GeeTest slider captcha solver: v3 and v4 via API
Tell a GeeTest v3 slider from a v4 slider, see why DIY gap detection is the easy half, and solve both with GeetestTaskProxyLess in curl and Python.

Your scraper hits a login page, and instead of a form you get a GeeTest slider captcha: a background image with a missing piece and a handle you have to drag into the gap. Finding the gap takes ten lines of OpenCV. Getting GeeTest to accept the drag is the part that breaks. This guide shows how to tell a v3 slider from a v4 slider, why the DIY route fails at the payload step, and how to solve both with one GeetestTaskProxyLess call. Over the last 30 days that task type ran 6,173 times on CapBypass with a 10.1 s average solve time, and the numbers section explains what the success rate does and does not tell you.
v3 or v4: tell the slider apart first
The GeeTest slider captcha looks almost the same in both versions, but the API inputs are different. Sending v4 inputs to a v3 page (or the reverse) gets you a solution the site rejects. Open DevTools, go to the Network tab and filter on geetest.
| Signal | GeeTest v3 slider | GeeTest v4 slider |
|---|---|---|
| Hosts | api.geetest.com, api.geevisit.com |
gcaptcha4.geetest.com |
| First requests | /gettype.php, /get.php |
/load, /verify |
| Page call | initGeetest(...) |
initGeetest4(...) |
| IDs you need | gt (fixed per site) + challenge (new every load) |
captcha_id (fixed per site) |
| Other challenge types | slide only (behind a "click to verify" widget) | slide plus 8 others |
The v3 slider is the only challenge v3 serves through the fullpage SDK, so if you see gettype.php, you are dealing with a slider. On v4, the slider is one of nine challenge types, and GeeTest picks one per session. A page that shows you a slider today can show an icon grid on the next reload, which the GeeTest icon captcha post covers in detail.
The v3 challenge is the field that trips people up. Your target site's backend generates it by calling GeeTest's register endpoint, then hands it to the browser along with gt. It is single use. Copy one from DevTools, reuse it ten minutes later, and every solve fails.
why a diy geetest slider solver breaks
Plenty of GitHub projects solve the GeeTest slider, and the approach is always the same three steps. The first one is easy, which is why so many projects exist. The other two are why most of them stop working.
1. Find the gap. GeeTest serves the background with and without the piece cut out (v3 also scrambles the image in strips you have to reassemble first). Diff the two images, or run Canny edge detection plus template matching on the piece, and you get the gap's x offset to within a pixel or two. This step works reliably.
2. Build a human-looking drag. GeeTest does not just check where the piece ends. It records the whole track: x, y and a timestamp for every mouse move. A straight line at constant speed fails. Projects add easing curves, overshoot and small y jitter, and they pass for a while, then GeeTest updates its scoring and the pass rate drops.
3. Encrypt the w parameter. The track, the offset and timing data go into an encrypted w value sent with the verify request. The encryption code lives in GeeTest's obfuscated slide.js (v3) or gcaptcha4.js (v4), and GeeTest ships new builds of both. When the script changes, your payload builder sends garbage until someone reverses the new version.
Driving a real browser with Playwright or Puppeteer removes step 3, since the page's own script builds w. You still need steps 1 and 2, and you pay for a full browser per solve. For a handful of solves a day on your own site, that is a fine project. At volume, steps 2 and 3 turn into ongoing maintenance.
solving the geetest slider with capbypass
CapBypass routes on the fields you send, and its solver detects the challenge type itself. There is no risk_type or slide flag:
gt+challengeselects the v3 flowcaptchaIdalone selects the v4 flow
GeetestTaskProxyLess uses CapBypass proxies. GeetestTask takes your own proxy in task.proxy and is otherwise identical. Both are listed in the GeeTest task docs.
v3 slider
Fetch a fresh challenge from the target site right before you create the task. Then send it with gt:
curl -s https://api.capbypass.pro/createTask \
-H 'Content-Type: application/json' \
-d '{
"clientKey": "'"$CAPBYPASS_API_KEY"'",
"task": {
"type": "GeetestTaskProxyLess",
"websiteURL": "https://example.com/login",
"gt": "81388ea1fc187e0c335c0a8907ff2625",
"challenge": "7b33c5254c55c432cf558767e36b8ef5"
}
}'
# {"errorId":0,"taskId":"07af74e1-6fec-4503-86e3-a8d080126516"}v4 slider
Send the captcha_id from the /load request's query string as captchaId, and no challenge:
curl -s https://api.capbypass.pro/createTask \
-H 'Content-Type: application/json' \
-d '{
"clientKey": "'"$CAPBYPASS_API_KEY"'",
"task": {
"type": "GeetestTaskProxyLess",
"websiteURL": "https://example.com/login",
"captchaId": "fcd636b4514bf7ac4143922550b3008b"
}
}'Then poll getTaskResult with the taskId until status is ready. The interval, error handling and refund rules are in polling captcha API tasks, so the rest of this guide uses the Python SDK, which wraps create and poll in one solve() call.
python, end to end (v3)
The register path below is a placeholder. Find the real one in DevTools: it is the first request on page load that returns JSON with gt and challenge.
import os
import time
import requests
from capbypass import CapBypass
SITE = "https://example.com"
client = CapBypass(api_key=os.environ["CAPBYPASS_API_KEY"])
session = requests.Session()
# 1. fresh gt + challenge from the target's backend (single use)
reg = session.get(
f"{SITE}/api/geetest/register",
params={"t": int(time.time() * 1000)},
).json()
# 2. solve the slider
solution = client.solve({
"type": "GeetestTaskProxyLess",
"websiteURL": f"{SITE}/login",
"gt": reg["gt"],
"challenge": reg["challenge"],
}, timeout=120)
# 3. submit the three v3 fields with the form
resp = session.post(f"{SITE}/login", data={
"username": os.environ["SITE_USER"],
"password": os.environ["SITE_PASS"],
"geetest_challenge": solution["challenge"],
"geetest_validate": solution["validate"],
"geetest_seccode": solution["seccode"],
}, headers={"User-Agent": solution["userAgent"]})
print(resp.status_code)Note that the solution's challenge is not the one you sent. GeeTest appends two characters to it during a solve, and the site's backend checks the new value. Always submit the returned one.
For v4, swap the gt/challenge pair for "captchaId": "<captcha_id>". The solution then has five fields, captcha_id, lot_number, pass_token, gen_time and captcha_output, which the site expects together, usually as form fields or a JSON body on its own verify route. The GeeTest v4 API tutorial has the TypeScript version of the same flow.
Bonus: +5% credits on every top-up
New to CapBypass? Apply code
WELCOME_2026at checkout for an extra 5% in credits on every top-up, with no minimum and no expiry. Redeem it on the top-up page and put it toward your firstGeetestTaskProxyLesssolves.
what the production numbers say
These figures come from the public getStatus endpoint, fetched on 2026-10-23. Anyone can run the same request:
curl -s -X POST https://api.capbypass.pro/getStatus \
-H 'content-type: application/json' -d '{"period":"30d"}'
What to read from it:
- The counts cover every GeeTest challenge type, v3 and v4 combined. The endpoint does not split out the slider, so treat these as GeeTest-wide numbers.
- The 30-day rate is 76.4% on 6,173 tasks, and the endpoint flags the type as degraded over that window. One week earlier, the same 30-day window showed 75.8% on 6,030 tasks.
- The last 7 days are 227 tasks at 100%. That is a much smaller sample, so it says the current week is clean, not that the month was.
- The average solve time is 10.1 s. It is an average, not a median. Budget your timeout for the slow tail, not the average: the SDK default of 120 s is fine.
Failed tasks are not charged, so a lower success rate costs you retries and time, not credits.
things that go wrong
challengereused or stale (v3). The most common v3 failure. Call the site's register endpoint for every task, and do not create the task until you have the fresh value.- v4 inputs on a v3 page. Sending
captchaIdto a page that loadsgettype.phpreturns a v4 payload the site cannot verify. Check the hosts in the table above first. - Custom GeeTest host. Some v3 sites proxy GeeTest through their own domain instead of
api.geetest.com. Pass that host incaptchaHost. On v4, a non-default API host goes ingeetestApiServerSubdomain. - User agent mismatch. v3 returns the
userAgentit solved with. Send it on the request that submits the seccode, as in the Python example, or pass your ownuserAgentin the task so both sides match. - Rejected after a valid solve. The site may also bind the solve to the IP. Use
GeetestTaskwith the same proxy your scraper uses so the solve and the submit come from one address.
pricing
GeeTest costs $0.99 per 1,000 successful solves on CapBypass, the same for v3 and v4, slider or any other type, and failed solves are free. Plan details are on the pricing page.
faq
What is the GeeTest slider captcha? It is GeeTest's slide puzzle: a background image with a cut-out piece you drag into the matching gap. It is the only challenge in GeeTest v3 fullpage and one of nine challenge types in GeeTest v4.
How do I know if a site uses GeeTest v3 or v4?
Filter the DevTools Network tab on geetest. Requests to api.geetest.com/gettype.php and an initGeetest call mean v3, while gcaptcha4.geetest.com/load and initGeetest4 mean v4.
Can I solve the GeeTest slider with OpenCV alone?
OpenCV finds the gap offset reliably, but GeeTest also scores the mouse track and requires an encrypted w parameter built by its own script. Without a realistic track and a working w builder, a correct offset still fails.
Do I need to tell CapBypass that the challenge is a slider?
No. You send gt and challenge for v3 or captchaId for v4, and the solver detects the challenge type GeeTest serves. The same GeetestTaskProxyLess request covers slide and the other v4 types.
How long does a GeeTest slider solve take?
The public status endpoint reports a 10.1 s average solve time for GeetestTaskProxyLess, across all GeeTest challenge types. Set a client timeout of about 120 s to cover slow solves.
Is it legal to bypass a GeeTest captcha? It depends on the site and your jurisdiction. Use this on sites you own or have permission to test, and read the terms for what the service allows.
Ready to start solving CAPTCHAs?
Get started with CapBypass in minutes. No credit card required.


