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
}Wat Bot Protection over jou beslist
Vraag het nu naar deze browser: het draait zijn tag op deze pagina en antwoordt wat je server zou krijgen, de klasse, de score en de redenen.
Alleen als je het vraagt. De beslissing wordt bewaard zoals elke andere, zoals het privacybeleid zegt. Privacy
Wat het tegenhoudt
De aanvallen waarvoor Bot Protection is gebouwd, bij de stap waar elk ervan op uit is.
- Registratie Nepaccounts en misbruik van gratis proefperiodes Scripts die per honderd accounts openen voor tegoed, acties, proefperiodes of spam: new account fraud. Lezen →
- Login Credential stuffing en account takeover Gelekte combinaties van e-mailadres en wachtwoord, net zo lang op je login uitgeprobeerd tot er een paar werken. Lezen →
- Checkout Card testing Kleine betalingen met gestolen kaarten, om uit te zoeken welke nog werken voordat ze worden verkocht. Lezen →
- Elke pagina Scraping en scalping Prijzen, content en beperkte voorraad weggekaapt door automatisering, sneller dan welk mens ook. Lezen →
Gemeten, niet beloofd
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.
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.
Hoe het werkt
Twee stukjes code. Niets verandert aan je verkeer
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>
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"}
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
Een mens, met bewijs van buiten de sessie: een eerdere bestelling, een eigen kaart.
allowEen mens voor wie je eigen feedback instaat.
allowNiet genoeg bewijs, de ene of de andere kant op. De meeste eerste bezoeken komen hier terecht.
allowAutomatisering, herkend aan wat de client doet.
challengeAutomatisering, met sterk bewijs in het gedrag.
blockWijst 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 Protection | CAPTCHA | Proxy voor je site | |
|---|---|---|---|
| Je bezoekers lossen puzzels op | Nooit | Elke keer | Soms |
| Je verkeer gaat erdoorheen | Nee | Nee, maar elk formulier wacht erop | Helemaal |
| Als het down is | Bezoekers komen erdoor | Formulieren liggen stil | Je site ligt stil |
| Vertelt je waarom | De klasse, de score en het soort bewijs | Geslaagd of niet | Een score |
| Waar je beslist | In je eigen code | In hun widget | In 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.