GeeTest v3 errors can come from three sources: the GeeTest registration API, the GeeTest validation API, or CaptchaAI's solving API. This reference covers all three, helping you identify the source and fix the issue quickly.
Error Source Identification
| Source | When it occurs | Error format |
|---|---|---|
| GeeTest Registration | When getting gt and challenge |
HTTP response codes + JSON |
| GeeTest Validation | When site verifies solution | JSON success/fail |
| CaptchaAI Submit | When sending task to CaptchaAI | ERROR_* strings |
| CaptchaAI Poll | When checking task result | ERROR_* or CAPCHA_NOT_READY |
GeeTest Registration Errors
These occur when the site's backend requests a challenge from GeeTest:
| Error | Cause | Impact on you |
|---|---|---|
success: 0 (offline mode) |
GeeTest servers unreachable | Site falls back to offline mode — simpler challenge |
Empty challenge |
Registration failed | Cannot solve — no challenge token available |
gt mismatch |
Wrong GeeTest ID extracted | Solution won't validate |
| HTTP 429 | Rate limited by GeeTest | Wait and retry — or the site may cache challenges |
Detecting Offline Mode
# Check if GeeTest is in offline mode
registration_data = get_geetest_registration()
if registration_data.get("success") == 0:
print("GeeTest offline mode — local validation")
# Offline mode uses different verification
else:
print("GeeTest online mode — standard flow")
GeeTest Validation Errors
These occur when the site's backend verifies the three solution values:
| Error | Meaning | Cause |
|---|---|---|
Validation returns fail |
Solution rejected | Challenge expired, wrong values, or tampered |
| Validation returns empty | Server error | GeeTest server issue |
| Challenge mismatch | geetest_challenge doesn't match expected |
Wrong challenge token used |
| Seccode format invalid | geetest_seccode missing \|jordan suffix |
Incomplete solution |
Common Validation Failures
| Scenario | Root cause | Fix |
|---|---|---|
| Solution was correct but rejected | Challenge expired between solve and submit | Reduce time between extracting challenge and submitting solution |
| All three values present but rejected | gt or challenge extracted from wrong element |
Verify you're extracting from the correct GeeTest widget |
| Works intermittently | Race condition with challenge refresh | Don't let the page refresh the challenge after extraction |
| Always fails | Wrong GeeTest version (v4 instead of v3) | Check GeeTest version and use correct CaptchaAI method |
CaptchaAI Submit Errors (GeeTest-Specific)
When submitting a GeeTest task to CaptchaAI:
| Error | Cause | Fix |
|---|---|---|
ERROR_WRONG_CAPTCHA_ID |
Invalid method parameter |
Use method=geetest |
ERROR_CAPTCHA_UNSOLVABLE |
Challenge couldn't be solved | Challenge may have expired — extract fresh and retry |
ERROR_WRONG_USER_KEY |
Invalid CaptchaAI API key | Check your API key |
ERROR_ZERO_BALANCE |
No funds | Add balance to CaptchaAI |
ERROR_NO_SLOT_AVAILABLE |
Server capacity reached | Retry after 1–5 seconds |
ERROR_PAGEURL |
Missing or invalid page URL | Provide the full URL |
GeeTest-Specific Parameter Errors
| Error | Cause | Fix |
|---|---|---|
ERROR_BAD_PARAMETERS |
Missing gt or challenge |
Both are required for GeeTest |
Invalid gt format |
gt should be 32-char hex |
Verify extraction — gt is always 32 hex characters |
Invalid challenge format |
challenge should be 32-char hex |
Extract fresh — challenge changes each page load |
CaptchaAI Poll Errors
| Error | Meaning | Action |
|---|---|---|
CAPCHA_NOT_READY |
Still solving | Continue polling every 3–5 seconds |
ERROR_CAPTCHA_UNSOLVABLE |
Failed to solve | Submit a new task with fresh challenge |
ERROR_WRONG_CAPTCHA_ID |
Task ID invalid | Use the exact ID returned by in.php |
Debugging Checklist
When a GeeTest solution fails, check in order:
1. Parameter Extraction
# Verify gt is 32 hex characters
assert len(gt) == 32 and all(c in "0123456789abcdef" for c in gt), f"Invalid gt: {gt}"
# Verify challenge is 32 hex characters
assert len(challenge) == 32, f"Invalid challenge length: {len(challenge)}"
2. Challenge Freshness
import time
challenge_extracted_at = time.time()
# ... solve with CaptchaAI ...
solve_duration = time.time() - challenge_extracted_at
if solve_duration > 90:
print(f"Warning: {solve_duration:.0f}s since extraction — challenge may be expired")
3. Solution Completeness
solution = captchaai_result["request"]
# Verify all three values present
assert "geetest_challenge" in solution, "Missing geetest_challenge"
assert "geetest_validate" in solution, "Missing geetest_validate"
assert "geetest_seccode" in solution, "Missing geetest_seccode"
# Verify seccode has correct format
assert "|jordan" in solution["geetest_seccode"], "Missing |jordan suffix"
4. Widget State
# Check if the page refreshed the challenge
current_challenge = page.evaluate("""
() => document.querySelector('[data-challenge]')?.dataset.challenge
""")
if current_challenge != original_challenge:
print("Challenge was refreshed — need to re-extract and re-solve")
Error Resolution Decision Tree
GeeTest solve failed
├── CaptchaAI returned ERROR?
│ ├── ERROR_WRONG_USER_KEY → Fix API key
│ ├── ERROR_ZERO_BALANCE → Add funds
│ ├── ERROR_CAPTCHA_UNSOLVABLE → Extract fresh challenge, retry
│ └── ERROR_BAD_PARAMETERS → Check gt/challenge values
│
├── CaptchaAI returned solution but site rejected?
│ ├── Challenge expired → Extract + solve + submit faster
│ ├── Wrong gt → Re-extract from correct element
│ ├── Page refreshed challenge → Block challenge refresh
│ └── Wrong GeeTest version → Verify v3 vs v4
│
└── GeeTest registration failed?
├── Offline mode → Handle offline verification
└── HTTP error → Site-specific issue
GeeTest v3 vs v4 Confusion
| Feature | v3 | v4 |
|---|---|---|
| Parameter names | gt, challenge |
captcha_id |
| Registration | register.php |
New registration API |
| Widget class | geetest_holder |
geetest_v4 |
| CaptchaAI method | method=geetest |
Check documentation for v4 support |
If you're seeing errors, verify the page uses v3 (not v4) by checking the GeeTest script URL and widget class.
FAQ
Why does GeeTest fail intermittently?
The most common cause is challenge expiration. GeeTest challenges are short-lived — if the solve takes too long or the page refreshes the challenge, the solution becomes invalid.
How do I handle GeeTest offline mode?
In offline mode (success: 0), the challenge verification happens locally on the site's server rather than through GeeTest's API. CaptchaAI can still solve these challenges — submit as normal.
Can I retry with the same challenge?
No. Each challenge is single-use. After an attempt (successful or not), you must extract a fresh challenge from the page.
Related Articles
Next Steps
Solve GeeTest v3 challenges reliably — get your CaptchaAI API key and implement proper error handling.
Discussions (0)
Join the conversation
Sign in to share your opinion.
Sign InNo comments yet.