Korzen
Bot Protection

API de détection de bots

Les clients entrent, les bots restent dehors

Avant un login, une inscription, un checkout ou toute page que visent les bots, votre serveur interroge Bot Protection sur le visiteur et reçoit une classe, un score et les raisons. Aucun proxy devant votre site, aucune énigme pour vos clients.

Essai gratuit de 14 jours · offres à partir de 29 $ par mois

# 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
}
·:+* requêtes qui arrivent | Bot Protection, avant votre action x un bot, arrêté # une personne, qui passe

Ce qu'il arrête

Les attaques pour lesquelles Bot Protection est conçu, à l'étape que chacune vise.

Mesuré, pas promis

Outils d'automatisation détectés
15 sur 15
Playwright avec flags stealth, Chrome piloté par CDP, curl_cffi déguisé en Chrome : nos propres tests, 17 octobre 2026
Temps de réponse, p99
moins de 3 ms
à 600 décisions par seconde, mesuré au serveur sur 4 cœurs, la taille de la VM, 20 octobre 2026
Timeout par défaut
200 ms
au-delà, ou à la moindre erreur, le visiteur passe

Le tableau de bord

Voir chaque décision, et pourquoi

Le tableau de bord que votre équipe ouvre quand le trafic s'envole : ce que Bot Protection a répondu, heure par heure, et les règles derrière chaque réponse.

Bot Protection · Vue d'ensemble
La vue d'ensemble : décisions par heure empilées par classe, la part de bots, les principales raisons et les derniers bots

Chaque réponse, avec ses raisons

Les dernières décisions, la plus récente en premier, actualisées toutes les quelques secondes. Filtrez par classe, chemin, pays, raison ou heure, et voyez chaque règle déclenchée. Survolez une raison pour lire ce qu'elle signifie.

Bot Protection · Décisions
Le tableau des décisions filtré par classe, avec l'heure, la classe, le bot score, le chemin, le pays et les raisons

Comment ça marche

Deux morceaux de code. Aucun changement à votre trafic

1

Ajouter le tag

Un petit script dans vos pages envoie ce que le navigateur montre de lui-même directement à Bot Protection et garde un token signé dans un cookie first-party.

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

Demander avant l'action

Avant un login, une inscription, un checkout ou toute page que visent les bots, votre serveur envoie l'IP, le User-Agent et le token de la requête, avec un timeout court.

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

Appliquer l'action

Chaque réponse dit allow, challenge ou block. Vous commencez en mode monitor, où c'est toujours allow, et activez le mode block quand vous lui faites confiance. En cas d'erreur ou de timeout, laissez passer le visiteur.

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

Ou collez un prompt dans Claude Code, Codex ou Cursor et laissez-le ajouter les deux : configurer avec l'IA.

Des guides pour Next.js, Express, Django, Rails, Laravel, Spring Boot, ASP.NET Core, Cloudflare Workers et plus, dans la doc.

La réponse

Une classe sur laquelle agir, pas un nombre à deviner

human high

Une personne, avec une preuve extérieure à la session : une commande passée, sa propre carte.

allow
human

Une personne dont votre propre feedback se porte garant.

allow
unknown

Pas assez d'éléments dans un sens ou dans l'autre. La plupart des premières visites arrivent ici.

allow
bot

De l'automatisation, d'après ce que fait le client.

challenge
bot high

De l'automatisation, avec de fortes preuves de comportement.

block

Quand de fortes preuves vont dans les deux sens, la réponse dit step_up : demandez une passkey ou 3-D Secure, pas un CAPTCHA.

Ce que lit Bot Protection

Des preuves qu'un bot ne peut pas falsifier longtemps

Cohérence

Le User-Agent correspond-il aux client hints, à la plateforme, au Web Worker, au GPU ? Un navigateur patché se contredit.

De vraies saisies

Les types de saisie que la page a vus : souris, clavier, tactile, molette. Les scripts cliquent sans jamais bouger.

Le réseau

Des datacenters, un fuseau horaire loin de l'IP, un aller-retour qui trahit un saut par un proxy.

Fermes

Un appareil derrière de nombreux réseaux, un token sur de nombreuses sorties, une empreinte à travers les sessions : des groupes qu'une ferme ne peut pas éviter.

Le comportement dans le temps

Une cadence robotique, des tentatives malgré les refus, des requêtes qui ne chargent jamais de page. Dix minutes de mémoire par visiteur.

Votre feedback

Signalez à Bot Protection une commande aboutie ou un chargeback. C'est une preuve extérieure à la session qui fait d'un visiteur un humain.

Pourquoi une API

Une protection sans nouveau point de défaillance

Bot ProtectionCAPTCHAProxy devant votre site
Vos visiteurs résolvent des énigmesJamaisÀ chaque foisParfois
Votre trafic passe par luiNonNon, mais chaque formulaire l'attendTout
Quand il tombeLes visiteurs passentLes formulaires s'arrêtentVotre site s'arrête
Vous dit pourquoiLa classe, le score et le type de preuveRéussi ou échouéUn score
Où vous décidezDans votre codeDans leur widgetDans leurs règles

Questions

Avant que vous ne demandiez

De vrais clients seront-ils bloqués ?

Être sur un VPN, un réseau mobile ou une connexion de bureau partagée peut faire monter le score mais ne suffit jamais, à lui seul, pour atteindre bot. bot exige des preuves d'automatisation dans ce que fait le client. Les clients qui ont déjà acheté chez vous reviennent en human high.

Bot Protection stocke-t-il des données personnelles ?

Les identifiants sont hachés avec une clé par client qui change chaque jour, ils ne peuvent donc pas être recoupés entre clients ni entre jours. Le comportement est oublié au bout de dix minutes ; seuls des compteurs et les dernières décisions sont gardés pour votre tableau de bord.

Un bot bloqué voit-il encore mon site ?

Oui. Bot Protection juge les actions sur lesquelles votre serveur l'interroge, comme une inscription, une connexion ou un checkout, pas le chargement des pages. En mode block, un bot charge toujours vos pages ; ce que votre serveur refuse, c'est l'action.

Votre site, sans les bots

Créez un compte, copiez deux snippets et regardez les décisions arriver.