Документация API
Асинхронное API для решения капч, совместимое с форматом anti-captcha (createTask / getTaskResult). Создаёте задачу, опрашиваете результат, платите только за решённые капчи.
Аутентификация
Аутентификация — по API-ключу, который передаётся в поле "clientKey" в теле JSON каждого запроса. Отдельного заголовка авторизации нет. Ключ можно найти в личном кабинете. Все методы работают через POST и принимают JSON.
Базовый URLКак это работает
API асинхронное. Создаёте задачу и получаете taskId, затем опрашиваете getTaskResult, пока статус не станет "ready". Рекомендуемый интервал опроса — раз в 5 секунд. Задача живёт 5 минут; после этого она истекает, а зарезервированные средства возвращаются.
Методы
В API три POST-метода: createTask отправляет капчу на решение, getTaskResult возвращает решение, getBalance показывает баланс аккаунта. Каждый запрос — JSON-тело с clientKey.
POST /createTask
Создаёт задачу на решение капчи и возвращает её taskId. Цена типа задачи резервируется на балансе и списывается только если задача решена.
Запрос{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
Ответ
{
"errorId": 0,
"taskId": 100
}
Поддерживаемые типы задач: В v1 поддерживаются токен-капчи, proxyless или с вашим прокси:
RecaptchaV2TaskProxyless // reCAPTCHA v2
RecaptchaV3TaskProxyless // reCAPTCHA v3 (websiteKey + minScore, pageAction)
TurnstileTaskProxyless // Cloudflare Turnstile
RecaptchaV2Task // reCAPTCHA v2 (your proxy)
TurnstileTask // Cloudflare Turnstile (your proxy)
Типы без суффикса Proxyless решаются через ваш прокси и требуют proxyType (http, socks4 или socks5), proxyAddress и proxyPort. Опционально: proxyLogin и proxyPassword (для прокси с авторизацией) и userAgent.
reCAPTCHA v2
Типы RecaptchaV2TaskProxyless и RecaptchaV2Task. Опциональное поле: isInvisible (true для невидимой reCAPTCHA). Ключ решения — gRecaptchaResponse.
Примеры объекта task// RecaptchaV2TaskProxyless
{
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"isInvisible": false
}
// RecaptchaV2Task (your proxy)
{
"type": "RecaptchaV2Task",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"proxyType": "http",
"proxyAddress": "1.2.3.4",
"proxyPort": 8080,
"proxyLogin": "user",
"proxyPassword": "password",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."
}
reCAPTCHA v3
Тип RecaptchaV3TaskProxyless. Обязательное поле: minScore (минимально допустимый score, например 0.3); опциональное: pageAction. Прокси для v3 не требуется: задачи решаются с IP-адресов сервиса. Ключ решения — gRecaptchaResponse.
Примеры объекта task// RecaptchaV3TaskProxyless
{
"type": "RecaptchaV3TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"minScore": 0.3,
"pageAction": "login"
}
Cloudflare Turnstile
Типы TurnstileTaskProxyless и TurnstileTask. Дополнительных полей нет. Ключ решения — token.
Примеры объекта task// TurnstileTaskProxyless
{
"type": "TurnstileTaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "0x4AAAAAAAxxxxxxxxxxxxxxxx"
}
// TurnstileTask (your proxy)
{
"type": "TurnstileTask",
"websiteURL": "https://example.com/login",
"websiteKey": "0x4AAAAAAAxxxxxxxxxxxxxxxx",
"proxyType": "http",
"proxyAddress": "1.2.3.4",
"proxyPort": 8080
}
POST /getTaskResult
Возвращает статус задачи. Пока идёт решение, статус будет "processing"; когда готово — "ready", а в "solution" лежит токен. Если решить не удалось, возвращается ошибка, а зарезервированные средства возвращаются на баланс.
Запрос{
"clientKey": "YOUR_API_KEY",
"taskId": 100
}
Ответ
{ "errorId": 0, "status": "processing" }
// reCAPTCHA v2 / v3
{
"errorId": 0,
"status": "ready",
"solution": { "gRecaptchaResponse": "03AGdBq..." }
}
// Turnstile
{
"errorId": 0,
"status": "ready",
"solution": { "token": "0.zxcv..." }
}
Ключ в solution зависит от типа капчи: gRecaptchaResponse для reCAPTCHA v2/v3, token для Turnstile.
POST /getBalance
Возвращает текущий доступный баланс аккаунта.
Запрос{ "clientKey": "YOUR_API_KEY" }
Ответ
{ "errorId": 0, "balance": 12.34 }
Примеры кода
Полный цикл: создать задачу, затем опросить результат. Подставьте свои YOUR_API_KEY, адрес сайта и site key.
reCAPTCHA v2
# 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..."}}
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
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);
reCAPTCHA v3
# 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": "RecaptchaV3TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"minScore": 0.3,
"pageAction": "login"
}
}'
# -> {"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..."}}
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": "RecaptchaV3TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"minScore": 0.3,
"pageAction": "login",
},
}).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
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: "RecaptchaV3TaskProxyless",
websiteURL: "https://example.com/login",
websiteKey: "6Le-xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
minScore: 0.3,
pageAction: "login",
},
}),
}).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);
Cloudflare Turnstile
# 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": "TurnstileTaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "0x4AAAAAAAxxxxxxxxxxxxxxxx"
}
}'
# -> {"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":{"token":"0.zxcv..."}}
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": "TurnstileTaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "0x4AAAAAAAxxxxxxxxxxxxxxxx",
},
}).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"]["token"])
break
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: "TurnstileTaskProxyless",
websiteURL: "https://example.com/login",
websiteKey: "0x4AAAAAAAxxxxxxxxxxxxxxxx",
},
}),
}).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.token;
}
}
solve().then(console.log);
Postman
В Postman: создайте POST-запрос к эндпоинту, выберите тело raw JSON и вставьте тело запроса ниже. Либо импортируйте готовую коллекцию (Import > Raw text):
{
"info": {
"name": "captcha-solver",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "createTask",
"item": [
{
"name": "reCAPTCHA v2 (proxyless)",
"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": "reCAPTCHA v2 (your proxy)",
"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\": \"RecaptchaV2Task\",\n \"websiteURL\": \"https://example.com/login\",\n \"websiteKey\": \"6Le-xxxx\",\n \"proxyType\": \"http\",\n \"proxyAddress\": \"1.2.3.4\",\n \"proxyPort\": 8080,\n \"proxyLogin\": \"user\",\n \"proxyPassword\": \"password\"\n }\n}"
}
}
},
{
"name": "reCAPTCHA v3 (proxyless)",
"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\": \"RecaptchaV3TaskProxyless\",\n \"websiteURL\": \"https://example.com/login\",\n \"websiteKey\": \"6Le-xxxx\",\n \"minScore\": 0.3,\n \"pageAction\": \"login\"\n }\n}"
}
}
},
{
"name": "Turnstile (proxyless)",
"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\": \"TurnstileTaskProxyless\",\n \"websiteURL\": \"https://example.com/login\",\n \"websiteKey\": \"0x4AAAAAAAxxxx\"\n }\n}"
}
}
},
{
"name": "Turnstile (your proxy)",
"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\": \"TurnstileTask\",\n \"websiteURL\": \"https://example.com/login\",\n \"websiteKey\": \"0x4AAAAAAAxxxx\",\n \"proxyType\": \"http\",\n \"proxyAddress\": \"1.2.3.4\",\n \"proxyPort\": 8080\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}"
}
}
},
{
"name": "getBalance",
"request": {
"method": "POST",
"header": [{ "key": "Content-Type", "value": "application/json" }],
"url": "https://api.captcha-solver.com/getBalance",
"body": {
"mode": "raw",
"raw": "{\n \"clientKey\": \"YOUR_API_KEY\"\n}"
}
}
}
]
}
Вайбкодинг: llms.txt
Пишете интеграцию через ChatGPT, Claude или кодинг-агента? Просто дайте ему ссылку ниже. Внутри всё API одним текстовым файлом: эндпоинты, примеры запросов, поля каждого типа капчи, логика опроса и коды ошибок. Нейронка напишет код интеграции, не открывая эти страницы.
Готовый промптПрочитай https://captcha-solver.com/llms.txt и напиши функцию на Python solve_recaptcha(website_url, website_key), которая решает reCAPTCHA v2 через это API. API-ключ возьми из переменной окружения CAPTCHA_API_KEY.
Ошибки
Ошибки возвращаются с HTTP 200 и телом JSON: "errorId" не равен нулю, плюс "errorCode" и "errorDescription". Клиентские библиотеки ориентируются на errorId / errorCode.
| Код | Значение |
|---|---|
ERROR_KEY_DOES_NOT_EXIST | Неверный или отсутствующий clientKey |
ERROR_ZERO_BALANCE | Недостаточно средств для создания задачи |
ERROR_NO_SUCH_CAPCHA_ID | Неизвестный taskId или задача истекла |
ERROR_CAPTCHA_UNSOLVABLE | Капчу не удалось решить (средства возвращены) |
ERROR_TASK_ABSENT | Отсутствует объект task |
ERROR_TASK_NOT_SUPPORTED | Тип задачи не поддерживается |
Нужна помощь? Напишите в поддержку.