Submitting a CAPTCHA with the wrong method parameter is the fastest way to waste credits and get errors. When you send userrecaptcha for a Turnstile, or turnstile for a GeeTest, CaptchaAI either returns ERROR_BAD_PARAMETERS, ERROR_CAPTCHA_UNSOLVABLE, or a token that the target rejects.
Symptoms
| What happens | Likely cause |
|---|---|
ERROR_BAD_PARAMETERS |
Missing required fields for the method |
ERROR_CAPTCHA_UNSOLVABLE |
Method does not match CAPTCHA type |
| Token solved but rejected by site | Correct solver, wrong CAPTCHA type on page |
| Unexpected response format | Used the wrong method family |
CAPTCHA type to method mapping
| CAPTCHA type | CaptchaAI method | Required parameters |
|---|---|---|
| reCAPTCHA v2 | userrecaptcha |
googlekey, pageurl |
| reCAPTCHA v2 Enterprise | userrecaptcha + enterprise=1 |
googlekey, pageurl |
| reCAPTCHA v2 Invisible | userrecaptcha + invisible=1 |
googlekey, pageurl |
| reCAPTCHA v3 | userrecaptcha + version=v3 |
googlekey, pageurl |
| reCAPTCHA v3 Enterprise | userrecaptcha + version=v3 + enterprise=1 |
googlekey, pageurl |
| Cloudflare Turnstile | turnstile |
sitekey, pageurl |
| Cloudflare Challenge | cloudflare_challenge |
pageurl, proxy, userAgent |
| GeeTest v3 | geetest |
gt, challenge, pageurl |
| Image/OCR | base64 or post |
body (base64) or file upload |
| Grid Image | post + grid_size |
File, grid_size, instructions |
How to identify the CAPTCHA type
reCAPTCHA (any version)
def detect_recaptcha(html):
if "www.google.com/recaptcha" in html or "www.recaptcha.net" in html:
if 'data-sitekey="' in html:
start = html.index('data-sitekey="') + 14
end = html.index('"', start)
sitekey = html[start:end]
if "invisible" in html.lower() or 'data-size="invisible"' in html:
return {"type": "recaptcha_v2_invisible", "method": "userrecaptcha",
"googlekey": sitekey, "extra": {"invisible": 1}}
return {"type": "recaptcha_v2", "method": "userrecaptcha",
"googlekey": sitekey}
# v3 is loaded via JavaScript, no visible widget
if "recaptcha/api.js?render=" in html:
start = html.index("render=") + 7
end = html.index('"', start) if '"' in html[start:start+50] else html.index("'", start)
sitekey = html[start:end]
return {"type": "recaptcha_v3", "method": "userrecaptcha",
"googlekey": sitekey, "extra": {"version": "v3"}}
return None
Cloudflare (Turnstile or Challenge)
def detect_cloudflare(html, status_code):
if "cf-turnstile" in html or "challenges.cloudflare.com/turnstile" in html:
sitekey = None
if 'data-sitekey="' in html:
start = html.index('data-sitekey="') + 14
end = html.index('"', start)
sitekey = html[start:end]
return {"type": "turnstile", "method": "turnstile", "sitekey": sitekey}
if status_code in [403, 503] and ("Just a moment" in html or "challenge-platform" in html):
return {"type": "cloudflare_challenge", "method": "cloudflare_challenge"}
return None
GeeTest
def detect_geetest(html):
if "geetest" in html.lower() or "gt.js" in html or "initGeetest" in html:
return {"type": "geetest", "method": "geetest"}
return None
Combined detection
import requests
def detect_captcha_type(url):
"""Detect CAPTCHA type on a URL."""
resp = requests.get(url)
html = resp.text
# Check each type
result = detect_recaptcha(html)
if result:
return result
result = detect_cloudflare(html, resp.status_code)
if result:
return result
result = detect_geetest(html)
if result:
return result
return {"type": "unknown", "method": None}
info = detect_captcha_type("https://example.com/login")
print(f"CAPTCHA type: {info['type']}")
print(f"CaptchaAI method: {info['method']}")
Common mistakes
| Mistake | What happens | Fix |
|---|---|---|
Using userrecaptcha for Turnstile |
Wrong token format, rejection | Switch to turnstile method |
Using turnstile for reCAPTCHA |
ERROR_BAD_PARAMETERS (wrong sitekey format) |
Switch to userrecaptcha |
Missing enterprise=1 for Enterprise reCAPTCHA |
Low scores, token rejected | Add enterprise=1 |
Missing version=v3 for reCAPTCHA v3 |
Treated as v2, wrong token type | Add version=v3 |
Missing invisible=1 for invisible reCAPTCHA |
Solve may fail or return wrong token | Add invisible=1 |
| Using any token method for Cloudflare Challenge | Challenge returns cookies, not tokens | Use cloudflare_challenge |
FAQ
How do I know if it is reCAPTCHA v2 or v3?
reCAPTCHA v2 shows a visible widget (checkbox or image challenge). reCAPTCHA v3 is invisible — it loads via JavaScript with render=SITEKEY and runs in the background.
What if the page uses a CAPTCHA I do not recognize?
Check the page source for known markers: recaptcha, cf-turnstile, geetest, hcaptcha. If none match, it may be a custom image CAPTCHA — use the base64 or post method.
Can I solve Enterprise reCAPTCHA with the standard method?
No. Enterprise reCAPTCHA requires enterprise=1. Without it, the token may solve but the site will reject it because Enterprise tokens have a different structure.
Get your CaptchaAI API key
Solve any CAPTCHA type correctly at captchaai.com.
Discussions (0)
Join the conversation
Sign in to share your opinion.
Sign InNo comments yet.