Evite fraudes de inscrição com 3 verificações de API, sem necessidade de captcha
Os captchas prejudicam a conversão e os bots os resolvem de qualquer maneira. Pontue cada inscrição com VPN, e-mail descartável e verificações de lista de bloqueio de IP em menos de 120 ms e desafie apenas os 5% melhores.
Os bots são mais baratos que o seu orçamento de captcha. Um farm de resolução comercial compensa o reCAPTCHA v2 em cerca de US$ 1 por mil, então um scraper que deseja 50.000 contas descartáveis gasta menos em captchas do que no VPS para executar o script. Enquanto isso, seus usuários reais saltam do quebra-cabeça em uma velocidade de 3 a 15%.
Uma cerca melhor é uma pontuação. Três chamadas de API fornecem sinal suficiente para permitir a passagem de 95% das inscrições sem atrito e desafiar ou bloquear a fatia restante. Latência total abaixo de 120ms no P99.
Três sinais, três pontos finais
Cada inscrição possui um IP e um email. Isso é suficiente para fazer três perguntas restritas.
O IP é uma VPN, saída Tor ou datacenter?
As inscrições reais de consumidores raramente se originam em um bloco CIDR da AWS. Um nó de saída do Tor quase nunca se inscreve para uma avaliação gratuita do seu SaaS. O /v1/vpn-detect endpoint verifica todos os três.
{
"ip": "34.102.55.10",
"is_vpn": true,
"is_tor": false,
"is_datacenter": true,
"provider": "Google Cloud",
"risk_score": 60
}
O e-mail usa um domínio descartável?
Provedores descartáveis (mailinator, guerrillamail, tempmail) alternam as caixas de entrada em minutos. Se uma inscrição atingir um domínio descartável, o usuário não terá intenção de receber acompanhamento. /v1/disposable-email/check sinaliza mais de 700 provedores conhecidos, além de padrões heurísticos.
{
"email": "user@mailinator.com",
"domain": "mailinator.com",
"is_disposable": true,
"is_free": false,
"provider": "Mailinator"
}
O IP está em uma faixa de bogon ou em uma lista de reputação?
Os IPs Bogon nunca devem chegar ao seu servidor pela Internet aberta; eles indicam um cabeçalho falsificado ou um proxy quebrado. DNS reverso suspeito (nomes de host com “proxy”, “tor”, “spam”) é outro sinal barato. /v1/ip-blocklist/check retorna um nível de risco mais detalhamento por cheque.
{
"ip": "185.220.101.5",
"is_private": false,
"is_bogon": false,
"reverse_dns": "tor-exit-1.example.org",
"risk_level": "high"
}
Peso e pontuação em uma função
Chame todos os três em paralelo, adicione pontos ponderados, fixe em 100 e escolha um veredicto. Os limites podem ser ajustados por produto; comece com 20 e 70 como desafio e bloqueie os cortes.
// signup-score.ts
type Verdict = 'allow' | 'challenge' | 'block';
export async function scoreSignup(input: {
ip: string;
email: string;
}): Promise<{ score: number; verdict: Verdict; signals: Record<string, unknown> }> {
const [vpn, email, blocklist] = await Promise.all([
fetch('https://api.botoi.com/v1/vpn-detect', postJson({ ip: input.ip })).then(r => r.json()),
fetch('https://api.botoi.com/v1/disposable-email/check', postJson({ email: input.email })).then(r => r.json()),
fetch('https://api.botoi.com/v1/ip-blocklist/check', postJson({ ip: input.ip })).then(r => r.json()),
]);
let score = 0;
if (vpn.is_tor) score += 80;
else if (vpn.is_datacenter) score += 50;
else if (vpn.is_vpn) score += 35;
if (email.is_disposable) score += 60;
else if (email.is_free) score += 10;
if (blocklist.risk_level === 'high') score += 40;
else if (blocklist.risk_level === 'medium') score += 20;
const verdict: Verdict = score >= 70 ? 'block' : score >= 20 ? 'challenge' : 'allow';
return { score: Math.min(score, 100), verdict, signals: { vpn, email, blocklist } };
}
function postJson(body: unknown): RequestInit {
return {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: \`Bearer \${process.env.BOTOI_API_KEY}\`,
},
body: JSON.stringify(body),
};
}
Algumas notas sobre os pesos. Tor é um sinal forte; Somente 80 pontos colocam a solicitação na faixa de bloqueio. Os IPs do datacenter capturam muito tráfego de bot, mas também usuários legítimos de VPN sempre ativos, portanto, 50 pontos os colocam em desafio, e não em bloqueio. E-mails descartáveis ganham 60 pontos porque usuários reais quase nunca escolhem o mailinator.
Conecte-o à rota de inscrição
Coloque a chamada de pontuação logo antes da criação do usuário. Rejeite a banda de bloqueio, exija verificação de e-mail na banda de desafio, deixe o resto intacto.
// app/api/signup/route.ts (Next.js)
import { NextResponse } from 'next/server';
import { scoreSignup } from '@/lib/signup-score';
export async function POST(req: Request) {
const body = await req.json();
const ip = req.headers.get('x-forwarded-for')?.split(',')[0] ?? '0.0.0.0';
const result = await scoreSignup({ ip, email: body.email });
if (result.verdict === 'block') {
await auditLog({ type: 'signup.blocked', ip, email: body.email, score: result.score });
return NextResponse.json({ error: 'signup_rejected' }, { status: 403 });
}
const user = await createUser({
email: body.email,
password: body.password,
requiresEmailVerification: result.verdict === 'challenge',
riskScore: result.score,
});
return NextResponse.json({ user });
}
Audite cada decisão
Não é possível ajustar os limites sem dados. Persista a pontuação e os sinais brutos em cada inscrição.
// Persist the score and signals with the user row for later calibration.
await db.signupAudit.insert({
userId: user.id,
ip,
score: result.score,
verdict: result.verdict,
signals: result.signals,
createdAt: new Date(),
});
Calibre semanalmente contra rotatividade e abuso
Execute um relatório uma vez por semana. Uma pontuação mais alta prevê maior rotatividade, taxa de reembolso ou relatórios de abuso? Se a pontuação de 60 inscrições mudar em 80% e a pontuação de 10 inscrições em 4%, seus pesos serão calibrados e você poderá restringir o limite de bloqueio. Se o gradiente for plano, repondere.
-- rerun weekly: does the score predict churn and abuse?
SELECT
FLOOR(score / 10) * 10 AS score_bucket,
COUNT(*) AS signups,
ROUND(100.0 * SUM(CASE WHEN churned THEN 1 ELSE 0 END) / COUNT(*), 1) AS churn_pct,
ROUND(100.0 * SUM(CASE WHEN abuse_reported THEN 1 ELSE 0 END) / COUNT(*), 1) AS abuse_pct
FROM signup_audit
WHERE created_at > NOW() - INTERVAL '90 days'
GROUP BY 1
ORDER BY 1;
O objetivo é uma curva monotônica. Cada grupo de pontuação deve ter resultados piores do que aquele abaixo dele. Caso contrário, adicione um sinal (impressão digital do dispositivo, velocidade de inscrição do mesmo /24) ou solte um peso que não esteja puxando seu próprio peso.
Onde isso se encaixa vs. captcha
| Abordagem | Fricção para usuários reais | Custo para o invasor | Latência P99 |
|---|---|---|---|
| reCAPTCHA v2 | Desistência de 3-15% | US$ 1 por 1.000 soluções | 300-800ms |
| hCaptcha Empresa | Desistência de 2-8% | US$ 1-2 por 1.000 | 250-600ms |
| Pontuação de 3 sinais | 0% para 95% dos usuários | Deve adquirir IP limpo + caixa de correio real | 80-120ms |
Uma pontuação não substitui o captcha quando você precisa de fluxos de login à prova de bots para um banco dos EUA. É o padrão certo para inscrição em SaaS, boletim informativo e portas de teste.
O que isso não cobre
- Preenchimento de credenciais no login: use uma chave de acesso ou limite de taxa por conta.
- Explosões de inscrição coordenadas de proxies residenciais: adicione limites de velocidade por /24 e por domínio de e-mail mais minuto de inscrição.
- Usuários que concluírem a verificação de e-mail com um endereço descartável: definam um congelamento de 24 horas no acesso ao recurso para a faixa de desafio.
Obtenha uma chave de API e insira-a
Pegue uma chave grátis em botoi.com/api/signup. O nível gratuito cobre 1.000 pontuações por dia, o suficiente para executar a calibração em relação a uma semana recente de inscrições. Os planos pagos começam em US$ 9/mês para 10.000 solicitações por dia.
Referência completa para cada endpoint: API de detecção de VPN, API de verificação de e-mail descartável, e API de verificação de lista de bloqueio de IP.
FAQ
- Por que não usar um captcha?
- A conversão de custos de Captchas (queda típica: 3 a 15% dos usuários reais) e farms comerciais de CAPTCHA resolvem o reCAPTCHA v2 por menos de US$ 1 por mil. A pontuação com sinais evita o atrito em 95% das inscrições e desafia apenas a fatia suspeita.
- Que sinais entram na pontuação?
- Três: sinalizadores de IP VPN/Tor/datacenter, domínio de e-mail descartável ou descartável e acessos à lista de bloqueio de IP (bogons, nomes de host suspeitos). Cada um retorna em menos de 50 ms. Pese-os para obter uma pontuação de risco de 0 a 100 e, em seguida, decida por limite.
- O bloqueio de IPs de datacenter prejudica usuários reais?
- Os IPs corporativos e de consumidor não correspondem aos blocos CIDR do datacenter. Os únicos usuários reais afetados são aqueles que usam VPNs sempre ativas, o que geralmente é uma minoria que você pode encaminhar para um caminho de verificação secundário em vez de bloquear completamente.
- Como faço para lidar com o meio de sinal baixo?
- Pontuação acima de 70: bloqueio. Pontuação abaixo de 20: permitir. Entre 20 e 70: requer verificação de e-mail ou reforço (código SMS, chave de acesso). Você transfere o atrito para a faixa de risco em vez de para todo o funil.
- Posso testar a pontuação em relação às inscrições históricas?
- Sim. Repita os últimos 90 dias de inscrições por meio dos três endpoints, junte a pontuação com colunas de rotatividade, reembolso e relatório de abuso e calibre seus limites antes de impor qualquer coisa. Cada endpoint permanece estável em chamadas repetidas com a mesma entrada.
Comece a construir com botoi
150+ endpoints de API para consultas, processamento de texto, geração de imagens e utilitários para desenvolvedores. Plano gratuito, sem cartão de crédito.