Getting Started

Solve any supported captcha with a single API call. Authenticate with your API key, send a solve request, and receive the solution.

Authentication

Every request requires an X-API-Key header with your API key. Get one from the dashboard.

X-API-Key: oc_your_api_key_here

Base URL

https://api.one-captcha.com

Sync Solve

POST /v1/solve — Submits and waits for the solution in a single request. Best for most use cases.

curl -X POST https://api.one-captcha.com/v1/solve \
  -H "X-API-Key: oc_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "recaptcha_v2",
    "params": {
      "url": "https://example.com",
      "sitekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
    }
  }'

Response

{
  "type": "recaptcha_v2",
  "status": "ready",
  "provider": "capsolver",
  "token": "03AGdBq24PBCbwiDRaS_MJ7Z...",
  "cost": 0.002990
}

Async Solve (Submit + Poll)

For long-running captchas or when you want to control the polling loop yourself. All SDKs provide both a manual submit/poll flow and a convenience solveAsync that handles polling for you.

REST API

1. Submit: POST /v1/tasks — same body as /v1/solve

// Returns: { "status": "processing", "taskRef": "v1.eyJ..." }

2. Poll: GET /v1/tasks/{taskRef}

// Returns: { "status": "processing" } or { "status": "ready", "token": "..." }

3. Report: POST /v1/tasks/{taskRef}/report

{ "accepted": false }

SDK Examples

Every SDK wraps the submit/poll loop. Use solveAsync for automatic polling, or createTask + getTask / waitForTask for manual control.

import { OneCaptchaClient } from '@onecaptcha/sdk';
const client = new OneCaptchaClient({ apiKey: 'oc_your_key' });

// Option 1: solveAsync — submits + polls automatically
const result = await client.solveAsync({
  type: 'recaptcha_v2',
  params: { url: 'https://example.com', sitekey: '6Le-wvk...' },
}, { pollInterval: 3000, pollTimeout: 120000 });

console.log(result.token);

// Option 2: manual submit + poll
const task = await client.createTask({
  type: 'recaptcha_v2',
  params: { url: 'https://example.com', sitekey: '6Le-wvk...' },
});
console.log('Submitted:', task.taskRef);

// Poll until ready
const ready = await client.waitForTask(task.taskRef, {
  pollInterval: 3000,
  pollTimeout: 120000,
});
console.log(ready.token);

// Report bad solution
await client.reportTask(task.taskRef, false);

Other Endpoints

MethodPathDescription
GET/v1/balanceGet your current balance
GET/v1/healthService health check (unauthenticated)

Captcha Type Reference

Each type uses the same POST /v1/solve endpoint. Pass the type and its required params.

recaptcha_v2

Google reCAPTCHA v2 checkbox ("I'm not a robot").

{
  "type": "recaptcha_v2",
  "params": {
    "url": "https://example.com/page",
    "sitekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "invisible": false
  }
}

Required: url, sitekey   Optional: invisible, proxy

recaptcha_v2_enterprise

Google reCAPTCHA v2 Enterprise. Same params as v2 but routed to Enterprise solvers.

{
  "type": "recaptcha_v2_enterprise",
  "params": { "url": "...", "sitekey": "...", "invisible": false }
}

Required: url, sitekey   Optional: invisible, proxy

recaptcha_v3

Google reCAPTCHA v3 (score-based, invisible).

{
  "type": "recaptcha_v3",
  "params": {
    "url": "https://example.com",
    "sitekey": "6LdKlZEpAAAAAN...",
    "action": "login",
    "minScore": 0.7
  }
}

Required: url, sitekey   Optional: action, minScore, proxy

recaptcha_v3_enterprise

Google reCAPTCHA v3 Enterprise. Same params as v3.

Required: url, sitekey   Optional: action, minScore, proxy

funcaptcha

Arkose Labs FunCaptcha.

{
  "type": "funcaptcha",
  "params": {
    "url": "https://example.com",
    "publicKey": "DE0B0BB7-1EE4-4D70-1853-31B835D4506B",
    "subdomain": "client-api.arkoselabs.com"
  }
}

Required: url, publicKey   Optional: subdomain, data, proxy

turnstile

Cloudflare Turnstile.

{
  "type": "turnstile",
  "params": {
    "url": "https://example.com",
    "sitekey": "0x4AAAAAAABS7vwvV6VFfMcD"
  }
}

Required: url, sitekey   Optional: action, cData, proxy

geetest_v3

GeeTest v3 slide/click captcha.

{
  "type": "geetest_v3",
  "params": {
    "url": "https://example.com",
    "gt": "022f3a3f52b2b1f1...",
    "challenge": "a]66d..."
  }
}

Required: url, gt, challenge   Optional: proxy

geetest_v4

GeeTest v4.

{
  "type": "geetest_v4",
  "params": {
    "url": "https://example.com",
    "captchaId": "e392e1d7fd421dc63325744d5a2b9c73"
  }
}

Required: url, captchaId   Optional: proxy

amazon_waf

AWS WAF Captcha (Amazon).

{
  "type": "amazon_waf",
  "params": {
    "url": "https://example.com",
    "key": "AQIDAHjcYu/GjX+QlghicBg..."
  }
}

Required: url, key   Optional: iv, context, proxy

mtcaptcha

MTCaptcha verification.

{
  "type": "mtcaptcha",
  "params": { "url": "https://example.com", "sitekey": "MTPublic-..." }
}

Required: url, sitekey   Optional: proxy

prosopo

Prosopo Procaptcha (Web3 captcha).

Required: url, sitekey   Optional: proxy

friendly_captcha

Friendly Captcha proof-of-work.

Required: url, sitekey   Optional: proxy

image_to_text

Classic image captcha OCR. Returns the text shown in the image.

{
  "type": "image_to_text",
  "params": {
    "body": "/9j/4AAQSkZJRg...",
    "caseSensitive": true,
    "numeric": 0,
    "minLength": 4,
    "maxLength": 8
  }
}

Required: body (base64 image)   Optional: caseSensitive, phrase, numeric, math, minLength, maxLength, comment, module

Returns: text instead of token

image_to_coordinates

Click-based image captcha. Returns the coordinates of objects to click.

{
  "type": "image_to_coordinates",
  "params": {
    "body": "/9j/4AAQSkZJRg...",
    "comment": "Click all traffic lights",
    "mode": "points"
  }
}

Required: body (base64 image)   Optional: comment, mode ("points" or "rectangles")

Returns: coordinates array instead of token