GuidesAdvanced

How to Bypass Kasada in 2026: A Scraping Guide

How to bypass Kasada in 2026: spot it in DevTools, see how its proof-of-work and invisible checks work, and use three methods that keep scrapers running.

VoidMob Team
12 min read
Browser DevTools network tab beside the Kasada logo and three numbered check layers

How to bypass Kasada starts with how it blocks: an invisible proof-of-work and automation checks instead of CAPTCHAs, so a plain HTTP request gets a bare 429 or 403. What keeps working is a real, patched browser that completes the challenge itself, routed through a mobile proxy on a carrier IP that stays fixed for the whole session.

Key takeaways

  • No CAPTCHA ever appears: a blocked scraper sees a 429 or 403, a challenge script and headers starting with x-kpsdk.
  • Its challenge is a proof-of-work plus hidden automation checks, so it needs something that runs JavaScript like a real browser.
  • Proxies alone do not bypass Kasada, but a datacenter IP fails even when the browser passes, so the IP layer still decides the outcome.
  • A common setup is a patched browser on a mobile proxy, with one profile and one IP per session.
  • Checks continue after the first page. Rotate IPs between sessions, never during one, and send the browser back through the challenge when blocks return.

How to Tell a Site Uses Kasada

With no CAPTCHA to look at, the evidence sits in the network traffic. Open DevTools, switch to the Network tab and reload the page. Most deployments show three signs:

  • Status 429 or 403 on the first document request, with a near-empty page and no CAPTCHA or explanation.
  • An ips.js challenge script (the usual name), loaded from a long UUID-style path.
  • Headers that start with x-kpsdk on the challenge response and on later protected requests.

Exact paths and cookie names vary by site, but those three together are a reliable sign. You can run the same check from a script:

check_kasada.py
1import requests2 3URL = "https://www.example.com/"4 5resp = requests.get(URL, timeout=15)6kasada_headers = [h for h in resp.headers if h.lower().startswith("x-kpsdk")]7 8print("Status:", resp.status_code)9print("Kasada headers:", kasada_headers or "none")10print("Challenge script in page:", "ips.js" in resp.text)

Even a 200 on the homepage does not rule Kasada out. Many sites protect only search, login or checkout, so run the check against the endpoint you actually need.

How Kasada Detects Scrapers

Kasada describes its model as zero trust, where "all requests are guilty until proven innocent". In practice, a request has to clear five layers:

  1. TLS and HTTP fingerprint. HTTP libraries negotiate TLS differently from browsers, and that handshake is visible before any header is read. Our JA3 vs JA4 breakdown covers how that fingerprint works.
  2. IP type and reputation. Datacenter ranges carry no consumer history. Mobile carrier IPs sit behind carrier-grade NAT, shared with real phone users.
  3. Proof-of-work. Kasada calls it an "asymmetric proof-of-work cryptographic challenge" that makes attacks "computationally expensive." One visitor barely notices it; ten thousand scripted requests pay for it in CPU time.
  4. Client-side interrogation. A "polymorphic client-side virtual machine" checks the browser for traces that automation frameworks leave behind, and Kasada keeps changing how that code is presented.
  5. Ongoing integrity checks. Kasada runs checks against "data tampering and replay attacks," so tokens copied out of a session do not stay valid for long, and a session keeps being scored after the first page.

Expect these layers to keep moving, since Kasada raised $20 million in February 2026 and is putting part of it into what it calls agentic defense, aimed at AI-driven automation.

Datacenter VPS + stock headless ChromePatched browser + dedicated mobile proxy
  • IPHosting range, no consumer historyCarrier IP on one mobile device
  • BrowserAutomation traces visiblePatched, headful, persistent profile
  • SessionNew IP per requestOne IP held per session
  • Proof-of-workRuns, but the session still failsSolved in a real browser

How to Bypass Kasada: 3 Methods

Most durable Kasada setups put a real browser somewhere in the chain, because a browser completes the proof-of-work and passes the client-side checks natively. The methods differ in how much of the scraping that browser does.

Intended use

Kasada-protected scraping is for legitimate work: public price and market monitoring, SEO and SERP tracking, ad verification, and research on public pages. It is not appropriate for fraud, credential abuse, engagement manipulation, or any activity that violates a target platform's Terms of Service.

MethodSolves the challengeCost per pageDurabilityEffort
Method 1: Patched browser + mobile proxyYes, on every pageHighestHighestMedium
Method 2: Browser-minted session, reusedOnce per sessionLow after the first pageUntil Kasada rechecksHigh
Method 3: A path Kasada does not guardNot neededLowestDepends on the sourceVaries

Method 1: Patched Browser on a Mobile Proxy

Stock Playwright, Puppeteer and Selenium leak automation traces that Kasada's client checks look for. Patched builds remove them. Patchright, a drop-in replacement for Playwright, shows the setup in its own example: real Google Chrome instead of Chromium, headful mode and a persistent profile. Leave the user agent and headers at their defaults rather than overriding them. Camoufox (a patched Firefox), Nodriver and SeleniumBase UC mode take the same idea in other directions, and our CloakBrowser guide walks through a stealth Chromium build paired with a mobile proxy.

The proxy is the other half: one carrier IP per session. A proxy list set to sticky does this on the shared pool, and a dedicated mobile proxy is one real 4G/5G device per customer, so run one per concurrent session; its host and credentials are shown on the proxy page. A sticky list holds the same device only while that device stays online. The snippet below uses a sticky list.

kasada_session.py
1# pip install patchright && patchright install chrome2from patchright.sync_api import sync_playwright3 4PROXY = {5  "server": "http://proxy.voidmob.com:10000",6  "username": "<list-username>",  # list set to sticky (rotation_period_seconds: -1)7  "password": "<list-password>",8}9 10with sync_playwright() as p:11  context = p.chromium.launch_persistent_context(12      user_data_dir="profiles/session-01",  # one profile per session, reused13      channel="chrome",                     # real Google Chrome, not Chromium14      headless=False,                       # run under Xvfb on a server15      no_viewport=True,16      proxy=PROXY,17  )18  page = context.new_page()19  page.goto("https://www.example.com/", wait_until="domcontentloaded")20  page.wait_for_load_state("networkidle")  # let the challenge finish and reload21  print(page.title())22  context.close()

Keep the profile folder between runs, so cookies and session state carry over the way they would for a returning visitor. On a server without a display, run the script under Xvfb rather than switching to headless mode. Move through the site the way a person does, through category pages and search rather than straight to deep URLs, and pace page loads unevenly.

Method 2: Mint the Session in a Browser, Reuse It at Volume

Rendering every page in a browser is the slowest and most expensive part of Kasada scraping. Once the browser has cleared the challenge, its cookies and tokens can go to a lighter client, such as curl_cffi with Chrome impersonation, which sends the follow-up requests through the same IP. This suits JSON endpoints behind a page, where one browser visit can cover many API calls.

Kasada's replay protection sets the limit. Tokens expire, and once responses turn back into 429s, the session needs a fresh pass through the browser. Running many sessions in parallel works well on the shared pool with one sticky list per worker (a package holds up to 100 lists), so each worker keeps its own carrier IP while its token lives.

Method 3: Find a Path Kasada Does Not Guard

Check for an official API, a public data feed or a sitemap before building any of the above. Do not assume a mobile app or API is softer: Kasada's Crocs case study describes bots reaching the website, the mobile apps and the APIs alike. Managed unblocker services are the other shortcut, trading control over the setup for a per-request price.

Kasada Proxies: Which IPs Work and How to Hold Them

Proxies for Kasada bypass setups decide the IP layer, and that layer can fail a session even when the browser passes everything else. Datacenter IPs rarely survive it. Residential IPs can work on lighter deployments. Mobile IPs hold up best, because a carrier address is shared with real subscribers behind CGNAT and blocking it means blocking paying customers.

How the IP behaves matters as much as its type. Sessions are evaluated as a whole, so an IP that changes between page loads looks like a session that moved networks mid-visit. Hold one IP for each session, as a sticky session on a rotating pool or as a dedicated mobile device that changes IP only when you call its rotation link, at most once a minute.

Rotate between sessions, never during one

Per-request rotation suits sites without Kasada. On Kasada, finish the session on one IP, close the browser profile, then rotate before the next session starts.

Check which IP type a site reads from your own connection:

What does your IP reveal right now?

Passed Kasada, Then Blocked Minutes Later

Scoring continues after the first page, which is why a scraper can clear the challenge and still get cut off a few minutes in. Common causes:

  • Expired tokens in a handoff. A lighter client kept reusing a session past its lifetime. Send the browser back through the challenge.
  • An IP change mid-session. A per-request pool or an automatic rotation swapped the IP. Switch to sticky sessions.
  • Shared profiles. Several sessions ran from one browser profile and fingerprint. Give each session its own profile.
  • Machine-paced navigation. Identical intervals and direct hits on deep URLs. Vary timing and move through real pages.
  • TLS mismatch. Follow-up requests left from Python's default TLS stack instead of a browser-matching one. Use curl_cffi with impersonation, or keep the work in the browser.
  • Headless mode. Run headful under Xvfb instead.

Dedicated mobile proxies on real carrier IPs

One real 4G/5G device per customer on a carrier connection, with rotation on demand.

FAQ

What is Kasada?

Kasada is a bot mitigation company founded in Sydney in 2015. Its platform screens every request with invisible checks, including a proof-of-work challenge and client-side automation detection, instead of showing CAPTCHAs. Sites use it against scraping, account takeover and checkout bots.

How do I know if a website uses Kasada?

Open DevTools and reload with the Network tab open. Protected sites typically return a 429 or 403 to automated requests without any CAPTCHA, load a challenge script often named ips.js, and send headers starting with x-kpsdk. A 200 on the homepage does not rule it out, because many sites protect only search, login or checkout.

Does Kasada use CAPTCHAs?

No. Kasada describes its product as CAPTCHA-less: the challenge runs invisibly in the browser as a proof-of-work and an automation check. Real visitors never see a puzzle, which is why scrapers only see a blocked response.

Can Python requests bypass Kasada?

Not on its own. Python's requests library cannot run JavaScript, so it cannot complete Kasada's proof-of-work, and its TLS handshake does not match a browser. It can reuse a session that a real browser created, but only until Kasada rechecks it.

Do proxies alone bypass Kasada?

No. A proxy changes the IP, but the proof-of-work and the client-side checks run in the browser. Proxies still matter, because a datacenter IP fails the reputation layer even when the browser passes, so the working setup is a patched browser plus a clean mobile IP.

What are the best proxies for Kasada?

Mobile proxies, held sticky for each session. Carrier IPs are shared with real phone users behind CGNAT, so sites avoid blocking them outright, and a dedicated mobile device keeps one IP for as long as a session needs it. Residential IPs can work on lighter deployments; datacenter IPs rarely get past the reputation layer.

Why does my scraper pass Kasada and then get blocked minutes later?

Scoring continues after the first page. The usual causes are a token reused outside the browser after it expired, an IP that changed mid-session, several sessions sharing one browser profile, or machine-paced navigation. Hold one IP and one profile per session, and send the browser back through the challenge when blocks start.

Is it legal to scrape Kasada-protected websites?

US courts have read the Computer Fraud and Abuse Act narrowly: Van Buren v. United States (2021) limited it to areas of a system the user is not entitled to enter, and in hiQ v. LinkedIn the Ninth Circuit found serious questions about whether scraping public profiles counts as access "without authorization." hiQ still lost on breach of the site's user agreement in 2022, so contract, copyright and privacy law apply whether or not a site runs Kasada. Personal data also falls under GDPR and CCPA, and logged-in areas fall under the account's own terms. This is general information, not legal advice.

Real Browsers on Real Networks

Kasada is built to make shortcuts expensive: the proof-of-work taxes volume, the client checks catch automation traces, and the integrity checks age out anything copied out of a session. What it cannot cheaply block is a real browser on a real carrier network that behaves like one visitor from start to finish. Build every Kasada scraping setup around that, and treat lighter clients and token reuse as accelerators on top, not replacements for it.