The cheatsheet
Read this table top-to-bottom. The first row that matches the response wins — vendors do not stack on the same hostname and path, so once a row matches you have your answer.
| Vendor | Cookies | Headers | JS / block signature |
|---|---|---|---|
| Akamai Bot Manager | _abck, bm_sz, ak_bmsc | Server: AkamaiGHost | Inlined ~512 KB sensor.js; block body Pardon Our Interruption on 412 |
| Cloudflare Bot Management / Turnstile | cf_clearance, __cf_bm | Server: cloudflare, cf-ray, cf-mitigated: challenge | /cdn-cgi/challenge-platform/ assets; Turnstile widget at challenges.cloudflare.com; Error 1015 on rate limit |
| DataDome | datadome, dd_cookie_test_* | x-datadome-cid, x-dd-b | JS at /js/datadome.js; WASM boring_challenge; CAPTCHA at geo.captcha-delivery.com |
| PerimeterX (HUMAN) | _px3, _pxhd, _pxde, _pxvid | x-px-* family | JS at /init.js served from client.px-cdn.net; Human Challenge press-and-hold widget |
| Kasada | x-kpsdk-ct, x-kpsdk-cd | x-kpsdk-* response headers | Polymorphic ips.js (renamed per deployment); silent 403 / 429 with no challenge UI |
| F5 Shape Security | reese84, TS* | Custom TS* set-cookies | Custom JS VM bytecode; $rsc= URL params; minute-cadence token rotation |
Identification workflow on a single response
The cheapest reliable detector is a regex over the Set-Cookie headers (the headers where the server hands you cookies), with the Server header as a tiebreaker for Cloudflare. Work through these in order:
- Cookies first. Match the cookie names above against the response
Set-Cookieheaders. Akamai, DataDome, PerimeterX, Kasada, and F5 Shape all set distinctive names on the very first response, so this alone usually identifies the vendor. - Server header second.
Server: cloudflarepluscf-rayconfirms Cloudflare is in front, but a Cloudflare site with Bot Management turned off looks identical to one with it on. Look forcf-mitigatedor a Turnstile script tag to tell the two apart. - HTML body third. If you got an HTML response, search the script
srcattributes:sensor.js(Akamai),/cdn-cgi/challenge-platform/(Cloudflare),captcha-delivery.com(DataDome),px-cdn.net(PerimeterX),challenges.cloudflare.com(Turnstile). - Block body fourth. Once you are blocked, the page itself is diagnostic — Pardon Our Interruption is Akamai, Just a moment… is Cloudflare, and the captcha-delivery.com iframe is DataDome.
How the vendors differ architecturally
Identifying the vendor explains how a site is built more than the site's own design does. Each product has a distinct architecture worth understanding when you integrate with a service you are permitted to access:
- Akamai — frequently deployed on the web front-end while a brand's mobile API uses a simpler architecture; the web tier leans heavily on TLS-handshake and behavioural signals.
- Cloudflare — a CDN with optional Bot Management and Turnstile layers; the same hostname can range from no bot product at all to full ML scoring, which is why the tiebreaker step matters.
- DataDome — scores every request independently rather than building trust across a session, so IP reputation weighs heavily in its model. Some sites also embed data in
__NEXT_DATA__in the initial HTML. - PerimeterX (HUMAN) — reputation is shared across all of its customer sites, so a single fingerprint signal is evaluated network-wide rather than per-site.
- Kasada — inspects client code with
Function.prototype.toString(), which is why runtime JS patching is detectable and source-level approaches behave differently. - F5 Shape — a custom JS VM with minute-by-minute token rotation, the most engineering-intensive product to integrate against, which is why managed APIs are common for it.
