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

# FunCaptcha Bypass - Arkose Labs Solver

> Bypass FunCaptcha (Arkose Labs) with automatic captcha solving. Setup, manual and automatic modes, proxy tips, and troubleshooting with code examples.

FunCaptcha (Arkose Labs) is an interactive CAPTCHA system commonly found on gaming, fintech, and e-commerce sites. Surfsky solves the audio challenge presented by the widget — automatically or manually with Surfsky's cloud browser. It requires an available audio flow; some deployments only present the visual puzzle, in which case there is no audio prompt for the solver to answer.

<span id="overview" />

<span id="prerequisites" />

<span id="quick-start" />

## Before you start

Use the [CAPTCHA setup example](/captcha-solving#connect-and-solve) to start a browser with `anti_captcha.enabled: true` and create a page-level `cdp` session. The snippets below use an async Playwright or Puppeteer session after navigating to your target.

Configure a Gemini key on the account or pass it as `anti_captcha.gemini_api_key`. For automatic mode, explicitly include `"funcaptcha"` in `auto_captcha_types`; it is not in the default list.

<Note>
  Use quality proxies. Datacenter IPs raise the FunCaptcha challenge frequency the same way they do for other anti-bot systems, and Human Emulation for mouse and keyboard timing further reduces how often the widget appears.
</Note>

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

<span id="solving-methods" />

## Manual captcha solving

Wait for the challenge to appear, then send:

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

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

The timeout is in milliseconds. Detection can raise a CDP error when the expected challenge is absent. After success, wait for a selector or response that identifies the protected content.

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

## Automatic captcha solving

Include `"funcaptcha"` in `anti_captcha.auto_captcha_types` at startup. Attach [solve event listeners](/captcha-solving#automatic-solving), then start detection before navigating:

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

`status: "started"` confirms the background loop started. Observe failures and use a bounded wait for your page result. Keep the CDP session connected until the job completes.

<span id="best-practices" />

<span id="related" />

## Reducing challenges

* **Gemini API Key Required** — the audio solver needs AI analysis; there is no keyless path for FunCaptcha.
* **Quality proxies** reduce challenge frequency — datacenter IPs trigger the widget more often.
* **Human Emulation** for mouse and keyboard helps avoid triggering the challenge in the first place. See [Human Emulation](/human_emulation).
* **Be patient** — Arkose Labs frequently chains multiple audio rounds before releasing the page; 1-2 minutes to complete is normal, not a stuck job.

<span id="need-help" />

## Verify bypass worked

A `success` status from `Captcha.solve` confirms the audio prompt was answered and submitted — it does not confirm the site's own risk check accepted it. Check that the protected content actually loaded before treating the job as done.

Inspect the widget when audio controls or challenge frames cannot be found. The solver does not support every visual challenge variant, and a site can change the audio flow independently of your code.

Check [solver configuration](/captcha-solving#provider-configuration), inspect one attempt in [DevTools](/debugging), and record the result or error before retrying. Stop the browser when the job ends.

## FunCaptcha bypass FAQ

<AccordionGroup>
  <Accordion title="Will the solver work if the site only shows the visual puzzle?">
    No. Surfsky's FunCaptcha solver targets the audio challenge specifically. If a target only presents the visual rotation or image-selection puzzle, there is no audio prompt for it to answer — this limitation applies to audio-based FunCaptcha solvers generally, not just Surfsky.
  </Accordion>

  <Accordion title="Do I need a Gemini API key for every solve?">
    Yes. Unlike DataDome's slider option, FunCaptcha's audio solver has no keyless path — `anti_captcha.gemini_api_key` is required for the AI analysis step every time.
  </Accordion>

  <Accordion title="Why isn't FunCaptcha in auto_captcha_types by default?">
    It carries a hard Gemini key dependency that other supported CAPTCHA types don't, so it's opt-in — add `"funcaptcha"` to the list yourself when you're ready to use it.
  </Accordion>

  <Accordion title="A solve reports success but the page still shows the challenge — why?">
    A `success` status means the audio prompt was answered, not that the site accepted it. Confirm the protected content actually loaded, and check whether the exit IP changed mid-session before assuming the solver failed.
  </Accordion>

  <Accordion title="Why is a single solve taking over a minute?">
    Arkose Labs frequently chains multiple audio rounds before releasing the page. 1-2 minutes is normal for FunCaptcha specifically — set your timeout accordingly rather than treating it as a stuck job.
  </Accordion>
</AccordionGroup>

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