How Kasada scores requests
Kasada operates as a gatekeeper proxy — every request flows through it before reaching the origin. Its JavaScript file (ips.js, polymorphically renamed on each deployment) issues a proof-of-work challenge that requires real CPU cycles and real browser APIs to solve. PoW tokens (x-kpsdk-ct) are single-use; reusing them is an immediate flag.
The standout 2026 detection vector: Kasada calls Function.prototype.toString() on dozens of native APIs (navigator.webdriver, WebGLRenderingContext.getParameter, HTMLCanvasElement.toDataURL). If playwright-stealth or any runtime stealth tool has patched them in JavaScript, the patched function returns function () { [custom code] } instead of function () { [native code] } — and Kasada has the full signature set indexed.
What does not work
playwright-stealth — every patch leaves a toString() trail. The patch signatures are catalogued and blocked outright.
undetected-chromedriver alone — removes the webdriver flag, but does not address the broader toString-detectable surface.
Datacenter proxies — IP reputation weight is heavy. AWS, GCP, DigitalOcean ASNs get near-zero trust regardless of browser quality.
Token replay — x-kpsdk-ct tokens are single-use. Caching them across requests, even to save cost, is an immediate flag.
What works
PatchRight is the canonical answer in 2026. It patches the Playwright Python source itself before Chrome ever starts. There is nothing in the JS runtime for toString() to inspect — the modifications happen at a layer Kasada cannot see.
SeleniumBase UC mode is a viable alternative — removes the WebDriver flag and auto-handles the PoW challenge.
Required around the browser: residential or ISP static IPs (datacenter is dead against Kasada), no token replay (always solve fresh), and a fresh session per session — no aggressive concurrency from one identity.
