Korzen
Bot Protection

API de detecção de bots

Clientes dentro, bots fora

Antes de um login, um cadastro, um checkout ou qualquer página visada por bots, o seu servidor pergunta ao Bot Protection sobre o visitante e recebe uma classe, um score e os motivos. Sem proxy na frente do site, sem desafio para os clientes.

14 dias de trial grátis · planos a partir de US$ 29 por mês

# 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
}
·:+* requisições chegando | Bot Protection, antes da sua ação x um bot, barrado # uma pessoa, liberada

O que ele barra

Os ataques que o Bot Protection foi feito para barrar, na etapa em que cada um acontece.

Medido, não prometido

Ferramentas de automação pegas
15 de 15
Playwright com flags de stealth, Chrome controlado por CDP, curl_cffi se passando por Chrome: nossos próprios testes, 17 de outubro de 2026
Tempo de resposta, p99
menos de 3 ms
a 600 decisões por segundo, medido no servidor em 4 núcleos, o tamanho da VM, 20 de outubro de 2026
Timeout padrão
200 ms
passou disso, ou deu qualquer erro, o visitante passa

O painel

Veja cada decisão e o porquê dela

O painel que o seu time abre quando o tráfego dispara: o que o Bot Protection respondeu, hora a hora, e as regras por trás de cada resposta.

Bot Protection · Visão geral
A visão geral: decisões por hora empilhadas por classe, a parcela de bots, os principais motivos e os últimos bots

Cada resposta e os motivos dela

As últimas decisões, das mais novas às mais antigas, atualizadas a cada poucos segundos. Filtre por classe, caminho, país, motivo ou período, e veja cada regra que disparou. Passe o mouse sobre um motivo para ler o que ele significa.

Bot Protection · Decisões
A tabela de decisões filtrada por classe, com horário, classe, bot score, caminho, país e motivos

Como funciona

Dois trechos de código. Nenhuma mudança no seu tráfego

1

Adicione a tag

Um script pequeno nas suas páginas envia direto ao Bot Protection o que o navegador revela sobre si e guarda um token assinado num cookie do seu domínio.

<script src="…/v1/tag.js"
  data-site-key="sk_…"
  async></script>
2

Pergunte antes da ação

Antes de um login, um cadastro, um checkout ou qualquer página que os bots buscam, o seu servidor envia o IP, o User-Agent e o token da requisição, com um timeout curto.

POST /v1/decide
{"ip": "…", "user_agent": "…",
 "token": "…",
 "path": "/checkout"}
3

Siga a resposta

Cada resposta diz allow, challenge ou block. Você começa em monitor mode, onde é sempre allow, e ativa o block mode quando estiver confiante. Em qualquer erro ou timeout, libere o visitante.

if d.Action == "block" {
    return http.StatusForbidden
}

Ou cole um prompt no Claude Code, Codex ou Cursor e deixe-o adicionar os dois: configurar com IA.

Guias para Next.js, Express, Django, Rails, Laravel, Spring Boot, ASP.NET Core, Cloudflare Workers e mais, nas docs.

A resposta

Uma classe para agir, não um número para adivinhar

human high

Uma pessoa, com prova de fora da sessão: um pedido anterior, o próprio cartão.

allow
human

Uma pessoa confirmada pelo seu próprio feedback.

allow
unknown

Evidência insuficiente para qualquer lado. A maioria das primeiras visitas cai aqui.

allow
bot

Automação, pelo que o cliente faz.

challenge
bot high

Automação, com forte evidência de comportamento.

block

Quando há evidência forte para os dois lados, a resposta diz step_up: peça uma passkey ou 3-D Secure, não um CAPTCHA.

O que o Bot Protection lê

Evidências que um bot não consegue falsificar por muito tempo

Consistência

O User-Agent bate com os client hints, a plataforma, o Web Worker, a GPU? Um navegador adulterado se contradiz.

Interação real

Que tipos de interação a página viu: mouse, teclado, toque, rolagem. Scripts clicam sem nunca se mover.

A rede

Datacenters, um fuso horário que não bate com o IP, uma latência que denuncia um proxy no caminho.

Fazendas de bots

Um dispositivo atrás de muitas redes, um token em muitas saídas, um fingerprint em várias sessões: grupos que uma fazenda de bots não consegue evitar.

Comportamento ao longo do tempo

Ritmo robótico, novas tentativas depois de recusas, requisições que nunca carregam uma página. Dez minutos de memória por visitante.

O seu feedback

Avise o Bot Protection sobre um pedido concluído ou um chargeback: é a prova, de fora da sessão, de que o visitante é humano.

Por que uma API

Proteção sem um novo ponto de falha

Bot ProtectionCAPTCHAProxy na frente do seu site
Seus visitantes resolvem desafiosNuncaToda vezÀs vezes
Seu tráfego passa por eleNãoNão, mas todo formulário espera por eleTodo
Quando ele caiOs visitantes passamOs formulários paramSeu site para
Diz o porquêA classe, o score e o tipo de evidênciaPassou ou nãoUm score
Onde você decideNo seu códigoNo widget delesNas regras deles

Perguntas

Antes que você pergunte

Clientes de verdade serão bloqueados?

Estar numa VPN, numa rede móvel ou na conexão compartilhada de um escritório pode aumentar o score, mas, sozinho, nunca basta para virar bot. Para bot, é preciso evidência de automação no que o cliente faz. Quem já comprou de você volta como human high.

O Bot Protection guarda dados pessoais?

Os identificadores passam por hash com uma chave por cliente que muda todo dia, então não dá para cruzá-los entre clientes nem entre dias. O comportamento é esquecido depois de dez minutos; só as contagens e as últimas decisões ficam guardadas para o seu painel.

Um bot bloqueado ainda vê o meu site?

Sim. O Bot Protection julga as ações sobre as quais o seu servidor pergunta, como um cadastro, um login ou um checkout, não o carregamento das páginas. Em block mode, um bot ainda carrega as suas páginas; o que o seu servidor recusa é a ação.

O seu site, sem os bots

Crie uma conta, copie dois trechos de código e veja as decisões chegarem.