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
Every SDK provides two ways to solve captchas. Use whichever fits your workflow.
One call, blocks until the solution is ready. The gateway holds the connection open. Best for most use cases.
// Node.js
const r = await client.solveRecaptchaV2({
url, sitekey
});
console.log(r.token);
Submits the task, then polls until ready. Use when you need non-blocking submission or want to control the polling loop.
// Node.js — automatic polling
const r = await client.solveRecaptchaV2Async({
url, sitekey
});
console.log(r.token);
Every solve* method has a matching solve*Async variant. Both return the same result shape.
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",
"taskRef": "550e8400-e29b-41d4-a716-446655440000",
"token": "03AGdBq24PBCbwiDRaS_MJ7Z...",
"cost": 0.002990
}
Every response includes a taskRef (UUID) you can use to report whether the solution worked. See Reporting below.
Every solve* method has a matching solve*Async that submits the task and polls until ready. You can also use createTask + waitForTask for manual control over the polling loop.
import { OneCaptchaClient } from '@onecaptcha/sdk';
const client = new OneCaptchaClient({ apiKey: 'oc_your_key' });
// Per-type async helper — submits + polls automatically
const result = await client.solveRecaptchaV2Async({
url: 'https://example.com',
sitekey: '6Le-wvk...',
});
console.log(result.token);
await result.reportGood(); // report success
// Image OCR async
const img = await client.solveImageToTextAsync(base64);
console.log(img.text);
await img.reportGood();
After using the solution on the target site, report whether it was accepted. This helps providers flag bad workers and may trigger refunds. For image_to_text solves, a good report promotes the result into the permanent image cache so future identical images resolve instantly.
Every result object carries reportGood() / reportBad() helpers so you can report directly without tracking the taskRef yourself.
# Report that the solution worked
curl -X POST https://api.one-captcha.com/v1/tasks/550e8400-e29b-41d4-a716-446655440000/report \
-H "X-API-Key: oc_your_key" \
-H "Content-Type: application/json" \
-d '{"accepted": true}'
# Report that the solution was rejected
curl -X POST https://api.one-captcha.com/v1/tasks/550e8400-e29b-41d4-a716-446655440000/report \
-H "X-API-Key: oc_your_key" \
-H "Content-Type: application/json" \
-d '{"accepted": false}'
| Method | Path | Description |
|---|---|---|
| GET | /v1/tasks/{taskRef} | Poll an async task by UUID |
| POST | /v1/tasks/{taskRef}/report | Report whether the solution worked |
| 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
SDK usage (Node.js):
// Simple — just pass the base64 string
const result = await client.solveImageToText(base64Image);
console.log(result.text);
// With options
const result = await client.solveImageToText({
body: base64Image,
caseSensitive: true,
minLength: 4,
});
// Async
const result = await client.solveImageToTextAsync(base64Image);
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