
Ethan Collins
Pattern Recognition Specialist

GeeTest V4 is the latest generation of GeeTest's behavioral CAPTCHA system, used by a growing number of websites to protect login forms, registration pages, and data endpoints. Unlike older CAPTCHA systems that rely on image puzzles, GeeTest V4 uses adaptive challenges and behavioral analysis — making it one of the more sophisticated protections you'll encounter in automation workflows.
What if you could solve GeeTest V4 automatically inside your n8n workflows — whether you're building a reusable solver API, scraping a captcha-protected site, or automating a login form — all without writing a single line of traditional code?
In this guide, you'll learn how to combine n8n (a visual workflow automation tool) with CapSolver (an AI-powered captcha solving service) to solve GeeTest V4 challenges on demand — either as a standalone API endpoint or as a step inside any automation workflow.
What you'll build:
Solver APIs — reusable endpoints your other tools can call:
Direct-use workflows — CapSolver embedded as a step inside larger automations:
GeeTest V4 is the newest version of GeeTest's CAPTCHA platform. It replaces the older V3 system with a simplified integration model and enhanced behavioral detection. From a solving perspective, V4 is structurally simpler than V3 — it only requires one static parameter (captchaId) instead of the dynamic challenge flow that V3 needs.

Key differences from GeeTest V3:
| Feature | GeeTest V3 | GeeTest V4 |
|---|---|---|
| Main parameter | gt + dynamic challenge |
captchaId (static) |
| Challenge fetch | Required — must call GeeTest API first | Not needed — captchaId is static |
| Solution fields | 3 (challenge, validate, seccode) |
5 (captcha_id, lot_number, pass_token, gen_time, captcha_output) |
| Widget script | gt.js |
gcaptcha4.js |
| Task type | GeeTestTask / GeeTestTaskProxyLess |
GeeTestTaskProxyLess only |
Why V4 is simpler to automate: The
captchaIdis embedded in the page source and never changes — find it once, use it forever. No dynamic challenge fetching means fewer nodes in your workflow.
Before getting started, make sure you have the following:
Important: Make sure you have sufficient balance in your CapSolver account. GeeTest V4 solving tasks consume credits based on usage.
CapSolver is available as an official integration in n8n — no community node installation required. You can find it directly in the node panel when building your workflows.
Since it's an official integration, you need to create a credential in n8n so that the CapSolver node can authenticate with your account.
Go to your n8n instance and navigate to Settings > Credentials. You'll see all your configured credentials here.

All (default)n8n will automatically test the connection. You should see a green "Connection tested successfully" banner confirming your API key is valid.

Important: Every CapSolver node in your workflows will reference this credential. You only need to create it once — all your solver workflows will share the same credential.
Now you're ready to build your GeeTest V4 solver workflow!
Before you can solve a GeeTest V4 CAPTCHA, you need to find its captchaId — the only required parameter. Unlike GeeTest V3 (which requires fetching a dynamic challenge), V4's captchaId is static and embedded directly in the page source.
captcha_id or captchaId in the page sourcegcaptcha4.js — the GeeTest V4 widget scriptcaptchaId is typically passed as a configuration parameter when initializing the widget<!-- Example: GeeTest V4 initialization in page source -->
<script>
initGeetest4({
captchaId: 'e392e1d7fd421dc63325744d5a2b9c73',
product: 'bind'
});
</script>
gcaptcha4 or geetestgcaptcha4.geetest.com — the captcha_id parameter will be in the query stringKey advantage of V4: The
captchaIdis static — once you find it, you can use it indefinitely without needing to fetch a new challenge each time. This makes V4 workflows structurally identical to Turnstile workflows.
This workflow creates a POST API endpoint that accepts GeeTest V4 parameters and returns a solved token set.

The workflow consists of four nodes:
$json.error is not empty){"error": "..."} on failure| Setting | Value |
|---|---|
| HTTP Method | POST |
| Path | solver-geetest-v4 |
| Respond | Response Node |
This creates an endpoint at: https://your-n8n-instance.com/webhook/solver-geetest-v4
| Parameter | Value | Description |
|---|---|---|
| Operation | GeeTest V4 |
Must be set to GeeTest V4 |
| Type | GeeTestTaskProxyLess |
This is the only available task type (no proxy variant) |
| Website URL | {{ $json.body.websiteURL }} |
The URL of the page with the GeeTest V4 widget |
| Captcha ID | {{ $json.body.captchaId }} |
The static GeeTest V4 captcha ID |
| GeeTest API Server Subdomain | (Optional) | Custom GeeTest API server if the site uses one |
Select your CapSolver credentials in this node. The optional
geetestApiServerSubdomainparameter is rarely needed — only add it if the default GeeTest server doesn't work for your target site.
| Setting | Value |
|---|---|
| Condition | ={{ $json.error }} is not empty |
| True branch | Routes to the Error Respond to Webhook node |
| False branch | Routes to the Success Respond to Webhook node |
Success branch (false output of CapSolver Error?):
| Setting | Value |
|---|---|
| Respond With | JSON |
| Response Body | ={{ JSON.stringify($json.data) }} |
Send a POST request to your webhook endpoint:
curl -X POST https://your-n8n-instance.com/webhook/solver-geetest-v4 \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://example.com/login",
"captchaId": "e392e1d7fd421dc63325744d5a2b9c73"
}'
Expected Response:
{
"taskId": "abc123...",
"solution": {
"captcha_id": "e392e1d7fd421dc63325744d5a2b9c73",
"lot_number": "7c18c041a6ed4e...",
"pass_token": "d88ce40c0a5c5a18...",
"gen_time": "1709123456",
"captcha_output": "dGVzdF9jYXB0Y2hh..."
},
"status": "ready"
}
Copy the JSON below and import it into n8n via Menu > Import from JSON:
{
"nodes": [
{
"parameters": {
"content": "## GeeTest V4 \u2014 Solver API\n\n### How it works\n\n1. Receives a solver request via a webhook.\n2. Processes the request using the GeeTest V4 solver.\n3. Evaluates if an error occurred during the solving process.\n4. Responds to the webhook with an error message if an error occurred.\n5. Provides a successful response to the webhook if no errors occurred.\n\n### Setup steps\n\n- [ ] Configure the webhook node with the incoming request details\n- [ ] Set up the GeeTest V4 solver node with appropriate credentials\n\n### Customization\n\nAdditional conditions in 'CapSolver Error?' node can be adjusted as per error handling requirements.",
"width": 480,
"height": 672
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-800,
-208
],
"id": "ab19b274-21ce-4939-bdb7-bcf9942e1116",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receive and process request\n\nReceives a request and sends it to the solver.",
"width": 496,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-240,
-112
],
"id": "0037b174-7efe-48d7-a71d-41c0096f60d4",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Error handling and response\n\nChecks for errors and responds accordingly.",
"width": 496,
"height": 480,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
352,
-208
],
"id": "f219ff43-c594-4726-a358-80db0fb2cefa",
"name": "Sticky Note2"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-192,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40001",
"name": "Receive Solver Request",
"webhookId": "a1b2c3d4-0001-0001-0001-a1b2c3d40002",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $json.body.websiteURL }}",
"captchaId": "={{ $json.body.captchaId }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40003",
"name": "GeeTest V4",
"onError": "continueRegularOutput",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "capsolver-err-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
400,
0
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40004",
"name": "CapSolver Error?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
700,
-100
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40005",
"name": "Respond to Webhook (Error)"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
700,
100
],
"id": "a1b2c3d4-0001-0001-0001-a1b2c3d40006",
"name": "Respond to Webhook"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"GeeTest V4": {
"main": [
[
{
"node": "CapSolver Error?",
"type": "main",
"index": 0
}
]
]
},
"CapSolver Error?": {
"main": [
[
{
"node": "Respond to Webhook (Error)",
"type": "main",
"index": 0
}
],
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
The GeeTest V4 solver API endpoint accepts the following parameters:
| Parameter | Required | Description |
|---|---|---|
websiteURL |
Yes | The URL of the page hosting the GeeTest V4 widget |
captchaId |
Yes | The static GeeTest V4 captcha ID (found in page source) |
geetestApiServerSubdomain |
No | Custom GeeTest API server subdomain (rarely needed) |
Tip: You can identify the
websiteURLandcaptchaIdby inspecting the page source or using DevTools to search forcaptcha_idin network requests.
Compared to GeeTest V3, V4 is simpler — you only need two required parameters and the captchaId is static. No dynamic challenge fetching is needed.
The API workflow above shows how to get a solved GeeTest V4 token set. But what do you actually do with it?
In real-world automation, solving the challenge is only half the job. You need to submit the 5 solution fields to the target website — exactly as a browser would — to unlock the data or action behind the GeeTest V4 protection.
Here's the general pattern:
Unlike Turnstile (single token) or reCAPTCHA (single gRecaptchaResponse), GeeTest V4 returns 5 solution fields that must all be submitted together:
| Field | Description |
|---|---|
captcha_id |
The captcha identifier (same as input captchaId) |
lot_number |
Unique lot number for this solve |
pass_token |
Authentication token proving the solve |
gen_time |
Timestamp when the solution was generated |
captcha_output |
The actual captcha output/answer |
Example: https://example.com/ — A GeeTest V4-protected website
Manual Trigger > CapSolver GeeTest V4 > HTTP POST Request (5 fields) > IF (check success) > Edit Fields (extract data)
GeeTest V4https://example.com/logine392e1d7fd421dc... (find it by inspecting the page source)captcha_id = {{ $json.data.solution.captcha_id }}lot_number = {{ $json.data.solution.lot_number }}pass_token = {{ $json.data.solution.pass_token }}gen_time = {{ $json.data.solution.gen_time }}captcha_output = {{ $json.data.solution.captcha_output }}username, password)Key concept: Every website handles token submission differently. In this example, the 5 fields are sent as form-urlencoded POST data — but other sites may expect them as JSON body fields, query parameters, or through a completely different endpoint. Always inspect the site's actual form submission (using DevTools Network tab) to see exactly how the fields need to be sent.
The solver API and scraping example above show the core pattern: solve the GeeTest V4, submit the 5 fields, process the result. The following workflows extend this pattern to production-ready use cases — each with dual triggers (schedule + webhook), persistent state tracking, and structured output.
| Workflow | Purpose |
|---|---|
GeeTest V4 Scraping — Price & Product Details — CapSolver + Schedule + Webhook |
Scrapes price and product name every 6 hours, compares against previous values stored in staticData, alerts on changes |
GeeTest V4 Account Login — CapSolver + Schedule + Webhook |
Logs into your own account on a captcha-protected site by solving first, then POSTing credentials with the 5 solution fields |
This workflow scrapes a product page every 6 hours (schedule) or on demand (webhook), extracts the price using the HTML node, and compares it against the previously stored value.
Schedule path:
Every 6 Hours > Fetch Captcha Details > Solve GeeTest V4 > Fetch Product Page > Extract Data
> Compare Data > Data Changed? > Build Alert / No Change
Key behaviors:
.product-price, h1)$workflow.staticData.lastPrice persists the previous price across executionsdeal) and increases (severity: info){
"nodes": [
{
"parameters": {
"content": "## GeeTest V4 Scraping \u2014 Price & Product Monitor\n\n### How it works\n\n1. Triggers on a schedule or webhook for GeeTest V4 implementation.\n2. Fetches and solves captcha for accessing the product page.\n3. Extracts data from the product page and compares it with prior data.\n4. Builds alerts if data changes, sets statuses if not.\n5. Responds to the webhook with the findings.\n\n### Setup steps\n\n- [ ] Configure API keys and URLs for the target site.\n- [ ] Set up CapSolver credentials for captcha solving.\n- [ ] Configure webhook endpoints if using the webhook trigger.\n\n### Customization\n\nAdjust the target URL for different product pages if needed.",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1312,
-256
],
"id": "efca1569-1a78-481e-9b4e-3f4e3b443eef",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled captcha fetching\n\nTriggered every 6 hours to fetch and solve captchas for accessing product data.",
"width": 800,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-112
],
"id": "ad65cf5e-a763-4327-a67a-f1a1d86f3691",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Fetch and process product data\n\nFetches product data page and processes the HTML for data extraction.",
"width": 784,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
160,
-112
],
"id": "1930f8a2-085c-4cff-a207-2ccfac0b3c96",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Data validation and alerting\n\nChecks if data has changed to decide whether to build an alert or update status.",
"width": 480,
"height": 480,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1056,
-256
],
"id": "2439556a-ba0d-49d0-896e-f5898d256b8c",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Webhook captcha handling\n\nTriggered by webhook to fetch and solve captchas to access product data.",
"width": 800,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
320
],
"id": "27e8071b-7581-466e-8346-273c8c4e9f46",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "## Fetch and process product data [Webhook]\n\nFetches product page for webhook, processes HTML to extract data and compare with prior data.",
"width": 784,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
160,
304
],
"id": "0deb6807-e5f9-47a8-b381-c2a588970c77",
"name": "Sticky Note5"
},
{
"parameters": {
"content": "## Data validation and webhook response\n\nDetermines product data changes and sends alert or status back through webhook response.",
"width": 688,
"height": 512,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1056,
256
],
"id": "06dfec0b-2773-42a6-98fa-5cd02b4da831",
"name": "Sticky Note6"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
0
],
"id": "v4s-901",
"name": "Every 6 Hours"
},
{
"parameters": {
"url": "https://YOUR-TARGET-SITE.com/api/captcha/config",
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-400,
0
],
"id": "v4s-900",
"name": "Fetch Captcha Details"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
"captchaId": "={{ $json.captcha_id || $json.captchaId || $json.gt4 }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "v4s-902",
"name": "Solve GeeTest V4",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://YOUR-TARGET-SITE.com/product-page",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "user-agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "v4s-903",
"name": "Fetch Product Page"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "productName",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
0
],
"id": "v4s-904",
"name": "Extract Data"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
0
],
"id": "v4s-905",
"name": "Compare Data"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-1",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
0
],
"id": "v4s-906",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a2",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "a3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1392,
-128
],
"id": "v4s-907",
"name": "Build Alert"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n1",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "n2",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n3",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1376,
48
],
"id": "v4s-908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-704,
432
],
"id": "v4s-909",
"name": "Webhook Trigger",
"webhookId": "v4s-909-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $json.body.websiteURL }}",
"captchaId": "={{ $json.body.captchaId }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
432
],
"id": "v4s-910",
"name": "Solve GeeTest V4 [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Webhook Trigger').item.json.body.websiteURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "user-agent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
432
],
"id": "v4s-911",
"name": "Fetch Product Page [Webhook]"
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "price",
"cssSelector": ".product-price, [data-price], .price"
},
{
"key": "productName",
"cssSelector": "h1, .product-title"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.html",
"typeVersion": 1.2,
"position": [
512,
432
],
"id": "v4s-912",
"name": "Extract Data [Webhook]"
},
{
"parameters": {
"jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'dropped' : 'increased') : 'unchanged';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'first check', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
800,
432
],
"id": "v4s-913",
"name": "Compare Data [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-2",
"leftValue": "={{ $json.changed }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
1104,
464
],
"id": "v4s-914",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "alert",
"value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} \u2192 {{ $json.currentPrice }}",
"type": "string"
},
{
"id": "a5",
"name": "severity",
"value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
"type": "string"
},
{
"id": "a6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
384
],
"id": "v4s-915",
"name": "Build Alert [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "n4",
"name": "status",
"value": "no_change",
"type": "string"
},
{
"id": "n5",
"name": "currentPrice",
"value": "={{ $json.currentPrice }}",
"type": "string"
},
{
"id": "n6",
"name": "checkedAt",
"value": "={{ $json.checkedAt }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1408,
592
],
"id": "v4s-916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1600,
448
],
"id": "v4s-917",
"name": "Respond to Webhook"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Fetch Captcha Details",
"type": "main",
"index": 0
}
]
]
},
"Fetch Captcha Details": {
"main": [
[
{
"node": "Solve GeeTest V4",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4": {
"main": [
[
{
"node": "Fetch Product Page",
"type": "main",
"index": 0
}
]
]
},
"Fetch Product Page": {
"main": [
[
{
"node": "Extract Data",
"type": "main",
"index": 0
}
]
]
},
"Extract Data": {
"main": [
[
{
"node": "Compare Data",
"type": "main",
"index": 0
}
]
]
},
"Compare Data": {
"main": [
[
{
"node": "Data Changed?",
"type": "main",
"index": 0
}
]
]
},
"Data Changed?": {
"main": [
[
{
"node": "Build Alert",
"type": "main",
"index": 0
}
],
[
{
"node": "No Change",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve GeeTest V4 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4 [Webhook]": {
"main": [
[
{
"node": "Fetch Product Page [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Fetch Product Page [Webhook]": {
"main": [
[
{
"node": "Extract Data [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Extract Data [Webhook]": {
"main": [
[
{
"node": "Compare Data [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Compare Data [Webhook]": {
"main": [
[
{
"node": "Data Changed? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Data Changed? [Webhook]": {
"main": [
[
{
"node": "Build Alert [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "No Change [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Build Alert [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"No Change [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
This workflow automates login to a captcha-protected site. A Set Login Config node centralizes all parameters — [Schedule] for the schedule path and [Webhook] for the on-demand webhook path. Edit the appropriate config node to configure each path.
Schedule path:
Every 24 Hours > Set Login Config > Fetch Captcha Details > Solve GeeTest V4 > Submit Login
> Login Successful? > Mark Login Success / Mark Login Failed
Key behaviors:
GeeTest V4captcha_id, lot_number, pass_token, gen_time, captcha_output)statusCode < 400 and the presence of a configurable successMarker in the response body{
"nodes": [
{
"parameters": {
"content": "## GeeTest V4 Account Login\n\n### How it works\n\n1. The workflow triggers either on a schedule or via a webhook.\n2. It prepares the login configuration with URLs and user fields.\n3. The workflow fetches captcha details from the specified API.\n4. It solves the GeeTest V4 captcha using a solving service.\n5. The login attempt is submitted and the success or failure is recorded.\n\n### Setup steps\n\n- [ ] Configure the schedule trigger for the regular login attempts.\n- [ ] Set up webhook URLs for manual login attempts.\n- [ ] Ensure GeeTest V4 capSolver service is properly configured with API keys.\n- [ ] Define correct login endpoints and field mappings.\n\n### Customization\n\nYou can alter the schedule interval or update the webhook URL to match your specific needs.",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1552,
-320
],
"id": "73972bce-83df-4c59-9b19-511f769b5fe9",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled login preparation\n\nInitializes login settings and schedules the process.",
"width": 496,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-992,
-112
],
"id": "74d19371-a64a-4362-a304-11d73336dbab",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled captcha handling\n\nFetches and solves captchas for scheduled logins.",
"width": 496,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-384,
-112
],
"id": "6e51b545-0fa0-4929-85af-c848d75f9640",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Scheduled login submission\n\nSubmits scheduled login and records outcome.",
"width": 800,
"height": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
224,
-320
],
"id": "0db63f1f-5767-40a5-a9bd-56fcfd2a314b",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Webhook login processing\n\nHandles webhook-triggered login including captcha solving.",
"width": 1104,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-688,
320
],
"id": "f71814c4-ec66-4359-8984-4736eae8bfb4",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "## Webhook login outcome\n\nDetermines and responds to the result of the webhook login process.",
"width": 800,
"height": 464,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
528,
240
],
"id": "241c39e7-dc38-4372-9951-e5aa83667893",
"name": "Sticky Note5"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-944,
0
],
"id": "v4l-921",
"name": "Every 24 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "l1",
"name": "websiteURL",
"value": "https://YOUR-LOGIN-PAGE.com",
"type": "string"
},
{
"id": "l2",
"name": "captchaApiURL",
"value": "https://YOUR-LOGIN-PAGE.com/api/captcha/config",
"type": "string"
},
{
"id": "l3",
"name": "usernameField",
"value": "email",
"type": "string"
},
{
"id": "l4",
"name": "passwordField",
"value": "password",
"type": "string"
},
{
"id": "l5",
"name": "usernameValue",
"value": "your-email@example.com",
"type": "string"
},
{
"id": "l6",
"name": "passwordValue",
"value": "YOUR_ACCOUNT_PASSWORD",
"type": "string"
},
{
"id": "l7",
"name": "successMarker",
"value": "account-dashboard",
"type": "string"
},
{
"id": "l8",
"name": "userAgent",
"value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-640,
0
],
"id": "v4l-922",
"name": "Set Login Config [Schedule]"
},
{
"parameters": {
"url": "={{ $json.captchaApiURL }}",
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-336,
0
],
"id": "v4l-922b",
"name": "Fetch Captcha Details [Schedule]"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $('Set Login Config [Schedule]').item.json.websiteURL }}",
"captchaId": "={{ $json.captcha_id || $json.captchaId || $json.gt4 }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
0
],
"id": "v4l-923",
"name": "Solve GeeTest V4 [Schedule]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Login Config [Schedule]').item.json.websiteURL }}/login",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $('Set Login Config [Schedule]').item.json.userAgent }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "={{ $('Set Login Config [Schedule]').item.json.usernameField }}",
"value": "={{ $('Set Login Config [Schedule]').item.json.usernameValue }}"
},
{
"name": "={{ $('Set Login Config [Schedule]').item.json.passwordField }}",
"value": "={{ $('Set Login Config [Schedule]').item.json.passwordValue }}"
},
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
272,
0
],
"id": "v4l-924",
"name": "Submit Login [Schedule]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "lif1",
"leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || '').includes($('Set Login Config [Schedule]').item.json.successMarker) }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
576,
0
],
"id": "v4l-925",
"name": "Login Successful? [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "s1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "s2",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "s3",
"name": "message",
"value": "Configured account login flow succeeded",
"type": "string"
},
{
"id": "s4",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
-208
],
"id": "v4l-926",
"name": "Mark Login Success [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "f2",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "f3",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "f4",
"name": "message",
"value": "Login response did not match the configured success marker",
"type": "string"
},
{
"id": "f5",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
16
],
"id": "v4l-927",
"name": "Mark Login Failed [Schedule]"
},
{
"parameters": {
"httpMethod": "POST",
"path": "account-login-geetest-v4",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-640,
432
],
"id": "v4l-928",
"name": "Webhook Trigger",
"webhookId": "v4l-928-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"operation": "GeeTest V4",
"websiteURL": "={{ $json.body.websiteURL }}",
"captchaId": "={{ $json.body.captchaId }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
432
],
"id": "v4l-929",
"name": "Solve GeeTest V4 [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Webhook Trigger').item.json.body.loginActionURL }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"name": "user-agent",
"value": "={{ $('Webhook Trigger').item.json.body.userAgent || 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' }}"
}
]
},
"sendBody": true,
"contentType": "form-urlencoded",
"bodyParameters": {
"parameters": [
{
"name": "={{ $('Webhook Trigger').item.json.body.usernameField || 'email' }}",
"value": "={{ $('Webhook Trigger').item.json.body.usernameValue }}"
},
{
"name": "={{ $('Webhook Trigger').item.json.body.passwordField || 'password' }}",
"value": "={{ $('Webhook Trigger').item.json.body.passwordValue }}"
},
{
"name": "captcha_id",
"value": "={{ $json.data.solution.captcha_id }}"
},
{
"name": "lot_number",
"value": "={{ $json.data.solution.lot_number }}"
},
{
"name": "pass_token",
"value": "={{ $json.data.solution.pass_token }}"
},
{
"name": "gen_time",
"value": "={{ $json.data.solution.gen_time }}"
},
{
"name": "captcha_output",
"value": "={{ $json.data.solution.captcha_output }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
272,
432
],
"id": "v4l-930",
"name": "Submit Login [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": false,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "lif2",
"leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || '').includes($('Webhook Trigger').item.json.body.successMarker) }}",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
576,
432
],
"id": "v4l-931",
"name": "Login Successful? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "ws1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "ws2",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "ws3",
"name": "message",
"value": "Configured account login flow succeeded",
"type": "string"
},
{
"id": "ws4",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
352
],
"id": "v4l-932",
"name": "Mark Login Success [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "wf1",
"name": "action",
"value": "account_login",
"type": "string"
},
{
"id": "wf2",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "wf3",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "wf4",
"name": "message",
"value": "Login response did not match the configured success marker",
"type": "string"
},
{
"id": "wf5",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
544
],
"id": "v4l-933",
"name": "Mark Login Failed [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1184,
432
],
"id": "v4l-934",
"name": "Respond to Webhook"
}
],
"connections": {
"Every 24 Hours": {
"main": [
[
{
"node": "Set Login Config [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Set Login Config [Schedule]": {
"main": [
[
{
"node": "Fetch Captcha Details [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Fetch Captcha Details [Schedule]": {
"main": [
[
{
"node": "Solve GeeTest V4 [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4 [Schedule]": {
"main": [
[
{
"node": "Submit Login [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Schedule]": {
"main": [
[
{
"node": "Login Successful? [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Login Successful? [Schedule]": {
"main": [
[
{
"node": "Mark Login Success [Schedule]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Login Failed [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve GeeTest V4 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve GeeTest V4 [Webhook]": {
"main": [
[
{
"node": "Submit Login [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Webhook]": {
"main": [
[
{
"node": "Login Successful? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Login Successful? [Webhook]": {
"main": [
[
{
"node": "Mark Login Success [Webhook]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Login Failed [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Mark Login Success [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Mark Login Failed [Webhook]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
You've learned how to build a GeeTest V4-solving API and production-ready scraping workflows using n8n and CapSolver — no traditional coding required.
In this guide, we covered:
captchaId found in page sourceThe key takeaway: solving the GeeTest V4 challenge is only half the job — you also need to submit all 5 solution fields (captcha_id, lot_number, pass_token, gen_time, captcha_output) to the target website to unlock the protected data.
Tip: These workflows use Schedule + Webhook triggers, but you can swap the trigger node to any n8n trigger — manual, app event, form submission, etc. After fetching data, use n8n's built-in nodes to save results to Google Sheets, databases, cloud storage, or send alerts via Telegram/Slack/Email.
Ready to get started? Sign up for CapSolver and use bonus code n8n for an extra 8% bonus on your first recharge!

GeeTest V4 is the latest generation of GeeTest's behavioral CAPTCHA system. It verifies visitors using adaptive challenges and behavioral analysis, replacing the older V3 system with a simplified integration model. From a solving perspective, V4 requires only a static captchaId parameter — no dynamic challenge fetching needed.
Pricing varies based on usage. Check the CapSolver pricing page for current GeeTest V4 rates.
GeeTest V4 challenges are typically solved in a few seconds. The exact time depends on server load and challenge complexity.
Yes! This workflow works with both self-hosted n8n and n8n Cloud. The CapSolver node is already available as an official integration — just add your API credentials.
Search the page source for captcha_id or captchaId, or look for references to gcaptcha4.js (the GeeTest V4 widget script). The captchaId is static — find it once, use it forever.
GeeTest V3 requires fetching a dynamic challenge parameter before each solve (via the gt and challenge fields), and returns 3 solution fields. GeeTest V4 uses a static captchaId that never changes, requires no dynamic challenge fetch, and returns 5 solution fields (captcha_id, lot_number, pass_token, gen_time, captcha_output). V4 is structurally simpler to automate.
Several things can cause this. First, solutions expire quickly — make sure you're submitting the 5 fields immediately after solving. Second, verify you're sending all 5 fields: captcha_id, lot_number, pass_token, gen_time, and captcha_output — missing any one of them will cause rejection. Third, check the field names and submission format: inspect the actual network request the browser makes (DevTools > Network tab) to confirm the exact field names, request method, and endpoint. Some sites expect the fields in a JSON body rather than form-urlencoded. If the solution is still rejected, contact CapSolver support for site-specific help.
Learn how to build web scrapers in n8n for captcha-protected sites using CapSolver. This step-by-step guide covers solving reCAPTCHA, submitting tokens correctly, extracting product data, and automating workflows with schedule and webhook triggers.

Learn how to integrate CapSolver with n8n to solve CAPTCHAs and build reliable automation workflows with ease.
