Was this helpful?
How to Bypass GeeTest v3 Captcha
Technical engineer
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
challengeparameter that must be extracted for each session - Static public key
gtfor 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.com
- HTTPS client for sending POST requests (curl, Postman, or a library in your language)
- Valid
gtandchallengefrom the target site - Full page URL where the captcha is displayed
- Proxy (optional, but recommended for stability)
Getting Your API Key
- Log in to your 2Captcha account dashboard
- Go to the account settings section
- Copy your
clientKey(API key) - 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
- Open the target page in your browser
- Press F12 to open developer tools
- Go to the Elements tab
- Find the
initGeetestfunction call
Example JavaScript:
javascript
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
- In DevTools, go to the Network tab
- Refresh the page with the captcha
- Filter requests by
geetestorget.php - Find the request to
api.geetest.com/get.php, thechallengeparameter 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:
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/loginor/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
{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "GeeTestTaskProxyless",
"websiteURL": "https://example.com/login",
"gt": "81388ea1fc187e0c335c0a8907ff2625",
"challenge": "2e2f0f65240058b683cb6ea21c303eea6n"
}
}
Example Request: GeeTestTask (with proxy)
json
{
"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
{
"clientKey": "YOUR_API_KEY",
"taskId": 74455221488
}
Successful Response:
json
{
"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_challengegeetest_validategeetest_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:
- Analyze the target site network requests when the page loads
- Find the request that returns a new
challenge - 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
{
"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,
proxyLoginandproxyPasswordare 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
- GeeTest API Documentation - Full method specification
- Test Sandbox - Safe testing without deducting funds
- Request Examples on GitHub - Collection of examples in different languages
- Support - Create a ticket if you encounter technical issues
Checklist
- API key obtained and verified from 2Captcha account dashboard
- Static
gtparameter extracted from the target site source code - Dynamic
challengeretrieval implemented before every request - Custom domain specified in
geetestApiServerSubdomainif used - When using proxy, all fields checked: type, address, port, login, password
- Error handling added for
errorIdanderrorCodecodes - 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.