Aller au contenu principal
agenthouse Académie Enablement IA Overview DealDesk Digital Customer Assistant HumanProof Decision Intelligence NewsRoom Anonymizer Agentic Business Agents agenthouse OS Services Développeurs AI Credits Deutsch English Italiano Français Español 日本語
Sans cookies Script en un fichier Vérifié côté serveur

Les CAPTCHA classiques ralentissent, nuisent à l’accessibilité et attirent souvent des scripts tiers très trackants. HumanProof utilise un défi signé à courte durée et une preuve de travail légère dans le navigateur — pas d’énigmes, d’images ni de widgets supplémentaires.

  • Pas d’empreinte ni de profil de suivi inter-sites via un réseau de widgets.
  • Pas besoin de Google ni d’un autre fournisseur CAPTCHA externe sur votre page.
  • Les secrets restent sur votre serveur : le navigateur n’a jamais la clé de vérification.

Du défi à l’envoi vérifié en quatre étapes.

  1. Le SDK demande un défi signé pour votre clé site publique et l'id de formulaire.
  2. Le navigateur résout une petite preuve de travail (hors thread principal si possible).
  3. La preuve est ajoutée comme champ caché à la soumission du formulaire.
  4. Votre serveur appelle l'API de vérification avec la clé secrète et reçoit accept, quarantine ou fake-success.

Adapté aux équipes sensibles RGPD et à l’hébergement UE : surface limitée, pas de scripts ad-tech sur votre formulaire.

  • Aucun cookie requis pour le widget.
  • Le trafic reste entre votre origine et l’API agenthouse — pas de scripts de réseaux publicitaires.
  • Côté vérification, journaux minimaux et conscients de la rétention.
  • Vous décidez pour chaque résultat — accepter, mettre en quarantaine ou fake-success — sur votre propre backend.

Pas de npm, bundler ni framework : chargez un script depuis l’API agenthouse, ajoutez les attributs data sur vos formulaires, c’est tout. Un script peut protéger plusieurs formulaires sur la même page. Ligne « Powered by agenthouse » optionnelle incluse par défaut.

Front : un script. Back-end : une POST JSON pour vérifier. Fonctionne avec n’importe quelle stack — Node.js, PHP, Python ou tout ce qui appelle HTTPS.

Back-end : envoyez le même corps JSON en POST vers …/humanproof/verify. La réponse inclut status, suggestedAction, reasonCode et accept (booléen — true uniquement si la soumission doit être traitée comme vérifiée). Uniquement depuis votre serveur — jamais secretKey dans le navigateur.

Certains formulaires exigent le champ hostname à la vérification (il doit correspondre à boundHost dans le payload client — l’hôte utilisé lors de la demande de challenge). Si requireVerifyHostname est activé, l’absence de hostname renvoie reasonCode HOSTNAME_REQUIRED. 127.0.0.1 et localhost diffèrent ; autorisez-les tous deux dans hostnames ou alignez l’URL du site et data-challenge-hostname avec le corps de verify.

Les URL script/API suivent la configuration (prod : api.agenthouse.org ; humanproof.publicSdkBase pour le dev).

Si le SDK doit récupérer une challenge et résoudre le proof-of-work à l’envoi, il déclenche sur window le CustomEvent humanproof.securingForm (detail : form, siteKey, formId) pour l’indicateur de progression. Quand la sécurisation est terminée et la preuve signée est jointe — juste avant l’envoi natif — il déclenche sur le formulaire agenthouse_humanproof_verified_submit (bubbles ; detail : form, siteKey, formId, métadonnées proof). L’événement signifie seulement une sécurisation client réussie ; votre backend doit toujours appeler verify. En cas d’échec : humanproof-error sur le formulaire.

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

Par défaut, le SDK verrouille le formulaire (input, select, textarea, button — tout ce qui n'est pas déjà désactivé) pendant qu'il récupère la challenge et résout le proof-of-work. Le formulaire reçoit data-humanproof-securing=1 et aria-busy=true pour le style et l'accessibilité, et est déverrouillé juste avant l'envoi (ou immédiatement en cas d'erreur). Désactivable au niveau du script avec data-lock-while-securing=false, ou par formulaire avec data-humanproof-lock-while-securing=false.

Le proof-of-work nécessite d’abord une challenge serveur. Optionnel : data-prefetch-challenge-delay-ms sur le script (ms après chargement) pour récupérer la challenge et résoudre en arrière-plan ; à l’envoi la preuve est réutilisée si encore valide. data-prefetch-expiry-margin-ms impose ce TTL restant avant réutilisation (décalage d’horloge). Par formulaire : data-humanproof-prefetch-challenge-delay-ms et data-humanproof-prefetch-expiry-margin-ms.

HTML HTML multi-formulaires 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 affiche par défaut une courte ligne « Powered by agenthouse ». Retirez-la avec un abonnement mensuel simple — même produit, mêmes garanties de confidentialité.

  • Courte ligne « Powered by » incluse dans l’offre gratuite.
  • L’offre payante masque la ligne ; comportement et vérification inchangés.
  • Contactez-nous quand vous souhaitez passer sous licence.

Des gains concrets pour les équipes produit et conformité.

  • Moins d’interruptions qu’avec des CAPTCHA image ou puzzle — rien de nouveau à cliquer.
  • Meilleure accessibilité : pas d’étape visuelle obligatoire, compatible avec le clavier.
  • Posture confidentialité solide : pas de CAPTCHA tiers ni de widget pub sur votre formulaire.
  • Mise en prod rapide : un script, une API de vérif, exemples pour backends courants.
  • Politique maîtrisée : difficulté par formulaire et traitement des envois suspects.

Envoyez le formulaire ci-dessous : la preuve de travail s’exécute en arrière-plan, puis la démo envoie à notre serveur (aucune donnée stockée).

Résultat de la démo

Configurez la clé site et les règles par formulaire dans agenthouse, ajoutez le script et vérifiez chaque envoi sur votre backend. C’est toute l’intégration — nous aidons au déploiement si besoin.

agenthouse Confidentialité Mentions légales