GeeTest v3
GeeTest v3 is an interactive CAPTCHA that presents users with visual puzzles such as sliding a puzzle piece into place, clicking specific icons, or matching images. It is widely deployed on Chinese websites and services, as well as on international platforms. GeeTest v3 uses a challenge-response mechanism where a fresh challenge value must be obtained from the target page for each solving attempt.
Supported Types
Section titled “Supported Types”| Type | Proxy | Description |
|---|---|---|
GeeTestTokenProxyLess | No | Standard (recommended) |
GeeTestToken | Yes | With proxy |
Parameters
Section titled “Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Task type from the table above |
websiteURL | string | Yes | URL of the page with the captcha |
gt | string | Yes | GeeTest gt parameter from the page |
challenge | string | Yes | GeeTest challenge parameter (dynamic, changes each page load) |
Proxy Parameters
Section titled “Proxy Parameters”Required when using the GeeTestToken proxy task type.
| Parameter | Type | Required | Description |
|---|---|---|---|
proxyType | string | Yes | http, socks4, or socks5 |
proxyAddress | string | Yes | Proxy IP or hostname |
proxyPort | integer | Yes | Proxy port |
proxyLogin | string | No | Proxy username |
proxyPassword | string | No | Proxy password |
Create Task
Section titled “Create Task”Request
Section titled “Request”{ "clientKey": "YOUR_API_KEY", "task": { "type": "GeeTestTokenProxyLess", "websiteURL": "https://example.com/login", "gt": "022f3baf5fa571d842e3f6ac12a4a167", "challenge": "6a8b50a4c69dade3b28f1cb7a26d4b7e" }}Response
Section titled “Response”{ "errorId": 0, "taskId": "abc-123-def"}Solution Object
Section titled “Solution Object”{ "challenge": "6a8b50a4c69dade3b28f1cb7a26d4b7elf", "validate": "510cd9735583edcef8c7d4a335bc02fa", "seccode": "510cd9735583edcef8c7d4a335bc02fa|jordan"}| Field | Type | Description |
|---|---|---|
challenge | string | Modified challenge value |
validate | string | Validation token |
seccode | string | Security code (usually validate + `“ |
How to Use
Section titled “How to Use”Submit all three solution values (challenge, validate, seccode) to the target site’s verification endpoint. The exact integration depends on the site:
- Form fields — Set the hidden input fields for
geetest_challenge,geetest_validate, andgeetest_seccode, then submit the form. - API request — Include all three values in the request body sent to the site’s server-side validation endpoint.
- JavaScript callback — Pass the solution object to the GeeTest success callback function.
Code Examples
Section titled “Code Examples”Python
Section titled “Python”import requestsimport time
API_KEY = "YOUR_API_KEY"
# Step 1: Fetch a fresh challenge from the target site# This is site-specific. Example:# init = requests.get("https://example.com/api/geetest/register").json()# gt = init["gt"]# challenge = init["challenge"]
gt = "022f3baf5fa571d842e3f6ac12a4a167"challenge = "6a8b50a4c69dade3b28f1cb7a26d4b7e" # Must be fresh!
# Step 2: Create taskresponse = requests.post("https://api.ucaptcha.net/createTask", json={ "clientKey": API_KEY, "task": { "type": "GeeTestTokenProxyLess", "websiteURL": "https://example.com/login", "gt": gt, "challenge": challenge }})task_id = response.json()["taskId"]
# Step 3: Poll for resultwhile True: result = requests.post("https://api.ucaptcha.net/getTaskResult", json={ "clientKey": API_KEY, "taskId": task_id }).json()
if result["status"] == "ready": solution = result["solution"] print("Challenge:", solution["challenge"]) print("Validate:", solution["validate"]) print("Seccode:", solution["seccode"]) break elif result["status"] == "failed": print("Error:", result.get("errorDescription")) break
time.sleep(5)JavaScript
Section titled “JavaScript”const API_KEY = "YOUR_API_KEY";
// Step 1: Fetch a fresh challenge from the target site// const init = await fetch("https://example.com/api/geetest/register").then(r => r.json());// const { gt, challenge } = init;
const gt = "022f3baf5fa571d842e3f6ac12a4a167";const challenge = "6a8b50a4c69dade3b28f1cb7a26d4b7e"; // Must be fresh!
// Step 2: Create taskconst { taskId } = await fetch("https://api.ucaptcha.net/createTask", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ clientKey: API_KEY, task: { type: "GeeTestTokenProxyLess", websiteURL: "https://example.com/login", gt, challenge } })}).then(r => r.json());
// Step 3: Poll for resultwhile (true) { const result = await fetch("https://api.ucaptcha.net/getTaskResult", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ clientKey: API_KEY, taskId }) }).then(r => r.json());
if (result.status === "ready") { console.log("Challenge:", result.solution.challenge); console.log("Validate:", result.solution.validate); console.log("Seccode:", result.solution.seccode); break; } else if (result.status === "failed") { console.error("Error:", result.errorDescription); break; }
await new Promise(r => setTimeout(r, 5000));}# Create taskcurl -X POST https://api.ucaptcha.net/createTask \ -H "Content-Type: application/json" \ -d '{ "clientKey": "YOUR_API_KEY", "task": { "type": "GeeTestTokenProxyLess", "websiteURL": "https://example.com/login", "gt": "022f3baf5fa571d842e3f6ac12a4a167", "challenge": "6a8b50a4c69dade3b28f1cb7a26d4b7e" } }'
# Poll for result (replace TASK_ID with the taskId from above)curl -X POST https://api.ucaptcha.net/getTaskResult \ -H "Content-Type: application/json" \ -d '{ "clientKey": "YOUR_API_KEY", "taskId": "TASK_ID" }'Provider Coverage
Section titled “Provider Coverage”- 2Captcha
- CapSolver
- Anti-Captcha
- CapMonster
- Multibot
Aliases
Section titled “Aliases”The following legacy type names are also accepted for backward compatibility:
GeeTestTaskGeeTestTaskProxylessGeeTestTaskProxyLess