Before you submit — these must be correct
If any of these are wrong, your token may be accepted by our solver but rejected or scored poorly by the target site. We can’t detect these mismatches for you.
- DataDome is the hardest anti-bot system on the market. Realistic success rate is 50-65% on enterprise sites even with residential — well below what you'd see on Akamai or Imperva. For mission-critical workflows, supply your own mobile (4G/5G) proxy via DataDomeSliderTask.
- Cookies are IP-bound. Reuse the same proxy on subsequent requests.
What is DataDome?
DataDome runs ~85,000 per-customer ML models and is widely considered the hardest anti-bot system in the industry. It scores behavior + IP reputation + TLS/JA3 fingerprint, with the slider being only the visible tip. Deployed on major e-commerce, ticketing, and travel sites where datacenter IPs almost always fail.
How it works
Send Task
POST your DataDomeSliderTask with the target URL and sitekey to our API. We'll queue it instantly.
We Solve
Capzy's proprietary solver handles DataDome's slider challenge end-to-end and returns the datadome cookie. ProxyLess is routed for you; DataDomeSliderTask uses your own proxy directly.
Get Token
Poll getTaskResult — when status is 'ready', the solution contains the token to inject into the target page.
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": "DataDomeSliderTask",
"proxyPort": "8080",
"proxyType": "http",
"proxyLogin": "user",
"websiteURL": "https://example.com/blocked",
"proxyAddress": "123.45.67.89",
"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)
# 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")Task parameters
typetypestringreqyesDataDomeSliderTaskwebsiteURLtypestringreqyesThe page URL showing the DataDome challengecaptchaUrltypestringreqnoThe DataDome challenge URL if different from the page (skips the warm-up navigation)proxyTypetypestringreqyesProxy protocol: http or httpsproxyAddresstypestringreqyesProxy IP address or hostnameproxyPorttypenumberreqyesProxy port numberproxyLogintypestringreqnoProxy username (if auth required)proxyPasswordtypestringreqnoProxy password (if auth required)userAgenttypestringreqyesUser-Agent string to use. Must match the UA you use when submitting the tokenSolution response
cookietypestringThe `datadome` cookie value. Set as the `datadome` cookie on your HTTP client. IP-bound — replay through the same proxy that solved.tokentypestringAlias of `cookie` for API-shape consistency. On silent-pass solves (DataDome didn't render the slider), returns the literal string `SOLVED_CHALLENGE_PASSED` — no cookie was set but the session is cleared.Example response
Full getTaskResult response shape. The fields in the table above describe what's inside solution — the outer envelope (errorId, status) is identical for every captcha type.
{
"errorId": 0,
"status": "ready",
"solution": {
"token": "abc123def456ghi789.cookieValueFromDataDome.AbCdEfGhIjKlMnOpQrSt",
"cookie": "abc123def456ghi789.cookieValueFromDataDome.AbCdEfGhIjKlMnOpQrSt"
}
}Error response
Failures use the same envelope with errorId: 1 plus errorCode + errorDescription. See the error-code reference for the full list.
{
"errorId": 1,
"errorCode": "ERROR_CAPTCHA_UNSOLVABLE",
"errorDescription": "Solver gave up — automatically refunded."
}Pending response
While the solver is still working, getTaskResult returns status: "processing". Poll every 1–2 seconds until ready or failed.
{
"errorId": 0,
"status": "processing"
}Features
task types
required: DataDomeSliderTask