Was this helpful?
How to tell GeeTest v3 from GeeTest v4
Technical engineer
To an ordinary user, GeeTest v3 and v4 look absolutely identical: the same slider puzzle, the same invisible behavior tracking. But for a developer, these are two completely different systems. If you try to feed v3 parameters to a v4 widget (or vice versa), the captcha will simply fail to work.
The most frustrating part is that visually, just by looking at the page, you often cannot determine the version. You have to look under the hood. Let us figure out how to understand in a couple of seconds which version you are dealing with and what exactly it requires.
The Quickest Way to Tell
Open the browser developer tools and look at the page source code or the Network tab.
- This is v3 if you see a challenge next to the gt value.
- This is v4 if you only see a captcha_id, and there is no static challenge on the page.
An extra hint: the script for v4 is loaded from gcaptcha4.geetest.com/load, and the captcha_id is often passed right there in the URL as a query parameter.
GeeTest v3: Key Features and Parameters
Version v3 requires two values:
- gt — a static site key that almost never changes.
- challenge — a dynamic value that is only valid for a single use.
The main trap with v3: the challenge parameter is one-time use. By the time the captcha loads on the page, that specific challenge is already spent. If you try to reuse it, the API will return an expired token error instead of a solution.
This means you cannot just copy the challenge once and cache it. You need to intercept the network request that the page itself makes to get a fresh challenge, and repeat this step before every new task submission.
A full API request for v3 looks like this:
bash
curl -X POST https://api.2captcha.com/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "GeeTestTaskProxyless",
"websiteURL": "https://2captcha.com/demo/geetest",
"gt": "81388ea1fc187e0c335c0a8907ff2625",
"challenge": "2e2f0f65240058b683cb6ea21c303eea6n"
}
}'
Using the Python SDK:
python
from twocaptcha import TwoCaptcha
solver = TwoCaptcha('YOUR_API_KEY')
result = solver.geetest(
gt='81388ea1fc187e0c335c0a8907ff2625',
challenge='2e2f0f65240058b683cb6ea21c303eea6n',
url='https://2captcha.com/demo/geetest'
)
print(result)
In response, you will get a set of three tokens: challenge, validate, and seccode. They need to be inserted into the form just as GeeTest itself would do after manual solving. Usually, these are hidden fields named geetest_challenge, geetest_validate, and geetest_seccode, although some sites instead expect a JavaScript callback to be triggered.
GeeTest v4: Simplified Format and Parameters
In version v4, the GeeTest developers got rid of the need to use a dynamic challenge.
All you need now is the captcha_id. This is a static identifier tied to the site. It does not expire or change like the challenge in v3. This makes working with v4 noticeably easier: you no longer need to hunt for network requests. It is enough to find this ID once and calmly use it over and over again.
An API request for v4:
bash
curl -X POST https://api.2captcha.com/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "GeeTestTaskProxyless",
"websiteURL": "https://2captcha.com/demo/geetest-v4",
"version": 4,
"initParameters": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73"
}
}
}'
Using the Python SDK:
python
from twocaptcha import TwoCaptcha
solver = TwoCaptcha('YOUR_API_KEY')
result = solver.geetest_v4(
captcha_id='e392e1d7fd421dc63325744d5a2b9c73',
url='https://2captcha.com/demo/geetest-v4'
)
print(result)
The response looks completely different from v3. Instead of three short tokens, v4 returns five fields: captcha_id, lot_number, pass_token, gen_time, and captcha_output. All five values need to be delivered to the target page — again, either as hidden form fields or via a callback expected by the site's JavaScript.
Quick Comparison
| Characteristic | GeeTest v3 | GeeTest v4 |
|---|---|---|
| Required parameters | gt, challenge | captcha_id |
| Does the value expire? | Yes, challenge is one-time | No, captcha_id is static |
| Is an extra step needed? | Yes, need to intercept a fresh challenge from page requests | No, ID is taken from the code once |
| Task type in API | GeeTestTaskProxyless / GeeTestTask | GeeTestTaskProxyless / GeeTestTask (with version: 4 parameter) |
| Returned tokens | challenge, validate, seccode | captcha_id, lot_number, pass_token, gen_time, captcha_output |
| Typical form field names | geetest_challenge, geetest_validate, geetest_seccode | lot_number, pass_token, gen_time, captcha_output |
Important Nuance with Field Names
A small but important point. If you read old guides or forum posts, you might have seen that v3 response tokens were named with a geetest_ prefix (for example, geetest_challenge).
This is a feature of the old in.php and res.php endpoints. The modern createTask and getTaskResult API, as well as current SDKs, return the exact same data but without the prefix: just challenge, validate, and seccode.
The data is the same, it is just that the key names in JSON differ depending on which part of the API you are using. Keep this in mind so you do not waste time looking for a field that is not actually in the response.
Conclusion
The difference between GeeTest v3 and v4 comes down to one key point: the need to dynamically fetch a fresh challenge every time in the third version versus using a static captcha_id in the fourth. While the widgets look identical to the user on the outside, under the hood they require a fundamentally different approach to integration.
Once you learn to identify the version in a couple of seconds via the page source code or network requests, the setup process will stop being a process of trial and error. You will know in advance whether you need to set up traffic interception, which exact parameters to prepare for the API, and in what format to expect the response tokens for form injection. This turns captcha bypass from a source of constant errors and timeouts into a clear, reliable, and completely predictable stage of your automation.
Useful Links
- 2Captcha API documentation for GeeTest: https://2captcha.com/api-docs/geetest
- GeeTest v3 demo page: https://2captcha.com/demo/geetest
- GeeTest v4 demo page: https://2captcha.com/demo/geetest-v4
- 2Captcha Python SDK on GitHub: https://github.com/2captcha/2captcha-python