CAPSOLVER
Blog
How to Solve reCAPTCHA v2/v3 Using CapSolver and n8n: Build Your Own Captcha-Solving API & Scrape Websites

How to Solve reCAPTCHA v2/v3 Using CapSolver and n8n

Logo of CapSolver

Lucas Mitchell

Automation Engineer

18-Mar-2026

If you've ever tried to automate web interactions, you've almost certainly run into reCAPTCHA โ€” Google's challenge system that blocks bots from accessing websites. Whether you're building scrapers, testing web applications, or automating repetitive tasks, reCAPTCHA can bring your entire workflow to a halt.

What if you could solve reCAPTCHA 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 reCAPTCHA v2, v2 Invisible, and v3 challenges on demand โ€” either as a standalone API endpoint or as a step inside any automation workflow.

What you'll build:

Solver API โ€” a reusable endpoint your other tools can call:

  • A reCAPTCHA solver API (works for v2, v2 Invisible, and v3 โ€” just change the Operation in the CapSolver node)

Direct-use workflows โ€” CapSolver embedded as a step inside larger automations:

  • A price & product scraper that solves reCAPTCHA, fetches protected pages, and alerts on price changes
  • An account login automation that solves reCAPTCHA before submitting credentials

What is reCAPTCHA?

reCAPTCHA is Google's bot detection system used by millions of websites. There are three main versions you'll encounter:

reCAPTCHA v2 โ€” Checkbox ("I'm not a robot") + image challenges
reCAPTCHA v2 Invisible โ€” No visible checkbox, triggers automatically in the background
reCAPTCHA v3 โ€” Completely invisible, assigns a score (0.0โ€“1.0) based on behavior

Understanding which version a website uses is critical โ€” each one requires slightly different parameters when solving.


Prerequisites

Before getting started, make sure you have the following:

  1. An n8n instance โ€” Either self-hosted or n8n Cloud
  2. A CapSolver account โ€” Sign up here and get your API key
  3. The CapSolver n8n node โ€” Already available as an official node in n8n (no installation needed)
  4. CapSolver browser extension (optional but recommended) โ€” For identifying captcha parameters on target websites

Important: Make sure you have sufficient balance in your CapSolver account. reCAPTCHA solving tasks consume credits based on the captcha type.


Setting Up CapSolver in n8n

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.

Step 1: Open the Credentials Page

Go to your n8n instance and navigate to Settings โ†’ Credentials. You'll see all your configured credentials here.

n8n credentials page showing CapSolver account

Step 2: Create the CapSolver Credential

  1. Click Create credential (top right)
  2. Search for "CapSolver" and select CapSolver API
  3. Enter your API Key โ€” copy it directly from the CapSolver Dashboard
  4. Leave Allowed HTTP Request Domains set to All (default)
  5. Click Save

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

CapSolver credential configuration with successful connection test

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 reCAPTCHA solver workflow!


How to Identify reCAPTCHA Parameters

Before you can solve a reCAPTCHA, you need to know its parameters โ€” specifically the websiteURL and websiteKey (also called the site key). The easiest way to find these is using the CapSolver Browser Extension.

Step 1: Install the CapSolver Extension

Download and install the CapSolver extension from the Chrome Web Store or Firefox Add-ons.

Step 2: Open the CAPTCHA Detector

  1. Navigate to the target website
  2. Press F12 to open Developer Tools
  3. Find the "CapSolver Captcha Detector" tab in DevTools
CapSolver Captcha Detector tab in DevTools

Step 3: Trigger the CAPTCHA

With the detector panel open, interact with the page to trigger the reCAPTCHA. The extension will automatically detect and display all relevant parameters:

  • Website URL โ€” The page URL hosting the CAPTCHA
  • Website Key (Site Key) โ€” The public key identifier for the captcha
  • pageAction โ€” The specific action being verified (v3)
  • isInvisible โ€” Whether it's an invisible reCAPTCHA
  • isEnterprise โ€” Whether it uses reCAPTCHA Enterprise
  • apiDomain โ€” The API endpoint being used (e.g., recaptcha.net)
Detected reCAPTCHA parameters in CapSolver extension

Tip: The extension generates a JSON output showing exactly how to format these parameters for your solving request. This saves you from having to manually inspect the page source.

For a detailed guide on identifying captcha parameters, check out the official CapSolver documentation.


Workflow: reCAPTCHA Solver API

This workflow creates a POST endpoint that accepts reCAPTCHA parameters and returns a solved token. The same 4-node structure works for all reCAPTCHA types โ€” just change the Operation in the CapSolver node.

reCAPTCHA v2 solver workflow in n8n

How It Works

  1. Webhook โ€” Receives POST requests with captcha parameters
  2. CapSolver โ€” Solves the challenge using the configured Operation
  3. CapSolver Error? โ€” IF node that branches on whether solving failed ($json.error is not empty)
  4. Respond to Webhook โ€” Returns the solution on success, or {"error": "..."} on failure

Choosing Your reCAPTCHA Type

Type Operation to select Extra parameter
v2 Standard reCAPTCHA v2 โ€”
v2 Invisible reCAPTCHA v2 Set Is Invisible to true in the node
v3 reCAPTCHA v3 Add pageAction โ€” must match the target site's configured action (e.g., login, submit)

The workflow below uses reCAPTCHA v2 as the default. Open the CapSolver node and change the Operation dropdown to switch types. No other structural changes are needed.

Node Configuration

1. Webhook Node

Setting Value
HTTP Method POST
Path solver-recaptcha
Respond Response Node

This creates an endpoint at: https://your-n8n-instance.com/webhook/solver-recaptcha

2. CapSolver Node

Parameter Value Description
Operation reCAPTCHA v2 Change this to reCAPTCHA v3 for v3; for v2 Invisible, keep reCAPTCHA v2 and set Is Invisible to true
Website URL ={{ $json.body.websiteURL }} The URL of the page with the captcha
Website Key ={{ $json.body.websiteKey }} The reCAPTCHA site key
Page Action ={{ $json.body.pageAction || '' }} Required for v3 โ€” must match the site's configured action
Is Invisible ={{ $json.body.isInvisible || false }} Set to true for v2 Invisible
API Domain ={{ $json.body.apiDomain || '' }} Optional โ€” custom API domain (e.g., recaptcha.net)
Enterprise Payload ={{ $json.body.enterprisePayload || '' }} Optional โ€” additional payload for reCAPTCHA Enterprise
Is Session ={{ $json.body.isSession || false }} Optional โ€” enable session-based solving
Task Type ={{ $json.body.taskType || 'ReCaptchaV2TaskProxyLess' }} CapSolver task type โ€” see reference below. Defaults to ReCaptchaV2TaskProxyLess
Proxy ={{ $json.body.proxy || '' }} Only used when the selected Task Type requires a proxy (non-ProxyLess types). Leave empty or omit for ProxyLess task types. Format: ip:port:user:pass

Also select your CapSolver credentials in the node.

reCAPTCHA Task Type Reference:

Task Type Proxy Required Notes
ReCaptchaV2TaskProxyLess No v2 default
ReCaptchaV2Task Yes v2 with proxy
ReCaptchaV2EnterpriseTaskProxyLess No Enterprise v2, no proxy
ReCaptchaV2EnterpriseTask Yes Enterprise v2, requires proxy
ReCaptchaV3TaskProxyLess No v3 default
ReCaptchaV3Task Yes v3 with proxy
ReCaptchaV3EnterpriseTaskProxyLess No Enterprise v3, no proxy
ReCaptchaV3EnterpriseTask Yes Enterprise v3, requires proxy

Proxy: Only applicable for non-ProxyLess task types (e.g., ReCaptchaV2Task, ReCaptchaV3EnterpriseTask). When using a ProxyLess task type, the proxy field is ignored โ€” CapSolver uses its own infrastructure. When using a non-ProxyLess type, you must supply a proxy.

3. CapSolver Error? Node (IF)

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

This makes the error path explicit on the canvas. The CapSolver node continues on error (onError: continueRegularOutput), so failures arrive here as { "error": "..." } rather than crashing the workflow. You can attach additional nodes to the true branch (logging, alerts, retries) without touching the success path.

4. Respond to Webhook Nodes

Success branch (false output of CapSolver Error?):

Setting Value
Respond With JSON
Response Body ={{ JSON.stringify($json.data) }}

Test It

Send a POST request to your webhook endpoint:

bash Copy
curl -X POST https://your-n8n-instance.com/webhook/solver-recaptcha \
  -H "Content-Type: application/json" \
  -d '{
    "websiteURL": "https://example.com/login",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "taskType": "ReCaptchaV2TaskProxyLess"
  }'

Task type must match the node's Operation. Each deployed workflow is configured for a specific reCAPTCHA version via the Operation field in the CapSolver node (reCAPTCHA v2 or reCAPTCHA v3). Only task types for that version are valid โ€” sending a v3 task type to a v2 workflow (or vice versa) will not work. Note: v2 Invisible uses the same reCAPTCHA v2 operation as standard v2 โ€” the difference is the isInvisible parameter, not the operation.

For reCAPTCHA v3, also add "pageAction": "login" (or whatever action the site uses) to the request body, and use a v3 task type (e.g., "taskType": "ReCaptchaV3TaskProxyLess").

Expected Response:

json Copy
{
  "taskId": "abc123...",
  "solution": {
    "gRecaptchaResponse": "03AGdBq24PBCb..."
  },
  "status": "ready"
}

Import This Workflow

Copy the JSON below and import it into n8n via Menu โ†’ Import from JSON. Then change the Operation in the CapSolver node to your target reCAPTCHA type.

Click to expand workflow JSON (reCAPTCHA v2 โ€” change Operation for other types)
json Copy
{
  "name": "reCAPTCHA โ€” Solver API",
  "nodes": [
    {
      "parameters": {
        "content": "## reCAPTCHA โ€” Solver API\n\n**Who it's for:** Developers who need to solve reCAPTCHA (v2, v2 Invisible, or v3) via a simple POST endpoint.\n\n**What it does:** Exposes a webhook that accepts captcha parameters, solves the challenge with CapSolver, and returns the token or error as JSON.\n\n**How it works:**\n1. Webhook receives POST with `websiteURL`, `websiteKey`, and optional params\n2. CapSolver node solves the reCAPTCHA challenge\n3. IF node checks for errors โ†’ returns success token or error JSON\n\n**Setup:**\n1. Add your CapSolver API key under **Settings โ†’ Credentials โ†’ CapSolver API**\n2. Change the **Operation** in the Solve Captcha node to match your reCAPTCHA type (v2, v3)\n3. Activate the workflow\n4. POST to `/webhook/solver-recaptcha`",
        "height": 494,
        "width": 440,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-680, -260],
      "id": "a0a0a0a0-0001-4000-8000-000000000001",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "solver-recaptcha",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [-192, 0],
      "id": "24f7cce0-bcbd-4134-958b-aa0c4528415c",
      "name": "Receive Solver Request",
      "webhookId": "784376f0-b5c9-492f-8ed2-07b63cd6e3fe"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v2",
        "type": "={{ $json.body.taskType || 'ReCaptchaV2TaskProxyLess' }}",
        "proxy": "={{ $json.body.proxy || '' }}",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "websiteKey": "={{ $json.body.websiteKey }}",
        "optional": {
          "pageAction": "={{ $json.body.pageAction || \'\' }}",
          "isInvisible": "={{ $json.body.isInvisible || false }}",
          "apiDomain": "={{ $json.body.apiDomain || \'\' }}",
          "enterprisePayload": "={{ $json.body.enterprisePayload || \'\' }}",
          "isSession": "={{ $json.body.isSession || false }}"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [112, 0],
      "id": "c10b2f8f-e03a-4f50-b359-34b7b49f8aae",
      "name": "Solve Captcha",
      "onError": "continueRegularOutput",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "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-e5f6-7890-abcd-ef1234567890",
      "name": "CapSolver Error?"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [700, -100],
      "id": "e1f2a3b4-c5d6-7890-abcd-123456789012",
      "name": "Respond to Webhook (Error)"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json.data) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [700, 100],
      "id": "34762c43-31a7-4a7a-ba29-29d1dad15ed0",
      "name": "Respond to Webhook"
    }
  ],
  "connections": {
    "Receive Solver Request": {
      "main": [
        [
          {
            "node": "Solve Captcha",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Captcha": {
      "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
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}
---

Workflow: Submitting Tokens to Websites

So far, the API workflows above show how to get a solved captcha token. But what do you actually do with it?

In real-world automation, solving the captcha is only half the job. You need to submit the token to the target website โ€” exactly as a browser would โ€” to unlock the data or action behind the captcha.

Here's the general pattern:

  1. Solve the captcha โ†’ Get the gRecaptchaResponse token from CapSolver
  2. Submit the token โ†’ Send it to the target website via an HTTP Request (usually as a g-recaptcha-response form field or URL parameter)
  3. Verify the response โ†’ Check if the website accepted the token and returned the expected data
  4. Process the result โ†’ Extract the data you need

Example: Solving & Submitting reCAPTCHA v2

Example: example.com

reCAPTCHA v2 scraping workflow in n8n

Workflow Flow

Copy
Manual Trigger โ†’ CapSolver reCAPTCHA v2 โ†’ HTTP POST Request โ†’ IF (check success) โ†’ Valid / Invalid

How It Works

  1. Manual Trigger โ€” Starts the workflow manually (click "Execute workflow"). You can replace this with any trigger โ€” Webhook, Schedule, App Event, etc.
  2. CapSolver reCAPTCHA v2 โ€” Solves the captcha for the demo page:
    • Website URL: https://example.com
    • Website Key: YOUR_SITE_KEY
  3. HTTP POST Request โ€” Submits the solved token to the same URL as a form POST:
    • The token is sent in the g-recaptcha-response form field
    • This is exactly what a browser does when you click "Submit" after solving the captcha
  4. IF Node โ€” Checks if the response HTML contains "recaptcha-success", meaning the captcha was accepted
  5. Valid / Invalid โ€” The IF node routes to the Valid branch on success (where you extract the data you need, e.g., with the HTML node for product listings, form results, etc.) or the Invalid branch on failure (where you handle the error)

Key concept: Every website handles token submission differently. In this demo, the token goes in a g-recaptcha-response form field via POST โ€” but other sites may expect it as a URL parameter, in a JSON body, or through a completely different endpoint. Always inspect the site's actual form submission (using DevTools Network tab) to see exactly how the token needs to be sent.

Click to expand workflow JSON
json Copy
{
  "name": "ReCaptcha V2 Solver",
  "nodes": [
    {
      "parameters": {
        "content": "## reCAPTCHA v2 โ€” Solve & Submit Token\n\n**Who it's for:** Anyone automating form submissions on reCAPTCHA-protected pages.\n\n**What it does:** Solves a reCAPTCHA v2 challenge, submits the token to the target site as a form POST, and checks whether the token was accepted.\n\n**How it works:**\n1. Solve reCAPTCHA v2 via CapSolver\n2. POST the `g-recaptcha-response` token to the target site\n3. Check response for success marker โ†’ route to Valid or Invalid\n\n**Setup:**\n1. Add your CapSolver API key under **Settings โ†’ Credentials**\n2. Replace `websiteURL`, `websiteKey`, and the HTTP Request URL with your target site values\n3. Inspect your target site's form (DevTools โ†’ Network) to see how the token is submitted",
        "height": 480,
        "width": 440,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-700, -260],
      "id": "b0b0b0b0-0001-4000-8000-000000000001",
      "name": "Sticky Note"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [-208, 0],
      "id": "4955f040-9cec-4696-8f59-88590e617b43",
      "name": "When clicking 'Execute workflow'"
    },
    {
      "parameters": {
        "websiteURL": "https://example.com",
        "websiteKey": "YOUR_SITE_KEY",
        "optional": {}
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [208, 0],
      "id": "c6f9940e-dc06-42d3-bbff-0c6bc1a7b057",
      "name": "reCAPTCHA v2",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://example.com",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "accept",
              "value": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"
            },
            {
              "name": "accept-language",
              "value": "es-ES,es;q=0.7"
            },
            {
              "name": "cache-control",
              "value": "no-cache"
            },
            {
              "name": "content-type",
              "value": "application/x-www-form-urlencoded"
            },
            {
              "name": "origin",
              "value": "https://example.com"
            },
            {
              "name": "pragma",
              "value": "no-cache"
            },
            {
              "name": "priority",
              "value": "u=0, i"
            },
            {
              "name": "referer",
              "value": "https://example.com"
            },
            {
              "name": "sec-ch-ua",
              "value": "\"Not:A-Brand\";v=\"99\", \"Brave\";v=\"145\", \"Chromium\";v=\"145\""
            },
            {
              "name": "sec-ch-ua-mobile",
              "value": "?0"
            },
            {
              "name": "sec-ch-ua-platform",
              "value": "\"Windows\""
            },
            {
              "name": "sec-fetch-dest",
              "value": "document"
            },
            {
              "name": "sec-fetch-mode",
              "value": "navigate"
            },
            {
              "name": "sec-fetch-site",
              "value": "same-origin"
            },
            {
              "name": "sec-fetch-user",
              "value": "?1"
            },
            {
              "name": "sec-gpc",
              "value": "1"
            },
            {
              "name": "upgrade-insecure-requests",
              "value": "1"
            },
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "g-recaptcha-response",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [416, 0],
      "id": "cb54fdc1-19b8-48b4-bdee-a978e02d33fc",
      "name": "Submit Token to Target Site"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "26963d7d-fbe0-473b-af6d-febafebd3019",
              "leftValue": "={{ $json.data }}",
              "rightValue": "recaptcha-success",
              "operator": {
                "type": "string",
                "operation": "contains"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [624, 0],
      "id": "72eeeaae-7472-4a61-8730-aa1c6fa0edaf",
      "name": "Token Accepted?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a2397a11-4145-4111-b5be-b01bf8e9ffae",
              "name": "status",
              "value": "valid",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [800, -16],
      "id": "4b7fea40-bbe2-4e61-92f7-d00e77d3f85b",
      "name": "Valid"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "7ba46f6f-2925-4baf-a68e-5fc1f143c10e",
              "name": "status",
              "value": "invalid",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [800, 192],
      "id": "7afcadb6-bac4-4008-9fc9-17e23b125c76",
      "name": "Invalid"
    }
  ],
  "connections": {
    "reCAPTCHA v2": {
      "main": [
        [
          {
            "node": "Submit Token to Target Site",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Submit Token to Target Site": {
      "main": [
        [
          {
            "node": "Token Accepted?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Token Accepted?": {
      "main": [
        [
          {
            "node": "Valid",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Invalid",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking 'Execute workflow'": {
      "main": [
        [
          {
            "node": "reCAPTCHA v2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

Adapting for other reCAPTCHA types: This same pattern works for v2 Invisible and v3. For v2 Invisible, set isInvisible: true in the CapSolver node. For v3, change the Operation to reCAPTCHA v3 and add the pageAction parameter. The HTTP Request submission step will differ per site โ€” always inspect the actual form submission in DevTools.


Workflow: Use-Case Examples

The solver API and scraping examples above show the core pattern: solve the captcha, submit the token, 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
reCAPTCHA 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
reCAPTCHA Account Login โ€” CapSolver + Schedule + Webhook Logs into your own account on a captcha-protected site by solving first, then POSTing credentials with the token

Example 1: Scraping โ€” Price & Product Details

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:

Copy
Every 6 Hours โ†’ Solve reCAPTCHA v3 โ†’ Fetch Product Page โ†’ Extract Data
  โ†’ Compare Data โ†’ Data Changed? โ†’ Build Alert / No Change

Error handling: If CapSolver fails, the execution stops and is marked as failed in n8n. Check Executions to see the error, or configure n8n's Error Workflow to get notified automatically.

Key behaviors:

  • Uses reCAPTCHA v3 with a pageAction parameter (configurable)
  • The token is sent as an x-recaptcha-token header (adapt to your site's expected format)
  • The HTML node extracts price and product name via CSS selectors (.product-price, h1)
  • $workflow.staticData.lastPrice persists the previous price across executions
  • Price comparison detects both drops (severity: deal) and increases (severity: info)
  • Task type is ReCaptchaV3TaskProxyLess (hardcoded) โ€” edit the Solve reCAPTCHA v3 node directly to change the task type or proxy
Click to expand full workflow JSON (17 nodes)
json Copy
{
  "name": "reCAPTCHA Scraping โ€” Price & Product Details โ€” CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## reCAPTCHA Scraping โ€” Price & Product Monitor\n\n**Who it's for:** Teams monitoring prices or product data on reCAPTCHA-protected sites.\n\n**What it does:** Solves reCAPTCHA v3, fetches a product page, extracts price & name via CSS selectors, compares against the last stored value, and alerts on changes.\n\n**How it works:**\n1. Schedule (every 6h) or Webhook triggers the flow\n2. CapSolver solves reCAPTCHA v3\n3. HTTP Request fetches the product page with the token\n4. HTML node extracts price and product name\n5. Code node compares current vs. stored price โ†’ alerts on change\n\n**Setup:**\n1. Add your CapSolver API key under **Settings โ†’ Credentials**\n2. Replace `YOUR-TARGET-SITE.com` and `YOUR_SITE_KEY_HERE` in the Solve and Fetch nodes\n3. Update CSS selectors in Extract Data to match your target page\n4. Connect the Build Alert output to your notification channel (Slack, Email, etc.)",
        "height": 560,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-900, -300],
      "id": "c0c0c0c0-0001-4000-8000-000000000001",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "### Schedule Path\nRuns automatically every 6 hours.\nResults stored in workflow static data for cross-execution comparison.",
        "height": 480,
        "width": 1900,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-440, -200],
      "id": "c0c0c0c0-0002-4000-8000-000000000001",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "### Webhook Path\nOn-demand trigger โ€” same logic, returns result as JSON response.",
        "height": 480,
        "width": 1900,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-440, 220],
      "id": "c0c0c0c0-0003-4000-8000-000000000001",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -400,
        0
      ],
      "id": "33333333-3333-3333-3333-333333333301",
      "name": "Every 6 Hours"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v3",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "websiteKey": "YOUR_SITE_KEY_HERE",
        "type": "ReCaptchaV3TaskProxyLess",
        "proxy": "",
        "optional": {
          "pageAction": "view_product"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "33333333-3333-3333-3333-333333333302",
      "name": "Solve reCAPTCHA v3",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "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"
            },
            {
              "name": "x-recaptcha-token",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "33333333-3333-3333-3333-333333333303",
      "name": "Fetch Product Page"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "sourceData": "json",
        "dataPropertyName": "data",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price",
              "returnValue": "text",
              "returnArray": false
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title",
              "returnValue": "text",
              "returnArray": false
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        0
      ],
      "id": "33333333-3333-3333-3333-333333333304",
      "name": "Extract Data"
    },
    {
      "parameters": {
        "jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d,]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\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';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        0
      ],
      "id": "33333333-3333-3333-3333-333333333305",
      "name": "Compare Data"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "price-if-001",
              "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": "33333333-3333-3333-3333-333333333306",
      "name": "Data Changed?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-001",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} โ†’ {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-002",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-003",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        -80
      ],
      "id": "33333333-3333-3333-3333-333333333307",
      "name": "Build Alert"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "nc-001",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "nc-002",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "nc-003",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        128
      ],
      "id": "33333333-3333-3333-3333-333333333308",
      "name": "No Change"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "price-monitor",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -400,
        420
      ],
      "id": "33333333-3333-3333-3333-333333333309",
      "name": "Webhook Trigger",
      "webhookId": "33333333-aaaa-bbbb-cccc-333333333309",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v3",
        "websiteURL": "https://YOUR-TARGET-SITE.com/product-page",
        "websiteKey": "YOUR_SITE_KEY_HERE",
        "type": "ReCaptchaV3TaskProxyLess",
        "proxy": "",
        "optional": {
          "pageAction": "view_product"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        420
      ],
      "id": "33333333-3333-3333-3333-333333333310",
      "name": "Solve reCAPTCHA v3 [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "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"
            },
            {
              "name": "x-recaptcha-token",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": false
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        420
      ],
      "id": "33333333-3333-3333-3333-333333333311",
      "name": "Fetch Product Page [Webhook]"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "sourceData": "json",
        "dataPropertyName": "data",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".product-price, [data-price], .price",
              "returnValue": "text",
              "returnArray": false
            },
            {
              "key": "productName",
              "cssSelector": "h1, .product-title",
              "returnValue": "text",
              "returnArray": false
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        420
      ],
      "id": "33333333-3333-3333-3333-333333333312",
      "name": "Extract Data [Webhook]"
    },
    {
      "parameters": {
        "jsCode": "// Get current and previous price from workflow static data\nconst staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Product';\n\n// Parse numeric values for comparison\nconst parsePrice = (str) => {\n  if (!str) return null;\n  const match = str.match(/[\\d,]+\\.?\\d*/);\n  return match ? parseFloat(match[0].replace(',', '')) : null;\n};\n\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\n\n// Update stored price\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\n\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';\n\nreturn [{\n  json: {\n    productName,\n    currentPrice,\n    previousPrice: previousPrice || 'first check',\n    changed,\n    direction,\n    diff: changed ? `$${diff}` : null,\n    checkedAt: new Date().toISOString()\n  }\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        420
      ],
      "id": "33333333-3333-3333-3333-333333333313",
      "name": "Compare Data [Webhook]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "price-if-002",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1104,
        420
      ],
      "id": "33333333-3333-3333-3333-333333333314",
      "name": "Data Changed? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "alert-004",
              "name": "alert",
              "value": "=Price {{ $json.direction }} for {{ $json.productName }}: {{ $json.previousPrice }} โ†’ {{ $json.currentPrice }} ({{ $json.direction === 'dropped' ? '-' : '+' }}{{ $json.diff }})",
              "type": "string"
            },
            {
              "id": "alert-005",
              "name": "severity",
              "value": "={{ $json.direction === 'dropped' ? 'deal' : 'info' }}",
              "type": "string"
            },
            {
              "id": "alert-006",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        340
      ],
      "id": "33333333-3333-3333-3333-333333333315",
      "name": "Build Alert [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "nc-004",
              "name": "status",
              "value": "no_change",
              "type": "string"
            },
            {
              "id": "nc-005",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "nc-006",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1408,
        548
      ],
      "id": "33333333-3333-3333-3333-333333333316",
      "name": "No Change [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1712,
        420
      ],
      "id": "33333333-3333-3333-3333-333333333317",
      "name": "Respond to Webhook"
    }
  ],
  "connections": {
    "Every 6 Hours": {
      "main": [
        [
          {
            "node": "Solve reCAPTCHA v3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve reCAPTCHA v3": {
      "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 reCAPTCHA v3 [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve reCAPTCHA v3 [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
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

Example 2: Account Login

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:

Copy
Every 24 Hours โ†’ Set Login Config โ†’ Solve Captcha โ†’ Submit Login
  โ†’ Login Successful? โ†’ Mark Login Success / Mark Login Failed

Error handling: If CapSolver fails, the execution stops and is marked as failed in n8n. Check Executions to see the error, or configure n8n's Error Workflow to get notified automatically.

Key behaviors:

  • Defaults to reCAPTCHA v2 (ReCaptchaV2TaskProxyLess) โ€” change taskType in Set Login Config [Schedule] or Set Login Config [Webhook] for the respective path; change the Operation in the Solve Captcha node if switching between v2 and v3
  • Form fields are hardcoded as email, password, and g-recaptcha-response โ€” edit the Submit Login node directly to match your target site's field names
  • The Login Successful? check evaluates both statusCode < 400 and the presence of a configurable successMarker in the response body
  • Webhook path uses Set Login Config [Webhook] with the same hardcoded placeholder values โ€” edit that node to configure the webhook on-demand path
  • Webhook path returns the result as JSON via Respond to Webhook
Click to expand full workflow JSON (15 nodes)
json Copy
{
  "name": "reCAPTCHA Account Login \u2014 CapSolver + Schedule + Webhook",
  "nodes": [
    {
      "parameters": {
        "content": "## reCAPTCHA Account Login\n\n**Who it's for:** Anyone automating login to a reCAPTCHA-protected website.\n\n**What it does:** Solves reCAPTCHA before submitting login credentials, then checks whether login succeeded.\n\n**How it works:**\n1. Schedule (every 24h) or Webhook triggers the flow\n2. Set Login Config centralizes all parameters (URL, keys, credentials, task type)\n3. CapSolver solves the reCAPTCHA challenge\n4. Submit Login POSTs email, password, and the solved token\n5. Login Successful? checks status code and response body for a success marker\n\n**Setup:**\n1. Add your CapSolver API key under **Settings โ†’ Credentials**\n2. Edit **Set Login Config [Schedule]** โ€” replace `websiteURL`, `websiteKey`, `email`, `password`, and `successMarker`\n3. Edit **Set Login Config [Webhook]** with the same values for the on-demand path\n4. Change `taskType` if needed (default: `ReCaptchaV2TaskProxyLess`)\n5. Edit **Submit Login** to match your target site's form field names",
        "height": 600,
        "width": 460,
        "color": 1
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-1140, -340],
      "id": "d0d0d0d0-0001-4000-8000-000000000001",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "### Schedule Path\nRuns every 24 hours to keep the session alive or verify access.",
        "height": 480,
        "width": 2200,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-680, -200],
      "id": "d0d0d0d0-0002-4000-8000-000000000001",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "content": "### Webhook Path\nOn-demand login trigger โ€” same logic, returns result as JSON response.",
        "height": 480,
        "width": 2200,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-680, 220],
      "id": "d0d0d0d0-0003-4000-8000-000000000001",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 24
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -640,
        0
      ],
      "id": "66666666-6666-6666-6666-666666666601",
      "name": "Every 24 Hours"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-001",
              "name": "websiteURL",
              "value": "https://YOUR-LOGIN-PAGE.com",
              "type": "string"
            },
            {
              "id": "login-004",
              "name": "websiteKey",
              "value": "YOUR_SITE_KEY_HERE",
              "type": "string"
            },
            {
              "id": "login-005",
              "name": "pageAction",
              "value": "",
              "type": "string"
            },
            {
              "id": "login-006",
              "name": "isInvisible",
              "value": false,
              "type": "boolean"
            },
            {
              "id": "login-007",
              "name": "apiDomain",
              "value": "",
              "type": "string"
            },
            {
              "id": "login-cfg-tasktype",
              "name": "taskType",
              "value": "ReCaptchaV2TaskProxyLess",
              "type": "string"
            },
            {
              "id": "login-cfg-proxy",
              "name": "proxy",
              "value": "",
              "type": "string"
            },
            {
              "id": "login-013",
              "name": "successMarker",
              "value": "account-dashboard",
              "type": "string"
            },
            {
              "id": "login-014",
              "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": [
        -336,
        0
      ],
      "id": "66666666-6666-6666-6666-666666666602",
      "name": "Set Login Config [Schedule]"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v2",
        "websiteURL": "={{ $json.websiteURL }}",
        "websiteKey": "={{ $json.websiteKey }}",
        "type": "={{ $json.taskType || 'ReCaptchaV2TaskProxyLess' }}",
        "proxy": "={{ $json.proxy || '' }}",
        "optional": {
          "pageAction": "={{ $json.pageAction || '' }}",
          "isInvisible": "={{ $json.isInvisible || false }}",
          "apiDomain": "={{ $json.apiDomain || '' }}"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -32,
        0
      ],
      "id": "66666666-6666-6666-6666-666666666603",
      "name": "Solve Captcha [Schedule]",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://YOUR-LOGIN-PAGE.com/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": "email",
              "value": "[email protected]"
            },
            {
              "name": "password",
              "value": "YOUR_ACCOUNT_PASSWORD"
            },
            {
              "name": "g-recaptcha-response",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "neverError": true
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        272,
        0
      ],
      "id": "66666666-6666-6666-6666-666666666604",
      "name": "Submit Login [Schedule]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "login-if-001",
              "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": "66666666-6666-6666-6666-666666666605",
      "name": "Login Successful? [Schedule]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-015",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-016",
              "name": "status",
              "value": "success",
              "type": "string"
            },
            {
              "id": "login-017",
              "name": "message",
              "value": "Configured account login flow succeeded",
              "type": "string"
            },
            {
              "id": "login-018",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        -80
      ],
      "id": "66666666-6666-6666-6666-666666666606",
      "name": "Mark Login Success [Schedule]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-019",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-020",
              "name": "status",
              "value": "failed",
              "type": "string"
            },
            {
              "id": "login-021",
              "name": "statusCode",
              "value": "={{ $json.statusCode }}",
              "type": "number"
            },
            {
              "id": "login-022",
              "name": "message",
              "value": "Login response did not match the configured success marker",
              "type": "string"
            },
            {
              "id": "login-023",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        120
      ],
      "id": "66666666-6666-6666-6666-666666666607",
      "name": "Mark Login Failed [Schedule]"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "account-login",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -640,
        420
      ],
      "id": "66666666-6666-6666-6666-666666666608",
      "name": "Webhook Trigger",
      "webhookId": "66666666-aaaa-bbbb-cccc-666666666608",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-001",
              "name": "websiteURL",
              "value": "https://YOUR-LOGIN-PAGE.com",
              "type": "string"
            },
            {
              "id": "login-004",
              "name": "websiteKey",
              "value": "YOUR_SITE_KEY_HERE",
              "type": "string"
            },
            {
              "id": "login-005",
              "name": "pageAction",
              "value": "",
              "type": "string"
            },
            {
              "id": "login-006",
              "name": "isInvisible",
              "value": false,
              "type": "boolean"
            },
            {
              "id": "login-007",
              "name": "apiDomain",
              "value": "",
              "type": "string"
            },
            {
              "id": "login-cfg-tasktype",
              "name": "taskType",
              "value": "ReCaptchaV2TaskProxyLess",
              "type": "string"
            },
            {
              "id": "login-cfg-proxy",
              "name": "proxy",
              "value": "",
              "type": "string"
            },
            {
              "id": "login-013",
              "name": "successMarker",
              "value": "account-dashboard",
              "type": "string"
            },
            {
              "id": "login-014",
              "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": [
        -336,
        420
      ],
      "id": "66666666-6666-6666-6666-666666666609",
      "name": "Set Login Config [Webhook]"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v2",
        "websiteURL": "={{ $json.websiteURL }}",
        "websiteKey": "={{ $json.websiteKey }}",
        "type": "={{ $json.taskType || 'ReCaptchaV2TaskProxyLess' }}",
        "proxy": "={{ $json.proxy || '' }}",
        "optional": {
          "pageAction": "={{ $json.pageAction || '' }}",
          "isInvisible": "={{ $json.isInvisible || false }}",
          "apiDomain": "={{ $json.apiDomain || '' }}"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -32,
        420
      ],
      "id": "66666666-6666-6666-6666-666666666610",
      "name": "Solve Captcha [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "YOUR_CREDENTIAL_ID",
          "name": "CapSolver account"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://YOUR-LOGIN-PAGE.com/login",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "content-type",
              "value": "application/x-www-form-urlencoded"
            },
            {
              "name": "user-agent",
              "value": "={{ $('Set Login Config [Webhook]').item.json.userAgent }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "email",
              "value": "[email protected]"
            },
            {
              "name": "password",
              "value": "YOUR_ACCOUNT_PASSWORD"
            },
            {
              "name": "g-recaptcha-response",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "neverError": true
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        272,
        420
      ],
      "id": "66666666-6666-6666-6666-666666666611",
      "name": "Submit Login [Webhook]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": false,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "login-if-002",
              "leftValue": "={{ $json.statusCode < 400 && String($json.body || $json.data || '').includes($('Set Login Config [Webhook]').item.json.successMarker) }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        576,
        420
      ],
      "id": "66666666-6666-6666-6666-666666666612",
      "name": "Login Successful? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-038",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-039",
              "name": "status",
              "value": "success",
              "type": "string"
            },
            {
              "id": "login-040",
              "name": "message",
              "value": "Configured account login flow succeeded",
              "type": "string"
            },
            {
              "id": "login-041",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        340
      ],
      "id": "66666666-6666-6666-6666-666666666613",
      "name": "Mark Login Success [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "login-042",
              "name": "action",
              "value": "account_login",
              "type": "string"
            },
            {
              "id": "login-043",
              "name": "status",
              "value": "failed",
              "type": "string"
            },
            {
              "id": "login-044",
              "name": "statusCode",
              "value": "={{ $json.statusCode }}",
              "type": "number"
            },
            {
              "id": "login-045",
              "name": "message",
              "value": "Login response did not match the configured success marker",
              "type": "string"
            },
            {
              "id": "login-046",
              "name": "checkedAt",
              "value": "={{ new Date().toISOString() }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        540
      ],
      "id": "66666666-6666-6666-6666-666666666614",
      "name": "Mark Login Failed [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1184,
        420
      ],
      "id": "66666666-6666-6666-6666-666666666615",
      "name": "Respond to Webhook"
    }
  ],
  "connections": {
    "Every 24 Hours": {
      "main": [
        [
          {
            "node": "Set Login Config [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Login Config [Schedule]": {
      "main": [
        [
          {
            "node": "Solve Captcha [Schedule]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Captcha [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": "Set Login Config [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Login Config [Webhook]": {
      "main": [
        [
          {
            "node": "Solve Captcha [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Solve Captcha [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
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  }
}

Conclusion

You've learned how to build reCAPTCHA-solving APIs and production-ready scraping workflows using n8n and CapSolver โ€” no traditional coding required.

In this guide, we covered:

  • API solver endpoints for reCAPTCHA v2, v2 Invisible, and v3 using webhook-based workflows
  • Use-case examples โ€” scraping and account login โ€” showing how to submit solved tokens and process protected data
  • How to identify captcha parameters using the CapSolver browser extension
  • Best practices for token handling, error management, and production use

The key takeaway: solving the captcha is only half the job โ€” you also need to submit the token 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!

CapSolver bonus code banner

Frequently Asked Questions

How much does it cost to solve a reCAPTCHA?

Pricing varies by captcha type. reCAPTCHA v2 typically costs around $1-3 per 1,000 solves. Check the CapSolver pricing page for current rates.

How long does it take to solve a reCAPTCHA?

Most reCAPTCHA v2 challenges are solved in 5-20 seconds. reCAPTCHA v3 is typically faster since there's no image challenge involved.

Can I use these workflows with n8n Cloud?

Yes! These workflows work with both self-hosted n8n and n8n Cloud. The CapSolver node is already available as an official integration โ€” just add your API credentials.

How do I find the reCAPTCHA site key for a website?

The easiest method is using the CapSolver browser extension โ€” open DevTools, go to the "CapSolver Captcha Detector" tab, and trigger the captcha. The extension will display all parameters automatically. Alternatively, you can search the page source for data-sitekey or render= in the reCAPTCHA script URL.

What's the difference between reCAPTCHA v2 and v2 Invisible?

Both use the same underlying technology, but v2 shows a visible checkbox ("I'm not a robot") while v2 Invisible runs in the background without any visible widget. When solving, the only difference is setting isInvisible: true.

CapSolver returned a token but the website still rejected it โ€” why?

Several things can cause this. First, tokens expire quickly โ€” make sure you're submitting the token immediately. Second, verify you're sending the token to the right place: inspect the actual network request the browser makes when you submit the form (DevTools โ†’ Network tab) and confirm the field name, request method, and endpoint all match what you've configured in n8n. Third, some sites require additional parameters like enterprisePayload or specific cookies and headers โ€” use the CapSolver extension to check if any of these apply. If the token is still rejected, contact CapSolver support for site-specific help.

Compliance Disclaimer: The information provided on this blog is for informational purposes only. CapSolver is committed to compliance with all applicable laws and regulations. The use of the CapSolver network for illegal, fraudulent, or abusive activities is strictly prohibited and will be investigated. Our captcha-solving solutions enhance user experience while ensuring 100% compliance in helping solve captcha difficulties during public data crawling. We encourage responsible use of our services. For more information, please visit our Terms of Service and Privacy Policy.

More