Ir al contenido principal
agenthouse Academia Habilitación IA Overview DealDesk Digital Customer Assistant HumanProof Decision Intelligence NewsRoom Anonymizer Agentic Business Agents agenthouse OS Services Desarrolladores AI Credits Deutsch English Italiano Français Español 日本語
Sin cookies Script en un archivo Verificado en el servidor

Los CAPTCHA clásicos frenan a la gente, dificultan la accesibilidad y suelen traer scripts de terceros muy invasivos. HumanProof usa un desafío firmado de corta vida y prueba de trabajo ligera en el navegador — sin puzzles, imágenes ni widgets extra.

  • Sin huella ni perfil de seguimiento entre sitios por una red de widgets.
  • No hace falta Google ni otro proveedor CAPTCHA externo en su página.
  • Los secretos quedan en su servidor: el navegador nunca tiene la clave de verificación.

Del desafío al envío verificado en cuatro pasos.

  1. El SDK solicita un desafío firmado para su clave de sitio pública e id de formulario.
  2. El navegador resuelve una pequeña prueba de trabajo (fuera del hilo principal si es posible).
  3. La prueba se adjunta como campo oculto al enviar el formulario.
  4. Su servidor llama a la API de verificación con la clave secreta y recibe accept, quarantine o fake-success.

Encaja en equipos conscientes del RGPD y hosting UE: superficie pequeña, sin scripts ad-tech en su formulario.

  • No se requieren cookies para el widget.
  • El tráfico queda entre su origen y la API de agenthouse — sin scripts de redes de anuncios.
  • En verificación, registro mínimo y consciente de la retención.
  • Usted decide cada resultado — aceptar, cuarentena o fake-success — en su propio backend.

Sin npm, bundler ni framework: cargue un script desde la API agenthouse, ponga atributos data en sus formularios y listo. Un script puede proteger varios formularios en la misma página. Línea opcional «Powered by agenthouse» incluida por defecto.

Front: un script. Back-end: una POST JSON para verificar. Sirve con cualquier pila — Node.js, PHP, Python o lo que pueda llamar a HTTPS.

Back-end: envíe el mismo JSON en POST a …/humanproof/verify. La respuesta incluye status, suggestedAction, reasonCode y accept (booleano — true solo cuando la entrega debe considerarse verificada). Solo desde su servidor: nunca envíe el secretKey al navegador.

Algunos formularios exigen el campo hostname en verify (debe coincidir con boundHost en el payload del cliente: el host con el que se pidió el desafío). Si requireVerifyHostname está activo, sin hostname la API devuelve reasonCode HOSTNAME_REQUIRED. 127.0.0.1 y localhost son distintos; inclúyalos en hostnames o alinee la URL del sitio y data-challenge-hostname con el cuerpo de verify.

Las URLs de script/API siguen la configuración (prod: api.agenthouse.org; humanproof.publicSdkBase para dev).

Si el SDK debe pedir la challenge y resolver el PoW al enviar, dispara en window el CustomEvent humanproof.securingForm (detail: form, siteKey, formId) para que su app muestre progreso. Cuando la protección termina y la prueba firmada se adjunta — justo antes del envío nativo — dispara en el formulario agenthouse_humanproof_verified_submit (bubbles; detail: form, siteKey, formId, metadatos proof). El evento solo indica éxito del lado cliente; su backend debe seguir llamando a verify. Si falla: humanproof-error en el formulario.

window.addEventListener('humanproof.securingForm', function (e) {
  /* e.detail.form, siteKey, formId */
});
form.addEventListener('agenthouse_humanproof_verified_submit', function (e) {
  /* e.detail.form, siteKey, formId, proof.challengeId, proof.proof, … */
});

Por defecto el SDK bloquea el formulario (input, select, textarea, button — todo lo que no esté ya deshabilitado) mientras obtiene la challenge y resuelve el proof-of-work. El formulario recibe data-humanproof-securing=1 y aria-busy=true para estilo y accesibilidad, y se desbloquea justo antes del envío (o de inmediato si hay error). Desactívelo en el script con data-lock-while-securing=false o por formulario con data-humanproof-lock-while-securing=false.

El PoW exige antes la challenge del servidor. Opcional: data-prefetch-challenge-delay-ms en el script (ms tras la carga) para obtener la challenge y resolver en segundo plano; al enviar se reutiliza la prueba si sigue válida. data-prefetch-expiry-margin-ms exige ese margen de TTL restante (desfase de reloj). Por formulario: data-humanproof-prefetch-challenge-delay-ms y data-humanproof-prefetch-expiry-margin-ms.

HTML HTML multi-formulario Node.js PHP Python
<form id="contact-form" data-humanproof="YOUR_FORM_ID">
  <label>Email <input type="email" name="email" required></label>
  <button type="submit">Send</button>
</form>
<script
  src="https://api.agenthouse.org/humanproof/humanproof.js"
  data-site-key="YOUR_PUBLIC_SITE_KEY"
  data-powered-by="true"
  data-endpoint="https://api.agenthouse.org/humanproof"
  data-prefetch-challenge-delay-ms="2500"
  data-prefetch-expiry-margin-ms="15000"
></script>
<form id="a" data-humanproof="form-a">...</form>
<form id="b" data-humanproof="form-b">...</form>
<script
  src="https://api.agenthouse.org/humanproof/humanproof.js"
  data-site-key="YOUR_PUBLIC_SITE_KEY"
  data-powered-by="true"
  data-endpoint="https://api.agenthouse.org/humanproof"
  data-prefetch-challenge-delay-ms="2500"
  data-prefetch-expiry-margin-ms="15000"
></script>
const verifyUrl = 'https://api.agenthouse.org/humanproof/verify';
const secretKey = ''; // set from your secrets store before use
const payload = JSON.parse(formFields.humanproof);
const body = { secretKey, ...payload };
if (typeof body.hostname !== 'string' || !body.hostname.trim()) {
  if (typeof body.boundHost === 'string' && body.boundHost.trim()) {
    body.hostname = body.boundHost.trim();
  }
}
const result = await (await fetch(verifyUrl, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(body)
})).json();
if (!result.accept) return; // do not process as a verified submit
<?php
$url = 'https://api.agenthouse.org/humanproof/verify';
$secret = ''; // set from your server secret store before use
$payload = json_decode($_POST['humanproof'], true);
$body = array_merge(['secretKey' => $secret], $payload);
if (empty($body['hostname']) && !empty($body['boundHost'])) {
  $body['hostname'] = $body['boundHost'];
}
$ch = curl_init($url);
curl_setopt_array($ch, [
  CURLOPT_POST => true,
  CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode($body),
  CURLOPT_RETURNTRANSFER => true,
]);
$out = curl_exec($ch);
$result = json_decode($out, true);
// if (empty($result['accept'])) { return; }
?>
import json
import urllib.request

VERIFY_URL = "https://api.agenthouse.org/humanproof/verify"

def verify_humanproof(secret_key: str, payload: dict) -> dict:
    body = {"secretKey": secret_key, **payload}
    if not (isinstance(body.get("hostname"), str) and body["hostname"].strip()):
        bh = body.get("boundHost")
        if isinstance(bh, str) and bh.strip():
            body["hostname"] = bh.strip()
    req = urllib.request.Request(
        VERIFY_URL,
        data=json.dumps(body).encode("utf-8"),
        headers={"Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(req, timeout=30) as resp:
        r = json.load(resp)
    # if not r.get("accept"): return
    return r

HumanProof muestra por defecto una línea breve «Powered by agenthouse». Elimínela con una suscripción mensual sencilla: mismo producto, mismas garantías de privacidad.

  • Línea breve «Powered by» incluida en el nivel gratuito.
  • El plan de pago oculta la línea; el comportamiento y la verificación son los mismos.
  • Contáctenos cuando quiera licenciar.

Beneficios prácticos para producto y cumplimiento.

  • Menos interrupciones que los CAPTCHA de imagen o rompecabezas: nada nuevo que pulsar.
  • Mejor accesibilidad: sin paso visual obligatorio, compatible con flujo por teclado.
  • Privacidad sólida: sin CAPTCHA de terceros ni widget publicitario en su formulario.
  • Rápido de integrar: un script, una API de verificación, ejemplos para backends habituales.
  • Política bajo su control: dificultad por formulario y manejo de envíos sospechosos.

Envíe el formulario de abajo: la prueba de trabajo corre en segundo plano y la demo publica en nuestro servidor (no se guarda nada).

Resultado de la demo

Configure la clave de sitio y reglas por formulario en agenthouse, añada el script y verifique cada envío en su backend. Esa es toda la integración — podemos ayudar con el despliegue.

agenthouse Privacidad Aviso legal