# DataDome

Bypass DataDome bot protection. Task types, parameters, and code examples.

Generates valid DataDome cookies using device fingerprinting bypass.


# Task Types

Task Type Description
DataDomeTagsTaskProxyless Tags challenge, without proxy
DataDomeTagsTask Tags challenge, with your proxy
DataDomeSliderTaskProxyless Slider captcha, without proxy
DataDomeSliderTask Slider captcha, with your proxy
DataDomeInterstitialTaskProxyless Interstitial challenge, without proxy
DataDomeInterstitialTask Interstitial challenge, with your proxy

# Parameters

# DataDome Tags

Parameter Type Required Description
websiteURL string Target URL protected by DataDome
websiteKey string DataDome key (if known)

# DataDome Slider

Parameter Type Required Description
websiteURL string Target URL protected by DataDome
data.config string ⚠️ JSON string of the var dd = {...} object from the blocked page (required if no captcha_url)
data.captcha_url string ⚠️ Full DataDome captcha URL (required if no config)

# DataDome Interstitial

Parameter Type Required Description
websiteURL string Target URL that triggered the DataDome interstitial
data.config string JSON string of the var dd = {...} object from the blocked page
proxy string Proxy in format user:pass@host:port (for DataDomeInterstitialTask)

# 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.


# 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