Documentation
Ajoutez l'agent à votre page d'inscription, appelez un endpoint depuis votre serveur et agissez selon la décision.
Démarrage rapide
1. Ajoutez l'agent à votre page d'inscription
Il collecte des signaux de l'appareil et place un jeton visiteur de courte durée dans un champ caché nommé attrelix_visitor de chaque formulaire de la page. Il expose aussi window.attrelix.token() pour les single-page apps.
<script src="https://attrelix.com/v1.js?v=0bbe74b52d" data-key="pk_live_…" async></script> // single-page apps: wait for the token before you submit const visitor = await window.attrelix.token();
2. Vérifiez l'inscription depuis votre serveur
Envoyez l'e-mail, l'IP du client et le jeton visiteur avec votre clé secrète. Facultatif : external_id (l'id de votre utilisateur), user_agent et card_fingerprint (par exemple le card.fingerprint de Stripe).
curl https://attrelix.com/v1/check \ -H "Authorization: Bearer $ATTRELIX_SECRET" \ -H "Content-Type: application/json" \ -d '{"email":"jdoe+7@gmail.com","ip":"203.0.113.9","visitor":"vt1.…"}'
# Python r = requests.post("https://attrelix.com/v1/check", timeout=3, headers={"Authorization": f"Bearer {SECRET}"}, json={"email": email, "ip": ip, "visitor": form["attrelix_visitor"]}) decision = r.json().get("decision", "allow") if r.ok else "allow"
3. Agissez selon la décision
allow : accordez les crédits gratuits. review : demandez quelque chose qui coûte de l'argent à une ferme — une carte, un numéro de téléphone — ou accordez moins de crédits. block : refusez le compte ou les crédits. Si l'appel échoue, acceptez : ne bloquez jamais de vrais utilisateurs à cause de nous.
Clés et jetons
- Clé publique (pk_live_…) : publique par conception. Elle se trouve dans votre page et ne peut que collecter des signaux, depuis les origines autorisées dans le tableau de bord.
- Clé secrète (sk_live_…) : serveur uniquement. Elle lance les vérifications et lit les résultats. Nous n'en stockons que le hash : copiez-la à sa création.
- Jeton visiteur : signé par nous, valable 15 minutes et pour une seule vérification, lié à votre projet. Un jeton utilisé deux fois, ou venant d'un autre réseau que celui de l'inscription, augmente le score.
POST /v1/check
Corps de la requête (JSON). Envoyez au moins l'un de email, ip ou visitor.
| L'adresse saisie par l'utilisateur. | |
| ip | L'IP du client lors de la requête d'inscription (pas celle de votre serveur). |
| visitor | La valeur attrelix_visitor du formulaire. |
| user_agent | L'en-tête User-Agent de la requête d'inscription. |
| external_id | Votre id du compte, s'il existe déjà. |
| card_fingerprint | Une empreinte de carte, quand une carte est ajoutée à l'inscription. |
Réponse
decision vaut allow, review ou block. score va de 0 à 100 : la somme des points des raisons, plafonnée. Chaque raison a un code stable que vous pouvez journaliser ou afficher.
{
"id": "chk_3fJ8kQ2mN7pX1aZb",
"decision": "block",
"score": 100,
"reasons": [
{ "code": "linked_accounts_10", "points": 45, "detail": "14" },
{ "code": "alias_of_existing", "points": 30, "detail": "3 variants of jdoe@gmail.com" },
{ "code": "datacenter_ip", "points": 25, "detail": "aws" }
],
"email": { "normalized": "jdoe@gmail.com", "disposable": false, "relay": false, "mx": "yes", … },
"network": { "ip": "3.88.0.1", "type": "datacenter", "provider": "aws", "signups_24h": 2 },
"device": { "id": "dev_9c1e…", "token": "valid", "browser": "Firefox 144", "flags": ["canvas_noise"] },
"linked": { "accounts": 14, "by_device": 12, "by_card": 0, "cluster": "cl_7q2f…" },
"latency_ms": 38
}
Erreurs
Les erreurs sont en JSON : {"error": code, "message": text}.
| 401 | clé absente, inconnue, révoquée ou du mauvais type (une clé pk_ sur /v1/check). |
| 400 | le corps n'est pas du JSON ou ne contient ni email, ni ip, ni visitor. |
| 402 | les vérifications mensuelles de l'offre sont épuisées. |
| 403 | l'agent a tourné sur une origine que vous n'avez pas autorisée. |
| 429 | trop de requêtes depuis une même adresse. |
Score
Les points s'additionnent, plafonnés à 100. Par défaut : vérifier dès 50, bloquer dès 80 — tous deux réglables. Une boîte jetable seule passe en vérification ; aucun signal isolé d'appareil ou de réseau n'y arrive.
| Code | Points | Signification |
|---|---|---|
| invalid_email | +50 | L'adresse n'est pas valide |
| disposable_email | +50 | Domaine d'e-mail jetable |
| no_mx | +35 | Le domaine ne peut pas recevoir de mail |
| alias_of_existing | +30 | Autre écriture d'une boîte déjà vue |
| relay_email | +10 | Adresse de relais |
| plus_tag | +5 | Tag + ou points Gmail |
| tor_exit | +35 | Nœud de sortie Tor |
| datacenter_ip | +25 | Adresse de datacenter ou de cloud |
| vpn_ip | +20 | Adresse VPN |
| ip_signups_24h | +10 | 3+ comptes depuis cette IP en 24 h |
| ip_signups_24h_high | +25 | 10+ comptes depuis cette IP en 24 h |
| subnet_burst | +15 | 10+ comptes depuis ce sous-réseau en 1 h |
| automation_webdriver | +40 | Automatisation WebDriver |
| headless_browser | +40 | Navigateur headless |
| automation_cdp | +10 | Automatisation par le protocole DevTools (Puppeteer, Playwright) |
| antidetect_browser | +15 | Navigateur anti-détection (plusieurs déguisements à la fois) |
| headless_viewport | +15 | Fenêtre sans barre ni onglets de navigateur |
| webgl_os_mismatch | +25 | La carte graphique appartient à un autre système |
| memory_cpu_mismatch | +10 | Nombre de cœurs et mémoire incohérents |
| no_human_interaction | +30 | Envoyé instantanément, sans frappe, souris ni tactile |
| instant_signup | +25 | Rempli et envoyé dans la seconde suivant le chargement |
| os_mismatch | +20 | Le système d'exploitation se contredit |
| browser_mismatch | +20 | Le navigateur contredit son user agent |
| fonts_mismatch | +15 | Les polices ne correspondent pas au système annoncé |
| canvas_noise | +15 | Empreinte canvas aléatoire |
| software_renderer | +15 | Rendu graphique logiciel (machine virtuelle ou headless) |
| zero_window | +15 | Fenêtre sans taille |
| permissions_mismatch | +15 | États de permission contradictoires |
| no_plugins | +10 | Chrome de bureau sans plugins |
| no_languages | +10 | Navigateur sans langues |
| utc_timezone | +5 | Horloge en UTC |
| token_missing | 0–100 | Pas de jeton visiteur (agent non chargé ou bloqué) |
| token_invalid | +30 | Jeton visiteur falsifié ou étranger |
| token_replayed | +35 | Jeton visiteur déjà utilisé |
| token_expired | +10 | Jeton visiteur expiré |
| token_ip_mismatch | +8 | Jeton collecté sur un autre réseau |
| token_ua_mismatch | +15 | Jeton collecté par un autre navigateur |
| linked_accounts | +15 | Lié à d'autres comptes |
| linked_accounts_3 | +30 | Lié à 3+ comptes |
| linked_accounts_10 | +45 | Lié à 10+ comptes |
| shared_card | +30 | Carte utilisée par un autre compte |
| device_burst | +15 | 5+ vérifications depuis cet appareil en 1 h |
Sources de données
Domaines jetables : le projet disposable-email-domains (CC0) et disposable/disposable-email-domains (MIT), mis à jour chaque jour. Plages datacenter : les listes publiées par AWS, Google Cloud, Oracle Cloud, DigitalOcean et Linode. Tor : la liste des sorties du Tor Project, mise à jour toutes les heures.
En ce moment : 98,644 domaines jetables et 21,665 plages.