Which defense layers are scoring your request
Transport status
429 or 403 as a capability wall — not a token-bucket cooldown. Retries reproduce the same envelope.
Header family
x-kpsdk-* response headers and access-control-expose-headers listing them when the deployment emits them.
Cookie pair
Base cookie plus -ssn twin with identical value (often matching x-kpsdk-ct). Names vary by customer.
Challenge document / SDK
Small HTML with window.KPSDK bootstrap and ips.js under a hard-coded UUID path prefix on the origin.
Route scope
Protection is often limited to high-value paths (APIs, checkout). A clean homepage does not rule Kasada out.
IP reputation
Residential exits can change ASN scoring; they cannot execute the client integrity payload.
How to implement this with residential proxies
- 1
Grep for Kasada artifacts before calling it rate limiting
On the failing response, look for access-control-expose-headers containing x-kpsdk-, headers x-kpsdk-ct / x-kpsdk-r, a cookie pair ending in -ssn with equal values, window.KPSDK, or the UUID path fragment 149e9513-01fa-4fb0-aad4-566afd725d1b. If none exist, do not blame Kasada — check the fronting CDN/WAF.
Pythondef looks_like_kasada(headers: dict, body: str) -> bool: h = {k.lower(): v for k, v in headers.items()} expose = h.get("access-control-expose-headers", "").lower() if "x-kpsdk-" in expose or any(k.startswith("x-kpsdk-") for k in h): return True if "x-kasada-response-headers" in h: return True b = body or "" return "window.KPSDK" in b or "149e9513-01fa-4fb0-aad4-566afd725d1b" in b - 2
Prove determinism — three identical requests, no Retry-After
Issue three back-to-back GETs. Kasada challenges commonly repeat status, length class, and x-kpsdk-r (observed literal 1-AA on multiple deployments) without Retry-After. True rate limits usually advertise cooldown semantics; this gate does not yield to waiting.
- 3
Three-way curl with header dump
Plain, Chrome-UA, and residential. Record status plus x-kpsdk-* each time. Note: some sites place Kasada only on APIs — probe the failing path, not just /.
bashPATH_URL='https://TARGET/protected-path' UA='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36' AUTH='aethyn-XXXXX-country-us:PASSWORD' dump() { curl -sS -D - -o /tmp/k.body "$@" | grep -iE 'HTTP/|x-kpsdk|access-control-expose|set-cookie:|x-kasada|server:|retry-after'; echo body_len=$(wc -c </tmp/k.body); } dump "$PATH_URL" dump "$PATH_URL" -A "$UA" dump "$PATH_URL" -A "$UA" -x "http://$AUTH@proxy.aethyn.io:5499" grep -E 'KPSDK|149e9513-01fa-4fb0-aad4-566afd725d1b' /tmp/k.body | head - 4
Apply the negative control
If you only have a generic 403 and Server: DOSarrest (or similar) with zero Kasada markers, you are not looking at a Kasada challenge. Fix the actual edge. Conversely, a clean HTML document can still load KPSDK.configure([...]) listing protected API prefixes — check scripts on 200 pages.
- 5
Remediate by layer
IP-shaped differences across the three-way test → Elite residential. Identical Kasada envelopes on all exits → browser-grade client that can run the integrity path. Disable blind 429 retry middleware for URLs that match looks_like_kasada().
What goes wrong when this scraper fails
Operators see 429, enable urllib3/Scrapy retries, buy more bandwidth, and conclude the site is throttling them. On Kasada-protected routes that diagnosis is usually wrong: the status is the challenge gate. Misattribution is expensive because every default HTTP client treats 429 as retryable.
Why this failure mode happens
Kasada’s product model stresses client integrity from the first request. Interstitial HTML routes commonly answer unverified clients with 429 plus a bootstrap document; some API deployments answer with 403 and empty bodies while still attaching x-kpsdk-*. Cookie names are configurable, branding on the interstitial is minimal, and a CDN such as DOSarrest may sit in front — so status-only and Server-only heuristics fail.
How Aethyn residential proxies help here
Use Elite residential to hold ASN quality constant while you prove whether the gate is IP-shaped. Sticky sessions matter only after a browser-capable client can complete the integrity path.
- Elite HTTP 5499 / SOCKS5 3499 for harder retail/API tenants
- Premium 2099 for cheaper three-way negatives
- Country targeting when geography disagrees with Accept-Language
- Session suffixes for multi-step browser flows
- Honest limit: proxy ≠ Kasada challenge clearance
Common questions about this scraper problem
Is a Kasada 429 the same as being rate limited?
Can Kasada also return 403?
Is a 403 without x-kpsdk-* headers Kasada?
Do residential proxies clear Kasada challenges?
Which Aethyn port should I use?
Will you teach how to solve Kasada PoW?
Best practices that keep scrapers reliable
- Disable automatic 429 retries once Kasada markers appear
- Probe the failing route, not only the homepage
- Identify by header/UUID/KPSDK — not cookie display names
- Date-stamp observations; vendor constants can change
- Public-data / ToS-safe scope — no challenge-solving recipes
Common mistakes that burn proxy budget
- Calling every 429 a rate limit
- Assuming 403 means post-challenge ban
- Matching only KP_UIDz
- Ignoring API-only deployments
- Publishing exact ips.js byte sizes as signatures