GeeTest

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.

Attention!
Built-in proxies are used by default — their cost is already included in the service. You only need to specify your own proxies in cases where the website does not accept the token or access to the built-in services is restricted.

Please use a proxy with username and password authentication.
The 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.

GeeTest V3

Possible captcha variants:

IMPORTANT: Some parameter values are dynamic — they change with each render of the page using GeeTest v3. Extract them immediately before creating the task to avoid errors during solving.

Request Parameters (V3)

ParameterTypeRequiredDescription
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.

Create Task - V3 (without proxy)

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"
  }
}

Response

{
  "errorId": 0,
  "taskId": 407533072
}

Create Task - V3 (with proxy)

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"
  }
}

Get Task Result - V3

POST https://captcha69.com/getTaskResult
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "taskId": 407533072
}

Response

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "challenge": "0f759dd1ea6c4wc76cedc2991039ca4f23",
    "validate": "6275e26419211d1f526e674d97110e15",
    "seccode": "510cd9735583edcb158601067195a5eb|jordan"
  }
}

Solution Properties (V3)

PropertyTypeDescription
challenge String All three parameters are required when submitting the form on the target site.
validate String
seccode String

Finding V3 Parameters

All parameters can be found in init-params among the network requests:


GeeTest V4

IMPORTANT: Some parameter values are dynamic — they change with each render of the page using GeeTest v4. Extract them immediately before creating the task to avoid errors during solving.

Request Parameters (V4)

ParameterTypeRequiredDescription
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.

Create Task - V4 (without proxy)

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"
    }
  }
}

Response

{
  "errorId": 0,
  "taskId": 407533072
}

Create Task - V4 (with proxy)

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"
  }
}

Get Task Result - V4

POST https://captcha69.com/getTaskResult
Content-Type: application/json

{
  "clientKey": "max1_YOUR_API_KEY",
  "taskId": 407533072
}

Response

{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "captcha_id": "f5c2ad5a8a3cf37192d8b9c039950f79",
    "lot_number": "bcb2c6ce2f8e4e9da74f2c1fa63bd713",
    "pass_token": "edc7a17716535a5ae624ef4707cb6e7e478dc557608b068d202682c8297695cf",
    "gen_time": "1683794919",
    "captcha_output": "XwmTZEJCJEnRIJBlvtEAZ662T...SQ3fX-MyoYOVDMDXWSRQig56"
  }
}

Solution Properties (V4)

PropertyTypeDescription
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_numberString
pass_tokenString
gen_timeString
captcha_outputString

Finding V4 Parameters

  1. Open the website where the CAPTCHA is displayed in your browser.
  2. Open Developer Tools (DevTools) and go to the Network tab.
  3. Refresh the page (F5) to capture all network requests.
  4. In the search field (Filter), type load or captcha to quickly find the required request.
  5. Find a request like load?callback=... — it usually contains CAPTCHA parameters.
  6. Click on this request and open the Payload tab to view the required data.

Code Examples

JavaScript (Browser) - Extract V3 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));
})();
JavaScript (Node.js) - Extract V3 Parameters
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();
Python - Extract V3 Parameters
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())
JavaScript (Node.js) - Extract V4 Parameters
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);
});
Python - Extract V4 Parameters
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"))