Korzen
Bot Protection

API voor botdetectie

Klanten erin, bots eruit

Vóór een login, een registratie, een checkout of elke pagina waar bots op uit zijn, vraagt je server Bot Protection naar de bezoeker en krijgt een klasse, een score en de redenen terug. Geen proxy voor je site, geen puzzels voor je klanten.

14 dagen gratis · abonnementen vanaf $29 per maand

# 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
}
·:+* binnenkomende requests | Bot Protection, vóór je actie x een bot, tegengehouden # een mens, doorgelaten

Wat het tegenhoudt

De aanvallen waarvoor Bot Protection is gebouwd, bij de stap waar elk ervan op uit is.

Gemeten, niet beloofd

Herkende automatiseringstools
15 van 15
Playwright met stealth-flags, Chrome bestuurd via CDP, curl_cffi vermomd als Chrome: onze eigen tests, 17 oktober 2026
Antwoordtijd, p99
onder 3 ms
bij 600 beslissingen per seconde, gemeten op de server, op 4 cores zoals de VM, 20 oktober 2026
Standaard-timeout
200 ms
daarna, of bij elke fout, komt je bezoeker erdoor

Het dashboard

Zie elke beslissing, en waarom

Het dashboard dat je team opent als het verkeer piekt: wat Bot Protection heeft geantwoord, uur na uur, en de regels achter elk antwoord.

Bot Protection · Overzicht
Het overzicht: beslissingen per uur gestapeld per klasse, het aandeel bots, de belangrijkste redenen en de nieuwste bots

Elk antwoord, met de redenen

De laatste beslissingen, nieuwste eerst, om de paar seconden ververst. Filter op klasse, pad, land, reden of tijd, en zie elke regel die afging. Ga met je muis over een reden om te lezen wat die betekent.

Bot Protection · Beslissingen
De tabel met beslissingen gefilterd op klasse, met tijd, klasse, bot score, pad, land en redenen

Hoe het werkt

Twee stukjes code. Niets verandert aan je verkeer

1

Voeg de tag toe

Een klein script in je pagina's stuurt wat de browser over zichzelf laat zien rechtstreeks naar Bot Protection en bewaart een ondertekende token in een first-party cookie.

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

Vraag het vóór de actie

Vóór een login, een registratie, een checkout of elke pagina waar bots op uit zijn, stuurt je server het IP, de User-Agent en de token van de request, met een korte timeout.

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

Pas de actie toe

Elk antwoord zegt allow, challenge of block. Je begint in monitor mode, waarin het altijd allow is, en zet block mode aan zodra je het vertrouwt. Bij elke fout of timeout laat je de bezoeker door.

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

Of plak één prompt in Claude Code, Codex of Cursor en laat die allebei toevoegen: instellen met AI.

Handleidingen voor Next.js, Express, Django, Rails, Laravel, Spring Boot, ASP.NET Core, Cloudflare Workers en meer, in de docs.

Het antwoord

Een klasse waar je op kunt handelen, geen getal om naar te raden

human high

Een mens, met bewijs van buiten de sessie: een eerdere bestelling, een eigen kaart.

allow
human

Een mens voor wie je eigen feedback instaat.

allow
unknown

Niet genoeg bewijs, de ene of de andere kant op. De meeste eerste bezoeken komen hier terecht.

allow
bot

Automatisering, herkend aan wat de client doet.

challenge
bot high

Automatisering, met sterk bewijs in het gedrag.

block

Wijst sterk bewijs beide kanten op, dan zegt het antwoord step_up: vraag om een passkey of 3-D Secure, niet om een CAPTCHA.

Wat Bot Protection leest

Bewijs dat een bot niet lang kan vervalsen

Consistentie

Klopt de User-Agent met de client hints, het platform, de Web Worker, de GPU? Een gepatchte browser spreekt zichzelf tegen.

Echte input

Welke soorten input de pagina zag: muis, toetsen, touch, scrollwiel. Scripts klikken zonder ooit te bewegen.

Het netwerk

Datacenters, een tijdzone ver van het IP, een round trip die een proxy-hop verraadt.

Farms

Eén apparaat achter veel netwerken, één token op veel exits, één fingerprint over sessies heen: groepen die een farm niet kan vermijden.

Gedrag in de tijd

Een robotachtig ritme, opnieuw proberen na weigeringen, requests die nooit een pagina laden. Tien minuten geheugen per bezoeker.

Jouw feedback

Meld een afgeronde bestelling of een chargeback aan Bot Protection. Bewijs van buiten de sessie is wat een bezoeker tot mens maakt.

Waarom een API

Bescherming zonder nieuw point of failure

Bot ProtectionCAPTCHAProxy voor je site
Je bezoekers lossen puzzels opNooitElke keerSoms
Je verkeer gaat erdoorheenNeeNee, maar elk formulier wacht eropHelemaal
Als het down isBezoekers komen erdoorFormulieren liggen stilJe site ligt stil
Vertelt je waaromDe klasse, de score en het soort bewijsGeslaagd of nietEen score
Waar je beslistIn je eigen codeIn hun widgetIn hun regels

Vragen

Voordat je het vraagt

Worden echte klanten geblokkeerd?

Een VPN, een mobiel netwerk of een gedeelde kantoorverbinding kan de score verhogen, maar komt op zichzelf nooit bij bot uit. Voor bot is bewijs van automatisering nodig in wat de client doet. Klanten die al eerder bij je kochten, komen terug als human high.

Slaat Bot Protection persoonsgegevens op?

Identifiers worden gehasht met een sleutel per klant die elke dag roteert, zodat ze niet over klanten of dagen heen te koppelen zijn. Gedrag wordt na tien minuten vergeten; alleen tellingen en de laatste beslissingen blijven bewaard voor je dashboard.

Ziet een geblokkeerde bot mijn site nog?

Ja. Bot Protection beoordeelt de acties waarnaar je server vraagt, zoals een registratie, een login of een checkout, niet het laden van pagina's. In block mode laadt een bot je pagina's nog steeds; wat je server weigert, is de actie.

Je site, zonder de bots

Maak een account aan, kopieer twee snippets en kijk hoe de beslissingen binnenkomen.