#
DataDome
Generates valid DataDome cookies using device fingerprinting bypass.
#
Task Types
#
Parameters
#
DataDome Tags
#
DataDome Slider
Either data.config or data.captcha_url is required
You must provide one of the two:
data.config— thevar dd = {...}JavaScript object from the blocked page (we build the captcha page)data.captcha_url— the fullhttps://geo.captcha-delivery.com/captcha/?...URL (we navigate directly to it)
#
DataDome Interstitial
How to get the config
When DataDome blocks a request with a slider captcha or interstitial page, the response HTML contains a var dd = {...} JavaScript object. Parse this object and pass it as the config field inside data.
var dd = {'cid': 'AHrlqAAAAAMA...', 'hsh': '...', 'host': 'geo.captcha-delivery.com', ...}
Extract the full dd object and pass it as a string.
#
Finding DataDome
Look for: datadome in cookies, requests to *.datadome.co, or DD_ prefixed JS variables.
#
Proxy Blocked (t=bv)
When DataDome returns a blocked page (403), the HTML contains a var dd = {...} object. If the t field is set to bv, it means your proxy (or IP) is hard blocked by DataDome. Solving the challenge will not have any effect — the cookie will never be accepted.
<script>var dd={'rt':'c','cid':'...','hsh':'...','t':'bv','s':43337,...}</script>
If you submit a task with t=bv in the config or captcha_url, the API will return ERROR_PROXY_BLOCKED immediately instead of attempting to solve.
Proxy blocked
If you receive ERROR_PROXY_BLOCKED, rotate your proxy and try again with a different IP address. This applies to both DataDome Slider and DataDome Interstitial task types.
#
Example
#
DataDome Tags
response = requests.post("https://v1.captchasolv.com/solve", json={
"clientKey": "YOUR_API_KEY",
"task": {
"type": "DataDomeTagsTaskProxyless",
"websiteURL": "https://example.com"
}
}, timeout=130)
solution = response.json()["solution"]
# Set solution["token"] as the datadome cookie value, use solution["userAgent"]
const response = await axios.post('https://v1.captchasolv.com/solve', {
clientKey: 'YOUR_API_KEY',
task: {
type: 'DataDomeTagsTaskProxyless',
websiteURL: 'https://example.com'
}
}, { timeout: 130000 });
const { token, userAgent } = response.data.solution;
// Use token as the datadome cookie value
#
DataDome Slider
import re, json, requests
# Step 1: Get the blocked page
resp = requests.get("https://example.com")
# Step 2: Parse the dd object from the HTML
match = re.search(r"var\s+dd\s*=\s*(\{[^}]+\})", resp.text)
dd = json.loads(match.group(1).replace("'", '"'))
# Step 3: Solve the slider
response = requests.post("https://v1.captchasolv.com/solve", json={
"clientKey": "YOUR_API_KEY",
"task": {
"type": "DataDomeSliderTaskProxyless",
"websiteURL": "https://example.com",
"data": {
"config": json.dumps(dd)
}
}
}, timeout=130)
token = response.json()["solution"]["token"]
# Use token as the datadome cookie value
const resp = await axios.get('https://example.com');
// Parse dd object from HTML
const match = resp.data.match(/var\s+dd\s*=\s*(\{[^}]+\})/);
const dd = JSON.parse(match[1].replace(/'/g, '"'));
// Solve the slider
const response = await axios.post('https://v1.captchasolv.com/solve', {
clientKey: 'YOUR_API_KEY',
task: {
type: 'DataDomeSliderTaskProxyless',
websiteURL: 'https://example.com',
data: {
config: JSON.stringify(dd)
}
}
}, { timeout: 130000 });
const { token } = response.data.solution;
// Use token as the datadome cookie value
#
DataDome Slider (with captcha_url)
If you already have the full captcha URL, you can pass it directly instead of the dd config object:
response = requests.post("https://v1.captchasolv.com/solve", json={
"clientKey": "YOUR_API_KEY",
"task": {
"type": "DataDomeSliderTaskProxyless",
"websiteURL": "https://example.com",
"data": {
"captcha_url": "https://geo.captcha-delivery.com/captcha/?initialCid=...&cid=...&hash=...&t=fe&s=..."
}
}
}, timeout=130)
token = response.json()["solution"]["token"]
const response = await axios.post('https://v1.captchasolv.com/solve', {
clientKey: 'YOUR_API_KEY',
task: {
type: 'DataDomeSliderTaskProxyless',
websiteURL: 'https://example.com',
data: {
captcha_url: 'https://geo.captcha-delivery.com/captcha/?initialCid=...&cid=...&hash=...&t=fe&s=...'
}
}
}, { timeout: 130000 });
const { token } = response.data.solution;
#
DataDome Interstitial
import re, json, requests
# Step 1: Get the blocked page
resp = requests.get("https://example.com")
# Step 2: Parse the dd object from the HTML
match = re.search(r"var\s+dd\s*=\s*(\{[^}]+\})", resp.text)
dd_raw = match.group(1)
# Step 3: Solve the interstitial
response = requests.post("https://v1.captchasolv.com/solve", json={
"clientKey": "YOUR_API_KEY",
"task": {
"type": "DataDomeInterstitialTaskProxyless",
"websiteURL": "https://example.com",
"data": {
"config": dd_raw
}
}
}, timeout=130)
token = response.json()["solution"]["token"]
# Use token as the datadome cookie value
const resp = await axios.get('https://example.com');
// Parse dd object from HTML
const match = resp.data.match(/var\s+dd\s*=\s*(\{[^}]+\})/);
const ddRaw = match[1];
// Solve the interstitial
const response = await axios.post('https://v1.captchasolv.com/solve', {
clientKey: 'YOUR_API_KEY',
task: {
type: 'DataDomeInterstitialTaskProxyless',
websiteURL: 'https://example.com',
data: {
config: ddRaw
}
}
}, { timeout: 130000 });
const { token } = response.data.solution;
// Use token as the datadome cookie value
#
Response
{
"errorId": 0,
"solution": {
"token": "yWsawWlNUdSMvf_hcEV_6Hbx~vJH2S~tqzDCC5tw...",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36 Edg/145.0.0.0"
},
"cost": "0.00001",
"createTime": 1772740459,
"endTime": 1772740466,
"solveCount": 1
}
Set token as the datadome cookie value and reuse userAgent for the entire session.
#
Tips
- User-Agent consistency — DataDome tracks User-Agent, always reuse the returned one
- Session-based — Use same cookies for an entire session
- Cookie refresh — If blocked again, solve a new challenge