> ## Documentation Index
> Fetch the complete documentation index at: https://docs.surfsky.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Datadome Bypass - Automatic Captcha Solver

> Bypass DataDome audio and slider CAPTCHAs automatically. Challenge types, proxy setup, IP-ban recovery, and manual/auto solving with code examples.

DataDome is a bot protection system used by many e-commerce and high-traffic websites. Surfsky handles DataDome CAPTCHA challenges in a few ways: audio or slider — automatically or manually with Surfsky's cloud browser. Choose the solver that matches the challenge displayed by the page. `datadome` is an alias for the audio solver; it is not an automatic choice between audio and slider challenges.

## DataDome challenge types

| Type             | Challenge                        | Provider requirement    |
| ---------------- | -------------------------------- | ----------------------- |
| `datadome`       | Audio, alias of `datadome_audio` | Gemini key.             |
| `datadome_audio` | Audio                            | Gemini key.             |
| `datadome_click` | Slider                           | No Gemini key required. |

For audio solving, configure a Gemini key on the account or pass `anti_captcha.gemini_api_key` when starting the browser.

<span id="overview" />

<span id="prerequisites" />

<span id="quick-start" />

## Before you start

Follow the [CAPTCHA setup](/captcha-solving#connect-and-solve). Enable `anti_captcha` in the start request and connect a page-level CDP session. The snippets below use an async `cdp` session on a page showing the challenge.

<Note>
  Use residential or mobile proxies. Datacenter IPs get challenged far more often and are the most common reason `datadome_click` or `datadome_audio` never clears on the first try.
</Note>

<span id="method-1-simple-manual-solving-recommended" />

<span id="solving-a-slider-challenge-no-gemini-required" />

<span id="solving-methods" />

## Manual captcha solving

For a slider challenge:

<CodeGroup>
  ```python Python theme={null}
  result = await cdp.send("Captcha.solve", {
      "type": "datadome_click",
      "timeout": 60000,
  })
  if result["status"] != "success":
      raise RuntimeError(result)
  ```

  ```javascript JavaScript theme={null}
  const result = await cdp.send("Captcha.solve", {
    type: "datadome_click",
    timeout: 60000,
  });
  if (result.status !== "success") throw new Error(JSON.stringify(result));
  ```
</CodeGroup>

For audio, use `type: "datadome_audio"`. The timeout is in milliseconds. Detection may raise a CDP error if the selected challenge is absent.

<span id="method-2-auto-solving" />

## Automatic captcha solving

Enable both variants if the target can present either:

```json theme={null}
{
  "anti_captcha": {
    "enabled": true,
    "auto_captcha_types": ["datadome_audio", "datadome_click"]
  }
}
```

Then omit `type` so detection can choose among those allowed variants:

```javascript theme={null}
await cdp.send("Captcha.autoSolve", {});
await page.goto(targetUrl, { waitUntil: "domcontentloaded" });
```

For a slider-only job, allow `datadome_click` at startup and pass `{ type: "datadome_click" }` to `autoSolve`. Attach [event listeners](/captcha-solving#automatic-solving) before starting.

<span id="reducing-challenges" />

<span id="related" />

## Reducing challenges

DataDome scores every request before deciding whether to challenge it. A few things lower that score and cut how often the challenge appears at all:

* Use residential or mobile proxies — datacenter IPs get challenged more often.
* Rotate proxies every 3–5 requests for aggressive scraping.
* Add delays and use [Human Emulation](/human_emulation) for mouse and keyboard.
* Reuse profiles that already passed a challenge — the cookie is good for 25+ follow-up requests, so avoid re-solving on every session.

<span id="datadome-specific-tips" />

## DataDome IP ban detection

If the `captchaUrl` contains `t=bv` instead of `t=fe`, the request IP is already banned — no solve will get through it. Switch to a different proxy before retrying; re-solving on the same IP wastes the attempt.

Prefer avoiding the slider entirely rather than solving it. `datadome_click` clears the visible challenge, but a clean fingerprint and a trusted proxy that never trigger the challenge in the first place are more reliable than solving it every session.

<span id="need-help" />

## Verify bypass worked

Keep the same browser and proxy while the challenge completes. Wait for the protected content or a successful site response after the solve; do not accept the solver's status as proof that the entire job succeeded.

`Captcha.solveFinished` confirms the challenge UI was cleared — it does not confirm the site accepted the resulting cookie. If the same challenge reappears right after a reported success, check whether the exit IP changed mid-session (common with rotating proxy pools) before assuming the solver failed.

If the site repeats the challenge, inspect the response and whether the exit IP changed. For audio failures, check Gemini configuration and whether an audio control is available. For slider failures, inspect the challenge frame and layout in [DevTools](/debugging).

Stop the browser after the job, including failed attempts. See [CAPTCHA troubleshooting](/captcha-solving#troubleshooting) for common errors.

## DataDome bypass FAQ

<AccordionGroup>
  <Accordion title="What's the difference between datadome, datadome_audio, and datadome_click?">
    `datadome` is an alias for `datadome_audio` — it always targets the audio challenge, it does not auto-detect which challenge type is on the page. Use `datadome_click` explicitly for slider puzzles, or enable both in `auto_captcha_types` and let detection pick.
  </Accordion>

  <Accordion title="Do I need a Gemini API key?">
    Only for audio challenges (`datadome` or `datadome_audio`). Slider challenges (`datadome_click`) don't require one — skip the Gemini key entirely if your target mostly serves sliders.
  </Accordion>

  <Accordion title="Why did the solve report success but the page still blocks me?">
    A `success` status confirms the challenge UI was cleared, not that the site accepted the resulting session. Check whether your exit IP changed between the solve and the follow-up request, and whether the `t` parameter in the captcha URL was `bv` (banned) rather than `fe`.
  </Accordion>

  <Accordion title="How often should I rotate proxies to avoid the challenge?">
    Every 3–5 requests for aggressive scraping on residential or mobile proxies. Datacenter IPs get challenged regardless of rotation frequency.
  </Accordion>

  <Accordion title="Can I reuse a browser profile that already passed DataDome?">
    Yes — the cookie from a passed challenge is valid for 25+ follow-up requests. Reusing the profile avoids paying the solve cost on every session.
  </Accordion>
</AccordionGroup>

Questions? Contact [support](mailto:hello@surfsky.io).
