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
}O que o Bot Protection decide sobre você
Pergunte sobre este navegador, agora: ele roda a tag nesta página e responde o que o seu servidor receberia, a classe, o score e os motivos.
Só quando você pede. A decisão é guardada como qualquer outra, como diz a política de privacidade. Privacidade
O que ele barra
Os ataques que o Bot Protection foi feito para barrar, na etapa em que cada um acontece.
- Cadastro Contas falsas e abuso de trial Scripts que abrem contas às centenas atrás de créditos, promoções, trials ou spam: fraude de conta nova. Ler →
- Login Credential stuffing e roubo de conta Pares de email e senha vazados testados no seu login até alguns funcionarem (account takeover). Ler →
- Checkout Teste de cartão Pagamentos pequenos com cartões roubados para descobrir quais ainda funcionam antes de serem vendidos (card testing). Ler →
- Qualquer página Scraping e scalping Preços, conteúdo e estoque limitado levados por automação, mais rápido que qualquer pessoa. Ler →
Medido, não prometido
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.
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.
Como funciona
Dois trechos de código. Nenhuma mudança no seu tráfego
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>
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"}
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
Uma pessoa, com prova de fora da sessão: um pedido anterior, o próprio cartão.
allowUma pessoa confirmada pelo seu próprio feedback.
allowEvidência insuficiente para qualquer lado. A maioria das primeiras visitas cai aqui.
allowAutomação, pelo que o cliente faz.
challengeAutomação, com forte evidência de comportamento.
blockQuando 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 Protection | CAPTCHA | Proxy na frente do seu site | |
|---|---|---|---|
| Seus visitantes resolvem desafios | Nunca | Toda vez | Às vezes |
| Seu tráfego passa por ele | Não | Não, mas todo formulário espera por ele | Todo |
| Quando ele cai | Os visitantes passam | Os formulários param | Seu site para |
| Diz o porquê | A classe, o score e o tipo de evidência | Passou ou não | Um score |
| Onde você decide | No seu código | No widget deles | Nas 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.