Your application should send the site address, public domain key (gt) and key (challenge).
The result of solving the task is three or five tokens for form submission.
gt, challenge and geetestApiServerSubdomain parameters are most often found inside the initGeetest JavaScript function. You can also find them in the HTML code of the page in the <script> block, which appears after the page is fully loaded.
Possible captcha variants:
| Parameter | Type | Required | Description |
|---|---|---|---|
type |
String | Required | GeeTestTask |
websiteURL |
String | Required | The URL of the page where the captcha is initialized. |
gt |
String | Required | The GeeTest identifier key gt for the domain. Static value, rarely updated. |
challenge |
String | Required | Dynamic key. A new challenge value must be obtained for each API request. If the captcha has already been loaded on the page, the current challenge value becomes invalid, and the API will return the error ERROR_TOKEN_EXPIRED. |
version |
Integer | Required | 3 |
geetestApiServerSubdomain |
String | Optional | GeeTest API subdomain server (must be different from api.geetest.com). May be required for some sites. |
geetestGetLib |
String | Optional | Path to the captcha script to display it on the page. Send JSON as a string. May be required for some sites. |
userAgent |
String | Optional | Browser User-Agent. Pass only a valid UA from Windows OS. |
proxyType |
String | Optional | http - regular http/https proxy; https - try this option only if "http" doesn't work; socks4 - socks4 proxy; socks5 - socks5 proxy. |
proxyAddress |
String | Optional | IPv4/IPv6 proxy IP address. |
proxyPort |
Integer | Optional | Proxy port. |
proxyLogin |
String | Optional | Proxy-server login. |
proxyPassword |
String | Optional | Proxy-server password. |
POST https://captcha69.com/createTask
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"task": {
"type": "GeeTestTask",
"websiteURL": "https://www.geetest.com/en/demo",
"gt": "022397c99c9f646f6477822485f30404",
"challenge": "7f044f48bc951ecfbfc03842b5e1fe59",
"version": 3,
"geetestApiServerSubdomain": "api-na.geetest.com"
}
}
{
"errorId": 0,
"taskId": 407533072
}
POST https://captcha69.com/createTask
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"task": {
"type": "GeeTestTask",
"websiteURL": "https://www.geetest.com/en/demo",
"gt": "022397c99c9f646f6477822485f30404",
"challenge": "7f044f48bc951ecfbfc03842b5e1fe59",
"version": 3,
"geetestApiServerSubdomain": "api-na.geetest.com",
"userAgent": "userAgentPlaceholder",
"proxyType": "http",
"proxyAddress": "8.8.8.8",
"proxyPort": 8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere"
}
}
POST https://captcha69.com/getTaskResult
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"challenge": "0f759dd1ea6c4wc76cedc2991039ca4f23",
"validate": "6275e26419211d1f526e674d97110e15",
"seccode": "510cd9735583edcb158601067195a5eb|jordan"
}
}
| Property | Type | Description |
|---|---|---|
challenge |
String | All three parameters are required when submitting the form on the target site. |
validate |
String | |
seccode |
String |
All parameters can be found in init-params among the network requests:
| Parameter | Type | Required | Description |
|---|---|---|---|
type |
String | Required | GeeTestTask |
websiteURL |
String | Required | Address of the page on which the captcha is solved. |
gt |
String | Required | The GeeTest identifier key for the domain - the captcha_id parameter. |
version |
Integer | Required | 4 |
geetestApiServerSubdomain |
String | Optional | GeeTest API subdomain server. May be required for some sites. |
geetestGetLib |
String | Optional | Path to the captcha script to display it on the page. Send JSON as a string. |
initParameters |
Object | Optional | Additional parameters for version 4, used together with riskType (captcha type/characteristics of its verification). |
userAgent |
String | Optional | Browser User-Agent. Pass only a valid UA from Windows OS. |
proxyType |
String | Optional | http - regular http/https proxy; https - try this option only if "http" doesn't work; socks4 - socks4 proxy; socks5 - socks5 proxy. |
proxyAddress |
String | Optional | IPv4/IPv6 proxy IP address. |
proxyPort |
Integer | Optional | Proxy port. |
proxyLogin |
String | Optional | Proxy-server login. |
proxyPassword |
String | Optional | Proxy-server password. |
POST https://captcha69.com/createTask
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"task": {
"type": "GeeTestTask",
"websiteURL": "https://gt4.geetest.com/",
"gt": "54088bb07d2df3c46b79f80300b0abbe",
"version": 4,
"initParameters": {
"riskType": "slide"
}
}
}
{
"errorId": 0,
"taskId": 407533072
}
POST https://captcha69.com/createTask
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"task": {
"type": "GeeTestTask",
"websiteURL": "https://gt4.geetest.com/",
"gt": "54088bb07d2df3c46b79f80300b0abbe",
"version": 4,
"initParameters": {
"riskType": "slide"
},
"proxyType": "http",
"proxyAddress": "8.8.8.8",
"proxyPort": 8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere",
"userAgent": "userAgentPlaceholder"
}
}
POST https://captcha69.com/getTaskResult
Content-Type: application/json
{
"clientKey": "max1_YOUR_API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"captcha_id": "f5c2ad5a8a3cf37192d8b9c039950f79",
"lot_number": "bcb2c6ce2f8e4e9da74f2c1fa63bd713",
"pass_token": "edc7a17716535a5ae624ef4707cb6e7e478dc557608b068d202682c8297695cf",
"gen_time": "1683794919",
"captcha_output": "XwmTZEJCJEnRIJBlvtEAZ662T...SQ3fX-MyoYOVDMDXWSRQig56"
}
}
| Property | Type | Description |
|---|---|---|
captcha_id |
String | All five parameters are required when submitting the form on the target site.input[name=captcha_id]input[name=lot_number]input[name=pass_token]input[name=gen_time]input[name=captcha_output] |
lot_number | String | |
pass_token | String | |
gen_time | String | |
captcha_output | String |
load or captcha to quickly find the required request.load?callback=... — it usually contains CAPTCHA parameters.
(function detectGeeTestV3Browser() {
const t = Date.now();
const url = `https://example.com/api/v1/captcha/gee-test/init-params?t=${t}`;
fetch(url)
.then(res => res.json())
.then(data => {
const { gt, challenge } = data;
if (gt && challenge) {
console.log("GeeTest v3 detected:");
console.log({ gt, challenge });
} else {
console.log("Failed to find gt/challenge parameters");
}
})
.catch(err => console.error("Request error:", err));
})();
async function detectGeeTestV3() {
const result = {
version: null,
data: {},
};
const t = Date.now();
try {
const response = await fetch(
`https://example.com/api/v1/captcha/gee-test/init-params?t=${t}`
);
if (response.ok) {
const data = await response.json();
const challenge = data.challenge;
const gt = data.gt;
if (gt && challenge) {
result.version = "v3";
result.data = { gt, challenge };
console.log(result.data);
} else {
console.log("Error: Missing gt or challenge");
}
} else {
console.log("Error: Invalid response status", response.status);
}
} catch (error) {
console.error("Request failed", error);
}
return result;
}
detectGeeTestV3();
import requests
import asyncio
import time
async def detect_gee_test_v3():
result = {
'version': None,
'data': {},
}
t = int(time.time() * 1000)
response = requests.get(f'https://example.com/api/v1/captcha/gee-test/init-params?t={t}')
if response.status_code == 200:
data = response.json()
challenge = data.get('challenge')
gt = data.get('gt')
if gt and challenge:
result['version'] = 'v3'
result['data'] = {'gt': gt, 'challenge': challenge}
print(result['data'])
else:
print('error')
return result
asyncio.run(detect_gee_test_v3())
import { chromium } from "playwright";
async function detectGeeTestV4(pageUrl) {
const result = { version: null, data: {} };
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
page.on("response", async (response) => {
const url = response.url();
if (url.includes("https://gcaptcha4.geetest.com/load?")) {
const urlParams = new URLSearchParams(url.split("?")[1]);
const captchaId = urlParams.get("captcha_id");
const riskType = urlParams.get("risk_type");
if (captchaId && !result.version) {
result.version = "v4";
result.data = {
captchaId: captchaId,
riskType: riskType,
};
console.log("GeeTest v4 detected:");
console.log(result.data);
}
}
});
await page.goto(pageUrl, { waitUntil: "networkidle" });
await page.waitForTimeout(20000);
if (!result.version) {
console.log("error");
}
await browser.close();
return result;
}
detectGeeTestV4("https://example.com").then((result) => {
console.log(result);
});
import asyncio
from playwright.async_api import async_playwright
from urllib.parse import urlparse, parse_qs
async def detect_geetest_v4(page_url):
result = {"version": None, "data": {}}
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
context = await browser.new_context()
page = await context.new_page()
async def on_request(request):
url = request.url
if "https://gcaptcha4.geetest.com/load?" in url:
query = parse_qs(urlparse(url).query)
captcha_id = query.get("captcha_id", [None])[0]
risk_type = query.get("risk_type", [None])[0]
if captcha_id and not result["version"]:
result["version"] = "v4"
result["data"] = {
"captchaId": captcha_id,
"riskType": risk_type
}
print("GeeTest v4 detected:")
print(result["data"])
context.on("request", on_request)
await page.goto(page_url, wait_until="networkidle")
await asyncio.sleep(10)
if not result["version"]:
print("error")
await browser.close()
return result
asyncio.run(detect_geetest_v4("https://www.example.com"))