Documentação
Coloque o agente na sua página de cadastro, chame um endpoint do seu servidor e aja conforme a decisão.
Início rápido
1. Coloque o agente na página de cadastro
Ele coleta sinais do dispositivo e coloca um token de visitante de vida curta num campo oculto chamado attrelix_visitor em todo formulário da página. Também expõe 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. Cheque o cadastro pelo seu servidor
Envie o e-mail, o IP do cliente e o token de visitante com a sua chave secreta. Opcionais: external_id (o id do seu usuário), user_agent e card_fingerprint (por exemplo o card.fingerprint do 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. Aja conforme a decisão
allow: libere os créditos grátis. review: peça algo que custe dinheiro a uma fazenda — um cartão, um telefone — ou libere menos créditos. block: recuse a conta ou os créditos. Se a chamada falhar, permita: nunca trave usuários reais por nossa causa.
Chaves e tokens
- Chave pública (pk_live_…): pública por definição. Fica na sua página e só coleta sinais, nas origens que você liberar no painel.
- Chave secreta (sk_live_…): só no servidor. Roda checagens e lê resultados. Guardamos apenas o hash dela: copie quando criar.
- Token de visitante: assinado por nós, vale 15 minutos e uma única checagem, preso ao seu projeto. Um token usado duas vezes, ou vindo de outra rede que não a do cadastro, aumenta o score.
POST /v1/check
Corpo da requisição (JSON). Envie pelo menos um entre email, ip e visitor.
| O endereço que o usuário digitou. | |
| ip | O IP do cliente na requisição de cadastro (não o do seu servidor). |
| visitor | O valor de attrelix_visitor vindo do formulário. |
| user_agent | O cabeçalho User-Agent da requisição de cadastro. |
| external_id | O seu id da conta, quando ela já existe. |
| card_fingerprint | Um fingerprint de cartão, quando um cartão é cadastrado no signup. |
Resposta
decision é allow, review ou block. score vai de 0 a 100: a soma dos pontos dos motivos, com teto. Cada motivo tem um código estável que você pode registrar ou 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
}
Erros
Erros vêm em JSON: {"error": code, "message": text}.
| 401 | chave ausente, desconhecida, revogada ou do tipo errado (uma chave pk_ em /v1/check). |
| 400 | o corpo não é JSON ou não tem email, ip nem visitor. |
| 402 | as checagens mensais do plano acabaram. |
| 403 | o agente rodou numa origem que você não liberou. |
| 429 | requisições demais vindas de um endereço. |
Pontuação
Os pontos se somam, com teto de 100. Padrão: revisar a partir de 50, bloquear a partir de 80 — ambos ajustáveis. Uma caixa descartável sozinha já vai para revisão; nenhum sinal isolado de dispositivo ou rede chega lá.
| Código | Pontos | Significado |
|---|---|---|
| invalid_email | +50 | O endereço não é válido |
| disposable_email | +50 | Domínio de e-mail descartável |
| no_mx | +35 | O domínio não recebe e-mail |
| alias_of_existing | +30 | Outra grafia de uma caixa já vista |
| relay_email | +10 | Endereço de encaminhamento |
| plus_tag | +5 | Tag + ou pontos do Gmail |
| tor_exit | +35 | Nó de saída do Tor |
| datacenter_ip | +25 | Endereço de datacenter ou nuvem |
| vpn_ip | +20 | Endereço de VPN |
| ip_signups_24h | +10 | 3+ contas deste IP em 24 h |
| ip_signups_24h_high | +25 | 10+ contas deste IP em 24 h |
| subnet_burst | +15 | 10+ contas desta sub-rede em 1 h |
| automation_webdriver | +40 | Automação por WebDriver |
| headless_browser | +40 | Navegador headless |
| automation_cdp | +10 | Automação pelo protocolo DevTools (Puppeteer, Playwright) |
| antidetect_browser | +15 | Navegador anti-detect (vários disfarces ao mesmo tempo) |
| headless_viewport | +15 | Janela sem barra nem abas do navegador |
| webgl_os_mismatch | +25 | A placa de vídeo pertence a outro sistema operacional |
| memory_cpu_mismatch | +10 | Número de núcleos e memória não batem |
| no_human_interaction | +30 | Enviado na hora, sem digitar, mover o mouse ou tocar na tela |
| instant_signup | +25 | Preenchido e enviado em menos de um segundo após a página carregar |
| os_mismatch | +20 | O sistema operacional se contradiz |
| browser_mismatch | +20 | O navegador contradiz o próprio user agent |
| fonts_mismatch | +15 | As fontes não batem com o sistema declarado |
| canvas_noise | +15 | Fingerprint de canvas aleatorizado |
| software_renderer | +15 | Gráficos por software (máquina virtual ou headless) |
| zero_window | +15 | Janela sem tamanho |
| permissions_mismatch | +15 | Estados de permissão contraditórios |
| no_plugins | +10 | Chrome de desktop sem plugins |
| no_languages | +10 | Navegador sem idiomas |
| utc_timezone | +5 | Relógio em UTC |
| token_missing | 0–100 | Sem token de visitante (agente não carregou ou foi bloqueado) |
| token_invalid | +30 | Token de visitante forjado ou de outro projeto |
| token_replayed | +35 | Token de visitante já usado |
| token_expired | +10 | Token de visitante expirado |
| token_ip_mismatch | +8 | Token coletado em outra rede |
| token_ua_mismatch | +15 | Token coletado por outro navegador |
| linked_accounts | +15 | Ligada a outras contas |
| linked_accounts_3 | +30 | Ligada a 3+ contas |
| linked_accounts_10 | +45 | Ligada a 10+ contas |
| shared_card | +30 | Cartão usado por outra conta |
| device_burst | +15 | 5+ checagens deste dispositivo em 1 h |
Fontes de dados
Domínios descartáveis: o projeto disposable-email-domains (CC0) e disposable/disposable-email-domains (MIT), atualizados todo dia. Faixas de datacenter: as listas publicadas por AWS, Google Cloud, Oracle Cloud, DigitalOcean e Linode. Tor: a lista de saídas do Tor Project, atualizada a cada hora.
Agora: 98,644 domínios descartáveis e 21,665 faixas.