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

# PerimeterX

> Handle PerimeterX press-and-hold challenges with the configured solver.

The PerimeterX solver handles the press-and-hold challenge using the browser page.

<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` when starting the session.

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

<span id="solving-methods" />

## Manual solving

Wait for the challenge to appear, then send:

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

  ```javascript JavaScript theme={null}
  const result = await cdp.send("Captcha.solve", {
    type: "perimeterx",
    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 solving

Include `"perimeterx"` 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: "perimeterx" });
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="how-it-works" />

<span id="need-help" />

<span id="related" />

## If solving fails

Keep the page in the same session while solving. Avoid clicking or navigating concurrently with the hold action. A completed hold does not prove the site has released the protected content.

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.
