GeeTest is a behavioral CAPTCHA system popular on Chinese e-commerce and gaming platforms and increasingly used internationally. It presents sliding puzzle challenges where the user must drag a piece to complete an image.
GeeTest v3 and v4 have different challenge structures and require different solving approaches.
GeeTest Solver Rankings
| Rank | Provider | v3 Support | v4 Support | Notes |
|---|---|---|---|---|
| 1 | CaptchaAI | 100% solve rate | ✓ | Best GeeTest performance |
| 2 | Anti-Captcha | ✓ | ✓ | Reliable for both versions |
| 3 | CapSolver | ✓ | ✓ | Good v4 performance |
| 4 | 2Captcha | ✓ | ✓ | Broadest overall type coverage |
| 5 | CapMonster Cloud | ✓ | ✓ | Anti-Captcha compatible |
CaptchaAI claims and benchmarks at 100% GeeTest v3 solve rate — one of its noted specializations.
GeeTest v3 vs. v4 Differences
GeeTest v3 — Classic sliding puzzle. Parameters:
- gt: The challenge type key
- challenge: The per-request challenge string (must be fetched fresh per solve attempt)
GeeTest v4 — Newer variant with behavioral analysis. Parameters:
- captchaId: GeeTest v4 captcha ID
- More sophisticated behavioral fingerprinting
GeeTest v4 is harder to solve than v3 for most providers due to increased behavioral analysis.
How to Identify GeeTest Version
import re
import requests
def detect_geetest_version(url: str):
page = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
if "gt.js" in page.text or "geetest.com/v3" in page.text:
return "v3"
if "gt4.js" in page.text or "geetest.com/v4" in page.text:
return "v4"
return "unknown"
GeeTest v3 — Python Integration
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_geetest_v3(page_url: str, gt_key: str, challenge: str) -> dict:
"""
Solve GeeTest v3 and return solution dict.
Note: `challenge` must be fetched fresh for each solve attempt.
"""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "geetest",
"gt": gt_key,
"challenge": challenge,
"pageurl": page_url,
"json": 1,
})
data = resp.json()
if data["status"] != 1:
raise ValueError(f"Submission failed: {data}")
task_id = data["request"]
time.sleep(10)
for _ in range(20):
r = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if r["status"] == 1:
# Returns: {"challenge": "...", "validate": "...", "seccode": "..."}
return r["request"]
if "ERROR" in str(r.get("request", "")):
raise ValueError(f"Error: {r['request']}")
time.sleep(5)
raise TimeoutError("GeeTest v3 solve timed out")
GeeTest v4 — Python Integration
def solve_geetest_v4(page_url: str, captcha_id: str) -> dict:
"""Solve GeeTest v4 and return solution tokens."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "geetest_v4",
"captcha_id": captcha_id,
"pageurl": page_url,
"json": 1,
})
data = resp.json()
if data["status"] != 1:
raise ValueError(f"Submission failed: {data}")
task_id = data["request"]
time.sleep(10)
for _ in range(20):
r = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1,
}).json()
if r["status"] == 1:
return r["request"]
time.sleep(5)
raise TimeoutError("GeeTest v4 solve timed out")
The Challenge Refresh Problem
GeeTest v3 requires a fresh challenge string for each solve attempt. The challenge is generated server-side and must be fetched from the target site's API before each solve. Using a stale or reused challenge will cause failure.
# Example: Fetching GeeTest v3 challenge from a site's API
def fetch_geetest_challenge(api_url: str, gt_key: str) -> str:
"""
Fetch a fresh GeeTest challenge from the target site's API.
Each site implements this differently — inspect the network requests.
"""
resp = requests.get(api_url, params={"gt": gt_key})
return resp.json()["challenge"]
FAQ
Why does my GeeTest solve fail even with a valid token? Most common cause: stale challenge string. GeeTest challenges expire in seconds. Fetch and use the challenge immediately.
Is GeeTest v3 or v4 more widely used? v3 remains more common globally. v4 adoption is growing. Many sites on Chinese platforms have already migrated to v4.
Which providers support GeeTest v4? CaptchaAI, Anti-Captcha, CapSolver, and 2Captcha all support v4. Check each provider's documentation for v4-specific task types.
Compare GeeTest solvers at captcharank.com/compare.
Production Readiness Notes
Use Best GeeTest CAPTCHA Solver as a decision and implementation aid, not just as a one-time reference. The practical test for best geetest captcha solver is whether the same approach behaves reliably when traffic is messy: rotating sessions, expired tokens, changing widget parameters, intermittent solver delays, and target pages that refresh without warning. For Automation developer / scraping engineer, the safest rollout is to start with a narrow fixture, record every submitted task, and compare the solver response with the browser state that finally submits the form. That makes failures explainable instead of mysterious, especially when a target alternates between visible challenges, invisible checks, and server-side verification.
Evaluation Criteria
A type-specific guide should map the widget parameters to the solver task fields, then verify that the returned token is accepted by the target page rather than merely returned by the API. For GeeTest work, the most useful scorecard combines technical acceptance with operational cost. A low nominal price is not enough if retries double the real cost per accepted token, and a fast median solve time is not enough if p95 latency stalls the queue. Track these criteria before you standardize the workflow:
- The challenge subtype, sitekey, action, rqdata, blob, captchaId, or page URL used for each task.
- Median and p95 solve time, separated by provider and target domain.
- Accepted-token rate on the target page, not just successful API responses.
- Retry count, timeout count, zero-balance incidents, and invalid-parameter errors.
- The exact browser, proxy region, and user-agent that submitted the solved token.
Rollout Checklist
Before this guidance moves into a production job, build a small acceptance suite around the pages that matter most. Run it with a fixed browser profile, then repeat with the proxy and concurrency settings you expect in production. Keep the first release conservative: bounded polling, clear timeout handling, and a fallback path when the solver cannot return a usable answer. For GeeTest, refresh gt, challenge, and captchaId parameters for every attempt, because stale GeeTest values are the most common source of false failures. That checklist keeps the article useful after the first copy-paste, because the integration is judged by end-to-end completion rather than by whether a code sample returned a string.
Monitoring Signals
Healthy CAPTCHA automation is observable. Log the task id, provider, challenge type, target host, queue time, solve time, final submit status, and normalized error code for every attempt. Review those logs in daily batches at first, then move to alerts once the baseline is stable. Sudden drops usually come from target-side changes: a new sitekey, a changed action name, a stricter hostname check, an added managed challenge, or a proxy pool that no longer matches the expected geography. When you can see those shifts quickly, provider switching becomes a controlled decision instead of a late-night rewrite.
Maintenance Cadence
Revisit the setup whenever the target UI changes, when the solver provider changes task names or pricing, or when benchmark data shows a sustained latency or solve-rate shift. Keep one known-good fixture for each CAPTCHA subtype and rerun it after dependency upgrades, browser updates, and proxy changes. If the article is used for vendor selection, repeat the same fixture across at least two providers before renewing a balance or migrating the whole pipeline. That habit keeps best geetest captcha solver work aligned with the real target behavior rather than with stale assumptions.