DataDomeSliderCookie
Solve the DataDome slider puzzle from a captcha-delivery challenge URL and get the cleared datadome cookie.
DataDome serves the slider when it wants a human to drag a puzzle piece into place. DataDomeSliderCookie takes the captured challenge page, your proxy, and the matching User-Agent, then returns the cleared datadome cookie to replay on the request that was blocked.
Recognising a slider block
The block arrives as a 403 carrying a small HTML page with a dd object. Two markers identify the slider:
ddcontains'rt':'c'- the page loads
https://ct.captcha-delivery.com/c.js(note thec.js)
JSON and XHR endpoints skip the HTML entirely and return the challenge inline as { "url": "https://geo.captcha-delivery.com/captcha/?..." }. A /captcha/ path means slider; /interstitial/ means DataDomeInterstitialCookie.
Building captchaUrl
captchaUrl is the full geo.captcha-delivery.com/captcha/ URL, not the c.js script URL. Use the URL returned by a JSON response or captcha iframe when one is present. Otherwise parse var dd from the blocked HTML and construct it. The current datadome cookie becomes cid, while the full blocked websiteURL becomes referer.
This helper parses the normal DataDome block and builds the URL with proper percent-encoding:
function buildSliderUrl(html, datadomeCookie, websiteURL) {
const source = html.match(/var dd\s*=\s*({[\s\S]*?})\s*;?\s*<\/script>/)?.[1];
if (!source) throw new Error('DataDome var dd object not found');
const dd = JSON.parse(source.replaceAll("'", '"'));
if (dd.t === 'bv') throw new Error('DataDome blocked this IP; rotate the proxy');
if (dd.t !== 'fe') throw new Error(`Unexpected DataDome t value: ${dd.t}`);
const params = new URLSearchParams({
initialCid: dd.cid,
hash: dd.hsh,
cid: datadomeCookie,
t: dd.t,
referer: websiteURL,
s: String(dd.s),
e: String(dd.e),
dm: 'cd',
});
return `https://geo.captcha-delivery.com/captcha/?${params}`;
}GET that exact URL with the same proxy, cookies, User-Agent and browser-like headers used for websiteURL. Base64-encode the raw response bytes without changing the body:
const captchaUrl = buildSliderUrl(blockedHtml, datadomeCookie, websiteURL);
const challengeResponse = await httpClient.get(captchaUrl); // same session, proxy and headers
const challengePage = Buffer.from(challengeResponse.body).toString('base64');t=bv means the IP is burned
The t parameter must be fe. If it is bv, your proxy IP is hard-blocked at the network level. Solving the
challenge will not clear it and every attempt is wasted spend, so rotate to a new IP and re-trigger the block.
One IP, one User-Agent, start to finish
A proxy is required, and it must be sticky. Use the same proxy and User-Agent for triggering the block, fetching
challengePage, and replaying the cookie. Salamoonder does not forward the supplied proxy because it solves from
the captured session; other providers consume it directly. Match your TLS fingerprint and header order to a real
browser too, since a correct cookie on a mismatched client still gets a 403.
Use a shared Windows Chrome User-Agent
For automatic routing, use Windows Chrome 146, 147 or 148. Those versions currently overlap the provider-supported ranges. Use the exact same value for the protected request, challenge-page fetch, task and cookie replay. Mobile, macOS and other Chrome versions are not accepted by every provider.
Send the blocked cookie in both places
Put the blocked response's datadome value in the cid parameter of captchaUrl and in initCookies.datadome.
Some providers read it from the URL while CapMonster reads the separate cookie jar, so both are required for a
request that can route to every provider.
Raise trust first, solve less often
Sessions that post DataDome telemetry get challenged less. Run DataDomeTagsCookie
to obtain a warmed datadome cookie, then build captchaUrl with it as the cid parameter. That is what continues
the session, on every provider. initCookies additionally hands the jar to providers that accept a separate one.
Supported Providers
| Provider | Price per 1,000 | Routing |
|---|---|---|
| $2.50 | ||
| $1.45 | ||
| $2.20 | ||
| $1.00 | ||
| $2.76 | ||
| $0.60 |
Request Schema
| Field | Type | Required | Description |
|---|---|---|---|
clientKey* | string | Yes | Your API key. Create one in the AnySolver dashboard. Example: |
task* | object | Yes | The task body. Required fields depend on the task type. See Tasks for per-task schemas. View task properties |
settings | object | No | Per-request settings for routing, auto retry, auto fallback, and proxy behavior. See Routing Strategies. View settings reference |
Task Object Properties
The task field accepts an object with the following properties:
| Field | Type | Required | Description |
|---|---|---|---|
type* | Yes | ||
websiteURL* | URL | Yes | Full URL of the protected page that returned the DataDome block. Use this exact URL as the Example: |
challengePage* | string | Yes | Base64-encoded raw response body from a GET to Example: |
userAgent* | string | Yes | User-Agent used to request the protected page and Example: |
initCookies* | object | Yes | Cookies from the blocked response. Example: |
proxy* | string | object | Yes | |
captchaUrl* | URL | Yes | Full Example: |
Optional fields are not guaranteed across providers
Response Schema
| Field | Type | Required | Description |
|---|---|---|---|
status* | Yes | Task status: "processing", "ready", or "failed". Example: | |
errorId* | Yes | 0 = success, 1 = external error, 2 = internal error. Example: | |
taskId | string | No | Unique identifier returned when the task was created. Example: |
errorCode | No | Machine-readable error code. Example: | |
errorDescription | string | No | Human-readable error message with resolution hints. Example: |
cost | number | No | Actual cost charged for this task in USD. Example: |
taskType | No | The type of CAPTCHA task to solve. Example: | |
provider | No | Provider that handled this task. While processing, the provider currently solving it. Example: | |
solution | object | No |
Solution Object Properties
The solution field contains an object with the following properties:
| Field | Type | Required | Description |
|---|---|---|---|
datadome* | string | Yes | The solved DataDome cookie value to replay on the target. Example: |
raw* | Record<string, unknown> | Yes | Raw provider response data for advanced use cases. |
userAgent | string | No | User-Agent string used during solving (if applicable). Example: |