Get API Key

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 URL
https://api.captcha-solver.com

How 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_EXISTInvalid or missing clientKey
ERROR_ZERO_BALANCENot enough balance to create the task
ERROR_NO_SUCH_CAPCHA_IDUnknown taskId or the task has expired
ERROR_CAPTCHA_UNSOLVABLEThe captcha could not be solved (funds refunded)
ERROR_TASK_ABSENTThe task object is missing
ERROR_TASK_NOT_SUPPORTEDTask type is not supported

Need help? Contact support.