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",
"token": "03AGdBq24PBCbwiDRaS_MJ7Z...",
"cost": 0.002990
}
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);
// Image OCR async
const img = await client.solveImageToTextAsync(base64);
console.log(img.text);
| 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
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