Documentación
Añade el agente a tu página de registro, llama a un endpoint desde tu servidor y actúa según la decisión.
Inicio rápido
1. Añade el agente a tu página de registro
Recoge señales del dispositivo y pone un token de visitante de corta vida en un campo oculto llamado attrelix_visitor en cada formulario de la página. También expone window.attrelix.token() para 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. Verifica el registro desde tu servidor
Envía el correo, la IP del cliente y el token de visitante con tu clave secreta. Opcional: external_id (el id de tu usuario), user_agent y card_fingerprint (por ejemplo el 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. Actúa según la decisión
allow: da los créditos gratis. review: pide algo que le cueste dinero a una granja — una tarjeta, un teléfono — o da menos créditos. block: rechaza la cuenta o los créditos. Si la llamada falla, permite: nunca bloquees a usuarios reales por nuestra culpa.
Claves y tokens
- Clave pública (pk_live_…): pública por diseño. Va en tu página y solo recoge señales, desde los orígenes que permitas en el panel.
- Clave secreta (sk_live_…): solo en el servidor. Ejecuta verificaciones y lee resultados. Solo guardamos su hash: cópiala al crearla.
- Token de visitante: firmado por nosotros, válido 15 minutos y para una sola verificación, ligado a tu proyecto. Un token usado dos veces, o desde otra red distinta a la del registro, sube la puntuación.
POST /v1/check
Cuerpo de la petición (JSON). Envía al menos uno de email, ip o visitor.
| La dirección que escribió el usuario. | |
| ip | La IP del cliente en la petición de registro (no la de tu servidor). |
| visitor | El valor de attrelix_visitor del formulario. |
| user_agent | La cabecera User-Agent de la petición de registro. |
| external_id | Tu id de la cuenta, cuando ya existe. |
| card_fingerprint | Una huella de tarjeta, cuando se añade una tarjeta en el registro. |
Respuesta
decision es allow, review o block. score va de 0 a 100: la suma de los puntos de los motivos, con tope. Cada motivo tiene un código estable que puedes registrar o mostrar.
{
"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
}
Errores
Los errores son JSON: {"error": code, "message": text}.
| 401 | clave ausente, desconocida, revocada o del tipo equivocado (una clave pk_ en /v1/check). |
| 400 | el cuerpo no es JSON o no tiene email, ip ni visitor. |
| 402 | se agotaron las verificaciones mensuales del plan. |
| 403 | el agente se ejecutó en un origen que no permitiste. |
| 429 | demasiadas peticiones desde una dirección. |
Puntuación
Los puntos se suman con un tope de 100. Por defecto: revisar desde 50, bloquear desde 80 — ambos ajustables. Un buzón desechable solo ya va a revisión; ninguna señal aislada de dispositivo o red llega ahí.
| Código | Puntos | Significado |
|---|---|---|
| invalid_email | +50 | La dirección no es válida |
| disposable_email | +50 | Dominio de correo desechable |
| no_mx | +35 | El dominio no puede recibir correo |
| alias_of_existing | +30 | Otra forma de escribir un buzón ya visto |
| relay_email | +10 | Dirección de reenvío |
| plus_tag | +5 | Etiqueta + o puntos de Gmail |
| tor_exit | +35 | Nodo de salida de Tor |
| datacenter_ip | +25 | Dirección de datacenter o nube |
| vpn_ip | +20 | Dirección de VPN |
| ip_signups_24h | +10 | 3+ cuentas desde esta IP en 24 h |
| ip_signups_24h_high | +25 | 10+ cuentas desde esta IP en 24 h |
| subnet_burst | +15 | 10+ cuentas desde esta subred en 1 h |
| automation_webdriver | +40 | Automatización por WebDriver |
| headless_browser | +40 | Navegador headless |
| automation_cdp | +10 | Automatización por el protocolo DevTools (Puppeteer, Playwright) |
| antidetect_browser | +15 | Navegador anti-detect (varios disfraces a la vez) |
| headless_viewport | +15 | Ventana sin barra ni pestañas del navegador |
| webgl_os_mismatch | +25 | La tarjeta gráfica pertenece a otro sistema operativo |
| memory_cpu_mismatch | +10 | Núcleos y memoria no concuerdan |
| no_human_interaction | +30 | Enviado al instante, sin teclear, mover el ratón ni tocar la pantalla |
| instant_signup | +25 | Rellenado y enviado en menos de un segundo tras cargar la página |
| os_mismatch | +20 | El sistema operativo se contradice |
| browser_mismatch | +20 | El navegador contradice su user agent |
| fonts_mismatch | +15 | Las fuentes no cuadran con el sistema declarado |
| canvas_noise | +15 | Huella de canvas aleatorizada |
| software_renderer | +15 | Gráficos por software (máquina virtual o headless) |
| zero_window | +15 | Ventana sin tamaño |
| permissions_mismatch | +15 | Estados de permisos contradictorios |
| no_plugins | +10 | Chrome de escritorio sin plugins |
| no_languages | +10 | Navegador sin idiomas |
| utc_timezone | +5 | Reloj en UTC |
| token_missing | 0–100 | Sin token de visitante (el agente no cargó o fue bloqueado) |
| token_invalid | +30 | Token de visitante falsificado o ajeno |
| token_replayed | +35 | Token de visitante ya usado |
| token_expired | +10 | Token de visitante caducado |
| token_ip_mismatch | +8 | Token recogido en otra red |
| token_ua_mismatch | +15 | Token recogido por otro navegador |
| linked_accounts | +15 | Vinculada a otras cuentas |
| linked_accounts_3 | +30 | Vinculada a 3+ cuentas |
| linked_accounts_10 | +45 | Vinculada a 10+ cuentas |
| shared_card | +30 | Tarjeta usada por otra cuenta |
| device_burst | +15 | 5+ verificaciones desde este dispositivo en 1 h |
Fuentes de datos
Dominios desechables: el proyecto disposable-email-domains (CC0) y disposable/disposable-email-domains (MIT), actualizados a diario. Rangos de datacenter: las listas publicadas por AWS, Google Cloud, Oracle Cloud, DigitalOcean y Linode. Tor: la lista de salidas del Tor Project, actualizada cada hora.
Ahora mismo: 98,644 dominios desechables y 21,665 rangos.