Skip to content

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.

TypeProxyDescription
GeeTestTokenProxyLessNoStandard (recommended)
GeeTestTokenYesWith proxy
ParameterTypeRequiredDescription
typestringYesTask type from the table above
websiteURLstringYesURL of the page with the captcha
gtstringYesGeeTest gt parameter from the page
challengestringYesGeeTest challenge parameter (dynamic, changes each page load)

Required when using the GeeTestToken proxy task type.

ParameterTypeRequiredDescription
proxyTypestringYeshttp, socks4, or socks5
proxyAddressstringYesProxy IP or hostname
proxyPortintegerYesProxy port
proxyLoginstringNoProxy username
proxyPasswordstringNoProxy password
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "GeeTestTokenProxyLess",
"websiteURL": "https://example.com/login",
"gt": "022f3baf5fa571d842e3f6ac12a4a167",
"challenge": "6a8b50a4c69dade3b28f1cb7a26d4b7e"
}
}
{
"errorId": 0,
"taskId": "abc-123-def"
}
{
"challenge": "6a8b50a4c69dade3b28f1cb7a26d4b7elf",
"validate": "510cd9735583edcef8c7d4a335bc02fa",
"seccode": "510cd9735583edcef8c7d4a335bc02fa|jordan"
}
FieldTypeDescription
challengestringModified challenge value
validatestringValidation token
seccodestringSecurity code (usually validate + `“

Submit all three solution values (challenge, validate, seccode) to the target site’s verification endpoint. The exact integration depends on the site:

  1. Form fields — Set the hidden input fields for geetest_challenge, geetest_validate, and geetest_seccode, then submit the form.
  2. API request — Include all three values in the request body sent to the site’s server-side validation endpoint.
  3. JavaScript callback — Pass the solution object to the GeeTest success callback function.
import requests
import 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 task
response = 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 result
while 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)
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 task
const { 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 result
while (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));
}
Terminal window
# Create task
curl -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"
}'
  • 2Captcha
  • CapSolver
  • Anti-Captcha
  • CapMonster
  • Multibot

The following legacy type names are also accepted for backward compatibility:

  • GeeTestTask
  • GeeTestTaskProxyless
  • GeeTestTaskProxyLess