Two steps to solve a challenge
1. Send a domain, get a clearance cookie + User-Agent + proxy. 2.Attach those to your own requests. That's the whole API.
Solve a domain
POST /v1/solve with your key. We solve the Cloudflare challenge on a real browser and real IP, and return the clearance triple.
curl -X POST https://raptorwayz.com/v1/solve \
-H "Authorization: Bearer <YOUR_KEY>" \
-H "Content-Type: application/json" \
-d '{"domain":"site.com"}'{
"cf_clearance": "hK9f…",
"user_agent": "Mozilla/5.0 … Chrome/149.0.0.0 Safari/537.36",
"proxy": "http://<YOUR_KEY>:x@raptorwayz.com:8080",
"expires_at": 1814453571,
"seconds_until_next": 1500,
"cached": false,
"plan": "paid"
}Use it with your data
Attach the cf_clearance cookie + User-Agent to your own request and route it through the returned proxy.
If Cloudflare re-challenges you, it's the IP. The clearance is only valid from the exit IP it was solved on, so send every request through the returned proxy (and keep the same User-Agent). Route from any other IP and Cloudflare invalidates the cookie and re-challenges, whatever the challenge type.
import requests
# The three values from step 1, they are bound together.
cf_clearance = "hK9f…"
user_agent = "Mozilla/5.0 … Chrome/149.0.0.0 Safari/537.36"
proxy = "http://<YOUR_KEY>:x@raptorwayz.com:8080"
resp = requests.get(
"https://site.com/whatever",
headers={"User-Agent": user_agent},
cookies={"cf_clearance": cf_clearance},
proxies={"https": proxy},
)
print(resp.status_code) # 200, you're throughAuthentication
The solve API uses an API key (one key = one solve / 25 min), passed as a bearer token. Keep keys server-side.
Authorization: Bearer <YOUR_KEY>
# or
X-Api-Key: <YOUR_KEY>Response fields
| Field | Type | Description |
|---|---|---|
| cf_clearance | string | The Cloudflare clearance cookie value. Send it as the cf_clearance cookie. |
| user_agent | string | The exact User-Agent to send. The clearance is bound to it. |
| proxy | string | The proxy to route through. The clearance is bound to this exit IP. |
| expires_at | number | Unix seconds for the cookie's nominal expiry (Cloudflare-set). Real validity is shorter, re-solve on the 25-min cadence. |
| seconds_until_next | number | Seconds until this key may solve a fresh domain again. 0 for trial keys. |
| cached | boolean | true when served from the warm cache or the idempotent window. |
| plan | string | "trial" or "paid". |
| free_calls_remaining | number | null | Remaining trial calls; null for paid keys. |
Quotas & billing
- •Paid key: one fresh solve per 25-minute window. Repeat calls inside the window replay the same response with
seconds_until_nextcounting down, no extra charge. Add keys for more throughput. - •Trial key: 3 free solves, no time window. Each success spends one; watch
free_calls_remaining. - •Failed solves cost nothing, a
502 solve_failedconsumes no quota.
Errors
Every non-200 returns { "error", "message", "seconds_until_next" }.
| Status | error | Meaning |
|---|---|---|
| 400 | invalid_domain | The domain was missing or malformed. |
| 401 | missing_api_key | No key supplied. Send Authorization: Bearer <key> or X-Api-Key. |
| 401 | invalid_api_key | The key is unknown. |
| 402 | trial_exhausted | Free trial calls used up. Buy a key to continue. |
| 403 | key_disabled | The key has been disabled. |
| 429 | rate_limited | Too many requests in a short burst (abuse limiter). |
| 502 | solve_failed | Could not obtain a clearance. No quota consumed, retry shortly. |
Manage your account and API keys in the dashboard.