Skip to content
capzy
PerimeterX (HUMAN Security)
AntiPerimeterXTask
proxy required

PerimeterX (HUMAN Security) Solver, solved in 5.0s.

Bypass PerimeterX press-and-hold protection. Returns _px3/_px2/_pxhd clearance cookies. Your own proxy required.

Avg Speed~5.0s
Success99%+
Cost / 1k$2.00
Throughput12/m

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

solve.py
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

use_result.py
# 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 Spec
Proxy fields below are required for this captcha — userAgent must match the one you’ll use when submitting the resulting token.
typetypestringreqyesAntiPerimeterXTask (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 socks5
proxyAddresstypestringreqyesProxy IP address or hostname
proxyPorttypenumberreqyesProxy port number
proxyLogintypestringreqnoProxy username (if auth required)
proxyPasswordtypestringreqnoProxy password (if auth required)
userAgenttypestringreqnoUser-Agent string to use. Must match the UA you use when submitting the token

Response 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

Solves Hold Captcha (HUMAN Challenge) — 8.5–11s hold
Bring your own proxy on the Task variant — tokens are IP-bound
Returns _px3 (priority) → _px2 → _pxhd with full _px* cookie set
Ready-to-paste `cookie` header string + structured `cookies` array
`challengePresented` field tells you whether the Hold widget actually fired
User-Agent capture for session continuity

Pricing & Stats

Per 1,000 solves$2.00
Avg solve time~5.0s
Success rate99%+
Throughput12/m

Start solving perimeterx (human security).

$0.10 in free credits — no card. ~250 free solves to test before you spend.

Frequently asked questions