API de detección de bots
Clientes dentro, bots fuera
Antes de un login, un registro, un checkout o cualquier página que buscan los bots, tu servidor le pregunta a Bot Protection por el visitante y recibe una clase, una puntuación y los motivos. Sin proxy delante de tu sitio, sin acertijos para tus clientes.
14 días de prueba gratis · planes desde US$ 29 al mes
# Ask before the protected action curl -X POST https://korzen.dev/v1/decide \ -H "Authorization: Bearer $KORZEN_API_KEY" \ -d '{ "ip": "203.0.113.10", "user_agent": "Mozilla/5.0 …", "token": "<_kz cookie>", "path": "/checkout" }'
// Ask before the protected action; let through on any error const d = await fetch(API + "/v1/decide", { method: "POST", headers: { Authorization: `Bearer ${KEY}` }, body: JSON.stringify({ ip, user_agent, token, path }), signal: AbortSignal.timeout(200), }).then((r) => r.json()).catch(() => null); if (d?.action === "block") return res.status(403).end();
# Ask before the protected action; let through on any error try: d = requests.post(API + "/v1/decide", headers={"Authorization": f"Bearer {KEY}"}, json={"ip": ip, "user_agent": ua, "token": token}, timeout=0.2).json() except requests.RequestException: d = {} if d.get("action") == "block": abort(403)
// Ask before the protected action; let through on any error c := &http.Client{Timeout: 200 * time.Millisecond} r, _ := http.NewRequest("POST", api+"/v1/decide", body) r.Header.Set("Authorization", "Bearer "+key) var d struct{ Action string } if res, err := c.Do(r); err == nil { json.NewDecoder(res.Body).Decode(&d) res.Body.Close() } if d.Action == "block" { http.Error(w, "try again later", 403) return }
// Ask before the protected action; let through on any error var req = HttpRequest .newBuilder(URI.create(API + "/v1/decide")) .header("Authorization", "Bearer " + KEY) .timeout(Duration.ofMillis(200)) .POST(BodyPublishers.ofString(json)).build(); String act = ""; try { var res = http.send(req, BodyHandlers.ofString()); act = mapper.readTree(res.body()) .path("action").asText(); } catch (Exception e) { /* let through */ } if (act.equals("block")) { response.sendError(403); return; }
// Ask before the protected action; let through on any error
$ch = curl_init(API . '/v1/decide');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($visitor),
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . KEY],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => 200,
]);
$d = json_decode(curl_exec($ch) ?: '{}', true);
if (($d['action'] ?? '') === 'block') {
http_response_code(403);
exit;
}
// Ask before the protected action; let through on any error // http: an HttpClient with "Authorization: Bearer KEY" var act = ""; try { using var cts = new CancellationTokenSource(200); var res = await http.PostAsJsonAsync( Api + "/v1/decide", visitor, cts.Token); var d = await res.Content .ReadFromJsonAsync<JsonElement>(cts.Token); act = d.GetProperty("action").GetString(); } catch { /* let through */ } if (act == "block") return Results.StatusCode(403);
200 OK RESPONSE
{
"request_id": "AQEAmJ3…",
"class": "bot_high",
"bot_score": 96,
"human_score": 0,
"reasons": ["behaviour", "inconsistency"],
"rules": [],
"step_up": false,
"action": "block",
"intended_action": "block",
"mode": "block",
"challenge": null,
"token_required": false,
"seen_before": 0,
"crawler": null
}Lo que Bot Protection decide sobre ti
Pregúntale por este navegador, ahora: ejecuta su tag en esta página y responde lo que recibiría tu servidor, la clase, el score y los motivos.
Solo cuando lo pides. La decisión se guarda como cualquier otra, como dice la política de privacidad. Privacidad
Lo que detiene
Los ataques para los que está hecho Bot Protection, en el paso que ataca cada uno.
- Registro Cuentas falsas y abuso de pruebas gratis Scripts que abren cuentas por cientos para conseguir créditos, promociones, pruebas o spam: fraude de cuenta nueva. Leer →
- Inicio de sesión Credential stuffing y robo de cuentas Pares de email y contraseña filtrados que se prueban en tu login hasta que alguno funciona (account takeover). Leer →
- Checkout Prueba de tarjetas Pagos pequeños con tarjetas robadas para saber cuáles aún funcionan antes de venderlas (card testing). Leer →
- Cualquier página Scraping y scalping Precios, contenido y stock limitado que la automatización se lleva más rápido que cualquier persona. Leer →
Medido, no prometido
El panel
Mira cada decisión, y el porqué
El panel que tu equipo abre cuando el tráfico se dispara: lo que Bot Protection respondió, hora a hora, y las reglas detrás de cada respuesta.
Cada respuesta, con sus motivos
Las últimas decisiones, de la más reciente a la más antigua, actualizadas cada pocos segundos. Filtra por clase, ruta, país, motivo o período, y mira cada regla que se activó. Pasa el cursor sobre un motivo para leer qué significa.
Cómo funciona
Dos fragmentos de código. Ningún cambio en tu tráfico
Agrega el tag
Un script pequeño en tus páginas envía lo que el navegador muestra de sí mismo directo a Bot Protection y guarda un token firmado en una cookie de tu dominio.
<script src="…/v1/tag.js" data-site-key="sk_…" async></script>
Pregunta antes de la acción
Antes de un login, un registro, un checkout o cualquier página que buscan los bots, tu servidor envía la IP, el User-Agent y el token de la solicitud, con un timeout corto.
POST /v1/decide {"ip": "…", "user_agent": "…", "token": "…", "path": "/checkout"}
Aplica la acción
Cada respuesta dice allow, challenge o block. Empiezas en monitor mode, donde siempre es allow, y activas el block mode cuando confíes. Ante cualquier error o timeout, deja pasar al visitante.
if d.Action == "block" { return http.StatusForbidden }
O pega un prompt en Claude Code, Codex o Cursor y deja que añada ambos: configurar con IA.
Guías para Next.js, Express, Django, Rails, Laravel, Spring Boot, ASP.NET Core, Cloudflare Workers y más, en las docs.
La respuesta
Una clase para actuar, no un número para adivinar
Una persona, con pruebas externas a la sesión: un pedido anterior, su propia tarjeta.
allowUna persona confirmada por tu propio feedback.
allowNo hay evidencia suficiente en ningún sentido. La mayoría de las primeras visitas cae aquí.
allowAutomatización, por lo que hace el cliente.
challengeAutomatización, con fuerte evidencia de comportamiento.
blockCuando hay evidencia fuerte en ambos sentidos, la respuesta dice step_up: pide una passkey o 3-D Secure, no un CAPTCHA.
Lo que lee Bot Protection
Evidencias que un bot no puede falsificar por mucho tiempo
Consistencia
¿El User-Agent coincide con los client hints, la plataforma, el Web Worker, la GPU? Un navegador modificado se contradice.
Interacción real
Qué tipos de interacción vio la página: mouse, teclado, toque, rueda. Los scripts hacen clic sin moverse nunca.
La red
Datacenters, una zona horaria que no encaja con la IP, una latencia que delata un proxy en el camino.
Granjas
Un dispositivo detrás de muchas redes, un token en muchas salidas, una huella en varias sesiones: grupos que una granja de bots no puede evitar.
Comportamiento en el tiempo
Ritmo robótico, reintentos tras los rechazos, solicitudes que nunca cargan una página. Diez minutos de memoria por visitante.
Tu feedback
Avisa a Bot Protection de un pedido completado o un contracargo. Las pruebas externas a la sesión son lo que demuestra que un visitante es humano.
Por qué una API
Protección sin un nuevo punto de falla
| Bot Protection | CAPTCHA | Proxy delante de tu sitio | |
|---|---|---|---|
| Tus visitantes resuelven acertijos | Nunca | Cada vez | A veces |
| Tu tráfico pasa por él | No | No, pero cada formulario depende de él | Todo |
| Cuando se cae | Los visitantes pasan | Los formularios se detienen | Tu sitio se detiene |
| Te dice por qué | La clase, la puntuación y el tipo de evidencia | Pasa o no pasa | Una puntuación |
| Dónde decides | En tu código | En su widget | En sus reglas |
Preguntas
Antes de que preguntes
¿Se bloqueará a clientes reales?
Estar en una VPN, una red móvil o la conexión compartida de una oficina puede subir la puntuación, pero eso solo nunca lleva a bot. Para bot hace falta evidencia de automatización en lo que hace el cliente. Quienes ya te compraron vuelven como human high.
¿Bot Protection guarda datos personales?
Los identificadores pasan por un hash con una clave por cliente que cambia cada día, así que no se pueden cruzar entre clientes ni entre días. El comportamiento se olvida tras diez minutos; solo se guardan los conteos y las últimas decisiones para tu panel.
¿Un bot bloqueado sigue viendo mi sitio?
Sí. Bot Protection juzga las acciones por las que pregunta tu servidor, como un registro, un inicio de sesión o un checkout, no la carga de las páginas. En block mode, un bot sigue cargando tus páginas; lo que tu servidor rechaza es la acción.
Tu sitio, sin los bots
Crea una cuenta, copia dos fragmentos de código y mira llegar las decisiones.