DataDomeInterstitialCookie
Clear the DataDome interstitial device check and get the cleared datadome cookie, with no puzzle involved.
The interstitial is DataDome's silent device check: a "please enable JS" page that fingerprints the browser and clears itself without ever showing a puzzle. DataDomeInterstitialCookie takes the captured challenge page, your proxy, and the matching User-Agent, then returns the cleared datadome cookie.
Recognising an interstitial block
Like the slider, it arrives as a 403 with a dd object in the HTML. Two markers separate it from the slider:
ddcontains'rt':'i'- the page loads
https://ct.captcha-delivery.com/i.js(note thei.js)
JSON and XHR endpoints return the challenge inline as { "url": "https://geo.captcha-delivery.com/interstitial/?..." } instead of the HTML page. An /interstitial/ path means this task; /captcha/ means DataDomeSliderCookie.
Building captchaUrl
captchaUrl is the full geo.captcha-delivery.com/interstitial/ URL, not the i.js script URL. Use the URL returned by a JSON response or challenge 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 buildInterstitialUrl(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("'", '"'));
const params = new URLSearchParams({
initialCid: dd.cid,
hash: dd.hsh,
cid: datadomeCookie,
referer: websiteURL,
s: String(dd.s),
e: String(dd.e),
b: String(dd.b),
dm: 'cd',
});
return `https://geo.captcha-delivery.com/interstitial/?${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 = buildInterstitialUrl(blockedHtml, datadomeCookie, websiteURL);
const challengeResponse = await httpClient.get(captchaUrl); // same session, proxy and headers
const challengePage = Buffer.from(challengeResponse.body).toString('base64');The interstitial link carries b and has no t, which is the quickest way to tell the two challenge URLs apart once built.
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.
An interstitial can escalate to a slider
DataDome sometimes answers the device check by handing back a slider instead of a cleared session. If the site still
blocks you and the next challenge URL has a /captcha/ path, feed that URL to
DataDomeSliderCookie.
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: |