Captcha bypass tutorials

Was this helpful?

How to Bypass GeeTest v3 Captcha

Kate Push

Technical engineer

Как распознать, решить обойти капчу GeeTest автоматически

Introduction

If you are automating interactions with websites protected by GeeTest version 3 captcha, this guide will help you set up integration with the 2Captcha service.

GeeTest V3 is a protection system that uses interactive tasks (most often a slider puzzle) combined with behavioral analysis. The key feature of version 3 is the dynamic challenge parameter, which changes for each session and requires obtaining a new value before every API request.

In this article, we will cover both methods of sending tasks: without proxy (GeeTestTaskProxyless) and with proxy (GeeTestTask), and show current JSON request examples.

General Information

What Is GeeTest V3

GeeTest V3 is a popular captcha system that combines a visual task with user behavior analysis. Key features:

  • Dynamic challenge parameter that must be extracted for each session
  • Static public key gt for each website
  • Returns three tokens: geetest_challenge, geetest_validate, geetest_seccode
  • Supports both proxyless and proxy modes

Task Types in 2Captcha API

Task Type Description When to Use
GeeTestTaskProxyless Solving via 2Captcha internal proxies If the site does not block data centers and does not require residential IPs
GeeTestTask Solving with your own proxy If the site checks geolocation, blocks cloud IPs, or requires sessions

GeeTest V3 Task Parameters

Parameter Type Required Description
type String Yes GeeTestTaskProxyless or GeeTestTask
websiteURL String Yes Full URL of the page where the captcha loads
gt String Yes GeeTest public key, static value for the site
challenge String Yes Dynamic challenge token, obtained from the target site
geetestApiServerSubdomain String No Custom API domain, for example api-na.geetest.com
userAgent String No Browser User-Agent that loads the captcha
proxyType String No* Proxy type: http, https, socks4, socks5
proxyAddress String No* Proxy IP address
proxyPort String No* Proxy port
proxyLogin String No* Proxy login if authentication is required
proxyPassword String No* Proxy password if authentication is required

* Required only when using GeeTestTask task type

Environment Setup

Request Requirements

To work with the 2Captcha API, you will need:

  • API key from your account dashboard at 2captcha.cn
  • HTTPS client for sending POST requests (curl, Postman, or a library in your language)
  • Valid gt and challenge from the target site
  • Full page URL where the captcha is displayed
  • Proxy (optional, but recommended for stability)

Getting Your API Key

  1. Log in to your 2Captcha account dashboard
  2. Go to the account settings section
  3. Copy your clientKey (API key)
  4. For security, store the key in an environment variable, not in your code

Page Analysis

Finding the gt Parameter

The gt parameter is static and usually contained in the page source code.

Method 1: via DevTools

  1. Open the target page in your browser
  2. Press F12 to open developer tools
  3. Go to the Elements tab
  4. Find the initGeetest function call

Example JavaScript:

javascript Copy
initGeetest({
    gt: "81388ea1fc187e0c335c0a8907ff2625",
    challenge: "2e2f0f65240058b683cb6ea21c303eea6n",
    // other parameters
});

The value of the gt field is the static site key.

Method 2: via Source Code

Use page search (Ctrl+F) to find the string gt: or data-geetest.

Getting the Dynamic challenge

The challenge parameter is single-use and dynamic. You must obtain a new one before every API request.

Method 1: via Network Tab

  1. In DevTools, go to the Network tab
  2. Refresh the page with the captcha
  3. Filter requests by geetest or get.php
  4. Find the request to api.geetest.com/get.php, the challenge parameter will be in the response or request parameters

Method 2: Programmatic Retrieval

Send a request to the endpoint that returns captcha initialization parameters. Usually this is:

Copy
GET https://api.geetest.com/get.php?gt=YOUR_GT&callback=geetest_123456

Important: do not cache the challenge value. After use, it becomes invalid.

Checking the websiteURL

Make sure you specify the full page URL, including the protocol:

  • Correct: https://example.com/login
  • Incorrect: example.com/login or /login

The API does not open the page itself, so it may be accessible only to authorized users, this will not prevent solving.

Implementation

Example Request: GeeTestTaskProxyless (without proxy)

Method: createTask
Endpoint: https://api.2captcha.com/createTask

json Copy
{
  "clientKey": "YOUR_API_KEY",
  "task": {
    "type": "GeeTestTaskProxyless",
    "websiteURL": "https://example.com/login",
    "gt": "81388ea1fc187e0c335c0a8907ff2625",
    "challenge": "2e2f0f65240058b683cb6ea21c303eea6n"
  }
}

Example Request: GeeTestTask (with proxy)

json Copy
{
  "clientKey": "YOUR_API_KEY",
  "task": {
    "type": "GeeTestTask",
    "websiteURL": "https://example.com/login",
    "gt": "81388ea1fc187e0c335c0a8907ff2625",
    "challenge": "2e2f0f65240058b683cb6ea21c303eea6n",
    "proxyType": "http",
    "proxyAddress": "1.2.3.4",
    "proxyPort": "8080",
    "proxyLogin": "user23",
    "proxyPassword": "p4$w0rd"
  }
}

Getting the Result

After creating the task, use the getTaskResult method to get the solution.

Endpoint: https://api.2captcha.com/getTaskResult

Request:

json Copy
{
  "clientKey": "YOUR_API_KEY",
  "taskId": 74455221488
}

Successful Response:

json Copy
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "geetest_challenge": "2e2f0f65240058b683cb6ea21c303eea6n",
    "geetest_validate": "a1b2c3d4e5f6g7h8i9j0",
    "geetest_seccode": "k1l2m3n4o5p6q7r8s9t0|jigsaw"
  },
  "cost": "0.00299",
  "ip": "1.2.3.4",
  "createTime": 1692863536,
  "endTime": 1692863556,
  "solveCount": 1
}

Using the Solution on the Target Site

You need to send the received parameters to the target site in the same format that the original form expects. Usually this includes:

  • geetest_challenge
  • geetest_validate
  • geetest_seccode

These values are often passed in the POST request body or in headers. Intercept the original request via DevTools (Network tab) and reproduce it with the received tokens.

Parameter Explanations

Dynamic challenge

The challenge parameter is single-use. After the captcha is loaded on the page, this value becomes invalid.

Rule: obtain a new challenge before every request to the 2Captcha API.

To do this:

  1. Analyze the target site network requests when the page loads
  2. Find the request that returns a new challenge
  3. Reproduce this request before creating a task in the API

Custom API Domain

Some sites use custom domains to load GeeTest scripts. If you see a domain other than api.geetest.com in the source code, specify it in the geetestApiServerSubdomain parameter:

json Copy
{
  "clientKey": "YOUR_API_KEY",
  "task": {
    "type": "GeeTestTaskProxyless",
    "websiteURL": "https://example.com",
    "gt": "81388ea1fc187e0c335c0a8907ff2625",
    "challenge": "2e2f0f65240058b683cb6ea21c303eea6n",
    "geetestApiServerSubdomain": "api-na.geetest.com"
  }
}

Proxy Settings

If you are using the GeeTestTask task type, make sure that:

  • The proxy supports HTTPS and does not require additional CAPTCHA confirmation
  • All required fields are specified: proxyType, proxyAddress, proxyPort
  • If authentication is required, proxyLogin and proxyPassword are correctly passed
  • The proxy is located in the region expected by the target site

Handling API Errors

Common error codes:

Error Code Description Solution
ERROR_WRONG_USER_KEY Invalid API key Check your clientKey in the account dashboard
ERROR_ZERO_BALANCE Insufficient funds Top up your account balance
ERROR_BAD_PARAMETERS Invalid task parameters Check the format of gt, challenge, websiteURL
ERROR_PROXY_CONNECT_REFUSED Could not connect to proxy Check proxy credentials and availability
ERROR_CAPTCHA_UNSOLVABLE Captcha cannot be solved Make sure challenge is current and the page is accessible
challenge expired Challenge parameter is outdated Get a new challenge before sending the task

Common Mistakes

Mistake Cause Solution
Reusing challenge challenge is single-use Get a new challenge before every request
Incorrect gt Using a key from another site Extract the current gt from the target page source code
Proxy rejects connection Invalid credentials or blocking Test the proxy manually before sending the task
Solution not accepted by site Incorrect token submission format Intercept the original request and reproduce the structure
ERROR_BAD_PARAMETERS error Invalid parameter format Check that gt and challenge are strings, websiteURL is a valid URL

Additional Resources

Checklist

  • API key obtained and verified from 2Captcha account dashboard
  • Static gt parameter extracted from the target site source code
  • Dynamic challenge retrieval implemented before every request
  • Custom domain specified in geetestApiServerSubdomain if used
  • When using proxy, all fields checked: type, address, port, login, password
  • Error handling added for errorId and errorCode codes
  • Sending the received solution to the target site tested
  • Logging of requests and responses configured for debugging

Conclusion

GeeTest V3 requires careful handling of the dynamic challenge parameter, which must be obtained anew before every API request. Unlike version 4, there is no simplified flow with captcha_id, but with proper implementation the integration remains stable.

The 2Captcha service supports two solving methods: GeeTestTaskProxyless for a quick start and GeeTestTask for cases where proxy control is required. Both methods return the same set of tokens: geetest_challenge, geetest_validate, geetest_seccode, which must be passed to the target site for verification.

Integration with 2Captcha allows you to delegate the complex part of bypassing captchas to a specialized service, focusing your efforts on your application logic. By following the parameters in this guide, you will be able to reliably solve GeeTest V3 on any website.