{"name":"ZeroCaptcha API","version":"0.1.0","baseUrl":"https://api.zerocaptcha.io","site":"https://zerocaptcha.io","docs":"https://zerocaptcha.io/docs","openapi":"https://zerocaptcha.io/openapi.json","llms":"https://zerocaptcha.io/llms-full.txt","auth":{"header":"Authorization","scheme":"Bearer","keyPrefix":"zc_live_","keyLength":41,"keyVariable":"ZEROCAPTCHA_KEY","baseUrlVariable":"ZEROCAPTCHA_API","scopes":["tasks","balance"],"compatible":"clientKey, in the JSON body","twoCaptcha":"key, a query or form parameter","description":"An API key sent as `Authorization: Bearer <key>`: it starts with `zc_live_`, and every task it makes is real and charged. A key needs no CSRF token."},"endpoints":[{"method":"POST","path":"/createTask","operationId":"compatCreateTask","tag":"compatible","summary":"Create a task (compatible)","description":"The createTask call other providers use. The body is `{\"clientKey\": \"…\", \"task\": {\"type\": \"TurnstileTaskProxyless\", \"websiteURL\": \"…\", \"websiteKey\": \"…\"}}`; the reply is `{\"errorId\": 0, \"taskId\": \"…\"}`. An `Idempotency-Key` header works as it does on REST. Creations share the key's and the account's budgets, if the service sets any, with `POST /v1/tasks`. Over one, the reply is `ERROR_RATE_LIMIT` with `Retry-After`, and nothing is created or charged.","auth":"clientKey in the JSON body","parameters":[{"in":"header","name":"Idempotency-Key","required":false,"description":"Your ID for this task, 1 to 255 visible ASCII characters, as on `POST /v1/tasks`."}],"request":{"contentType":"application/json","schema":"CompatCreateRequest"},"responses":[{"status":"200","description":"`errorId` 0 with `taskId`, or 1 with `errorCode` and `errorDescription`."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"POST","path":"/feedbackTask","operationId":"compatFeedbackTask","tag":"compatible","summary":"Report how a token did (CapSolver)","description":"CapSolver's `feedbackTask`: `{\"clientKey\": \"…\", \"taskId\": \"…\", \"result\": {\"invalid\": true}}` says the site refused the token, `false` that it took it; `invalid` may also come beside `result`. Recorded for our staff, never refunded. Without `invalid`, `ERROR_INVALID_REQUEST`.","auth":"clientKey in the JSON body","parameters":[],"request":{"contentType":"application/json","schema":"CompatFeedbackRequest"},"responses":[{"status":"200","description":"`errorId` 0 with `status: \"success\"`, or 1 with `errorCode` and `errorDescription`: `ERROR_NO_SUCH_CAPCHA_ID` for a task this key's account does not have, `ERROR_REPORT_NOT_RECORDED` for one that did not succeed, and `ERROR_DUPLICATE_REPORT` for one reported already."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"POST","path":"/getBalance","operationId":"compatGetBalance","tag":"compatible","summary":"Get the balance (compatible)","description":"`{\"clientKey\": \"…\"}`; the reply is `{\"errorId\": 0, \"balance\": 12.3456}`, the available balance in US dollars, printed exactly. Reads share their budgets with REST; over one, the reply is `ERROR_RATE_LIMIT` with `Retry-After`.","auth":"clientKey in the JSON body","parameters":[],"request":{"contentType":"application/json","schema":"CompatBalanceRequest"},"responses":[{"status":"200","description":"The balance, or an error in the dialect's shape."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"POST","path":"/getTaskResult","operationId":"compatGetTaskResult","tag":"compatible","summary":"Get a task's result (compatible)","description":"`{\"clientKey\": \"…\", \"taskId\": \"…\"}`. While the task runs the reply is `{\"errorId\": 0, \"status\": \"processing\"}`; once solved it is `status: \"ready\"` with `solution.token` and `cost`, and for a challenge page `solution.userAgent` and `solution.cookies` too. A failed task, or one whose token expired, replies with `errorId: 1` and its `errorCode`. Polls share the budgets for reads with REST; over one, the reply is `ERROR_RATE_LIMIT` with `Retry-After`.","auth":"clientKey in the JSON body","parameters":[],"request":{"contentType":"application/json","schema":"CompatResultRequest"},"responses":[{"status":"200","description":"The task's state, or an error in the dialect's shape."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"GET","path":"/in.php","operationId":"twoCaptchaSubmit","tag":"2captcha","summary":"Submit a task (2Captcha)","description":"2Captcha's `in.php` for Cloudflare Turnstile: `method=turnstile` with `sitekey` and `pageurl`, and optionally `action`, `data`, `proxy` and `pingback`. The reply is `OK|<task id>`, or `{\"status\": 1, \"request\": \"<task id>\"}` with `json=1`; poll `res.php` with the ID. Priced, held and charged as `POST /v1/tasks` is; an `Idempotency-Key` header works as it does there.","auth":"key parameter","parameters":[{"in":"query","name":"key","required":true,"description":"Your API key, `zc_live_…`. A missing or malformed one is `ERROR_WRONG_USER_KEY`, an unknown or revoked one `ERROR_KEY_DOES_NOT_EXIST`."},{"in":"query","name":"method","required":true,"description":"`turnstile`; any other method is `ERROR_BAD_PARAMETERS`."},{"in":"query","name":"sitekey","required":true,"description":"The widget's site key."},{"in":"query","name":"pageurl","required":true,"description":"The page the widget is on: a public http or https page, as `websiteURL` is on REST. Missing or invalid, `ERROR_PAGEURL`."},{"in":"query","name":"action","required":false,"description":"The widget's action, if it sets one."},{"in":"query","name":"data","required":false,"description":"The widget's cData, if it sets one."},{"in":"query","name":"pingback","required":false,"description":"Where to POST the result once the task ends: 2Captcha's pingback form, `id` and `code`, signed with your callback secret. Any public URL, with no registration."},{"in":"query","name":"json","required":false,"description":"`1` for JSON replies; `0`, the default, for plain text."},{"in":"query","name":"proxy","required":false,"description":"Your proxy as `login:password@host:port` or `host:port`; the task then runs through it."},{"in":"query","name":"proxytype","required":false,"description":"`HTTP`, the default, or `HTTPS`. SOCKS is not supported yet (`ERROR_PROXY_FORMAT`)."},{"in":"query","name":"soft_id","required":false,"description":"Accepted and ignored."},{"in":"query","name":"header_acao","required":false,"description":"Accepted and ignored: this service sends no CORS headers."},{"in":"query","name":"pagedata","required":false,"description":"Accepted and ignored: Cloudflare challenge pages are not supported."},{"in":"query","name":"userAgent","required":false,"description":"Accepted and ignored."},{"in":"header","name":"Idempotency-Key","required":false,"description":"Your ID for this task, 1 to 255 visible ASCII characters, as on `POST /v1/tasks`."}],"responses":[{"status":"200","description":"`OK|<task id>`, or an error code such as `ERROR_ZERO_BALANCE`; with `json=1`, the same as JSON."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with an error code."}]},{"method":"POST","path":"/in.php","operationId":"twoCaptchaSubmitForm","tag":"2captcha","summary":"Submit a task by POST (2Captcha)","description":"`in.php` as a POST, the way 2Captcha's own clients send it: the parameters as a form (`application/x-www-form-urlencoded` or `multipart/form-data`) or a JSON object, and any in the query string too, which win. The replies are those of `GET /in.php`.","auth":"key parameter","parameters":[{"in":"header","name":"Idempotency-Key","required":false,"description":"Your ID for this task, 1 to 255 visible ASCII characters, as on `POST /v1/tasks`."}],"request":{"contentType":"application/x-www-form-urlencoded","schema":"TwoCaptchaSubmit"},"responses":[{"status":"200","description":"`OK|<task id>`, or an error code such as `ERROR_ZERO_BALANCE`; with `json=1`, the same as JSON."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with an error code."}]},{"method":"POST","path":"/reportCorrect","operationId":"compatReportCorrect","tag":"compatible","summary":"Report a token that worked (2Captcha)","description":"2Captcha's `reportCorrect`: `{\"clientKey\": \"…\", \"taskId\": \"…\"}` says the site took the solved task's token. Recorded for our staff; one report per task, on a task that succeeded.","auth":"clientKey in the JSON body","parameters":[],"request":{"contentType":"application/json","schema":"CompatReportRequest"},"responses":[{"status":"200","description":"`errorId` 0 with `status: \"success\"`, or 1 with `errorCode` and `errorDescription`: `ERROR_NO_SUCH_CAPCHA_ID` for a task this key's account does not have, `ERROR_REPORT_NOT_RECORDED` for one that did not succeed, and `ERROR_DUPLICATE_REPORT` for one reported already."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"POST","path":"/reportCorrectRecaptcha","operationId":"compatReportCorrectRecaptcha","tag":"compatible","summary":"Report a token that worked (Anti-Captcha)","description":"Anti-Captcha's `reportCorrectRecaptcha`: the same as `/reportCorrect`.","auth":"clientKey in the JSON body","parameters":[],"request":{"contentType":"application/json","schema":"CompatReportRequest"},"responses":[{"status":"200","description":"`errorId` 0 with `status: \"success\"`, or 1 with `errorCode` and `errorDescription`: `ERROR_NO_SUCH_CAPCHA_ID` for a task this key's account does not have, `ERROR_REPORT_NOT_RECORDED` for one that did not succeed, and `ERROR_DUPLICATE_REPORT` for one reported already."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"POST","path":"/reportIncorrect","operationId":"compatReportIncorrect","tag":"compatible","summary":"Report a refused token (2Captcha)","description":"2Captcha's `reportIncorrect`: `{\"clientKey\": \"…\", \"taskId\": \"…\"}` says the site refused the solved task's token. It is recorded for our staff, who watch the solvers' quality with it; tasks are final, so it refunds nothing. One report per task, on a task that succeeded.","auth":"clientKey in the JSON body","parameters":[],"request":{"contentType":"application/json","schema":"CompatReportRequest"},"responses":[{"status":"200","description":"`errorId` 0 with `status: \"success\"`, or 1 with `errorCode` and `errorDescription`: `ERROR_NO_SUCH_CAPCHA_ID` for a task this key's account does not have, `ERROR_REPORT_NOT_RECORDED` for one that did not succeed, and `ERROR_DUPLICATE_REPORT` for one reported already."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"POST","path":"/reportIncorrectRecaptcha","operationId":"compatReportIncorrectRecaptcha","tag":"compatible","summary":"Report a refused token (Anti-Captcha)","description":"Anti-Captcha's `reportIncorrectRecaptcha`, which its clients send for a token task: the same as `/reportIncorrect`. Recorded, never refunded.","auth":"clientKey in the JSON body","parameters":[],"request":{"contentType":"application/json","schema":"CompatReportRequest"},"responses":[{"status":"200","description":"`errorId` 0 with `status: \"success\"`, or 1 with `errorCode` and `errorDescription`: `ERROR_NO_SUCH_CAPCHA_ID` for a task this key's account does not have, `ERROR_REPORT_NOT_RECORDED` for one that did not succeed, and `ERROR_DUPLICATE_REPORT` for one reported already."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with `errorId` 1."}]},{"method":"GET","path":"/res.php","operationId":"twoCaptchaResult","tag":"2captcha","summary":"Get a result or the balance (2Captcha)","description":"2Captcha's `res.php`. `action=get&id=<task id>` answers `CAPCHA_NOT_READY` while the task runs, then `OK|<token>`, or an error code such as `ERROR_CAPTCHA_UNSOLVABLE` (nothing charged) or `ERROR_TOKEN_EXPIRED`; `action=get2` adds the price, `OK|<token>|<price>`. `action=get&ids=<id>,<id>,…` reads up to 100 tasks at once: each one's token, `CAPCHA_NOT_READY` or error code, in order, joined by `|`. `action=reportbad` or `reportgood` with `id` records whether the site took the token (`OK_REPORT_RECORDED`): recorded for our staff, never refunded, as tasks are final. `action=getbalance` answers the available balance in US dollars, such as `12.3456`. With `json=1`, each as `{\"status\": …, \"request\": …}`. Reads share their budgets with REST; over one, the reply is `ERROR: 1005` with `Retry-After`.","auth":"key parameter","parameters":[{"in":"query","name":"key","required":true,"description":"Your API key, as for in.php."},{"in":"query","name":"action","required":true,"description":"`get` for a task's token (or several tasks' with `ids`), `get2` for its token and price, `reportbad` or `reportgood` to say whether the site took its token, or `getbalance` for the available balance. Missing, `ERROR_EMPTY_ACTION`."},{"in":"query","name":"id","required":false,"description":"The task's ID, as in.php gave it, for `get`, `get2`, `reportbad` and `reportgood`; a task's UUID from another format works too. Not a task ID, `ERROR_WRONG_ID_FORMAT`; no task of this key's account, `ERROR_WRONG_CAPTCHA_ID`."},{"in":"query","name":"ids","required":false,"description":"With `action=get`, in place of `id`: up to 100 task IDs, comma-separated. The reply is each one's answer in order, joined by `|`, such as `CAPCHA_NOT_READY|0.AbC…|ERROR_CAPTCHA_UNSOLVABLE`."},{"in":"query","name":"json","required":false,"description":"`1` for JSON replies; `0`, the default, for plain text."}],"responses":[{"status":"200","description":"The token, `CAPCHA_NOT_READY`, several tasks' answers, `OK_REPORT_RECORDED`, the balance, or an error code; with `json=1`, the same as JSON."},{"status":"default","description":"Only a failure outside the dialect, as RFC 9457 problem details: a body over the size limit (413), a request that ran out of time (504), this instance shedding load (503, with `Retry-After`) or a fault in the server (500). Every other failure is HTTP 200 with an error code."}]},{"method":"GET","path":"/v1/balance","operationId":"getBalance","tag":"balance","summary":"Get the balance","description":"The available balance and what is held for tasks in progress.","auth":"Authorization: Bearer <key>","parameters":[],"responses":[{"status":"200","description":"The balance."},{"status":"429","description":"Over a budget for reading (`rate_limited`); retry after `Retry-After`."},{"status":"default","description":"An error, as RFC 9457 problem details."}]},{"method":"GET","path":"/v1/prices","operationId":"listPrices","tag":"prices","summary":"List prices","description":"What each task type costs: the price a task created now is charged if it succeeds, and the next change already scheduled. It needs no key or session. Production lists approved prices only; a task type without one is listed with no price in effect, and its tasks are refused until it has one. A task is always charged the price in effect when it was created. Every caller gets the same reply, which caches may keep for up to five minutes; send the `ETag` of a reply you hold as `If-None-Match` to get 304 while it is current. Requests have a budget per client address.","auth":"none","parameters":[{"in":"header","name":"If-None-Match","required":false,"description":"The `ETag` of a reply you hold. While the prices are unchanged, the reply is 304 with no body."}],"responses":[{"status":"200","description":"The prices."},{"status":"304","description":"The prices are those of the reply whose `ETag` was sent: keep using it."},{"status":"429","description":"Over the budget of this client address (`rate_limited`); retry after `Retry-After`, and keep a copy of the list rather than asking again."},{"status":"503","description":"The prices cannot be read now (`service_unavailable`): the database cannot be reached, or this instance is shedding load. Retry shortly."},{"status":"default","description":"An error, as RFC 9457 problem details."}]},{"method":"GET","path":"/v1/tasks","operationId":"listTasks","tag":"tasks","summary":"List tasks","description":"Newest first, with cursor pagination.","auth":"Authorization: Bearer <key>","parameters":[{"in":"query","name":"status","required":false,"description":"Only tasks with this status."},{"in":"query","name":"limit","required":false,"description":"Tasks per page, 1 to 100; 50 by default."},{"in":"query","name":"cursor","required":false,"description":"`nextCursor` from the previous page."},{"in":"query","name":"idempotencyKey","required":false,"description":"Only the task created with this Idempotency-Key, to recover a reply that was lost."}],"responses":[{"status":"200","description":"A page of tasks."},{"status":"429","description":"Over a budget for reading (`rate_limited`); retry after `Retry-After`, and poll less often."},{"status":"default","description":"An error, as RFC 9457 problem details."}]},{"method":"POST","path":"/v1/tasks","operationId":"createTask","tag":"tasks","summary":"Create a task","description":"Queues a task and holds its price on your balance; the price is charged only if the task succeeds. Send an `Idempotency-Key` to retry safely: for 24 hours, the same key and request return the first reply instead of a second task, and the same key with a different request is refused. Creations are bounded by your balance and your account's share of the queue, and by no rate budget unless the service sets one.","auth":"Authorization: Bearer <key>","parameters":[{"in":"header","name":"Idempotency-Key","required":false,"description":"Your ID for this task, 1 to 255 visible ASCII characters."}],"request":{"contentType":"application/json","schema":"CreateTask"},"responses":[{"status":"201","description":"The task, queued; or, for a retry with the same `Idempotency-Key`, the first reply."},{"status":"409","description":"A request with this `Idempotency-Key` is still being processed (`idempotency_key_in_use`); retry after `Retry-After` for its reply."},{"status":"429","description":"The queue share is full (`queue_full`), or a budget for creating the service has set is spent (`rate_limited`). Nothing was created or charged; retry after `Retry-After`."},{"status":"default","description":"An error, as RFC 9457 problem details."}]},{"method":"GET","path":"/v1/tasks/events","operationId":"streamTaskEvents","tag":"tasks","summary":"Live task updates","description":"Server-sent events for the caller's tasks: `task` carries a task (without its token) each time it changes, `reset` asks the client to refetch its list because updates were missed. Start from a list's `liveCursor`. Opening a stream draws on the caller's budget for reads, as a list read does; keeping it open costs nothing more. The stream ends when its key or session no longer allows it, or when its client stops taking events; an account may hold only a few streams open at once.","auth":"Authorization: Bearer <key>","parameters":[{"in":"query","name":"since","required":false,"description":"Where to start: `liveCursor` from a task list, or the last event's ID."},{"in":"header","name":"Last-Event-ID","required":false,"description":"The last event's ID, sent by a reconnecting browser."}],"responses":[{"status":"200","description":"An event stream."},{"status":"429","description":"Over a budget for reading, or as many streams open as the account, or this server, may hold (`rate_limited`); reconnect less often, or close a stream, and retry after `Retry-After`."},{"status":"default","description":"An error, as RFC 9457 problem details."}]},{"method":"GET","path":"/v1/tasks/{id}","operationId":"getTask","tag":"tasks","summary":"Get a task","description":"The task's status, cost and, while it is valid, its token: for a challenge page, its clearance cookie and the user agent it is bound to. A task that named a callback URL shows it with where its delivery stands and each attempt: when, the HTTP status, and when the next is due.","auth":"Authorization: Bearer <key>","parameters":[{"in":"path","name":"id","required":true,"description":"The task's ID."}],"responses":[{"status":"200","description":"The task."},{"status":"429","description":"Over a budget for reading (`rate_limited`); retry after `Retry-After`, and poll less often."},{"status":"default","description":"An error, as RFC 9457 problem details."}]},{"method":"POST","path":"/v1/tasks/{id}/callback/resend","operationId":"resendTaskCallback","tag":"tasks","summary":"Send a task's callback again","description":"Calls the task's callback URL again, as soon as the worker gets to it, with eight more attempts if it fails: once the callback was delivered or given up, or after its record was deleted. It is signed and shaped as the first call was, and carries the same `ZeroCaptcha-Delivery` ID while its record lasts. A key needs the `tasks:write` scope; a session must be an owner's (`role_required`), with the CSRF token. A suspended account sends none (`account_suspended`).","auth":"Authorization: Bearer <key>","parameters":[{"in":"path","name":"id","required":true,"description":"The task's ID."}],"responses":[{"status":"202","description":"Queued: the callback as it stands now."},{"status":"403","description":"A member's session, not an owner's (`role_required`), a key without `tasks:write` (`insufficient_scope`), or a suspended account (`account_suspended`)."},{"status":"404","description":"No task of this account has this ID, or the task names no callback URL (`not_found`)."},{"status":"409","description":"The task has not ended yet, or its callback is still being delivered (`state_conflict`)."},{"status":"default","description":"An error, as RFC 9457 problem details."}]},{"method":"POST","path":"/v1/tasks/{id}/report","operationId":"reportTask","tag":"tasks","summary":"Report a task's token","description":"Says whether the site accepted a solved task's token: `bad` when it refused it, `good` when it worked. The report is recorded for our staff, who watch the solvers' quality with it; tasks are final, so it refunds nothing. One report per task, and only on a task that succeeded. Needs the `tasks:write` scope; with a session, the CSRF token.","auth":"Authorization: Bearer <key>","parameters":[{"in":"path","name":"id","required":true,"description":"The task's ID."}],"request":{"contentType":"application/json","schema":"NewTaskReport"},"responses":[{"status":"201","description":"Recorded."},{"status":"404","description":"No task of this account has this ID (`not_found`)."},{"status":"409","description":"The task did not succeed, so there is no token to report on, or it has a report already (`state_conflict`)."},{"status":"default","description":"An error, as RFC 9457 problem details."}]}],"taskTypes":[{"type":"TurnstileTaskProxyless","kind":"turnstile","mode":"proxyless","alias":false,"required":["websiteKey","websiteURL"],"optional":["action","callbackUrl","cdata"]},{"type":"TurnstileTask","kind":"turnstile","mode":"proxy","alias":false,"required":["proxy","websiteKey","websiteURL"],"optional":["action","callbackUrl","cdata"]},{"type":"AntiTurnstileTaskProxyLess","kind":"turnstile","mode":"proxyless","alias":true,"required":["websiteKey","websiteURL"],"optional":["action","callbackUrl","cdata"]},{"type":"AntiTurnstileTask","kind":"turnstile","mode":"proxy","alias":true,"required":["proxy","websiteKey","websiteURL"],"optional":["action","callbackUrl","cdata"]},{"type":"CloudflareChallengeTask","kind":"cloudflare","mode":"proxy","alias":false,"required":["proxy","websiteURL"],"optional":["callbackUrl"]},{"type":"AntiCloudflareTask","kind":"cloudflare","mode":"proxy","alias":true,"required":["proxy","websiteURL"],"optional":["callbackUrl"]}],"schemas":{"CreateTurnstileTask":[{"name":"action","type":"string | null","required":false,"description":"The widget's action, if it sets one: up to 32 ASCII letters, digits, `_` and `-`.","maxLength":32,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"callbackUrl","type":"string | null","required":false,"description":"Where to POST the result once the task ends, signed with your callback secret (`ZeroCaptcha-Signature`): an http or https URL of at most 2048 characters, without credentials, naming a public domain or a public IP address on a port no other protocol reserves. A call that is not answered 2xx is retried with backoff, eight attempts in all over roughly 65 to 95 minutes; one to a name that resolves to a private address is not made. `callbackUrl` in this dialect.","format":"uri","maxLength":2048},{"name":"cdata","type":"string | null","required":false,"description":"The widget's cData, if it sets one: up to 255 ASCII letters, digits, `_` and `-`.","maxLength":255,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"proxy","type":"string | null","required":false,"description":"Your proxy as a URL with its port, such as `http://user:pass@proxy.example.net:8080`: http or https, as SOCKS is not supported yet. `TurnstileTask` needs one, and `TurnstileTaskProxyless` takes none. The server also checks that the host is public, that the port is not one another protocol reserves, such as 25, and that the login and password are at most 255 bytes each, a password only with a login. Never logged, and deleted when the task finishes.","pattern":"^(?:https?://[^/?#]+:[0-9]+(?:[/?#].*)?)?$"},{"name":"type","type":"string","required":true,"description":"`TurnstileTaskProxyless`, or `TurnstileTask` to solve the widget through your proxy. The same names with CapSolver's `Anti` prefix work too, and case does not matter.","enum":["TurnstileTaskProxyless","TurnstileTask","AntiTurnstileTaskProxyLess","AntiTurnstileTask"]},{"name":"websiteKey","type":"string","required":true,"description":"The widget's site key: 1 to 100 ASCII letters, digits, `_` and `-`.","maxLength":100,"minLength":1,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"websiteURL","type":"string","required":true,"description":"The page the widget is on, or behind the challenge: an http or https URL of at most 2048 characters, without credentials, on its scheme's default port. The server also checks that it names a public domain, not an IP address, a name of one label or one kept for local use such as `localhost`, `*.local` or `*.internal`; the task keeps the URL as the server normalizes it, such as with a lowercase host.","format":"uri","maxLength":2048,"pattern":"^(?:http://[^/?#@:]+(?::80)?|https://[^/?#@:]+(?::443)?)(?:[/?#].*)?$"}],"CreateChallengeTask":[{"name":"callbackUrl","type":"string | null","required":false,"description":"Where to POST the result once the task ends, signed with your callback secret (`ZeroCaptcha-Signature`): an http or https URL of at most 2048 characters, without credentials, naming a public domain or a public IP address on a port no other protocol reserves. A call that is not answered 2xx is retried with backoff, eight attempts in all over roughly 65 to 95 minutes; one to a name that resolves to a private address is not made. `callbackUrl` in this dialect.","format":"uri","maxLength":2048},{"name":"proxy","type":"string","required":true,"description":"Your proxy as a URL with its port, such as `http://user:pass@proxy.example.net:8080`: http or https, as SOCKS is not supported yet. The clearance is earned through it and works only from its address. The server also checks that the host is public, that the port is not one another protocol reserves, such as 25, and that the login and password are at most 255 bytes each, a password only with a login. Never logged, and deleted when the task finishes.","pattern":"^https?://[^/?#]+:[0-9]+(?:[/?#].*)?$"},{"name":"type","type":"string","required":true,"description":"`CloudflareChallengeTask`, or CapSolver's `AntiCloudflareTask`, in any case: pass a Cloudflare challenge page (the WAF's managed, JS or interactive challenge) through your proxy, for its `cf_clearance` cookie. A clearance works only from the IP address and with the user agent that earned it, so there is no proxyless challenge task: `CloudflareChallengeTaskProxyless` is refused.","enum":["CloudflareChallengeTask","AntiCloudflareTask"]},{"name":"websiteURL","type":"string","required":true,"description":"The page the widget is on, or behind the challenge: an http or https URL of at most 2048 characters, without credentials, on its scheme's default port. The server also checks that it names a public domain, not an IP address, a name of one label or one kept for local use such as `localhost`, `*.local` or `*.internal`; the task keeps the URL as the server normalizes it, such as with a lowercase host.","format":"uri","maxLength":2048,"pattern":"^(?:http://[^/?#@:]+(?::80)?|https://[^/?#@:]+(?::443)?)(?:[/?#].*)?$"}],"TaskView":[{"name":"action","type":"string | null","required":false},{"name":"attempts","type":"integer","required":true,"description":"Solve attempts made so far, each one a solver node took on and finished. Waiting for a node with room, however long, is none.","format":"int32"},{"name":"callback","type":"TaskCallback | null","required":false,"description":"The callback the task named, where it stands and each delivery attempt; null when it named none. Filled on `GET /v1/tasks/{id}` only: null in lists, live events and callback payloads."},{"name":"cdata","type":"string | null","required":false},{"name":"cost","type":"Usd","required":true,"description":"What the task has cost: its price once it succeeds, otherwise zero."},{"name":"createdAt","type":"string","required":true,"format":"date-time"},{"name":"deadline","type":"string","required":true,"description":"Unsolved by this time, the task expires and nothing is charged.","format":"date-time"},{"name":"errorCode","type":"string | null","required":false},{"name":"errorDescription","type":"string | null","required":false},{"name":"finishedAt","type":"string | null","required":false,"format":"date-time"},{"name":"held","type":"Usd","required":true,"description":"Held on the balance while the task is queued or running."},{"name":"id","type":"string","required":true,"format":"uuid"},{"name":"idempotencyKey","type":"string | null","required":false},{"name":"kind","type":"TaskType","required":true,"description":"What it solves, whichever name it was sent with: `turnstile`, a widget's token, or `cloudflare`, a challenge page's clearance."},{"name":"maxAttempts","type":"integer","required":true,"description":"The most solve attempts the task gets.","format":"int32"},{"name":"price","type":"Usd","required":true,"description":"What the task is charged if it succeeds."},{"name":"solution","type":"Solution | null","required":false,"description":"Present while the token is available, and only on single-task reads."},{"name":"startedAt","type":"string | null","required":false,"format":"date-time"},{"name":"status","type":"Status","required":true},{"name":"tokenExpiresAt","type":"string | null","required":false,"format":"date-time"},{"name":"tokenIssuedAt","type":"string | null","required":false,"format":"date-time"},{"name":"tokenState","type":"TokenState","required":true},{"name":"type","type":"string","required":true,"description":"The task type as it was sent, such as `TurnstileTaskProxyless`."},{"name":"updatedAt","type":"string","required":true,"format":"date-time"},{"name":"usesProxy","type":"boolean","required":true,"description":"Whether the task runs through the customer's proxy."},{"name":"version","type":"integer","required":true,"description":"Raised on every change; a newer version replaces an older one.","format":"int32"},{"name":"websiteKey","type":"string | null","required":false,"description":"The widget's site key; `null` for a challenge page."},{"name":"websiteURL","type":"string","required":true}],"Solution":[{"name":"cookie","type":"ClearanceCookie | null","required":false,"description":"A challenge page's only: the cookie to send to the site. `null` for a Turnstile token."},{"name":"token","type":"string","required":true,"description":"The Turnstile token, valid once, until tokenExpiresAt; for a challenge page, the value of its `cf_clearance` cookie, as in `cookie`."},{"name":"userAgent","type":"string | null","required":false,"description":"A challenge page's only: the `User-Agent` its clearance was earned with. Cloudflare accepts the cookie only with this user agent, from the address of the proxy that earned it, and from a client whose TLS looks like the browser this names. `null` for a Turnstile token."}],"ClearanceCookie":[{"name":"expiresAt","type":"string | null","required":false,"description":"When the site stops accepting it, if that is known; `null` when it is not. The site's own setting decides (its Challenge Passage, Cloudflare's default being 30 minutes), and the solver does not learn it, so it is `null` today. `tokenExpiresAt` says until when this API serves the cookie.","format":"date-time"},{"name":"name","type":"string","required":true,"description":"Always `cf_clearance`."},{"name":"value","type":"string","required":true}],"TaskPage":[{"name":"data","type":"TaskView[]","required":true,"description":"Tasks without their tokens; read one task to get its token."},{"name":"liveCursor","type":"string","required":true,"description":"Pass as `since` to the live updates, so none are missed after this page was read."},{"name":"nextCursor","type":"string | null","required":false,"description":"Pass as `cursor` for the next page; absent on the last page."}],"Balance":[{"name":"available","type":"Usd","required":true,"description":"What new tasks can be held against."},{"name":"currency","type":"string","required":true},{"name":"held","type":"Usd","required":true,"description":"Held for tasks that are queued or running."}],"Problem":[{"name":"code","type":"ErrorCode","required":true,"description":"The stable, machine-readable error code."},{"name":"detail","type":"string","required":false,"description":"What went wrong in this occurrence. Never present on 5xx responses."},{"name":"instance","type":"string","required":true,"description":"The path of the request that failed.","format":"uri-reference"},{"name":"request_id","type":"string","required":true,"description":"The request's ID, also sent in the `x-request-id` header; quote it when asking for support."},{"name":"status","type":"integer","required":true,"description":"The HTTP status code of the response.","format":"int32","minimum":400,"maximum":599},{"name":"title","type":"string","required":true,"description":"A short summary of the problem type."},{"name":"type","type":"string","required":true,"description":"Identifies the problem type: a link to its section of the error reference, which ends in `#` and the `code`.","format":"uri"}],"CompatCreateRequest":[{"name":"callbackUrl","type":"string | null","required":false,"description":"Where to POST the result once the task ends, signed with your callback secret (`ZeroCaptcha-Signature`): an http or https URL of at most 2048 characters, without credentials, naming a public domain or a public IP address on a port no other protocol reserves. A call that is not answered 2xx is retried with backoff, eight attempts in all over roughly 65 to 95 minutes; one to a name that resolves to a private address is not made. `callbackUrl` in this dialect.","format":"uri","maxLength":2048},{"name":"clientKey","type":"string","required":true,"description":"Your API key, `zc_live_…`. A missing or unknown one is `ERROR_KEY_DOES_NOT_EXIST`.","maxLength":41,"minLength":41,"pattern":"^zc_live_[0-9A-Za-z]+$"},{"name":"task","type":"CompatAnyTask","required":true}],"CompatTask":[{"name":"action","type":"string | null","required":false,"description":"The widget's action, if it sets one: up to 32 ASCII letters, digits, `_` and `-`.","maxLength":32,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"cData","type":"string | null","required":false,"description":"`cdata`, as some clients name it.","maxLength":255,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"cdata","type":"string | null","required":false,"description":"The widget's cData, if it sets one: up to 255 ASCII letters, digits, `_` and `-`.","maxLength":255,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"cloudflareTaskType","type":"string","required":false,"description":"CapMonster Cloud's mode: `token`, or absent, for the widget's token. Its `cf_clearance` and `wait_room` modes are `ERROR_TASK_NOT_SUPPORTED`: use `CloudflareChallengeTask` with your proxy, whose reply gives the clearance and the user agent to send it with.","enum":["token"]},{"name":"data","type":"string | null","required":false,"description":"`cdata`, as some clients name it.","maxLength":255,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"metadata","type":"CompatTaskMetadata | null","required":false},{"name":"pageAction","type":"string | null","required":false,"description":"`action`, as CapMonster Cloud's clients name it.","maxLength":32,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"proxy","type":"string | null","required":false,"description":"Your proxy as a URL with its port, such as `http://user:pass@proxy.example.net:8080`: http or https, as SOCKS is not supported yet. `TurnstileTask` needs one, and `TurnstileTaskProxyless` takes none. The server also checks that the host is public, that the port is not one another protocol reserves, such as 25, and that the login and password are at most 255 bytes each, a password only with a login. Never logged, and deleted when the task finishes.","pattern":"^(?:https?://[^/?#]+:[0-9]+(?:[/?#].*)?)?$"},{"name":"proxyAddress","type":"string | null","required":false,"description":"The proxy's host name or IP address, which must be public: with `proxyPort`, the alternative to `proxy`.","maxLength":253,"minLength":1},{"name":"proxyLogin","type":"string | null","required":false,"description":"The proxy's login: at most 255 bytes.","maxLength":255},{"name":"proxyPassword","type":"string | null","required":false,"description":"The proxy's password: at most 255 bytes, and only with `proxyLogin`. Never logged, and deleted when the task finishes.","maxLength":255},{"name":"proxyPort","type":"integer | null","required":false,"description":"The proxy's port, needed with `proxyAddress`; a string of digits works too. The server refuses a port another protocol reserves, such as 25.","minimum":1,"maximum":65535},{"name":"proxyType","type":"string","required":false,"description":"How the solver talks to the proxy: `http`, the default, or `https`, in any case. SOCKS is not supported yet.","enum":["http","https"]},{"name":"turnstileCData","type":"string | null","required":false,"description":"`cdata`, as some clients name it.","maxLength":255,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"type","type":"string","required":true,"description":"`TurnstileTaskProxyless`, or `TurnstileTask` to solve the widget through your proxy. The same names with CapSolver's `Anti` prefix work too, and case does not matter.","enum":["TurnstileTaskProxyless","TurnstileTask","AntiTurnstileTaskProxyLess","AntiTurnstileTask"]},{"name":"websiteKey","type":"string","required":true,"description":"The widget's site key: 1 to 100 ASCII letters, digits, `_` and `-`.","maxLength":100,"minLength":1,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"websiteURL","type":"string | null","required":false,"description":"The page the widget is on, or behind the challenge: an http or https URL of at most 2048 characters, without credentials, on its scheme's default port. The server also checks that it names a public domain, not an IP address, a name of one label or one kept for local use such as `localhost`, `*.local` or `*.internal`; the task keeps the URL as the server normalizes it, such as with a lowercase host.","format":"uri","maxLength":2048,"pattern":"^(?:http://[^/?#@:]+(?::80)?|https://[^/?#@:]+(?::443)?)(?:[/?#].*)?$"},{"name":"websiteUrl","type":"string | null","required":false,"description":"`websiteURL`, as some clients spell it.","format":"uri","maxLength":2048,"pattern":"^(?:http://[^/?#@:]+(?::80)?|https://[^/?#@:]+(?::443)?)(?:[/?#].*)?$"}],"CompatChallengeTask":[{"name":"proxy","type":"string | null","required":false,"description":"Your proxy as a URL with its port, or give it as the `proxyAddress` fields: a challenge page needs one, as its clearance works only from the proxy's address.","pattern":"^https?://[^/?#]+:[0-9]+(?:[/?#].*)?$"},{"name":"proxyAddress","type":"string | null","required":false,"description":"The proxy's host name or IP address, which must be public: with `proxyPort`, the alternative to `proxy`.","maxLength":253,"minLength":1},{"name":"proxyLogin","type":"string | null","required":false,"description":"The proxy's login: at most 255 bytes.","maxLength":255},{"name":"proxyPassword","type":"string | null","required":false,"description":"The proxy's password: at most 255 bytes, and only with `proxyLogin`. Never logged, and deleted when the task finishes.","maxLength":255},{"name":"proxyPort","type":"integer | null","required":false,"description":"The proxy's port, needed with `proxyAddress`; a string of digits works too. The server refuses a port another protocol reserves, such as 25.","minimum":1,"maximum":65535},{"name":"proxyType","type":"string","required":false,"description":"How the solver talks to the proxy: `http`, the default, or `https`, in any case. SOCKS is not supported yet.","enum":["http","https"]},{"name":"type","type":"string","required":true,"description":"`CloudflareChallengeTask`, or CapSolver's `AntiCloudflareTask`, in any case: pass a Cloudflare challenge page (the WAF's managed, JS or interactive challenge) through your proxy, for its `cf_clearance` cookie. A clearance works only from the IP address and with the user agent that earned it, so there is no proxyless challenge task: `CloudflareChallengeTaskProxyless` is refused.","enum":["CloudflareChallengeTask","AntiCloudflareTask"]},{"name":"websiteURL","type":"string | null","required":false,"description":"The page the widget is on, or behind the challenge: an http or https URL of at most 2048 characters, without credentials, on its scheme's default port. The server also checks that it names a public domain, not an IP address, a name of one label or one kept for local use such as `localhost`, `*.local` or `*.internal`; the task keeps the URL as the server normalizes it, such as with a lowercase host.","format":"uri","maxLength":2048,"pattern":"^(?:http://[^/?#@:]+(?::80)?|https://[^/?#@:]+(?::443)?)(?:[/?#].*)?$"},{"name":"websiteUrl","type":"string | null","required":false,"description":"`websiteURL`, as some clients spell it.","format":"uri","maxLength":2048,"pattern":"^(?:http://[^/?#@:]+(?::80)?|https://[^/?#@:]+(?::443)?)(?:[/?#].*)?$"}],"CompatTaskMetadata":[{"name":"action","type":"string | null","required":false,"description":"The widget's action, if it sets one: up to 32 ASCII letters, digits, `_` and `-`.","maxLength":32,"pattern":"^[\\-0-9A-Z_a-z]*$"},{"name":"cdata","type":"string | null","required":false,"description":"The widget's cData, if it sets one: up to 255 ASCII letters, digits, `_` and `-`.","maxLength":255,"pattern":"^[\\-0-9A-Z_a-z]*$"}],"CompatCreated":[{"name":"errorId","type":"integer","required":true,"description":"0 on success.","format":"int32","minimum":0,"maximum":0},{"name":"taskId","type":"string","required":true,"format":"uuid"}],"CompatResultRequest":[{"name":"clientKey","type":"string","required":true,"description":"Your API key, `zc_live_…`. A missing or unknown one is `ERROR_KEY_DOES_NOT_EXIST`.","maxLength":41,"minLength":41,"pattern":"^zc_live_[0-9A-Za-z]+$"},{"name":"taskId","type":"string","required":true,"description":"The task's ID, as createTask gave it. One that names no task of this key's account is `ERROR_NO_SUCH_CAPCHA_ID`.","format":"uuid"}],"CompatProcessing":[{"name":"errorId","type":"integer","required":true,"description":"0 on success.","format":"int32","minimum":0,"maximum":0},{"name":"status","type":"string","required":true,"description":"Always `processing`.","enum":["processing"]},{"name":"taskId","type":"string","required":true,"format":"uuid"}],"CompatReady":[{"name":"cost","type":"Usd","required":true,"description":"The price charged for the task."},{"name":"createTime","type":"integer","required":true,"description":"When the task was created, in Unix seconds.","format":"int64"},{"name":"endTime","type":"integer","required":true,"description":"When it was solved, in Unix seconds.","format":"int64"},{"name":"errorId","type":"integer","required":true,"description":"0 on success.","format":"int32","minimum":0,"maximum":0},{"name":"expiresAt","type":"string","required":true,"description":"When the token stops being accepted.","format":"date-time"},{"name":"solution","type":"CompatSolution","required":true},{"name":"solveCount","type":"integer","required":true,"description":"The solve attempts it took.","format":"int32"},{"name":"status","type":"string","required":true,"description":"Always `ready`.","enum":["ready"]},{"name":"taskId","type":"string","required":true,"format":"uuid"}],"CompatSolution":[{"name":"cookies","type":"map of string","required":false,"description":"A challenge page's only: the cookies to send to the site, by name: `cf_clearance`."},{"name":"token","type":"string","required":true,"description":"The Turnstile token; for a challenge page, the `cf_clearance` cookie's value."},{"name":"type","type":"string","required":true,"description":"`turnstile` for a Turnstile token, `cloudflare` for a challenge page's clearance.","enum":["turnstile","cloudflare"]},{"name":"userAgent","type":"string","required":false,"description":"A challenge page's only: the `User-Agent` its clearance was earned with. The site accepts the cookie only with it, from your proxy's address."}],"CompatError":[{"name":"cost","type":"Usd","required":false,"description":"What the task cost: its price when it succeeded, 0.000000 when it did not."},{"name":"errorCode","type":"string","required":true,"description":"A stable code, such as `ERROR_KEY_DOES_NOT_EXIST`."},{"name":"errorDescription","type":"string","required":true},{"name":"errorId","type":"integer","required":true,"description":"1 on every failure.","format":"int32","minimum":1,"maximum":1},{"name":"status","type":"CompatEnded","required":false,"description":"`ready` when the task succeeded but its token is no longer usable, `failed` when it did not succeed."},{"name":"taskId","type":"string","required":false,"description":"The task, when the failure is the task's own.","format":"uuid"}],"CompatBalanceRequest":[{"name":"clientKey","type":"string","required":true,"description":"Your API key, `zc_live_…`. A missing or unknown one is `ERROR_KEY_DOES_NOT_EXIST`.","maxLength":41,"minLength":41,"pattern":"^zc_live_[0-9A-Za-z]+$"}],"CompatBalance":[{"name":"balance","type":"number","required":true,"description":"US dollars, printed exactly as a JSON number: 12.3456, 0, 0.0008.","format":"double"},{"name":"errorId","type":"integer","required":true,"description":"0 on success.","format":"int32","minimum":0,"maximum":0}],"TwoCaptchaSubmit":[{"name":"action","type":"string | null","required":false,"description":"The widget's action, if it sets one."},{"name":"data","type":"string | null","required":false,"description":"The widget's cData, if it sets one."},{"name":"header_acao","type":"integer | null","required":false,"description":"Accepted and ignored: this service sends no CORS headers.","format":"int32","minimum":0},{"name":"json","type":"integer | null","required":false,"description":"`1` for JSON replies; `0`, the default, for plain text.","format":"int32","minimum":0},{"name":"key","type":"string","required":true,"description":"Your API key, `zc_live_…`. A missing or malformed one is `ERROR_WRONG_USER_KEY`, an unknown or revoked one `ERROR_KEY_DOES_NOT_EXIST`."},{"name":"method","type":"string","required":true,"description":"`turnstile`; any other method is `ERROR_BAD_PARAMETERS`."},{"name":"pagedata","type":"string | null","required":false,"description":"Accepted and ignored: Cloudflare challenge pages are not supported."},{"name":"pageurl","type":"string","required":true,"description":"The page the widget is on: a public http or https page, as `websiteURL` is on REST. Missing or invalid, `ERROR_PAGEURL`."},{"name":"pingback","type":"string | null","required":false,"description":"Where to POST the result once the task ends: 2Captcha's pingback form, `id` and `code`, signed with your callback secret. Any public URL, with no registration."},{"name":"proxy","type":"string | null","required":false,"description":"Your proxy as `login:password@host:port` or `host:port`; the task then runs through it."},{"name":"proxytype","type":"string | null","required":false,"description":"`HTTP`, the default, or `HTTPS`. SOCKS is not supported yet (`ERROR_PROXY_FORMAT`)."},{"name":"sitekey","type":"string","required":true,"description":"The widget's site key."},{"name":"soft_id","type":"string | null","required":false,"description":"Accepted and ignored."},{"name":"userAgent","type":"string | null","required":false,"description":"Accepted and ignored."}],"TwoCaptchaReply":[{"name":"error_text","type":"string","required":false,"description":"On a failure, what it means and what to do."},{"name":"price","type":"string","required":false,"description":"With `action=get2`: what the task cost, in US dollars."},{"name":"request","type":"string","required":true,"description":"On success the task's ID, its token or the balance; otherwise the code, such as `CAPCHA_NOT_READY` or `ERROR_ZERO_BALANCE`."},{"name":"status","type":"integer","required":true,"description":"1 on success, 0 on failure and while the task is not ready.","format":"int32","minimum":0,"maximum":1}],"PriceList":[{"name":"currency","type":"string","required":true},{"name":"data","type":"TaskPrice[]","required":true,"description":"One entry per task type and mode, in a fixed order."}],"TaskPrice":[{"name":"current","type":"PricePoint | null","required":true,"description":"What a task created now is charged if it succeeds. `null` while no price is in effect, when tasks of this type are refused."},{"name":"mode","type":"TaskMode","required":true},{"name":"next","type":"PricePoint | null","required":true,"description":"The next change already scheduled, if there is one."},{"name":"type","type":"string","required":true,"description":"The task type as `POST /v1/tasks` takes it: `TurnstileTaskProxyless`, `TurnstileTask` to solve a widget through your proxy, or `CloudflareChallengeTask` to pass a challenge page through your proxy.","enum":["TurnstileTaskProxyless","TurnstileTask","CloudflareChallengeTask"]}],"PricePoint":[{"name":"approved","type":"boolean","required":true,"description":"Whether an admin approved it. Production publishes approved prices only; local development and staging publish drafts too, as `false`."},{"name":"effectiveFrom","type":"string","required":true,"description":"When it takes effect, or took effect.","format":"date-time"},{"name":"price","type":"Usd","required":true,"description":"The price of one solved task, exact to the micro-dollar."}]},"enums":{"Status":["queued","running","succeeded","failed","expired"],"TokenState":["pending","available","expired","deleted","none"],"TaskType":["turnstile","cloudflare"],"TaskMode":["proxyless","proxy"],"KeyScope":["tasks","balance"],"ErrorCode":["bad_request","not_found","method_not_allowed","payload_too_large","internal_error","service_unavailable","request_timeout","unauthorized","invalid_credentials","key_revoked","key_limit_reached","key_state_conflict","csrf_rejected","insufficient_scope","ip_not_allowed","account_suspended","insufficient_funds","domain_blocked","validation_failed","idempotency_key_reused","idempotency_key_in_use","queue_full","rate_limited","reauthentication_required","link_invalid","link_expired","link_used","weak_password","state_conflict","role_required","spend_cap_reached","payments_unavailable","email_taken","email_unverified"]},"errors":{"rest":[{"code":"bad_request","status":400,"policy":"fix","meaning":"The request is malformed in a way no more specific code covers, such as a missing or unsupported Content-Type. Other 4xx statuses without a code of their own also use it.","action":"Compare the method, headers and body with the API reference, and send JSON with Content-Type: application/json.","cost":"Nothing. A refused request is never charged."},{"code":"not_found","status":404,"policy":"fix","meaning":"No route matches the path, or no task or key with this ID belongs to your account.","action":"Check the path and the ID. A task or a key is visible only to its own account.","cost":"Nothing. Reads are never charged."},{"code":"method_not_allowed","status":405,"policy":"fix","meaning":"The path exists, but not with this HTTP method.","action":"Use the method the reference gives for the path, such as POST /v1/tasks to create a task.","cost":"Nothing. A refused request is never charged."},{"code":"payload_too_large","status":413,"policy":"fix","meaning":"The request body is larger than the API accepts.","action":"Send only the documented fields. A task needs the page URL, its site key and, when you use them, action, cdata and a proxy.","cost":"Nothing. A refused request is never charged."},{"code":"internal_error","status":500,"policy":"retry","meaning":"Something failed on our side. The reply has no detail; the cause is logged under its request ID.","action":"If it keeps happening, contact support and quote the request_id.","cost":"Nothing for this reply. If a create went through before it, that task is charged only if it succeeds."},{"code":"service_unavailable","status":503,"policy":"retry","meaning":"A service the API depends on is down or overloaded, so the request could not be served.","action":"Retry. If it lasts, check the status page.","cost":"Nothing. A refused request is never charged."},{"code":"request_timeout","status":504,"policy":"retry","meaning":"The API did not finish the request in time. The timeout is on our side, not a slow client.","action":"Retry. To check whether a create went through, list tasks with the idempotencyKey filter.","cost":"Nothing for this reply. If a create went through before it, that task is charged only if it succeeds."},{"code":"unauthorized","status":401,"policy":"fix","meaning":"No valid API key or session came with the request: the Authorization header is missing or malformed, or the key does not exist.","action":"Send Authorization: Bearer followed by a key from the dashboard, and check that the whole key was copied.","cost":"Nothing. A refused request is never charged."},{"code":"invalid_credentials","status":401,"policy":"fix","meaning":"Dashboard log-in only: the email and password do not match an account.","action":"Check the email address and the password, then log in again.","cost":"Nothing. A refused request is never charged."},{"code":"key_revoked","status":401,"policy":"fix","meaning":"The key was revoked, or it was rotated and its overlap has ended, so it can no longer call the API. The detail says which.","action":"Use the key that replaced it, or create a new key in the dashboard, and replace the old one wherever it is used.","cost":"Nothing. A refused request is never charged."},{"code":"key_limit_reached","status":409,"policy":"fix","meaning":"Dashboard only: the account has as many active API keys as it may. A key being replaced by a rotation, and a revoked key, does not count.","action":"Revoke a key you no longer use, then create the new one. To replace a key, rotate it instead: a rotation never needs a free place.","cost":"Nothing. A refused request is never charged."},{"code":"key_state_conflict","status":409,"policy":"fix","meaning":"Dashboard only: the key cannot change this way. It no longer works, so it cannot be renamed, restricted or rotated; it was rotated already, so it cannot be rotated again; or it was never rotated, so it has no overlap to end.","action":"Reload the key to see where it stands. Rotate the key that replaced it, revoke a key to stop it at once, or create a new key.","cost":"Nothing. A refused request is never charged."},{"code":"csrf_rejected","status":403,"policy":"fix","meaning":"Dashboard sessions only: a browser request came from another site, or without the session's CSRF token.","action":"In the dashboard, reload the page. From code, call the API with an API key instead.","cost":"Nothing. A refused request is never charged."},{"code":"insufficient_scope","status":403,"policy":"fix","meaning":"The key lacks the scope this call needs: tasks:write to create tasks, tasks:read to read them and balance:read for the balance. No API key may manage keys: that takes a dashboard session.","action":"Use a key with the scope the detail names, or create one that has it. Manage keys from the dashboard.","cost":"Nothing. A refused request is never charged."},{"code":"ip_not_allowed","status":403,"policy":"fix","meaning":"The key works only from the addresses on its allowlist, and this request came from another.","action":"Add the address to the key's allowlist in the dashboard, or call from an allowed address.","cost":"Nothing. A refused request is never charged."},{"code":"account_suspended","status":403,"policy":"stop","meaning":"The account is suspended: its keys are refused, and it cannot create tasks, make keys or add funds.","action":"Contact support to appeal.","cost":"Nothing. A refused request is never charged."},{"code":"insufficient_funds","status":402,"policy":"fix","meaning":"Your available balance cannot cover the task's price. Prices held for tasks still running count against it.","action":"Add funds in the dashboard, then create the task again.","cost":"Nothing. A refused request is never charged."},{"code":"domain_blocked","status":403,"policy":"stop","meaning":"Tasks for this site are not allowed: it is in a category the Acceptable Use Policy excludes, such as banking or government, or its owner opted out.","action":"Do not send tasks for this site.","cost":"Nothing. A refused request is never charged."},{"code":"validation_failed","status":422,"policy":"fix","meaning":"A field is missing or has an invalid value, such as an unsupported task type, a websiteURL that is not a URL, or a proxy on a proxyless task. The detail names the field.","action":"Fix the field the detail names, then send the request again.","cost":"Nothing. A refused request is never charged."},{"code":"idempotency_key_reused","status":422,"policy":"fix","meaning":"This Idempotency-Key was used within the last 24 hours for a different request.","action":"Use a new key for a new task. Reuse a key only to retry exactly the same request.","cost":"Nothing. A refused request is never charged."},{"code":"idempotency_key_in_use","status":409,"policy":"wait","meaning":"A request with this Idempotency-Key is still being processed.","action":"Wait, then send the same request with the same key.","cost":"Nothing extra. The first request's task, if it made one, is charged only if it succeeds."},{"code":"queue_full","status":429,"policy":"wait","meaning":"Your account's share of the queue, or the solver pool, is full.","action":"Wait, then retry, and spread tasks out over time.","cost":"Nothing. A refused request is never charged."},{"code":"rate_limited","status":429,"policy":"wait","meaning":"The request is over a budget: reads of tasks and the balance for your key or account, sign-in attempts from your address or failures for an email, sign-ups, password reset requests and uses of email links from your address or for an email, emails asked for by one person, or the live streams your account may hold open. Creating tasks has no budget: your balance and your share of the queue bound it instead. The RateLimit and RateLimit-Policy headers show where the key's and account's budgets stand.","action":"Wait, then retry, and pace requests by the RateLimit header: poll results less often, or close a live stream you no longer need.","cost":"Nothing. A refused request is never charged."},{"code":"reauthentication_required","status":403,"policy":"fix","meaning":"The change needs a recent sign-in, such as changing the email address or the password, or turning two-factor or a passkey on or off, and the session last proved who it is longer ago than the account policy's reauthenticationWindow. Managing API keys never needs one.","action":"Confirm the password with POST /v1/session/reauthentication, then send the change again.","cost":"Nothing. A refused request is never charged."},{"code":"link_invalid","status":400,"policy":"fix","meaning":"The email link is not one this service made, or not all of it arrived, as when a mail client cuts a long link short.","action":"Open the link straight from the email, or copy all of it. If it still fails, ask for a new email.","cost":"Nothing. A refused request is never charged."},{"code":"link_expired","status":410,"policy":"fix","meaning":"The email link is past its lifetime, or was replaced: by a newer reset link, a change of address, or a password changed since it was sent.","action":"Ask for a new verification email or a new password reset email; the page that opened the link offers it.","cost":"Nothing. A refused request is never charged."},{"code":"link_used","status":409,"policy":"fix","meaning":"The email link was already used. Each link works once.","action":"Nothing, if the address is verified or the password was reset already: sign in. Otherwise ask for a new email.","cost":"Nothing. A refused request is never charged."},{"code":"weak_password","status":422,"policy":"fix","meaning":"The new password breaks a rule: it has fewer than 8 characters, is the account's email address, or is a common password. The problem's detail says which.","action":"Use at least 8 characters, not the email address and not a common password. A password manager's generated password passes.","cost":"Nothing. A refused request is never charged."},{"code":"state_conflict","status":409,"policy":"fix","meaning":"What was asked conflicts with where the resource stands, such as asking for a verification email for an address that is verified already, or registering a passkey that is registered already.","action":"Read the resource again, such as GET /v1/session, and act on what it shows.","cost":"Nothing. A refused request is never charged."},{"code":"role_required","status":403,"policy":"fix","meaning":"The signed-in person's role does not allow the action: in the dashboard, a member doing what only an owner may, such as managing keys, billing or the team; in the staff console, a staff member without the role the action needs.","action":"Ask an owner of the account (or, for staff, an admin) for the role, or leave the action to someone who holds it.","cost":"Nothing. A refused request is never charged."},{"code":"spend_cap_reached","status":402,"policy":"fix","meaning":"The API key has a daily spend cap, and this task would take what its tasks created today (UTC) hold or were charged past it. Tasks that failed or expired do not count.","action":"Raise or remove the key's cap in the dashboard, use another key, or wait for the next UTC day.","cost":"Nothing. A refused request is never charged."},{"code":"payments_unavailable","status":503,"policy":"retry","meaning":"A top-up cannot be started now: no payment processor is set up, or it did not answer. Balances, tasks and receipts are unaffected.","action":"Try the top-up again later. If it lasts, contact support.","cost":"Nothing. No invoice was created and nothing was charged."},{"code":"email_taken","status":409,"policy":"fix","meaning":"Sign-up only: this email address already has an account. The detail says: This email already has an account. Log in or reset your password.","action":"Log in with the address, or reset its password if you have forgotten it. To open another account, use another address.","cost":"Nothing. A refused request is never charged."},{"code":"email_unverified","status":403,"policy":"fix","meaning":"Dashboard only: creating an API key or starting a top-up needs the signed-in owner's email address confirmed, and it is not yet. Keys the account already has keep working, and everything else in the dashboard works as before.","action":"Open the link in the email ZeroCaptcha sent when you signed up. If it is lost or expired, send a new one from the dashboard, or with POST /v1/email-verification/resend. Wrong address? Change it in Settings.","cost":"Nothing. A refused request is never charged."}],"compatible":[{"code":"ERROR_TASK_ABSENT","policy":"fix","meaning":"The body has no task object, or the task has no type.","action":"Send a task with a type, such as TurnstileTaskProxyless.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_TASK_NOT_SUPPORTED","policy":"fix","meaning":"The task type is not one ZeroCaptcha solves.","action":"Use TurnstileTaskProxyless, TurnstileTask with your proxy, or CloudflareChallengeTask with your proxy for a challenge page. AntiTurnstileTaskProxyLess, AntiTurnstileTask and AntiCloudflareTask work too, as the same tasks. A challenge page without a proxy is refused this way too: its clearance would not work from your address.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_INVALID_TASK_DATA","policy":"fix","meaning":"A task field is missing or invalid: a websiteURL that is not a URL, no websiteKey on a Turnstile task, a proxy on a proxyless task or none on TurnstileTask or a challenge page. The errorDescription names the problem. As a task outcome, the solver refused the task's parameters after it was queued.","action":"Fix the field the errorDescription names, then create the task again.","cost":"Nothing. A refused request is never charged, and a task that fails this way is released in full."},{"code":"ERROR_KEY_DOES_NOT_EXIST","policy":"fix","meaning":"The clientKey is missing, or is not a valid key.","action":"Send a key from the dashboard as clientKey, and check that the whole key was copied.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_KEY_REVOKED","policy":"fix","meaning":"The key was revoked, or it was rotated and its overlap has ended, so it can no longer call the API. The errorDescription says which.","action":"Use the key that replaced it, or create a new key in the dashboard, and replace the old one wherever it is used.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_ACCOUNT_SUSPENDED","policy":"stop","meaning":"The account is suspended. As a task outcome, it was suspended after the task was created and before it ran.","action":"Contact support to appeal.","cost":"Nothing. A refused request is never charged, and a task stopped this way is released in full."},{"code":"ERROR_IP_NOT_ALLOWED","policy":"fix","meaning":"The key works only from the addresses on its allowlist, and this request came from another.","action":"Add the address to the key's allowlist in the dashboard, or call from an allowed address.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_ACCESS_DENIED","policy":"fix","meaning":"The key lacks the scope this call needs: tasks:write for createTask, tasks:read for getTaskResult and balance:read for getBalance.","action":"Use a key with the scope the errorDescription names, or create one that has it.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_DOMAIN_BLOCKED","policy":"stop","meaning":"Tasks for this site are not allowed: it is in a category the Acceptable Use Policy excludes, or its owner opted out. As a task outcome, the site was blocked after the task was created.","action":"Do not send tasks for this site.","cost":"Nothing. A refused request is never charged, and a task stopped this way is released in full."},{"code":"ERROR_ZERO_BALANCE","policy":"fix","meaning":"Your available balance cannot cover the task's price. Prices held for tasks still running count against it.","action":"Add funds in the dashboard, then create the task again.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_NO_SLOT_AVAILABLE","policy":"wait","meaning":"Your account's share of the queue, or the solver pool, is full.","action":"Wait, then retry, and spread tasks out over time.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_RATE_LIMIT","policy":"wait","meaning":"The call is over a budget of your key or account: getTaskResult and getBalance share one. createTask has none: your balance and your share of the queue bound it instead. The same condition as rate_limited, under the name clients of this format already handle.","action":"Wait, then retry, and poll getTaskResult less often.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_IDEMPOTENCY_KEY_REUSED","policy":"fix","meaning":"The Idempotency-Key header was used within the last 24 hours for a different createTask request.","action":"Use a new key for a new task. Reuse a key only to retry exactly the same request.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_IDEMPOTENCY_KEY_IN_USE","policy":"wait","meaning":"A createTask request with this Idempotency-Key is still being processed.","action":"Wait a moment, then send the same request with the same key.","cost":"Nothing extra. The first request's task, if it made one, is charged only if it succeeds."},{"code":"ERROR_NO_SUCH_CAPCHA_ID","policy":"fix","meaning":"The taskId is missing, is not a task ID, or names no task of this key's account. CAPCHA is the dialect's own spelling.","action":"Poll with the taskId that createTask returned, using a key of the same account.","cost":"Nothing. Reads are never charged."},{"code":"ERROR_SERVICE_UNAVAILABLE","policy":"retry","meaning":"The API could not serve the request right now.","action":"Retry. If it lasts, check the status page.","cost":"Nothing for this reply. If a create went through before it, that task is charged only if it succeeds."},{"code":"ERROR_REPORT_NOT_RECORDED","policy":"fix","meaning":"A report (reportIncorrect, reportCorrect, their Recaptcha forms, or feedbackTask) named a task that did not succeed, so it has no token to report on.","action":"Report only tasks that succeeded. Reports are recorded for our staff and never refund a task.","cost":"Nothing. Reads are never charged."},{"code":"ERROR_DUPLICATE_REPORT","policy":"fix","meaning":"The task has a report already: one per task.","action":"Send one report per task.","cost":"Nothing. Reads are never charged."},{"code":"ERROR_INVALID_REQUEST","policy":"fix","meaning":"The body is not valid JSON, or is not a JSON object; or feedbackTask came without result.invalid.","action":"Send a JSON object. The Content-Type does not matter here, so clients that send JSON as text/plain work.","cost":"Nothing. A refused request is never charged."},{"code":"ERROR_TOKEN_EXPIRED","policy":"new-task","meaning":"getTaskResult only: the task succeeded, but its token has expired. Turnstile tokens work once, for 300 seconds. The reply keeps status ready and includes the cost.","action":"Create a new task, and use each token as soon as it is ready.","cost":"The task's price. It succeeded, so it was charged, even though its token expired before it was used."},{"code":"ERROR_SPEND_CAP_REACHED","policy":"fix","meaning":"createTask only: the API key's daily spend cap would be passed by this task. The same condition as spend_cap_reached.","action":"Raise or remove the key's cap in the dashboard, or wait for the next UTC day.","cost":"Nothing. A refused request is never charged."}],"taskOutcomes":[{"code":"ERROR_CAPTCHA_UNSOLVABLE","policy":"new-task","meaning":"Every attempt to solve the challenge failed.","action":"If it keeps happening, check the websiteURL and websiteKey and, with TurnstileTask or a challenge page, that your proxy works.","cost":"Nothing. The price held when the task was created goes back to your balance in full."},{"code":"ERROR_TASK_TIMEOUT","policy":"new-task","meaning":"The task was not solved before its deadline.","action":"Create a new task. If timeouts keep happening, check the status page.","cost":"Nothing. The price held when the task was created goes back to your balance in full."},{"code":"ERROR_DOMAIN_BLOCKED","policy":"stop","meaning":"Tasks for this site are not allowed: it is in a category the Acceptable Use Policy excludes, or its owner opted out. As a task outcome, the site was blocked after the task was created.","action":"Do not send tasks for this site.","cost":"Nothing. A refused request is never charged, and a task stopped this way is released in full."},{"code":"ERROR_ACCOUNT_SUSPENDED","policy":"stop","meaning":"The account is suspended. As a task outcome, it was suspended after the task was created and before it ran.","action":"Contact support to appeal.","cost":"Nothing. A refused request is never charged, and a task stopped this way is released in full."},{"code":"ERROR_ACCOUNT_DELETED","policy":"stop","meaning":"An owner deleted the account while the task was queued, which cancels every task it had queued.","action":"Nothing to do. To start again, sign up for a new account.","cost":"Nothing. The price held when the task was created goes back to your balance in full."},{"code":"ERROR_PROXY_NOT_ALLOWED","policy":"fix","meaning":"The proxy points at a private or reserved address, such as 127.0.0.1 or 10.0.0.0/8, which tasks cannot use.","action":"Use a proxy with a public address.","cost":"Nothing. The price held when the task was created goes back to your balance in full."},{"code":"ERROR_INVALID_TASK_DATA","policy":"fix","meaning":"A task field is missing or invalid: a websiteURL that is not a URL, no websiteKey on a Turnstile task, a proxy on a proxyless task or none on TurnstileTask or a challenge page. The errorDescription names the problem. As a task outcome, the solver refused the task's parameters after it was queued.","action":"Fix the field the errorDescription names, then create the task again.","cost":"Nothing. A refused request is never charged, and a task that fails this way is released in full."}],"twoCaptcha":[{"code":"ERROR_WRONG_USER_KEY","policy":"fix","meaning":"The key is missing or is not a ZeroCaptcha key."},{"code":"ERROR_KEY_DOES_NOT_EXIST","policy":"fix","meaning":"The key is unknown, revoked or expired."},{"code":"ERROR_IP_NOT_ALLOWED","policy":"fix","meaning":"The key's allowlist does not include this address."},{"code":"ERROR_ACCESS_DENIED","policy":"fix","meaning":"The key lacks the scope: `tasks` to create and read tasks, `balance` for `getbalance`."},{"code":"ERROR_ZERO_BALANCE","policy":"fix","meaning":"Your available balance does not cover the task. Add funds."},{"code":"ERROR_SPEND_CAP_REACHED","policy":"fix","meaning":"The key's daily spend cap is reached."},{"code":"ERROR_PAGEURL","policy":"fix","meaning":"`pageurl` is missing, or is not a public `http` or `https` page."},{"code":"ERROR_BAD_PARAMETERS","policy":"fix","meaning":"A parameter is missing or wrong: `method`, `sitekey`, `pingback` or `action`; or `res.php` was asked for a challenge-page task, which this format cannot carry."},{"code":"ERROR_PROXY_FORMAT","policy":"fix","meaning":"The proxy is not `login:password@host:port` or `host:port`, is SOCKS, or is not public."},{"code":"ERROR_DOMAIN_BLOCKED","policy":"stop","meaning":"The site is on our blocklist."},{"code":"ERROR_ACCOUNT_SUSPENDED","policy":"stop","meaning":"The account is suspended."},{"code":"ERROR_NO_SLOT_AVAILABLE","policy":"wait","meaning":"The queue is full for a moment: send the task again shortly."},{"code":"ERROR_IDEMPOTENCY_KEY_REUSED","policy":"fix","meaning":"The `Idempotency-Key` was used for a different task."},{"code":"ERROR_IDEMPOTENCY_KEY_IN_USE","policy":"wait","meaning":"The first request with this `Idempotency-Key` is still being served: send it again shortly."},{"code":"ERROR_SERVICE_UNAVAILABLE","policy":"retry","meaning":"We could not serve the request just now: try again shortly."},{"code":"MAX_USER_TURN","policy":"wait","meaning":"`in.php` is called too often: wait the seconds in `Retry-After`."},{"code":"ERROR_EMPTY_ACTION","policy":"fix","meaning":"`res.php` was called without `action`."},{"code":"ERROR_WRONG_ID_FORMAT","policy":"fix","meaning":"`id` is not a task ID."},{"code":"ERROR_WRONG_CAPTCHA_ID","policy":"fix","meaning":"No task of this account has that ID."},{"code":"ERROR_REPORT_NOT_RECORDED","policy":"fix","meaning":"`reportbad` or `reportgood` named a task that did not succeed."},{"code":"ERROR_DUPLICATE_REPORT","policy":"fix","meaning":"`reportbad` or `reportgood` named a task reported already: one report per task."},{"code":"ERROR_CAPTCHA_UNSOLVABLE","policy":"new-task","meaning":"The task was not solved, or not before its deadline; nothing is charged."},{"code":"ERROR_BAD_PROXY","policy":"fix","meaning":"Your proxy pointed at an address tasks cannot use; nothing is charged."},{"code":"ERROR_TOKEN_EXPIRED","policy":"new-task","meaning":"The task was solved and charged, but its token has expired."},{"code":"ERROR: 1005","policy":"wait","meaning":"`res.php` is called too often: wait the seconds in `Retry-After`."}]},"facts":{"pollIntervalSeconds":2,"taskDeadlineSeconds":150,"maxAttempts":3,"tokenLifetimeSeconds":{"turnstile":300,"cloudflare":1800},"tokenDeletedAfterSeconds":600,"idempotencyWindowHours":24,"queueRetryAfterSeconds":2,"bodyLimitBytes":65536,"requestTimeoutSeconds":10,"readBudget":{"perKey":"200 per 2 seconds","perAccount":"200 per 2 seconds"},"activeTasksPerAccount":50,"streamsPerAccount":10,"callbacks":{"timeoutSeconds":10,"attempts":8,"firstRetrySeconds":30,"maxRetrySeconds":3600,"signatureToleranceSeconds":300}},"retries":{"retryStatuses":[429,500,502,503,504],"retryCodes":["idempotency_key_in_use","queue_full","rate_limited","service_unavailable"],"honourRetryAfter":true,"backoff":{"initialSeconds":1,"multiplier":2,"maxSeconds":16,"jitter":"multiply by a random 0.5 to 1"},"requestTimeoutSeconds":15,"solveDeadlineSeconds":180},"idempotency":{"header":"Idempotency-Key","value":"1 to 255 visible ASCII characters; one new value per task, reused only to retry that task","windowHours":24,"replayedHeader":"Idempotent-Replayed","sameKeyDifferentRequest":"idempotency_key_reused (422), or ERROR_IDEMPOTENCY_KEY_REUSED","stillRunning":"idempotency_key_in_use (409, Retry-After), or ERROR_IDEMPOTENCY_KEY_IN_USE","lookup":"GET /v1/tasks?idempotencyKey=<key>"},"callbacks":{"field":"callbackUrl","twoCaptchaField":"pingback","signatureHeader":"ZeroCaptcha-Signature","signature":"t=<unix seconds>,v1=<hex HMAC-SHA256 of `<t>.<raw body>` keyed with the callback secret>","deliveryHeader":"ZeroCaptcha-Delivery","secretPrefix":"zcsig_","userAgent":"ZeroCaptcha-Callbacks/1.0","bodies":{"rest":"application/json: the task, as GET /v1/tasks/{id} shows it","compatible":"application/json: the reply getTaskResult would give","twoCaptcha":"application/x-www-form-urlencoded: id=<task id>&code=<token or error code>"},"timeoutSeconds":10,"attempts":8,"firstRetrySeconds":30,"maxRetrySeconds":3600,"signatureToleranceSeconds":300},"examples":{"createTurnstileTask":{"request":{"type":"TurnstileTaskProxyless","websiteURL":"https://example.com/login","websiteKey":"0x4AAAAAAAB1cD2eF3gH4iJ5","action":"login","cdata":"session-7f3a9c2e"}},"createChallengeTask":{"request":{"type":"CloudflareChallengeTask","websiteURL":"https://example.com/","proxy":"http://user:pass@proxy.example.net:8080"}},"succeededTurnstileTask":{"id":"0192f3a4-7b1c-7d2e-9f10-3c4d5e6f7a8b","type":"TurnstileTaskProxyless","kind":"turnstile","status":"succeeded","websiteURL":"https://example.com/login","websiteKey":"0x4AAAAAAAB1cD2eF3gH4iJ5","action":"login","cdata":"session-7f3a9c2e","usesProxy":false,"price":"0.000800","held":"0.000000","cost":"0.000800","attempts":1,"maxAttempts":3,"errorCode":null,"errorDescription":null,"solution":{"token":"0.Zm9vYmFy…","userAgent":null,"cookie":null},"tokenState":"available","tokenIssuedAt":"2026-09-30T14:02:14Z","tokenExpiresAt":"2026-09-30T14:07:14Z","createdAt":"2026-09-30T14:02:05Z","startedAt":"2026-09-30T14:02:06Z","finishedAt":"2026-09-30T14:02:14Z","deadline":"2026-09-30T14:04:35Z","updatedAt":"2026-09-30T14:02:14Z","idempotencyKey":"2c6ad4a4-5d0b-4be4-9d60-3f1f1e1b8a52","version":3},"failedTask":{"id":"0192f3a4-7b1c-7d2e-9f10-3c4d5e6f7a8b","type":"TurnstileTaskProxyless","kind":"turnstile","status":"failed","websiteURL":"https://example.com/login","websiteKey":"0x4AAAAAAAB1cD2eF3gH4iJ5","action":null,"cdata":null,"usesProxy":false,"price":"0.000800","held":"0.000000","cost":"0.000000","attempts":3,"maxAttempts":3,"errorCode":"ERROR_CAPTCHA_UNSOLVABLE","errorDescription":"Every attempt to solve the challenge failed. Nothing was charged.","solution":null,"tokenState":"none","tokenIssuedAt":null,"tokenExpiresAt":null,"createdAt":"2026-09-30T14:02:05Z","startedAt":"2026-09-30T14:02:06Z","finishedAt":"2026-09-30T14:02:40Z","deadline":"2026-09-30T14:04:35Z","updatedAt":"2026-09-30T14:02:40Z","idempotencyKey":null,"version":7},"problem":{"type":"https://zerocaptcha.io/docs/reference/errors/#insufficient_funds","title":"Insufficient funds","status":402,"detail":"Your balance cannot cover this task. Add funds and try again.","instance":"/v1/tasks","code":"insufficient_funds","request_id":"0192f3a4-7b1c-7d2e-9f10-3c4d5e6f7a8c"},"balance":{"available":"12.345600","held":"0.001600","currency":"USD"}}}
