# Migrate From Anti-Captcha: TurnstileTask on ZeroCaptcha

> Move Cloudflare Turnstile tasks from Anti-Captcha to ZeroCaptcha: the same task types, calls and field names, cData included, and what to check first.

- Source: https://zerocaptcha.io/guides/migrate-from-anti-captcha
- Published: 2026-09-30
- Updated: 2026-10-01
- Author: ZeroCaptcha Engineering

Anti-Captcha documents Turnstile with the task types `TurnstileTaskProxyless` and `TurnstileTask`
on its `createTask` and `getTaskResult` calls. ZeroCaptcha accepts those same types and calls.
For most clients, moving over means changing the API host and the key: the field names stay,
Anti-Captcha's `cData` included. This guide shows the request and the checklist.

ZeroCaptcha is not affiliated with Anti-Captcha. Facts about Anti-Captcha below come from its
public pages, checked 1 October 2026.

## What Anti-Captcha's request looks like

Anti-Captcha's [TurnstileTask documentation](https://anti-captcha.com/apidoc/task-types/TurnstileTask)
posts to `https://api.anti-captcha.com/createTask` with `clientKey` and a `task` holding `type`,
`websiteURL`, `websiteKey`, an optional `action`, an optional `cData`, and, for `TurnstileTask`,
the proxy fields `proxyType`, `proxyAddress`, `proxyPort`, `proxyLogin` and `proxyPassword`.

## The same request on ZeroCaptcha

```json
{
  "clientKey": "zc_live_…",
  "task": {
    "type": "TurnstileTask",
    "websiteURL": "https://shop.example.com/login",
    "websiteKey": "0x4AAAAAAAB1cD2eF3gH4iJ5",
    "action": "login",
    "cData": "sess_91f2c0",
    "proxyType": "http",
    "proxyAddress": "proxy.example.net",
    "proxyPort": 8080,
    "proxyLogin": "user",
    "proxyPassword": "secret"
  }
}
```

Post it to `/createTask` on your ZeroCaptcha API host, then poll `/getTaskResult` with the
`taskId`. Every field keeps its name.

## The cData field

ZeroCaptcha reads the widget's cData from the first of these fields that is present: `cdata`,
`cData`, `data`, `turnstileCData`, then `metadata.cdata` (or `metadata.cData`). Anti-Captcha's
`cData` is one of them, so a client written for Anti-Captcha sends it unchanged. JSON keys are
case-sensitive, so a cData under any other name is ignored, and the site may then reject the token
on its server. See
[Cloudflare Turnstile action and cData](https://zerocaptcha.io/guides/cloudflare-turnstile-action-and-cdata) to find out
whether a widget sets one.

## Checking the result

Poll `getTaskResult` every one or two seconds with `clientKey` and `taskId`. While the task runs,
the reply is `{"errorId": 0, "taskId": "…", "status": "processing"}`. When it is solved, `status` is `ready` and
the token is in `solution.token`:

```python
result = requests.post(f"{API}/getTaskResult", timeout=15,
                       json={"clientKey": KEY, "taskId": task_id}).json()
if result["errorId"]:
    raise RuntimeError(result["errorCode"])      # such as ERROR_CAPTCHA_UNSOLVABLE
if result["status"] == "ready":
    token = result["solution"]["token"]          # use it within 300 seconds
```

The balance call is the same too: `getBalance` with `clientKey` answers
`{"errorId": 0, "balance": 12.3456}`, in US dollars.

## Other differences to check

- **Task IDs are UUIDs.** A client that stores or parses them as integers needs to keep them as
  strings.
- **Proxy types are `http` and `https`.** SOCKS proxies are not supported yet: a task with one is
  refused before any money is held. [Solve Cloudflare Turnstile with a proxy](https://zerocaptcha.io/guides/solve-cloudflare-turnstile-with-a-proxy)
  covers the formats.
- **The ready reply** carries `solution.token` and `solution.type`, plus `cost`, `createTime`,
  `endTime`, `solveCount` and `expiresAt`. A Turnstile token works once, for 300 seconds.
- **Extra fields are ignored.** A `userAgent` in the task, for example, is accepted and not used.
- **Reports are recorded, not refunded.** `reportIncorrectRecaptcha` and `reportCorrectRecaptcha`
  answer as Anti-Captcha's do, and our staff read them, but every charge is final.
- **Errors come as `errorId` 1** with `errorCode` and `errorDescription`, always with HTTP 200.
  The [errors reference](https://zerocaptcha.io/docs/reference/errors) lists every code and what it costs.

## Prices

Anti-Captcha lists Cloudflare Turnstile at $2 per 1,000 on its pay-as-you-go price table on
[its home page](https://anti-captcha.com/) (checked 1 October 2026). ZeroCaptcha's current price
per 1,000 solved tasks is on the [pricing page](https://zerocaptcha.io/pricing). ZeroCaptcha holds the price when a task
is created and charges it only when a token is ready.

## Rolling it out

1. Create an account, a key and a first top-up: the [quickstart](https://zerocaptcha.io/docs/quickstart) takes a few
   minutes.
2. Point one worker at ZeroCaptcha's API host and compare results on your pages.
3. Move the rest once the numbers look right.

The [Anti-Captcha alternative](https://zerocaptcha.io/compare/anti-captcha-alternative) page compares the two services,
and the [Cloudflare Turnstile solver](https://zerocaptcha.io/cloudflare-turnstile-solver) page has full samples in every supported language.

## Questions

### Do I have to rename cData?

No. ZeroCaptcha reads Anti-Captcha's cData as it is spelled, as well as cdata, data, turnstileCData and metadata.cdata.

### Does TurnstileTask need a proxy on ZeroCaptcha?

Yes. TurnstileTask solves through the proxy you give, over HTTP or HTTPS; TurnstileTaskProxyless needs none.

### What changes in my code?

The API host and the key. Check too that your code keeps task IDs as text: ZeroCaptcha's are UUIDs.
