Getting started
Switch from 2Captcha, CapSolver or Anti-Captcha in one line
VoidCaptcha answers the 2Captcha in.php / res.php API and the createTask / getTaskResult / getBalance API that Anti-Captcha and CapSolver share. Point your existing client at api.voidcaptcha.com, use your VoidCaptcha key, and keep the rest of your code.
The one line#
The official 2Captcha Python client, 2captcha-python, takes the host as a constructor argument:
from twocaptcha import TwoCaptcha
solver = TwoCaptcha("YOUR_VOIDCAPTCHA_KEY", server="api.voidcaptcha.com")The official CapSolver Python client, capsolver, reads its base URL from a module setting or the CAPSOLVER_API_BASE environment variable:
import capsolver
capsolver.api_base = "https://api.voidcaptcha.com"
capsolver.api_key = "YOUR_VOIDCAPTCHA_KEY"The official Anti-Captcha Python client, anticaptchaofficial, has its host written into the library and no setting for it, so the change is three lines rather than one. Put them before your first solve:
from anticaptchaofficial import antinetworking
_post = antinetworking.session.post
antinetworking.session.post = lambda url, **kw: _post(url.replace("api.anti-captcha.com", "api.voidcaptcha.com"), **kw)Any other tool or library with a custom host or base URL setting works the same way. Calling the HTTP API directly, only the host changes:
https://2captcha.com/in.php -> https://api.voidcaptcha.com/in.php
https://2captcha.com/res.php -> https://api.voidcaptcha.com/res.php
https://api.anti-captcha.com/createTask -> https://api.voidcaptcha.com/createTask
https://api.anti-captcha.com/getTaskResult -> https://api.voidcaptcha.com/getTaskResult
https://api.capsolver.com/getBalance -> https://api.voidcaptcha.com/getBalanceThese solve on our first pool. The same five endpoints under https://api.voidcaptcha.com/v2/compat/ solve on the second one, so a 2Captcha client would use server="api.voidcaptcha.com/v2/compat".
Before you switch#
Send your own proxy
RecaptchaV2TaskProxyless, FunCaptchaTaskProxyless and the like) is refused with ERROR_PROXY_REQUIRED before anything is billed. Turnstile is the one type that needs none. HTTP and HTTPS proxies are accepted in any of the usual spellings; SOCKS proxies are refused with ERROR_PROXY_FORMAT. See Proxies.- Your key is your VoidCaptcha key, sent wherever the old one went (
keyfor 2Captcha,clientKeyfor the JSON API). It is longer than a 2Captcha key, so a tool that checks for exactly 32 characters will refuse it. - Task ids are ours (
vt_…), not numbers. The official clients treat them as opaque strings. - Results are held for ten minutes, then dropped. Collect them in the session that created them.
- Billing, thread limits and errors are exactly those of the native API: a failed solve is never billed, and
reportbadis accepted but refunds nothing because there is nothing to refund.
2Captcha methods#
| method | Our task type | Parameters used |
|---|---|---|
userrecaptcha | ReCaptchaV2 | googlekey, pageurl, proxy. enterprise=1 gives ReCaptchaV2Enterprise. |
userrecaptcha + version=v3 | ReCaptchaV3 | action is passed on. enterprise=1 gives ReCaptchaV3Enterprise. min_score is accepted and not enforced. |
turnstile | Turnstile | sitekey, pageurl. No proxy needed; one sent is ignored. action and data are read off the page. |
geetest | GeetestV3 | gt, challenge, api_server, pageurl, proxy. |
geetest_v4 | GeetestV4 | captcha_id, risk_type, pageurl, proxy. |
funcaptcha | FunCaptcha_Invisible | publickey, surl, data[blob], pageurl, proxy. |
amazon_waf | awsToken | pageurl, challenge_script, proxy. sitekey, iv and context are not needed. |
datadome | datadome_slider / datadome_Interstitial | captcha_url (picks the variant), pageurl, userAgent, proxy. |
hunt | HuntCaptcha | pageurl, api_get_lib, data, proxy. |
res.php answers action=get, get2, getbalance, reportgood and reportbad, in plain text or with json=1. Every reply is HTTP 200, as 2Captcha’s are.
Anti-Captcha and CapSolver task types#
| Anti-Captcha | CapSolver | Our task type | Fields used |
|---|---|---|---|
RecaptchaV2Task, NoCaptchaTask | ReCaptchaV2Task | ReCaptchaV2 | websiteURL, websiteKey, proxy, userAgent |
RecaptchaV2EnterpriseTask | ReCaptchaV2EnterpriseTask | ReCaptchaV2Enterprise | as above |
RecaptchaV3TaskProxyless + a proxy | ReCaptchaV3Task | ReCaptchaV3 | pageAction becomes action; isEnterprise gives ReCaptchaV3Enterprise |
— | ReCaptchaV3EnterpriseTask | ReCaptchaV3Enterprise | as above |
TurnstileTask, TurnstileTaskProxyless | AntiTurnstileTaskProxyLess | Turnstile | websiteURL, websiteKey; no proxy needed |
GeeTestTask | GeeTestTask | GeetestV3 / GeetestV4 | gt + challenge for v3; captchaId or initParameters.captcha_id for v4 |
FunCaptchaTask | FunCaptchaTask | FunCaptcha_Invisible | websitePublicKey, funcaptchaApiJSSubdomain, data.blob |
AmazonTask | AntiAwsWafTask | awsToken | websiteURL, challengeScript / awsChallengeJS |
— | DatadomeSliderTask | datadome_slider / datadome_Interstitial | websiteURL, captchaUrl, userAgent |
— | AntiCloudflareTask | CFClearance | websiteURL, proxy, userAgent |
Both spellings of the proxyless suffix (Proxyless, ProxyLess) are understood. Proxies arrive as Anti-Captcha’s proxyAddress / proxyPort / proxyLogin / proxyPassword fields or as CapSolver’s proxy string. Our own task type names are accepted on this endpoint too, with our field names, so you can move to the native API one task at a time.
What comes back#
Solutions carry the field names your client reads, beside ours. Nothing of ours is removed.
| Type | 2Captcha request | Anti-Captcha / CapSolver solution |
|---|---|---|
| reCAPTCHA | the token | gRecaptchaResponse, plus our token and userAgent |
| Turnstile, FunCaptcha | the token; json=1 adds useragent | token, userAgent |
| GeeTest v3 | geetest_challenge, geetest_validate, geetest_seccode | challenge, validate, seccode |
| GeeTest v4 | captcha_id, lot_number, pass_token, gen_time, captcha_output | the same five fields |
| AWS WAF | {"aws-waf-token": …} | token, cookie, cookies["aws-waf-token"] |
| DataDome | datadome=… cookie | cookie |
| Cloudflare Clearance | — | cookies.cf_clearance, token, userAgent |
One difference to know: 2Captcha’s amazon_waf answers with a captcha_voucher; we answer with the aws-waf-token cookie itself, which you set on your session directly.
Not supported#
These are refused with an error that names them, never answered with a guess:
- Image, text, audio, grid, coordinate, rotate and other recognition tasks, and the classification task types.
- KeyCaptcha, Capy, Lemin, MTCaptcha, Cutcaptcha, Friendly Captcha, Tencent, Prosopo and the other methods not in the tables above.
- reCAPTCHA
data-s/recaptchaDataSValue/enterprisePayload.s. - Turnstile on a Cloudflare challenge page (
pagedata,chlPageData). Use our Cloudflare Clearance type for those pages. - SOCKS proxies, and proxyless variants of types that need your proxy.
res.phpwithids(several at once). Poll each id on its own.
Tip
pingback, callbackUrl), softId, min_score and isInvisible are accepted and ignored: they do not change the answer.Errors#
Errors come back in your client’s own words where it has one: ERROR_KEY_DOES_NOT_EXIST, ERROR_ZERO_BALANCE, ERROR_NO_SLOT_AVAILABLE for the thread limit, ERROR_CAPTCHA_UNSOLVABLE, and on the JSON API the matching Anti-Captcha errorId. Where it has none, you get our code, listed in Errors. A poll that arrives sooner than every two seconds answers “not ready” rather than an error.
Last updated on 17 October 2026