Skip to main content
Are you experiencing issues obtaining the token?
Contact support

DataDome

This type of captcha usually requires the user to solve a puzzle by moving a slider for verification.

Warning!
  • Use your own proxies to perform this task.

  • If your proxy uses IP-based authorization, you must whitelist the address 65.21.190.34.

  • After solving, you will receive special cookies that must be added to the browser.

Request parameters

type<string>required

CustomTask


class<string>required

DataDome


websiteURL<string>required

The main page URL where the captcha is solved.


captchaUrl (inside metadata)<string>required

"captchaUrl" - link to the captcha. Usually in the format: "https://geo.captcha-delivery.com/captcha/?initialCid=...".


datadomeCookie (inside metadata)<string>required

Your DataDome cookies. Can be obtained from the page using document.cookie (if cookies do not have the HttpOnly flag), in the request header Set-Cookie: "datadome=...", or directly from the HTML code initialCid (see examples on how to find datadomeCookie).


datadomeVersion (inside metadata)<string>optional

DataDome solving method version. If set to "new", the updated solving method is used with support for both i.js and c.js scripts (see details below). If the parameter is not specified, the legacy solving method is applied, which supports only i.js.


proxyType<string>required

http - standard http/https proxy;
https - use this only if "http" does not work (required for some custom proxies);
socks4 - socks4 proxy;
socks5 - socks5 proxy.


proxyAddress<string>required

IPv4/IPv6 proxy address. Not allowed:

  • transparent proxies (where the client IP is visible);
  • proxies on local machines.


proxyPort<integer>required

Proxy port.


proxyLogin<string>required

Proxy server login.


proxyPassword<string>required

Proxy server password.


userAgent<string>optional

Browser User-Agent.
Pass only a valid UA from Windows OS. Currently it is: userAgentPlaceholder


Create task method

During page loading, DataDome may use one of two scripts: c.js or i.js. Before solving, check which script is loaded (DevTools → Network / HTML).

Option with c.js:

Option with i.js:

POST
https://api.capmonster.cloud/createTask

Request

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": "https://example.com",
"userAgent": "userAgentPlaceholder",
"metadata": {
"captchaUrl": "https://geo.captcha-delivery.com/interstitial/?initialCid=AHrlqAAAAAMA9UvsL58YLqIAXNLFPg%3D%3D&hash=C0705ACD75EBF650A07FF8291D3528&cid=7sfa5xUfDrR4bQTp1c2mhtiD7jj9TXExcQypjdNAxKVFyIi1S9tE0~_mqLa2EFpOuzxKcZloPllsNHjNnqzD9HmBA4hEv7SsEyPYEidCBvjZEaDyfRyzefFfolv0lAHM&referer=https%3A%2F%2Fwww.example.com.au%2F&s=6522&b=978936&dm=cm",
"datadomeCookie": "datadome=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z",
"datadomeVersion": "new"
},
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": 8080,
"proxyLogin": "proxyUsername",
"proxyPassword": "proxyPassword"
}
}

Response

{
"errorId":0,
"taskId":407533072
}

Get task result method

Use the getTaskResult method to get the solved DataDome captcha.

POST
https://api.capmonster.cloud/getTaskResult

Request

{
"clientKey":"API_KEY",
"taskId": 407533072
}

Response

{
"errorId": 0,
"status": "ready",
"solution": {
"domains": {
"www.example.com": {
"cookies": {
"datadome": "P1w0VnjFcTFslfps0J4FaPpY_QPbPBW4MeYxj4LW~pztIfJiSSuBPr8oQTUHzdrfgv137FbOBd3kCUOOgny7LhIkhm5e1qdtzYM4s2e46U_qfERK4KiCy22MOSIDsDyh"
},
"localStorage": null
}
},
"url": null,
"fingerprint": null,
"headers": null,
"data": null
}
}

How to find datadomeCookie

Using Developer Tools

Option 1:

  1. Open the DataDome-protected site in a browser (Chrome, Firefox).

  2. Press F12 → go to the Application tab → Cookies.

  3. Find the domain of the site (e.g., www.example.com).

Among the cookies, look for the datadome key — this is the required datadomeCookie.

Option 2:

  1. Open the site where the DataDome captcha triggers.

  2. Go to DevTools → Network, reload the page, and find the request loading the page with initialCid.

Example URL:

https://geo.captcha-delivery.com/interstitial/?initialCid=...&hash=...&cid=...

or:

  1. Open the Response of this request. In the HTML code, find the object:

var ddm = { ... };

  1. Inside this object, locate the cid parameter. Its value is the current datadomeCookie.

Option 3:

  1. Open the site where the DataDome captcha triggers.

  2. Go to DevTools → Network, reload the page, and find a request with 403 status.

  3. Go to the Headers → Response Headers tab. In the headers, find Set-Cookie: and copy the value of the datadome parameter (datadome=<value>).

Example of automatic DataDome solving

Attention!

The examples below are provided for informational purposes and to demonstrate the general logic.

Since websites differ in protection mechanisms, request structures, and parameters, these solutions may require additional adaptation and testing for a specific site.

Show code
// npm install axios cheerio https-proxy-agent

import axios from "axios";
import * as cheerio from "cheerio";
import { URL } from "url";
import { HttpsProxyAgent } from "https-proxy-agent";

// ======================================================
// SETTINGS
// ======================================================

// Enables/disables detailed logging output
// Used only for development convenience and debugging
const DEBUG = true;

const CAPMONSTER_API_KEY = "YOUR_API_KEY"; // Specify your CapMonster Cloud API key
const PAGE_URL = "https://www.example.com/"; // Specify the URL of the page where DataDome is triggered

const USER_AGENT =
"userAgentPlaceholder";

const PROXY_URL = "http://login:pass@address:port";

const CREATE_TASK = "https://api.capmonster.cloud/createTask";
const GET_RESULT = "https://api.capmonster.cloud/getTaskResult";

const MAX_WAIT = 120000;

// ======================================================
// DEBUG LOGGER
// ======================================================

function log(title, data = null) {
if (!DEBUG) return;

console.log(`\n${"=".repeat(25)} ${title} ${"=".repeat(25)}`);

if (typeof data === "object") console.log(JSON.stringify(data, null, 2));
else if (data) console.log(data);

console.log("=".repeat(70));
}

// ======================================================
// DD OBJECT EXTRACTION
// ======================================================

function extractDD(html) {
const $ = cheerio.load(html);
const scripts = $("script").toArray();

for (const s of scripts) {
const text = $(s).html();
if (text && text.includes("var dd=")) {
try {
const raw = text.split("var dd=")[1].split(";")[0].replace(/'/g, '"');
return JSON.parse(raw);
} catch (e) {
return null;
}
}
}

return null;
}

// ======================================================
// CAPTCHA URL BUILDING
// ======================================================

function buildCaptchaUrl(dd) {
const base = `https://${dd.host}/captcha/`;

const params = new URLSearchParams({
initialCid: dd.cid,
hash: dd.hsh,
cid: dd.cookie,
t: dd.t,
referer: PAGE_URL,
s: dd.s,
dm: "cd",
});

if (dd.e) params.append("e", dd.e);

return base + "?" + params.toString();
}

// ======================================================
// WORKING WITH CAPMONSTER CLOUD
// ======================================================

async function createTask(payload) {
log("CREATE TASK REQUEST", payload);

const { data } = await axios.post(CREATE_TASK, payload);

log("CREATE TASK RESPONSE", data);

return data.taskId;
}

async function waitResult(taskId) {
const start = Date.now();

while (true) {
if (Date.now() - start > MAX_WAIT) throw new Error("CapMonster timeout");

await new Promise((r) => setTimeout(r, 3000));

const { data } = await axios.post(GET_RESULT, {
clientKey: CAPMONSTER_API_KEY,
taskId,
});

if (data.status === "processing") {
console.log("... solving");
continue;
}

if (data.status === "ready") return data.solution;

if (data.errorId) throw new Error(JSON.stringify(data));
}
}

// ======================================================
// MAIN SOLVER
// ======================================================

async function solveDataDome() {
console.log("\nDataDome → CapMonster solver started (HTTP mode)\n");

let agent = null;
let parsedProxy = null;

if (PROXY_URL) {
parsedProxy = new URL(PROXY_URL);
agent = new HttpsProxyAgent(PROXY_URL);
}

// 1. First request
console.log("Opening page...");

const response = await axios.get(PAGE_URL, {
headers: {
"User-Agent": USER_AGENT,
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Cache-Control": "no-cache",
Pragma: "no-cache",
"Upgrade-Insecure-Requests": "1",
},
httpsAgent: agent,
proxy: false, // important when using httpsAgent
validateStatus: () => true,
});

const html = response.data;

log("STATUS", response.status);

const dd = extractDD(html);

if (!dd) {
console.log("No DataDome detected.");
return;
}

log("DD OBJECT", dd);

if (dd.t === "bv") {
console.log("Proxy banned. Change proxy.");
return;
}

// 2. Build captcha URL
const captchaUrl = buildCaptchaUrl(dd);
log("CAPTCHA URL", captchaUrl);

// 3. Create task in CapMonster Cloud
const task = {
type: "CustomTask",
class: "DataDome",
websiteURL: PAGE_URL,
userAgent: USER_AGENT,
metadata: {
captchaUrl,
datadomeCookie: `datadome=${dd.cookie}`,
datadomeVersion: "new",
},
};

if (PROXY_URL) {
task.proxyType = "http";
task.proxyAddress = parsedProxy.hostname;
task.proxyPort = parseInt(parsedProxy.port);
task.proxyLogin = parsedProxy.username;
task.proxyPassword = parsedProxy.password;
}

const payload = {
clientKey: CAPMONSTER_API_KEY,
task,
};

const taskId = await createTask(payload);

if (!taskId) {
console.log("Failed to create task.");
return;
}

const solution = await waitResult(taskId);

log("SOLUTION", solution);

console.log("\nDataDome solved successfully.\n");
}

solveDataDome().catch(console.error);
Show code (Node.js + Playwright)
// npm install axios cheerio playwright

import axios from "axios";
import * as cheerio from "cheerio";
import { chromium } from "playwright";
import { URL } from "url";

// ======================================================
// SETTINGS
// ======================================================

// Enables/disables detailed logging output
// Used only for development convenience and debugging
const DEBUG = true;

const CAPMONSTER_API_KEY = "YOUR_API_KEY" // Specify your CapMonster Cloud API key
const PAGE_URL = "https://www.example.com/" // Specify the URL of the page where DataDome is triggered

const USER_AGENT =
"userAgentPlaceholder";

const PROXY_URL = "http://login:pass@address:port" // Specify your proxy

const CREATE_TASK = "https://api.capmonster.cloud/createTask";
const GET_RESULT = "https://api.capmonster.cloud/getTaskResult";

const MAX_WAIT = 120000;

// ======================================================
// DEBUG LOGGER
// ======================================================

function log(title, data = null) {
if (!DEBUG) return;

console.log(`\n${"=".repeat(25)} ${title} ${"=".repeat(25)}`);

if (typeof data === "object") console.log(JSON.stringify(data, null, 2));
else if (data) console.log(data);

console.log("=".repeat(70));
}

// ======================================================
// DD OBJECT EXTRACTION
// ======================================================

function extractDD(html) {
const $ = cheerio.load(html);
const scripts = $("script").toArray();

for (const s of scripts) {
const text = $(s).html();
if (text && text.includes("var dd=")) {
try {
const raw = text.split("var dd=")[1].split(";")[0].replace(/'/g, '"');
return JSON.parse(raw);
} catch (e) {
return null;
}
}
}

return null;
}

// ======================================================
// CAPTCHA URL BUILDING
// ======================================================

function buildCaptchaUrl(dd) {
const base = `https://${dd.host}/captcha/`;

const params = new URLSearchParams({
initialCid: dd.cid,
hash: dd.hsh,
cid: dd.cookie,
t: dd.t,
referer: PAGE_URL,
s: dd.s,
dm: "cd",
});

if (dd.e) params.append("e", dd.e);

return base + "?" + params.toString();
}

// ======================================================
// WORKING WITH CAPMONSTER CLOUD
// ======================================================

async function createTask(payload) {
log("CREATE TASK REQUEST", payload);

const { data } = await axios.post(CREATE_TASK, payload);

log("CREATE TASK RESPONSE", data);

return data.taskId;
}

async function waitResult(taskId) {
const start = Date.now();

while (true) {
if (Date.now() - start > MAX_WAIT) throw new Error("CapMonster timeout");

await new Promise((r) => setTimeout(r, 3000));

const { data } = await axios.post(GET_RESULT, {
clientKey: CAPMONSTER_API_KEY,
taskId,
});

if (data.status === "processing") {
console.log("... solving");
continue;
}

if (data.status === "ready") return data.solution;

if (data.errorId) throw new Error(JSON.stringify(data));
}
}

// ======================================================
// MAIN SOLVER (PLAYWRIGHT)
// ======================================================

async function solveDataDome() {
console.log("\nDataDome → CapMonster solver started\n");

let proxyConfig = null;
let parsedProxy = null;

if (PROXY_URL) {
parsedProxy = new URL(PROXY_URL);

proxyConfig = {
server: `http://${parsedProxy.hostname}:${parsedProxy.port}`,
username: parsedProxy.username,
password: parsedProxy.password,
};
}

const browser = await chromium.launch({
headless: false,
proxy: proxyConfig,
});

const context = await browser.newContext({
userAgent: USER_AGENT,
});

const page = await context.newPage();

console.log("Opening page...");
await page.goto(PAGE_URL, { waitUntil: "domcontentloaded" });

const html = await page.content();
const dd = extractDD(html);

if (!dd) {
console.log("No DataDome detected.");
await browser.close();
return;
}

log("DD OBJECT", dd);

if (dd.t === "bv") {
console.log("Proxy banned. Change proxy.");
await browser.close();
return;
}

const captchaUrl = buildCaptchaUrl(dd);
log("CAPTCHA URL", captchaUrl);

const task = {
type: "CustomTask",
class: "DataDome",
websiteURL: PAGE_URL,
userAgent: USER_AGENT,
metadata: {
captchaUrl,
datadomeCookie: `datadome=${dd.cookie}`,
datadomeVersion: "new",
},
};

if (PROXY_URL) {
task.proxyType = "http";
task.proxyAddress = parsedProxy.hostname;
task.proxyPort = parseInt(parsedProxy.port);
task.proxyLogin = parsedProxy.username;
task.proxyPassword = parsedProxy.password;
}

const payload = {
clientKey: CAPMONSTER_API_KEY,
task,
};

const taskId = await createTask(payload);

if (!taskId) {
console.log("Failed to create task.");
await browser.close();
return;
}

const solution = await waitResult(taskId);
log("SOLUTION", solution);

await browser.close();
}

solveDataDome().catch(console.error);

Use SDK library

Show code (for browser)
// https://github.com/ZennoLab/capmonstercloud-client-js

import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = "YOUR_API_KEY"; // Specify your CapMonster Cloud API key

document.addEventListener("DOMContentLoaded", async () => {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);

// Optionally, you can check the balance
const balance = await client.getBalance();
console.log("Balance:", balance);

// DataDome can only be solved with your own proxies
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};

const datadomeRequest = new DataDomeRequest({
_class: 'DataDome',
websiteURL: "https://example.com/", // URL of the captcha page
userAgent: "userAgentPlaceholder",
proxy,
metadata: {
captchaUrl: "https://geo.captcha-delivery.com/interstitial/?initialCid=AHrlqAAAAAMA9UvsL58YLqIAXNLFPg%3D%3D&hash=C0705ACD75EBF650A07FF8291D3528&cid=7sfa5xUfDrR4bQTp1c2mhtiD7jj9TXExcQypjdNAxKVFyIi1S9tE0~_mqLa2EFpOuzxKcZloPllsNHjNnqzD9HmBA4hEv7SsEyPYEidCBvjZEaDyfRyzefFfolv0lAHM&referer=https%3A%2F%2Fwww.example.com.au%2F&s=6522&b=978936&dm=cm",
datadomeCookie: "datadome=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z"
}
});

const result = await client.Solve(datadomeRequest);
console.log("Solution:", result);
});
Show code (Node.js)
// https://github.com/ZennoLab/capmonstercloud-client-js

import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = "YOUR_API_KEY"; // Specify your CapMonster Cloud API key

async function solveDataDome() {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);

// Optionally, you can check the balance
const balance = await client.getBalance();
console.log("Balance:", balance);

// DataDome can only be solved with your own proxies
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};

const datadomeRequest = new DataDomeRequest({
_class: 'DataDome',
websiteURL: "https://example.com/", // URL of the captcha page
userAgent: "userAgentPlaceholder",
proxy,
metadata: {
captchaUrl: "https://geo.captcha-delivery.com/interstitial/?initialCid=AHrlqAAAAAMA9UvsL58YLqIAXNLFPg%3D%3D&hash=C0705ACD75EBF650A07FF8291D3528&cid=7sfa5xUfDrR4bQTp1c2mhtiD7jj9TXExcQypjdNAxKVFyIi1S9tE0~_mqLa2EFpOuzxKcZloPllsNHjNnqzD9HmBA4hEv7SsEyPYEidCBvjZEaDyfRyzefFfolv0lAHM&referer=https%3A%2F%2Fwww.example.com.au%2F&s=6522&b=978936&dm=cm",
datadomeCookie: "datadome=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z"
}
});

const result = await client.Solve(datadomeRequest);
console.log("Solution:", result);
}

solveDataDome().catch(console.error);