API Endpoints
Updated 10/24/2026
Build DataDome URL API
Convert the raw DataDome block response your HTTP client received into the challenge URL a datadome task expects with the buildDataDomeUrl endpoint. Submit the captured block page, JSON body, or redirect header, and the API returns the normalized captchaUrl together with the challenge type.
Use POST /buildDataDomeUrl after your client is blocked by DataDome and you captured the raw response, but you do not want to re-implement DataDome's challenge URL builder. If your workflow already knows the full challenge URL, you can skip this endpoint and submit it directly to Create Task as task.captchaUrl.
Build DataDome URL Endpoint
POST https://solver.solverify.net/buildDataDomeUrl
The API key must be provided as clientKey in the JSON request body.
Accepted Block Payloads
DataDome blocks HTTP clients in three common shapes, and all of them are supported:
| Payload shape | Typical source | Field to send |
|---|---|---|
| HTML block page | Browser document navigation | body |
JSON body with a url field | Blocked API call | body |
Location header of a blocked redirect | Redirect-following HTTP client | location |
If you already captured the challenge URL, send it in captchaUrl to validate and normalize it.
The HTML shape is rebuilt exactly like DataDome's own JavaScript builds it: the API reads the var dd = {...} configuration from the block page and reconstructs the https://<host>/captcha/ or https://<host>/interstitial/ URL from its values.
Request Body
{
"clientKey": "YOUR_API_KEY",
"websiteURL": "https://accounts.example.com/login",
"body": "<html>...<script>var dd = {'rt':'i','cid':'...','hsh':'...'}</script>...</html>"
}
| Field | Type | Required | Description |
|---|---|---|---|
clientKey | string | Yes | Your Solverify API key. Keep this value private and only send it from trusted server-side code. |
websiteURL | string | Yes | The protected page where the challenge was triggered. It becomes the referer parameter when the challenge URL is rebuilt from a block page. Maximum 2,048 characters. |
body | string | Conditional | The raw response body that carried the challenge. Maximum 1 MB. |
location | string | Conditional | The response Location header when the challenge arrived as a redirect. Maximum 4,096 characters. |
captchaUrl | string | Conditional | An already-known challenge URL to validate and normalize. When present it takes precedence over body and location. Maximum 4,096 characters. |
At least one of body, location, or captchaUrl is required. When body is supplied, the API tries the JSON url field first, then the var dd = {...} block, then any embedded captcha-delivery.com challenge URL.
Success Response
A successful request returns errorId: 0 and both the challenge URL and its type:
{
"errorId": 0,
"captchaUrl": "https://geo.captcha-delivery.com/interstitial/?initialCid=...&hash=...&cid=...&referer=https%3A%2F%2Faccounts.example.com%2Flogin&s=1927&e=...&dm=cd&t=it",
"challengeType": "interstitial",
"errorCode": null,
"errorDescription": null
}
Response Fields
| Field | Type | Description |
|---|---|---|
errorId | number | 0 indicates that the request succeeded. |
captchaUrl | string | The rebuilt challenge URL. Feed it to a datadome task exactly as returned; do not remove or rewrite its query parameters. |
challengeType | string | interstitial or captcha, matching the DataDome route the URL points at. |
errorCode | string or null | Machine-readable error code when the request fails. |
errorDescription | string or null | Human-readable information about the error. |
Solve the Rebuilt Challenge
Submit the returned captchaUrl in a datadome task with the same proxy and session context that triggered the block:
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "datadome",
"websiteURL": "https://accounts.example.com/login",
"captchaUrl": "https://geo.captcha-delivery.com/interstitial/?initialCid=...",
"proxyType": "http",
"proxyAddress": "1.1.1.1",
"proxyPort": "8080"
}
}
See DataDome Solver API for the full task reference. DataDome challenge URLs are session and IP bound, so rebuild them from a fresh block payload when they expire instead of storing them for later use.
Build DataDome URL Code Examples
These examples rebuild a challenge URL from a captured block page and print the result.
curl --request POST \
--url https://solver.solverify.net/buildDataDomeUrl \
--header "Content-Type: application/json" \
--data '{
"clientKey": "YOUR_API_KEY",
"websiteURL": "https://accounts.example.com/login",
"body": "<html>...<script>var dd = {'rt':'i','cid':'...','hsh':'...'}</script>...</html>"
}'
Possible Build DataDome URL Errors
| Error code | Description |
|---|---|
ERROR_INVALID_REQUEST | The request body is missing required fields, or none of body, location, or captchaUrl was supplied. |
ERROR_INVALID_TASK | No DataDome challenge was found in the supplied payload, or captchaUrl is not a captcha-delivery.com challenge URL. |
ERROR_INVALID_KEY | The supplied Solverify API key is invalid. |
ERROR_TEMPORARY_UNAVAILABLE | The API cache is temporarily overloaded or unavailable. Retry with backoff. |
Always inspect errorId before using captchaUrl. For every supported API error, see Solverify API Error Codes.
When Should You Use This Endpoint?
Use POST /buildDataDomeUrl when:
- Your HTTP client was blocked by DataDome and you captured the raw response body or redirect header.
- Your integration receives DataDome blocks from multiple entry points and you want one consistent challenge URL builder.
- You captured a challenge URL in a format your workflow does not handle and want it validated and normalized.
Skip it when you already have the exact captchaUrl produced by your own flow; submit that URL to a datadome task directly.
Frequently Asked Questions
Does buildDataDomeUrl create a task or charge my balance?
No. The endpoint only converts a captured payload into a challenge URL. It does not create a solving task, and no balance is consumed.
Do I need this endpoint to solve DataDome tasks?
No, it is an optional helper. It exists so integrations can forward whatever their HTTP client actually received instead of re-implementing DataDome's URL construction.
What payload should I send?
Send exactly what your HTTP client received: the block page HTML in body, the JSON response in body, or the Location header value in location. Always provide the websiteURL of the protected page.
Why did I receive ERROR_INVALID_TASK?
The supplied payload did not contain a recognizable DataDome challenge. Confirm that the request was actually blocked by DataDome, that the full response body (including the var dd = {...} script) was captured, or that the Location header was not truncated.
Can I reuse a rebuilt captchaUrl later?
DataDome challenge URLs are bound to the session and IP that triggered the block and are typically short-lived. Rebuild a fresh URL from a new block payload instead of storing one for later use.