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.
| 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 Set-Cookie headers, with the Server header as a tiebreaker for Cloudflare. 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 first response. - Server header second.
Server: cloudflare+cf-rayconfirms Cloudflare is in front, but Cloudflare without Bot Management enabled looks identical to Cloudflare with it. Look forcf-mitigatedor a Turnstile script tag to tell the difference. - HTML body third. If you got an HTML response, search for the script
src:sensor.js(Akamai),/cdn-cgi/challenge-platform/(Cloudflare),captcha-delivery.com(DataDome),px-cdn.net(PerimeterX),challenges.cloudflare.com(Turnstile). - Block body fourth. Once blocked, the body itself is diagnostic — Pardon Our Interruption is Akamai, Just a moment… is Cloudflare, the captcha-delivery.com iframe is DataDome.
What to do once you have identified the vendor
The vendor determines the next move more than the target itself does:
- Akamai — try the mobile API first; if forced to the web, use one ISP residential IP for the whole session and
curl_cffiwithimpersonate="chrome131", or a Go TLS reimplementation for hard deployments. - Cloudflare —
curl_cffihandles unprotected Cloudflare; Bot Management plus Turnstile needs a real browser or managed API. - DataDome — per-request scoring means IP quality matters more than session continuity. Mobile or residential IP +
curl_cffiis the common bypass; check for__NEXT_DATA__in the HTML before going browser-mode. - PerimeterX — reputation is shared across all customer sites, so a burned fingerprint is burned globally. Camoufox + clean residential is the typical play.
- Kasada —
Function.prototype.toString()inspection means runtime JS patches lose;PatchRight(source-level Python patches) is the working tool. - F5 Shape — the custom JS VM and minute-cadence token rotation make DIY uneconomical. Use a managed API.
