Passare al contenuto principale
agenthouse Accademia AI Enablement Overview DealDesk Digital Customer Assistant HumanProof Decision Intelligence NewsRoom Anonymizer Agentic Business Agents agenthouse OS Services Sviluppatori AI Credits Deutsch English Italiano Français Español 日本語
Nessun cookie Script in un file Verificato lato server

I CAPTCHA classici rallentano, peggiorano l’accessibilità e spesso caricano script di terze parti invasivi. HumanProof usa una challenge firmata a breve vita e proof-of-work leggero nel browser — nessun puzzle, immagine o widget extra.

  • Nessun fingerprinting né profilo di tracciamento cross-site da una rete di widget.
  • Nessun Google o fornitore CAPTCHA esterno obbligatorio sulla pagina.
  • I segreti restano sul server: il browser non ha mai la chiave di verifica.

Dalla challenge all’invio verificato in quattro passaggi.

  1. L'SDK richiede una challenge firmata per la site key pubblica e l'id modulo.
  2. Il browser risolve una piccola proof-of-work (fuori dal main thread se possibile).
  3. La prova è allegata come campo nascosto all'invio del modulo.
  4. Il server chiama l'API di verifica con la chiave segreta e riceve accept, quarantine o fake-success.

Adatto a team attenti al GDPR e hosting UE-first: superficie ridotta, nessuno script ad-tech sul modulo.

  • Nessun cookie richiesto per il widget.
  • Il traffico resta tra la vostra origine e l’API agenthouse — nessuno script di reti pubblicitarie.
  • Lato verifica, logging minimo e attento alla retention.
  • Decidete voi come reagire a ogni esito — accetta, quarantena o fake-success — sul vostro backend.

Niente npm, bundler o framework: caricate uno script dall’API agenthouse, impostate gli attributi data sui moduli e avete finito. Uno script può proteggere più moduli nella stessa pagina. Riga “Powered by agenthouse” opzionale inclusa di default.

Front-end: uno script. Back-end: una POST JSON per verificare. Funziona con qualsiasi stack — Node.js, PHP, Python o qualsiasi cosa che chiami HTTPS.

Back-end: inviate lo stesso corpo JSON a POST …/humanproof/verify. La risposta include status, suggestedAction, reasonCode e accept (booleano — true solo quando la richiesta va trattata come invio verificato). Solo dal server: non mandate mai il secretKey al browser.

Alcuni form richiedono il campo hostname in verify (deve coincidere con boundHost nel payload client — l’host usato alla richiesta della challenge). Con requireVerifyHostname attivo, senza hostname l’API risponde reasonCode HOSTNAME_REQUIRED. 127.0.0.1 e localhost sono distinti; includeteli entrambi in hostnames oppure allineate URL del sito e data-challenge-hostname al body di verify.

Gli URL script/API seguono la configurazione (produzione: api.agenthouse.org; humanproof.publicSdkBase per dev).

Se allo submit lo SDK deve richiedere la challenge e risolvere il PoW, emette su window il CustomEvent humanproof.securingForm (detail: form, siteKey, formId) per mostrare avanzamento. Quando la protezione è completa e la prova firmata è allegata — subito prima del submit nativo — emette sul form agenthouse_humanproof_verified_submit (bubbles; detail: form, siteKey, formId, metadati proof). L’evento indica solo il successo lato client; il backend deve comunque chiamare verify. In caso di errore: humanproof-error sul form.

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, … */
});

Per impostazione predefinita l'SDK blocca il modulo (input, select, textarea, button — tutto ciò che non è già disabled) mentre recupera la challenge e risolve il proof-of-work. Il modulo riceve data-humanproof-securing=1 e aria-busy=true per styling e accessibilità, e viene sbloccato appena prima dell'invio (o subito in caso di errore). Disattivabile sullo script con data-lock-while-securing=false oppure per form con data-humanproof-lock-while-securing=false.

Il PoW richiede prima la challenge dal server. Opzionale: data-prefetch-challenge-delay-ms sullo script (ms dopo il load) per scaricare la challenge e risolvere in background; all’invio si riusa la prova se ancora valida. data-prefetch-expiry-margin-ms impone quel margine di TTL residuo (skew orologio). Per form: data-humanproof-prefetch-challenge-delay-ms e data-humanproof-prefetch-expiry-margin-ms.

HTML HTML multi-modulo 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 mostra di default una breve riga «Powered by agenthouse». Rimuovetela con un abbonamento mensile semplice — stesso prodotto, stesse garanzie privacy.

  • Riga «Powered by» inclusa nel piano gratuito.
  • Il piano a pagamento nasconde la riga; comportamento e verifica restano identici.
  • Contattateci quando volete attivare la licenza.

Vantaggi concreti per prodotto e compliance.

  • Meno interruzioni dei CAPTCHA a immagini o puzzle — niente nuovi clic per gli utenti.
  • Accessibilità migliore: nessuno step visivo obbligatorio, compatibile con flussi da tastiera.
  • Privacy solida: nessun CAPTCHA di terze parti né widget pubblicitario sul modulo.
  • Rapido da integrare: uno script, un’API di verifica, esempi per backend comuni.
  • Policy sotto il vostro controllo: difficoltà per modulo e gestione degli invii sospetti.

Inviate il modulo sotto: la proof-of-work gira in background, poi la demo invia al nostro server (nessun salvataggio).

Risultato demo

Configurate site key e regole per modulo in agenthouse, aggiungete lo script e verificate ogni invio sul backend. È tutta l’integrazione — siamo qui per il rollout.

agenthouse Privacy Note legali