Detenga el fraude de registro con 3 comprobaciones de API, no se requiere captcha
Los captchas perjudican la conversión y los bots los resuelven de todos modos. Califique cada registro con VPN, correo electrónico desechable y verificaciones de listas de bloqueo de IP en menos de 120 ms, y desafíe solo al 5% superior.
Los bots son más baratos que tu presupuesto de captcha. Una granja de resolución comercial autoriza reCAPTCHA v2 a aproximadamente 1 dólar por mil, por lo que un raspador que quiere 50.000 cuentas desechables gasta menos en captchas que en el VPS para ejecutar el script. Mientras tanto, sus usuarios reales rebotan en el rompecabezas a un ritmo del 3 al 15%.
Una mejor valla es una puntuación. Tres llamadas API le brindan suficiente señal para permitir que el 95% de los registros pasen sin fricciones y desafiar o bloquear la porción restante. Latencia total inferior a 120 ms en el P99.
Tres señales, tres puntos finales
Cada registro tiene una IP y un correo electrónico. Esto es suficiente para formular tres preguntas específicas.
¿La IP es una VPN, una salida Tor o un centro de datos?
Los registros de consumidores reales rara vez se originan en un bloque CIDR de AWS. Un nodo de salida de Tor casi nunca se registra para una prueba gratuita de su SaaS. El /v1/vpn-detect El punto final comprueba los tres.
{
"ip": "34.102.55.10",
"is_vpn": true,
"is_tor": false,
"is_datacenter": true,
"provider": "Google Cloud",
"risk_score": 60
}
¿El correo electrónico utiliza un dominio desechable?
Los proveedores desechables (mailinator, guerrillamail, tempmail) rotan las bandejas de entrada en minutos. Si un registro llega a un dominio desechable, el usuario no tiene intención de recibir seguimiento. /v1/disposable-email/check Marca más de 700 proveedores conocidos además de patrones heurísticos.
{
"email": "user@mailinator.com",
"domain": "mailinator.com",
"is_disposable": true,
"is_free": false,
"provider": "Mailinator"
}
¿Está la IP en un rango bogon o en una lista de reputación?
Las IP de Bogon nunca deberían llegar a su servidor desde Internet abierto; indican un encabezado falsificado o un proxy roto. El DNS inverso sospechoso (nombres de host con "proxy", "tor", "spam") es otra señal barata. /v1/ip-blocklist/check devuelve un nivel de riesgo más un desglose por cheque.
{
"ip": "185.220.101.5",
"is_private": false,
"is_bogon": false,
"reverse_dns": "tor-exit-1.example.org",
"risk_level": "high"
}
Peso y puntuación en una sola función
Llame a los tres en paralelo, agregue puntos ponderados, limite a 100 y elija un veredicto. Los umbrales se pueden ajustar por producto; Comience con 20 y 70 como desafío y bloquee los 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),
};
}
Algunas notas sobre los pesos. Tor es una señal fuerte; Solo 80 puntos colocan la solicitud en la banda de bloqueo. Las IP de los centros de datos captan una gran cantidad de tráfico de bots, pero también usuarios legítimos de VPN siempre activos, por lo que 50 puntos los sitúan en desafío, no en bloqueo. Los correos electrónicos desechables obtienen 60 puntos porque los usuarios reales casi nunca eligen mailinator.
Conéctelo a la ruta de registro
Coloque la llamada de puntuación justo antes de la creación del usuario. Rechace la banda de bloqueo, solicite verificación por correo electrónico en la banda de desafío, permita que el resto pase sin tocar.
// 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 });
}
Auditar cada decisión
No se pueden ajustar los umbrales sin datos. Conserve la puntuación y las señales sin procesar con cada registro.
// 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 la deserción y el abuso
Ejecute un informe una vez por semana. ¿Una puntuación más alta predice una mayor tasa de abandono, tasa de reembolso o informes de abuso? Si obtiene 60 registros de abandono al 80% y 10 registros de abandono al 4%, sus ponderaciones están calibradas y puede ajustar el umbral de bloqueo. Si el gradiente es plano, vuelva a ponderar.
-- 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;
El objetivo es una curva monótona. Cada grupo de puntuación debería tener peores resultados que el que está debajo. De lo contrario, agregue una señal (huella digital del dispositivo, velocidad de registro del mismo /24) o suelte un peso que no esté tirando de su propio peso.
Dónde encaja esto versus captcha
| Acercarse | Fricción para usuarias reales | Costo para la atacante | Latencia P99 |
|---|---|---|---|
| reCAPTCHA v2 | 3-15% de caída | 1 dólar por cada 1.000 soluciones | 300-800 ms |
| hCaptcha Empresa | 2-8% de caída | $1-2 por 1,000 | 250-600 ms |
| puntuación de 3 señales | 0% para el 95% de las usuarias | Debe adquirir IP limpia + buzón real | 80-120 ms |
Una puntuación no reemplaza el captcha cuando se necesitan flujos de inicio de sesión a prueba de bots para un banco de EE. UU. Es el valor predeterminado correcto para el registro de SaaS, el boletín informativo y las puertas de prueba.
Lo que esto no cubre
- Relleno de credenciales al iniciar sesión: utilice una clave de acceso o un límite de tasa por cuenta.
- Ráfagas de registro coordinadas desde servidores proxy residenciales: agregue límites de velocidad por /24 y por minuto de registro de dominio de correo electrónico.
- Usuarios que completan la verificación por correo electrónico con una dirección desechable: establezcan una congelación de 24 horas en el acceso a las funciones para la banda de desafío.
Obtenga una clave API e introdúzcala
Obtenga una clave gratuita en botoi.com/api/signup. El nivel gratuito cubre 1000 puntuaciones por día, suficiente para ejecutar la calibración en una semana reciente de registros. Los planes pagos comienzan en $9/mes para 10,000 solicitudes por día.
Referencia completa para cada punto final: API de detección de VPN, API de verificación de correo electrónico desechable, y API de verificación de lista de bloqueo de IP.
FAQ
- ¿Por qué no usar una captcha en su lugar?
- La conversión de costos de captchas (caída típica: del 3 al 15 % de los usuarios reales) y las granjas comerciales de CAPTCHA resuelven reCAPTCHA v2 por menos de $1 por cada mil. La puntuación con señales evita la fricción en el 95% de los registros y solo desafía la parte sospechosa.
- ¿Qué señales entran en la partitura?
- Tres: indicadores de IP de VPN/Tor/centro de datos, dominio de correo electrónico desechable o descartable y visitas a la lista de bloqueo de IP (bogons, nombres de host sospechosos). Cada uno regresa en menos de 50 ms. Pondérelos para obtener una puntuación de riesgo de 0 a 100 y luego decida según el umbral.
- ¿Bloquear las IP de los centros de datos perjudica a los usuarios reales?
- Las IP corporativas y de consumo no coinciden con los bloques CIDR del centro de datos. Los únicos usuarios reales afectados son las personas que utilizan VPN siempre activas, que suelen ser una minoría a la que se puede dirigir a una ruta de verificación secundaria en lugar de bloquearla directamente.
- ¿Cómo manejo el medio de señal baja?
- Puntuación superior a 70: bloqueo. Puntuación inferior a 20: permitir. Entre 20 y 70: requiere verificación por correo electrónico o un paso adelante (código SMS, clave de acceso). Cambias la fricción a la banda de riesgo en lugar de a todo el embudo.
- ¿Puedo probar la puntuación con registros históricos?
- Sí. Vuelva a reproducir los últimos 90 días de registros a través de los tres puntos finales, únase a la puntuación con las columnas de abandono, reembolso e informe de abuso, y calibre sus umbrales antes de imponer algo. Cada punto final permanece estable en llamadas repetidas con la misma entrada.
Empieza a construir con botoi
150+ endpoints de API para consultas, procesamiento de texto, generacion de imagenes y utilidades para desarrolladores. Plan gratuito, sin tarjeta de credito.