Solve any supported captcha with a single API call. Authenticate with your API key, send a solve request, and receive the solution.
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
https://api.one-captcha.com
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-"
}
}'
{
"type": "recaptcha_v2",
"status": "ready",
"provider": "capsolver",
"token": "03AGdBq24PBCbwiDRaS_MJ7Z...",
"cost": 0.002990
}
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.
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 }
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);
| Method | Path | Description |
|---|---|---|
| GET | /v1/balance | Get your current balance |
| GET | /v1/health | Service health check (unauthenticated) |
Each type uses the same POST /v1/solve endpoint. Pass the type and its required params.
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
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
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
Google reCAPTCHA v3 Enterprise. Same params as v3.
Required: url, sitekey Optional: action, minScore, proxy
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
Cloudflare Turnstile.
{
"type": "turnstile",
"params": {
"url": "https://example.com",
"sitekey": "0x4AAAAAAABS7vwvV6VFfMcD"
}
}
Required: url, sitekey Optional: action, cData, proxy
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.
{
"type": "geetest_v4",
"params": {
"url": "https://example.com",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73"
}
}
Required: url, captchaId Optional: proxy
AWS WAF Captcha (Amazon).
{
"type": "amazon_waf",
"params": {
"url": "https://example.com",
"key": "AQIDAHjcYu/GjX+QlghicBg..."
}
}
Required: url, key Optional: iv, context, proxy
MTCaptcha verification.
{
"type": "mtcaptcha",
"params": { "url": "https://example.com", "sitekey": "MTPublic-..." }
}
Required: url, sitekey Optional: proxy
Prosopo Procaptcha (Web3 captcha).
Required: url, sitekey Optional: proxy
Friendly Captcha proof-of-work.
Required: url, sitekey Optional: proxy
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
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