API Documentation
Asynchronous API for solving captchas, compatible with the anti-captcha createTask / getTaskResult format. Create a task, poll for the result, pay only for solved captchas.
Authentication
Authentication uses your API key, passed as "clientKey" in the JSON body of every request. There is no separate auth header. You can find your key in the dashboard. All endpoints are POST and accept a JSON body.
Base URLHow it works
The API is asynchronous. Create a task and receive a taskId, then poll getTaskResult until the status is "ready". The recommended polling interval is once every 5 seconds. A task lives for 5 minutes; after that it expires and reserved funds are refunded.
Methods
POST /createTask
Creates a captcha-solving task and returns its taskId. The price of the task type is reserved on your balance and charged only if the task is solved.
Request{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
Response
{
"errorId": 0,
"taskId": 100
}
Supported task types: v1 supports token captchas, proxyless only:
RecaptchaV2TaskProxyless // reCAPTCHA v2
RecaptchaV3TaskProxyless // reCAPTCHA v3 (websiteKey + minScore, pageAction)
TurnstileTaskProxyless // Cloudflare Turnstile
POST /getTaskResult
Returns the task status. While solving, status is "processing"; when done, status is "ready" and "solution" holds the token. If the captcha could not be solved, an error is returned and the reserved funds are refunded.
Request{
"clientKey": "YOUR_API_KEY",
"taskId": 100
}
Response
{ "errorId": 0, "status": "processing" }
{
"errorId": 0,
"status": "ready",
"solution": { "gRecaptchaResponse": "03AGdBq..." }
}
POST /getBalance
Returns the current available balance of your account.
Request{ "clientKey": "YOUR_API_KEY" }
Response
{ "errorId": 0, "balance": 12.34 }
Code examples
A full cycle: create a task, then poll for the result. Replace YOUR_API_KEY, the website URL and the site key with your own values.
cURL# 1. Create a task
curl -s -X POST https://api.captcha-solver.com/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}'
# -> {"errorId":0,"taskId":100}
# 2. Poll for the result (repeat every ~5s until status is "ready")
curl -s -X POST https://api.captcha-solver.com/getTaskResult \
-H "Content-Type: application/json" \
-d '{"clientKey":"YOUR_API_KEY","taskId":100}'
# -> {"errorId":0,"status":"processing"}
# -> {"errorId":0,"status":"ready","solution":{"gRecaptchaResponse":"03AGdBq..."}}
Python
import time
import requests
BASE = "https://api.captcha-solver.com"
API_KEY = "YOUR_API_KEY"
# 1. Create a task
resp = requests.post(f"{BASE}/createTask", json={
"clientKey": API_KEY,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
},
}).json()
if resp["errorId"] != 0:
raise RuntimeError(resp["errorCode"])
task_id = resp["taskId"]
# 2. Poll until ready
while True:
time.sleep(5)
result = requests.post(f"{BASE}/getTaskResult", json={
"clientKey": API_KEY,
"taskId": task_id,
}).json()
if result["errorId"] != 0:
raise RuntimeError(result["errorCode"])
if result["status"] == "ready":
print(result["solution"]["gRecaptchaResponse"])
break
JavaScript (Node 18+)
const BASE = "https://api.captcha-solver.com";
const API_KEY = "YOUR_API_KEY";
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function solve() {
// 1. Create a task
const create = await fetch(`${BASE}/createTask`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: API_KEY,
task: {
type: "RecaptchaV2TaskProxyless",
websiteURL: "https://example.com/login",
websiteKey: "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
},
}),
}).then((r) => r.json());
if (create.errorId !== 0) throw new Error(create.errorCode);
// 2. Poll until ready
while (true) {
await sleep(5000);
const result = await fetch(`${BASE}/getTaskResult`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: API_KEY, taskId: create.taskId }),
}).then((r) => r.json());
if (result.errorId !== 0) throw new Error(result.errorCode);
if (result.status === "ready") return result.solution.gRecaptchaResponse;
}
}
solve().then(console.log);
Postman
In Postman: create a POST request to the endpoint, set the body to raw JSON, and paste the request body below. Or import the ready collection (Import > Raw text):
{
"info": {
"name": "captcha-solver",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "createTask",
"request": {
"method": "POST",
"header": [{ "key": "Content-Type", "value": "application/json" }],
"url": "https://api.captcha-solver.com/createTask",
"body": {
"mode": "raw",
"raw": "{\n \"clientKey\": \"YOUR_API_KEY\",\n \"task\": {\n \"type\": \"RecaptchaV2TaskProxyless\",\n \"websiteURL\": \"https://example.com/login\",\n \"websiteKey\": \"6Le-xxxx\"\n }\n}"
}
}
},
{
"name": "getTaskResult",
"request": {
"method": "POST",
"header": [{ "key": "Content-Type", "value": "application/json" }],
"url": "https://api.captcha-solver.com/getTaskResult",
"body": {
"mode": "raw",
"raw": "{\n \"clientKey\": \"YOUR_API_KEY\",\n \"taskId\": 100\n}"
}
}
}
]
}
Errors
Errors are returned with HTTP 200 and a JSON body: "errorId" is non-zero, together with "errorCode" and "errorDescription". Client libraries match on errorId / errorCode.
| Code | Meaning |
|---|---|
ERROR_KEY_DOES_NOT_EXIST | Invalid or missing clientKey |
ERROR_ZERO_BALANCE | Not enough balance to create the task |
ERROR_NO_SUCH_CAPCHA_ID | Unknown taskId or the task has expired |
ERROR_CAPTCHA_UNSOLVABLE | The captcha could not be solved (funds refunded) |
ERROR_TASK_ABSENT | The task object is missing |
ERROR_TASK_NOT_SUPPORTED | Task type is not supported |
Need help? Contact support.