Korzen
Bot Protection

API di rilevamento bot

Dentro i clienti, fuori i bot

Prima di un login, una registrazione, un checkout o qualsiasi pagina presa di mira dai bot, il tuo server chiede a Bot Protection chi è il visitatore e riceve una classe, uno score e le ragioni. Nessun proxy davanti al tuo sito, nessun rompicapo per i tuoi clienti.

14 giorni di prova gratuita · piani da 29 $ al mese

# 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
}
·:+* richieste in arrivo | Bot Protection, prima della tua azione x un bot, fermato # una persona, passa

Cosa ferma

Gli attacchi per cui Bot Protection è nato, nel punto preciso che ciascuno prende di mira.

Misurato, non promesso

Strumenti di automazione rilevati
15 su 15
Playwright con flag stealth, Chrome pilotato via CDP, curl_cffi che si spaccia per Chrome: i nostri test, 17 ottobre 2026
Tempo di risposta, p99
meno di 3 ms
a 600 decisioni al secondo, misurato sul server su 4 core, la taglia della VM, 20 ottobre 2026
Timeout predefinito
200 ms
oltre, o a qualunque errore, il visitatore passa

La dashboard

Ogni decisione, e il suo perché

La dashboard che il tuo team apre quando il traffico schizza: cosa ha risposto Bot Protection, ora per ora, e le regole dietro ogni risposta.

Bot Protection · Panoramica
La panoramica: decisioni all'ora impilate per classe, la quota di bot, le ragioni principali e gli ultimi bot

Ogni risposta, con le sue ragioni

Le ultime decisioni, dalla più recente, aggiornate ogni pochi secondi. Filtra per classe, path, paese, ragione o ora, e vedi ogni regola che è scattata. Passa il mouse su una ragione per leggere cosa significa.

Bot Protection · Decisioni
La tabella delle decisioni filtrata per classe, con ora, classe, bot score, path, paese e ragioni

Come funziona

Due pezzi di codice. Il tuo traffico non cambia

1

Aggiungi il tag

Un piccolo script nelle tue pagine invia direttamente a Bot Protection ciò che il browser mostra di sé e conserva un token firmato in un cookie first-party.

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

Chiedi prima dell'azione

Prima di un login, una registrazione, un checkout o qualsiasi pagina presa di mira dai bot, il tuo server invia IP, User-Agent e token della richiesta, con un timeout breve.

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

Applica l'azione

Ogni risposta dice allow, challenge o block. Parti in monitor mode, dove è sempre allow, e attivi la block mode quando ti fidi. In caso di errore o timeout, lascia passare il visitatore.

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

Oppure incolla un prompt in Claude Code, Codex o Cursor e lascia che aggiunga entrambi: configura con l'AI.

Guide per Next.js, Express, Django, Rails, Laravel, Spring Boot, ASP.NET Core, Cloudflare Workers e altro, nella documentazione.

La risposta

Una classe su cui agire, non un numero da interpretare

human high

Una persona, con una prova esterna alla sessione: un ordine passato, la sua carta.

allow
human

Una persona garantita dal tuo stesso feedback.

allow
unknown

Indizi insufficienti in un senso o nell'altro. Qui finisce la maggior parte delle prime visite.

allow
bot

Automazione, da ciò che fa il client.

challenge
bot high

Automazione, con forti indizi dal comportamento.

block

Quando indizi forti puntano in entrambe le direzioni, la risposta dice step_up: chiedi una passkey o il 3-D Secure, non un CAPTCHA.

Cosa legge Bot Protection

Indizi che un bot non può falsificare a lungo

Coerenza

Lo User-Agent corrisponde ai client hints, alla piattaforma, al Web Worker, alla GPU? Un browser modificato si contraddice.

Input reale

Quali tipi di input ha visto la pagina: mouse, tastiera, touch, rotellina. Gli script cliccano senza mai muoversi.

La rete

Datacenter, un fuso orario lontano dall'IP, un round trip che tradisce il passaggio da un proxy.

Farm

Un dispositivo dietro molte reti, un token su molte uscite, un fingerprint su più sessioni: raggruppamenti che una farm non può evitare.

Comportamento nel tempo

Ritmo robotico, tentativi ripetuti nonostante i rifiuti, richieste che non caricano mai una pagina. Dieci minuti di memoria per visitatore.

Il tuo feedback

Segnala a Bot Protection un ordine completato o un chargeback. È una prova esterna alla sessione a rendere umano un visitatore.

Perché un'API

Protezione senza un nuovo punto di guasto

Bot ProtectionCAPTCHAProxy davanti al tuo sito
I tuoi visitatori risolvono rompicapiMaiOgni voltaA volte
Il tuo traffico ci passa attraversoNoNo, ma ogni form lo aspettaTutto
Quando è giùI visitatori passanoI form si bloccanoIl tuo sito si blocca
Ti dice perchéLa classe, lo score e il tipo di indiziSuperato o noUno score
Dove decidiNel tuo codiceNel loro widgetNelle loro regole

Domande

Prima che tu lo chieda

I clienti veri verranno bloccati?

Usare una VPN, una rete mobile o la connessione condivisa di un ufficio può alzare lo score, ma da solo non porta mai a bot. Per bot servono indizi di automazione in ciò che fa il client. I clienti che hanno già comprato da te tornano come human high.

Bot Protection conserva dati personali?

Gli identificatori vengono sottoposti a hash con una chiave per cliente che ruota ogni giorno, quindi non si possono collegare tra clienti o tra giorni diversi. Il comportamento viene dimenticato dopo dieci minuti; per la tua dashboard si conservano solo i conteggi e le ultime decisioni.

Un bot bloccato vede ancora il mio sito?

Sì. Bot Protection giudica le azioni su cui il tuo server lo interroga, come una registrazione, un login o un checkout, non il caricamento delle pagine. In block mode un bot carica ancora le tue pagine; quello che il tuo server rifiuta è l'azione.

Il tuo sito, senza i bot

Crea un account, copia due snippet e guarda arrivare le decisioni.