Korzen
Bot Protection

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
}
·:+* solicitudes llegando | Bot Protection, antes de tu acción x un bot, detenido # una persona, dentro

Lo que detiene

Los ataques para los que está hecho Bot Protection, en el paso que ataca cada uno.

Medido, no prometido

Herramientas de automatización detectadas
15 de 15
Playwright con flags de stealth, Chrome controlado por CDP, curl_cffi haciéndose pasar por Chrome: nuestras propias pruebas, 17 de octubre de 2026
Tiempo de respuesta, p99
menos de 3 ms
a 600 decisiones por segundo, medido en el servidor con 4 núcleos, el tamaño de la VM, 20 de octubre de 2026
Timeout por defecto
200 ms
si se supera, o ante cualquier error, el visitante pasa

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.

Bot Protection · Resumen
La vista general: decisiones por hora apiladas por clase, la proporción de bots, los motivos principales y los últimos bots

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.

Bot Protection · Decisiones
La tabla de decisiones filtrada por clase, con hora, clase, bot score, ruta, país y motivos

Cómo funciona

Dos fragmentos de código. Ningún cambio en tu tráfico

1

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>
2

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"}
3

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

human high

Una persona, con pruebas externas a la sesión: un pedido anterior, su propia tarjeta.

allow
human

Una persona confirmada por tu propio feedback.

allow
unknown

No hay evidencia suficiente en ningún sentido. La mayoría de las primeras visitas cae aquí.

allow
bot

Automatización, por lo que hace el cliente.

challenge
bot high

Automatización, con fuerte evidencia de comportamiento.

block

Cuando 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 ProtectionCAPTCHAProxy delante de tu sitio
Tus visitantes resuelven acertijosNuncaCada vezA veces
Tu tráfico pasa por élNoNo, pero cada formulario depende de élTodo
Cuando se caeLos visitantes pasanLos formularios se detienenTu sitio se detiene
Te dice por quéLa clase, la puntuación y el tipo de evidenciaPasa o no pasaUna puntuación
Dónde decidesEn tu códigoEn su widgetEn 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.