
Most scrapers treat a HUMAN press-and-hold interstitial the way they treat HTTP 429: slow down, rotate, buy more IPs. Against PerimeterX / HUMAN Bot Defender, that reflex burns bandwidth and never clicks the gate. The challenge is an integrity UI, not a token bucket. Residential proxies can change the outcome only when the failure is still IP-shaped — no valid _px3, origin-side risk seeing socket_ip. Once the press-and-hold shell is on screen, the proxy cannot complete it.
Deep playbook: PerimeterX / HUMAN press-and-hold: read the signals. This post is the misdiagnosis piece, same job as Kasada 429 vs rate limit: classify, three-way probe, then pick a lever. Public-data scope only — no CAPTCHA-solver instructions, no hold-duration recipes, no worker-farm wiring.
[!IMPORTANT] Live notes dated 2026-08-10 on SDK-visible defaults and template markers. Cookie names, first-party paths, and whether a given route is MONITOR or blocking vary by customer. Re-verify before you hard-code assumptions. Edges drift.
Why the misdiagnosis is expensive
HUMAN’s SDK library defaults are moduleMode MONITOR and blockingScore 100. Fresh or lightly configured properties can score quietly for weeks: your scraper sees 200s, the dashboard says healthy, and then onboarding or remote config flips the path to blocking. Operators read that flip as “the proxy pool went bad” and respond with rotation, sleeps, and a larger GB bag.
None of those actions execute the sensor or complete press-and-hold. All of them increase time-to-signal. The same folklore that makes Kasada 429 expensive — urllib3 and Scrapy treating the status as retryable — shows up here as “the CAPTCHA will clear if we look like more users.” It will not. A press-and-hold document is already the decision.
A related trap: looking for a permanent client-visible response beacon. Bot Defender has almost no always-on x-px-* response header. Set-Cookie: _pxhd appears when the risk API returns a fresh value. Absence of a branded header is not absence of HUMAN.

Identification that survives branding tricks
Lead with artifacts that survive first-party mode (library default true, which can hide perimeterx.net hosts):
| Marker | Role |
|---|---|
meta name="description" content="px-captcha" | Strongest portable challenge HTML marker across Java/PHP/Python SDK templates |
Set-Cookie: _px3= | v3 risk token (hmac:payload); proves deployment, not clearance |
Set-Cookie: _pxhd= | Optional long-lived cookie when risk API returns a fresh value |
window._pxAppId on challenge HTML | Corroboration; first-party paths are appId-derived |
JSON 403 with appId / blockScript-style fields | Advanced Blocking Response for JSON-preferring clients — an enforcer signal, not catalog JSON |
Do not identify by an unofficial <div id="px-captcha"> — that id is not a reliable template contract. Do not replay _px3 under a different User-Agent: web cookie-origin tokens bind HMAC to UA, so lifted cookies fail. Do not confuse __pxvid (two underscores, Code Defender) with _pxvid / pxvid (Bot Defender). Different products.
Negative control: a 403/429 with no _px3/_pxhd, no px-captcha meta, and no _pxAppId is probably another vendor or the CDN in front — use the anti-bot hub matrix, not a HUMAN runbook.
On HTML bodies, search both attribute orders (name then content, and the reverse). First-party mode means you may never see a third-party HUMAN hostname; look at cookies and meta anyway.

Three-way curl before you touch the UI
Compare plain, Chrome-UA, and residential on the same URL. Log which legs set _px3 / _pxhd versus which return px-captcha HTML. If all three get the challenge shell, IP rotation will not click press-and-hold for you.
Code SnippetU=https://TARGET/ A='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36' P=http://aethyn-XXXXX-country-us:PASSWORD@proxy.aethyn.io:5499 for tag in plain ua res; do case $tag in plain) opts=() ;; ua) opts=(-A "$A") ;; res) opts=(-A "$A" -x "$P") ;; esac echo "== $tag ==" curl -sS -D - -o /tmp/px.$tag "${opts[@]}" "$U" | grep -iE 'HTTP/|set-cookie: _px|content-type' grep -i 'px-captcha\|_pxAppId' /tmp/px.$tag | head -n 3 done
Replace TARGET with a URL you are allowed to collect. Elite HTTP 5499 for the residential leg (SOCKS5 3499 if the collector is Playwright SOCKS). Premium 2099 / 1099 is enough for a cheap header survey when you are still asking “is HUMAN even here?”
ABR JSON: a 403 with Content-Type: application/json and appId / blockScript-style fields means Bot Defender answered a JSON-preferring client. Do not ingest it as product data. It also does not tell you captcha versus hard-block by itself.

Where residential proxies fit
| Layer | Proxy effect |
|---|---|
Datacenter ASN / velocity / geo, no valid _px3 | Residential can help (socket_ip is on the thin risk path) |
| Press-and-hold / HUMAN Challenge UI | Proxy cannot complete the hold |
Sensor / _px3 minting | Needs a real browser context under your compliance policy |
| TLS / HTTP fingerprint alone | Needs browser-grade client |
Use Aethyn Elite HTTP 5499 (SOCKS5 3499) when the three-way probe implicates reputation; hold ISP/country steady with -session-…-lifetime-N (1–1440 min, default 30) after a browser-backed flow can establish cookies — sticky is a rotating-pool hold, not a dedicated IP. Premium HTTP 2099 / SOCKS5 1099 for inexpensive cookie/header surveys. Honest bottom line: HUMAN is among the vendors where “buy more IPs” is least sufficient once the challenge UI is showing.
This page does not teach CAPTCHA solving. If the data is available through a documented API or licensed feed, that remains the correct engineering answer.
Decision tree (one screen)

- Does the response carry HUMAN markers (px-captcha meta /
_px3/_pxhd/_pxAppId/ ABR JSON)?- No → another vendor or a generic 403/429; status playbook may apply.
- Yes → stop treating it as backoff; go to step 2.
- Is the failure identical on plain curl, Chrome-UA curl, and residential curl?
- Yes, all challenge shells → client/JS/UI layer; plan a browser-backed stack under Terms. Do not scale rotation.
- No, residential flips it → keep Elite (or Premium if the survey was enough); re-measure.
- Are you looking at ABR JSON?
- Yes → fail closed as an enforcer document; do not parse as catalog.
Geo mismatch after adding a proxy (exit country vs browser locale) is a common self-inflicted failure — diagnose it; do not treat this page as an evasion checklist.
Related error funnels
Continue with cookie HMAC notes, first-party paths, and remediation order: PerimeterX / HUMAN press-and-hold.
Common questions about this article
Is PerimeterX press-and-hold a rate limit?
What is the most portable HUMAN HTML marker?
Does a _px3 cookie mean I passed?
Will residential proxies finish press-and-hold?
What do MONITOR mode and blockingScore 100 mean?
Guides, integrations & docs
Continue reading

Kasada 429 vs Rate Limit: Stop the Misdiagnosis
Kasada often challenges unverified clients with HTTP 429 (or 403 on API routes) — not a cooldown. Learn x-kpsdk-* tells, the UUID script path, and why backoff burns bandwidth.

DataDome 403: Same Status, Different Outcomes (Scraping)
DataDome returns HTTP 403 for device check, CAPTCHA, and ban. Learn x-datadome: protected, the datadome cookie, and how to classify bodies before rotating proxies.

What Is Akamai Reference #18 Access Denied? (Scraping Guide)
Reference #18 means Akamai edge Access Denied — not a random Ray ID. Decode the receipt, separate #9 malformations from bot decisions, and know when residential proxies help.
Classify HUMAN before you rotate
If px-captcha meta or a press-and-hold shell is present, IP rotation will not click the challenge. Use Elite residential only when the three-way probe says the failure is reputation-shaped.