PerimeterX (HUMAN Security) Solver, solved in 5.0s.
Bypass PerimeterX press-and-hold protection. Returns _px3/_px2/_pxhd clearance cookies. Your own proxy required.
PerimeterX (now HUMAN Security) is a bot protection platform that scores requests on IP trust, browser fingerprint, TLS/JA3, and on-page behavior. The visible CAPTCHA is a press-and-hold button; the cookie hierarchy is _px3 (newer/strict, 60s expiry) > _px2 (older sites) > _pxhd (fallback).
Quick Integration
import requests, time
API = "https://api.capzy.ai"
KEY = "capzy_your_key_here"
# Step 1: Create task
task = requests.post(f"{API}/createTask", json={
"clientKey": KEY,
"task": {
"type": "AntiPerimeterXTask",
"websiteURL": "https://example.com",
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": "8080",
"proxyLogin": "user",
"proxyPassword": "pass"
}
}).json()
task_id = task["taskId"]
print(f"Task created: {task_id}")
# Step 2: Poll for result
while True:
result = requests.post(f"{API}/getTaskResult", json={
"clientKey": KEY,
"taskId": task_id
}).json()
if result["status"] == "ready":
print("Solved!", result["solution"])
break
elif result["status"] == "failed":
print("Failed:", result.get("errorDescription"))
break
time.sleep(1)
Using the result
# Step 3: Use the result — drop-in Cookie: header replay
sol = result["solution"]
headers = {
"Cookie": sol["cookie"],
"User-Agent": sol.get("userAgent", ""),
}
# IMPORTANT: route through the SAME proxy you supplied at solve time
resp = requests.get("https://target.example.com/", headers=headers, proxies={
"http": "http://USER:PASS@PROXY_HOST:PORT",
"https": "http://USER:PASS@PROXY_HOST:PORT",
})
print(resp.status_code, len(resp.text), "bytes")1. Send Payload
Dispatch your AntiPerimeterXTask to our processing cluster via the secure API endpoint.
2. Solving Engine
Capzy's proprietary solver returns the PerimeterX clearance cookies (_px3 / _px2 / _pxhd) needed to access the protected page. PerimeterX clearance cookies are bound to the solving IP — your client must replay requests through the same proxy you supplied at solve time, so the `AntiPerimeterXTask` (proxy-required) variant is the only supported task type. The ProxyLess variant is intentionally NOT offered for PerimeterX because tokens issued from our pool IPs would be rejected by your downstream calls.
3. Get Result
Poll getTaskResult for the validated token, then finalize your automated request.
Task Parameters
API SpectypetypestringreqyesAntiPerimeterXTask (proxy is required for PerimeterX — there is no ProxyLess variant)websiteURLtypestringreqyesFull URL of the PROTECTED parent page (the one the user is trying to access). NOT the PerimeterX challenge iframe URL — hitting `iframe.hsprotect.net` or `*.px-cdn.net` directly returns an empty stub and fails. Capzy rejects iframe URLs with `ERROR_INVALID_PARAMS` so you catch the wrong input on the first try.uuidtypestringreqnoThe visitor's `_pxvid` cookie value from the target page (UUID format). Pre-seeded into the solver's browser before navigation so PerimeterX mints a clearance cookie tied to YOUR visitor session, not a fresh one. Capture from DevTools → Application → Cookies → `_pxvid` on the protected page. **Strongly recommended** for sites that enforce visitor binding — without it our token belongs to a session PerimeterX won't recognize when your client replays.vidtypestringreqnoVisitor ID from the parent page's `window._pxhc.vid` (sometimes distinct from `uuid`). If only `uuid` is passed we use it for both. Set explicitly when the target exposes them as separate values.pxAppIdtypestringreqnoPerimeterX tenant ID (e.g. `PXzC5j78di`). Visible in the api.js URL on the target page: `//client.perimeterx.net/<pxAppId>/main.min.js`. Used for analytics + diagnostics._pxhdtypestringreqnoHardened device ID. If the target site sets `_pxhd` alongside `_pxvid`, pass it here so the solver context carries the same identity.cookiestypearray | object | stringreqnoYour existing PerimeterX session cookies, injected into the solver's browser BEFORE navigation so we solve bound to YOUR session — the one your client was blocked/challenged on — and the clearance validates when you replay it. Accepts a `[{name, value, domain?, path?}]` array, a `{name: value}` map, or a raw `Cookie:` header string. Most useful when your traffic is already being blocked: pass the cookies from that blocked response (alongside `uuid`/`_pxhd`) and we adopt that exact session.proxyTypetypestringreqyesProxy protocol: http, https, socks4, or socks5proxyAddresstypestringreqyesProxy IP address or hostnameproxyPorttypenumberreqyesProxy port numberproxyLogintypestringreqnoProxy username (if auth required)proxyPasswordtypestringreqnoProxy password (if auth required)userAgenttypestringreqnoUser-Agent string to use. Must match the UA you use when submitting the tokenResponse Shape
tokentypestringClearance cookie value alone (priority: _px3 > _px2 > _pxhd) — use when you only need the proof string.cookietypestringReady-to-paste `Cookie:` header value (`_px3=...; _pxhd=...; _pxvid=...`). Domain is intentionally omitted — it's a header value, not a jar entry, so it ships to whichever URL you're calling.cookiestypearrayAll _px* cookies as `{name, value, domain, path}` for customers building their own cookie jar.userAgenttypestringUser-Agent used during solve — must match on all replay requests (clearance is UA-bound).uuidtypestring**Only returned when `challengePresented` is `true`.** Visitor identifier (the `_pxvid` value) PerimeterX bound `_px3` to during the Hold Captcha. PerimeterX validates `_px3` + `_pxvid` + `_pxhd` as a triple — pin this `uuid` on your downstream session for the replay to validate. Omitted on silent passes because no fresh `_pxvid` is minted.vidtypestring**Only returned when `challengePresented` is `true`.** PerimeterX's `vid` parameter (`window._pxhc.vid` on the parent page). Usually equal to `uuid`; differs only when the target exposes them separately.challengePresentedtypeboolean`true` if PerimeterX actually rendered the Hold Captcha (press-and-hold) widget on this solve and we held it; `false` if our fingerprint passed silently. Both produce valid cookies — this just tells you which path minted them.holdDurationSectypenumberSeconds we held the press-and-hold button (`8.5`–`11.0`). `0` when the Hold Captcha was not presented.ipBoundtypebooleanAlways `true` for PerimeterX — flags that the proof is tied to the solving IP, so replays must come through the same proxy.Example response
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "<_px3 cookie value>",
"cookie": "_pxvid=<uuid>; _px3=<value>; _pxhd=<value>",
"cookies": [
{
"name": "_pxvid",
"value": "<uuid>",
"domain": ".target.example.com",
"path": "/"
},
{
"name": "_px3",
"value": "<value>",
"domain": ".target.example.com",
"path": "/"
},
{
"name": "_pxhd",
"value": "<value>",
"domain": ".target.example.com",
"path": "/"
}
],
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"challengePresented": true,
"holdDurationSec": 9.4,
"uuid": "<the _pxvid value PX bound _px3 to>",
"vid": "<usually equal to uuid>",
"ipBound": true
}
}Error response
{
"errorId": 1,
"errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
"errorDescription": "Solver gave up."
}Features
Pricing & Stats
Start solving perimeterx (human security).
$0.10 in free credits — no card. ~250 free solves to test before you spend.