SurSolver

How to solve DataDome

DataDome scores traffic silently and, when it blocks you, hands back a challenge page and a cookie bound to your connection. Here is how to read the block, send the right parameters and replay the cookie.

Updated

Charged when a task is accepted

On this page

What is DataDome Bot Manager and how to recognise it

DataDome is a bot-management platform that scores every request using IP reputation, TLS and HTTP/2 fingerprints, browser fingerprinting, behavioural signals and per-customer models. Most visitors never see it. When it suspects automation it serves either a device-check interstitial or a slider challenge, and the visitor is asked to drag a piece into place.

You recognise a block by its shape. On a page it arrives as an HTTP 403 with a small HTML body that contains a var dd object; on API and XHR endpoints it arrives as inline JSON with a url field that points at the captcha-delivery.com host. A datadome cookie is set on the response, and a challenge URL under /captcha/ is the slider, while /interstitial/ is the device check.

The blocked document fetched same-origin on leboncoin.fr: status 403, with the response body's `var dd` object printed in the console

This product is solved with cookies: the aim is a validated datadome cookie to replay on the blocked session. The result also lists a token field and the user agent; the public catalog (GET /v1/task-types) lists each key.

Extension, API or automation?

SurSolver is an HTTP API: you call it from your own code, and there is no browser extension. You trigger the block yourself, send the page URL, the challenge URL and your proxy details, and get the cookie back. Your own client then replays it.

That works with any HTTP client, or with Playwright, Puppeteer and Selenium when a browser carries the session. The important part is that the block, the solve and the replay all use the same proxy.

How to find the parameters

First trigger the block: load the protected page through the proxy you will solve and replay with. You should get a 403 page, or a JSON response with a url on API calls.

Next, check the variant. In the page source, var dd with rt:'c' and the c.js script is the slider; rt:'i' with i.js is the interstitial. Then look at the t value in the challenge URL, before you spend anything: t=fe is solvable, and t=bv means the IP is banned at network level, so change the proxy and trigger the block again.

The challenge URL is the value to send. Prefer the url from the JSON block or the src of the challenge iframe, copied verbatim. Otherwise build it from the var dd fields, with the page URL percent-encoded as the referer. The blocked datadome cookie can be read from the Application panel, from the Set-Cookie response header, or from the challenge HTML, and can be sent as well. Extract everything right before you create the task, because the values are dynamic per render. Also send the page URL of the blocked page.

Where the cookies go

Set the returned datadome value as a cookie on the protected domain, or send it in a Cookie header, then retry the blocked request from the same proxy IP. If the solution includes a user agent, use exactly that value; otherwise reuse the one you triggered the block with. The headers and TLS fingerprint should look like a real browser for that user agent.

The datadome cookie and the captcha-delivery request URLs printed from the console on leboncoin.fr

In browser automation, add the cookie through the cookie API before you navigate. Keep it and reuse it while the site accepts it, rather than solving on every request, and solve again when you are challenged.

Common mistakes

Changing the proxy or the user agent anywhere in the chain is the classic failure. The cookie is bound to the exit IP and the fingerprint, so the same sticky proxy and the same user agent must be used to trigger the block, fetch the challenge, solve and replay. A rotating proxy breaks all of that.

Sending a challenge URL with t=bv is the second: that IP is banned, and solving cannot clear it. Rotate the IP and trigger the block again. Datacenter addresses are frequently blocked as well, so residential or mobile sticky proxies work best.

If you get a cookie back and still see a 403, suspect the client, not the cookie. The TLS fingerprint, the header order and sometimes the Accept-Language value must match a real browser for the claimed user agent. And an interstitial can escalate to the slider: if the next challenge URL has a /captcha/ path, solve it as a slider.

Solve it with SurSolver

Send the page URL, the challenge URL and your proxy details to createTask with the task type DatadomeSliderTask, then poll getTaskResult until the status is ready. The solution carries the datadome cookie and, when the solver reports one, the user agent to replay it with. The accepted names and parameters are listed by the public catalog (GET /v1/task-types).

FAQ

How do I solve a DataDome slider captcha automatically?

Reproduce the block through your own sticky proxy, take the challenge URL from the block response, and create a task with the page URL, that challenge URL and your proxy details. The solution gives you the datadome cookie to replay from the same proxy.

What does the captchaUrl look like and what is t=fe?

It is the full challenge URL on the captcha-delivery.com host, taken from the block response with its session parameters intact. Keep t=fe: it marks a solvable challenge, while t=bv means the IP is banned at network level and you must rotate it and trigger the block again first.

Do I need a proxy for DataDome?

Yes. This type has no proxyless form, and the cookie is bound to the IP and fingerprint it was earned with. Use a sticky proxy, ideally residential or mobile, and keep it the same from the block to the replay.

Why do I still get a 403 after replaying the cookie?

Usually the proxy, user agent or TLS and header fingerprint differs from the solve. To isolate it, paste a cookie copied from a real browser into your client: if that still gets a 403, the problem is your client, not the cookie.

How do I tell the DataDome slider from the interstitial?

Look at the block page source. A var dd object with rt set to c and the c.js script is the slider, while rt set to i with i.js is the device-check interstitial. In a JSON block, a challenge URL under /captcha/ is the slider and one under /interstitial/ is the interstitial.

From the blog

No posts yet — read the blog for new guides and release notes.