DataDomeInterstitialToken
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. DataDomeInterstitialToken completes that check on your proxy's exit IP and 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 DataDomeSliderToken.
Building captchaUrl
If you have the JSON url, pass it straight through. Otherwise take cid, hsh, s and b from the dd object, plus the datadome cookie set on the blocked response and the URL that was blocked. Assemble the query with URLSearchParams so every value is percent-encoded. Raw interpolation breaks here, because referer is a full URL and the cookie contains ~ and =, so their contents turn into extra parameters:
const params = new URLSearchParams({
initialCid: cid,
hash: hsh,
cid: datadomeCookie,
referer: blockedUrl,
s,
b,
});
const captchaUrl = `https://geo.captcha-delivery.com/interstitial/?${params}`;The interstitial link carries b and has no t or e, 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. The datadome cookie is bound to the exit IP and the userAgent you
submit, so use the same proxy and the same User-Agent for triggering the block, solving, and replaying. 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
DataDomeSliderToken.
Use a Windows Chrome User-Agent
CapSolver only accepts DataDome tasks on a Windows Chrome UA and publishes a fixed list of accepted strings; the
other providers accept anything. A mobile or macOS UA therefore solves on some providers and returns
INVALID_USERAGENT on CapSolver. That error is always refunded, never billed, but it is terminal unless you add
INVALID_USERAGENT to settings.fallback.fallbackOnErrors so routing moves to the next provider. Pick one of the
exact strings from CapSolver's accepted list: a Windows Chrome UA that is merely recent, but not on that list, is
still rejected.
CapMonster needs initCookies.datadome
CapMonster continues the blocked session from the cookie itself and only accepts it as a separate jar entry, so send
the datadome cookie from the blocked response as initCookies.datadome. Without it the task fails on CapMonster
only, with INVALID_TASK_DATA. That error is always refunded, and adding it to settings.fallback.fallbackOnErrors
moves routing to the next provider.
Raise trust first, solve less often
Sessions that post DataDome telemetry get challenged less. Run DataDomeTagsToken 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 |
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. |
provider | No | Specific provider to use. If omitted, automatic routing selects the best provider. Example: | |
selectionMode | No | Routing strategy for this request. Overrides the API key default. See Routing Strategies. Example: | |
keyPoolMode | No | Which provider key pool to use: Example: |
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 page where the CAPTCHA is displayed. Example: |
userAgent* | string | Yes | User-Agent used on the target page. The challenge is loaded and solved with it, so it must match. Example: |
proxy* | string | object | Yes | |
captchaUrl* | URL | Yes | URL of the DataDome interstitial (device check), taken from the Example: |
initCookies | Record<string, unknown> | No | Cookie jar to carry into the solve, as a name → value map. Optional: the session is already bound through the 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 | Specific provider to use. If omitted, automatic routing selects the best provider. 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: |