
Adélia Cruz
Neural Network Developer

Se você já tentou automatizar interações na web, quase certamente já se deparou com o reCAPTCHA — o sistema de desafio do Google que bloqueia bots de acessarem sites. Seja construindo scrapers, testando aplicações web ou automatizando tarefas repetitivas, o reCAPTCHA pode paralisar todo o seu fluxo de trabalho.
E se você pudesse resolver o reCAPTCHA automaticamente dentro dos seus fluxos de trabalho no n8n — seja criando uma API solver reutilizável, raspando um site protegido por captcha ou automatizando um formulário de login — tudo isso sem escrever uma única linha de código tradicional?
Neste guia, você aprenderá como combinar o n8n (uma ferramenta visual de automação de fluxos de trabalho) com o CapSolver (um serviço de resolução de captcha com inteligência artificial) para resolver desafios reCAPTCHA v2, v2 Invisível e v3 sob demanda — seja como um endpoint API independente ou como uma etapa dentro de qualquer fluxo de automação.
O que você vai construir:
API Solver — um endpoint reutilizável que suas outras ferramentas podem chamar:
Fluxos de uso direto — CapSolver embutido como uma etapa dentro de automações maiores:
reCAPTCHA é o sistema de detecção de bots do Google usado por milhões de sites. Existem três versões principais que você encontrará:
reCAPTCHA v2 — Caixa de seleção ("Não sou um robô") + desafios de imagens
reCAPTCHA v2 Invisível — Sem caixa de seleção visível, dispara automaticamente em segundo plano
reCAPTCHA v3 — Completamente invisível, atribui uma pontuação (0.0–1.0) baseada no comportamento
Entender qual versão um site utiliza é fundamental — cada uma requer parâmetros ligeiramente diferentes para a resolução.
Antes de começar, certifique-se de ter o seguinte:
Importante: Certifique-se de ter saldo suficiente na sua conta CapSolver. Tarefas de resolução de reCAPTCHA consomem créditos conforme o tipo de captcha.
O CapSolver está disponível como uma integração oficial no n8n — não é necessário instalar nenhum nó da comunidade. Você pode encontrá-lo diretamente no painel de nós ao construir seus fluxos.
Como é uma integração oficial, você precisa criar uma credencial no n8n para que o nó CapSolver possa autenticar com sua conta.
Vá para sua instância do n8n e navegue até Configurações → Credenciais. Você verá todas as credenciais configuradas aqui.

All (padrão)O n8n testará a conexão automaticamente. Você deverá ver uma faixa verde com a mensagem "Conexão testada com sucesso" confirmando que sua chave API é válida.

Importante: Cada nó CapSolver nos seus fluxos fará referência a essa credencial. Você só precisa criá-la uma vez — todos os seus fluxos solver compartilharão a mesma credencial.
Agora você está pronto para construir seu fluxo de trabalho solver de reCAPTCHA!
Antes de poder resolver um reCAPTCHA, você precisa saber seus parâmetros — especificamente o websiteURL e o websiteKey (também chamado de chave do site). A maneira mais fácil de encontrá-los é usando a Extensão de Navegador CapSolver.
Baixe e instale a extensão CapSolver na Chrome Web Store ou nos Add-ons do Firefox.

Com o painel do detector aberto, interaja com a página para disparar o reCAPTCHA. A extensão detectará automaticamente e exibirá todos os parâmetros relevantes:
recaptcha.net)
Dica: A extensão gera uma saída JSON mostrando exatamente como formatar esses parâmetros para sua requisição de resolução. Isso evita que você tenha que inspecionar manualmente o código-fonte da página.
Para um guia detalhado sobre como identificar parâmetros de captcha, confira a documentação oficial do CapSolver.
Este fluxo cria um endpoint POST que aceita parâmetros de reCAPTCHA e retorna um token resolvido. A mesma estrutura de 4 nós funciona para todos os tipos de reCAPTCHA — basta mudar a Operação no nó CapSolver.

$json.error não está vazio){"error": "..."} em caso de falha| Tipo | Operação a selecionar | Parâmetro extra |
|---|---|---|
| v2 Padrão | reCAPTCHA v2 |
— |
| v2 Invisível | reCAPTCHA v2 |
Defina Is Invisible como true no nó |
| v3 | reCAPTCHA v3 |
Adicione pageAction — deve corresponder à ação configurada no site alvo (ex.: login, submit) |
O fluxo abaixo usa reCAPTCHA v2 como padrão. Abra o nó CapSolver e mude o dropdown Operação para trocar de tipo. Nenhuma outra alteração estrutural é necessária.
| Configuração | Valor |
|---|---|
| Método HTTP | POST |
| Caminho | solver-recaptcha |
| Responder | Response Node |
Isso cria um endpoint em: https://sua-instancia-n8n.com/webhook/solver-recaptcha
| Parâmetro | Valor | Descrição |
|---|---|---|
| Operação | reCAPTCHA v2 |
Mude para reCAPTCHA v3 para v3; para v2 Invisível, mantenha reCAPTCHA v2 e defina Is Invisible como true |
| Website URL | ={{ $json.body.websiteURL }} |
A URL da página com o captcha |
| Website Key | ={{ $json.body.websiteKey }} |
A chave do site reCAPTCHA |
| Page Action | ={{ $json.body.pageAction || '' }} |
Obrigatório para v3 — deve corresponder à ação configurada no site |
| Is Invisible | ={{ $json.body.isInvisible || false }} |
Defina como true para v2 Invisível |
| API Domain | ={{ $json.body.apiDomain || '' }} |
Opcional — domínio API customizado (ex.: recaptcha.net) |
| Enterprise Payload | ={{ $json.body.enterprisePayload || '' }} |
Opcional — payload adicional para reCAPTCHA Enterprise |
| Is Session | ={{ $json.body.isSession || false }} |
Opcional — habilita resolução baseada em sessão |
| Task Type | ={{ $json.body.taskType || 'ReCaptchaV2TaskProxyLess' }} |
Tipo de tarefa CapSolver — veja referência abaixo. Padrão é ReCaptchaV2TaskProxyLess |
| Proxy | ={{ $json.body.proxy || '' }} |
Usado apenas quando o Tipo de Tarefa selecionado requer proxy (tipos não-ProxyLess). Deixe vazio ou omita para tipos ProxyLess. Formato: ip:port:user:pass |
Também selecione suas credenciais CapSolver no nó.
Referência de Tipo de Tarefa reCAPTCHA:
| Tipo de Tarefa | Proxy Necessário | Observações |
|---|---|---|
ReCaptchaV2TaskProxyLess |
Não | v2 padrão |
ReCaptchaV2Task |
Sim | v2 com proxy |
ReCaptchaV2EnterpriseTaskProxyLess |
Não | Enterprise v2, sem proxy |
ReCaptchaV2EnterpriseTask |
Sim | Enterprise v2, requer proxy |
ReCaptchaV3TaskProxyLess |
Não | v3 padrão |
ReCaptchaV3Task |
Sim | v3 com proxy |
ReCaptchaV3EnterpriseTaskProxyLess |
Não | Enterprise v3, sem proxy |
ReCaptchaV3EnterpriseTask |
Sim | Enterprise v3, requer proxy |
Proxy: Aplicável apenas para tipos de tarefa não-
ProxyLess(ex.:ReCaptchaV2Task,ReCaptchaV3EnterpriseTask). Ao usar um tipoProxyLess, o campo proxy é ignorado — o CapSolver usa sua própria infraestrutura. Para tipos não-ProxyLess, você deve fornecer um proxy.
| Configuração | Valor |
|---|---|
| Condição | ={{ $json.error }} não está vazio |
| Ramo verdadeiro | Direciona para o nó Responder ao Webhook de Erro |
| Ramo falso | Direciona para o nó Responder ao Webhook de Sucesso |
Isso torna o caminho de erro explícito no canvas. O nó CapSolver continua em caso de erro (onError: continueRegularOutput), então falhas chegam aqui como { "error": "..." } em vez de travar o fluxo. Você pode anexar nós adicionais ao ramo verdadeiro (logs, alertas, tentativas) sem alterar o caminho de sucesso.
Ramo de sucesso (saída falsa do nó Erro CapSolver?):
| Configuração | Valor |
|---|---|
| Responder com | JSON |
| Corpo da resposta | ={{ JSON.stringify($json.data) }} |
Envie uma requisição POST para seu endpoint webhook:bash 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" }' > O tipo de tarefa deve corresponder à Operação do nó. Cada fluxo de trabalho implantado é configurado para uma versão específica do reCAPTCHA através do campo Operation no nó CapSolver (reCAPTCHA v2 ou reCAPTCHA v3). Apenas os tipos de tarefa para essa versão são válidos — enviar um tipo de tarefa v3 para um fluxo v2 (ou vice-versa) não funcionará. Nota: o v2 Invisível usa a mesma operação reCAPTCHA v2 que o v2 padrão — a diferença está no parâmetro isInvisible, não na operação.
Para reCAPTCHA v3, adicione também "pageAction": "login" (ou qualquer ação que o site utilize) ao corpo da requisição, e use um tipo de tarefa v3 (por exemplo, "taskType": "ReCaptchaV3TaskProxyLess").
Resposta Esperada:```json
{
"taskId": "abc123...",
"solution": {
"gRecaptchaResponse": "03AGdBq24PBCb..."
},
"status": "ready"
}
Copie o JSON abaixo e importe-o no n8n através de **Menu** → **Importar de JSON**. Em seguida, altere a **Operação** no nó CapSolver para o tipo de reCAPTCHA desejado.
<details>
<summary>Clique para expandir o JSON do fluxo de trabalho (reCAPTCHA v2 — altere a Operação para outros tipos)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Solver API\n\n### How it works\n\n1. A webhook receives the reCAPTCHA solver request.\n2. The request is passed to the solver node to resolve the reCAPTCHA.\n3. The system checks if the solver encountered an error.\n4. If an error occurred, a response is sent indicating the failure.\n5. If successful, a response is sent with the result.\n\n### Setup steps\n\n- [ ] Configure webhook endpoint to receive solver requests.\n- [ ] Set up CapSolver credentials if necessary.\n\n### Customization\n\nAdjust the solver node settings depending on reCAPTCHA type or difficulty.",
"width": 480,
"height": 592
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-800,
-240
],
"id": "497d295f-4668-48ff-8eaa-97773cfd1c89",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receive request and solve\n\nHandles incoming requests and solves reCAPTCHA.",
"width": 496,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-240,
-112
],
"id": "cb4b7a54-ae67-458e-bbef-18e3f6d242bb",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Evaluate and respond\n\nChecks for errors and sends appropriate webhook responses.",
"width": 560,
"height": 432,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
-240
],
"id": "fc9430f0-b899-45ce-b5cf-de9a1b10fbe2",
"name": "Sticky Note2"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"id": "rc-api-001",
"name": "Receive Solver Request",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-192,
0
],
"webhookId": "solver-recaptcha"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"id": "rc-api-002",
"name": "Solve reCAPTCHA",
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
},
"continueOnFail": true
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
},
"leftValue": "={{ $json.error }}",
"rightValue": ""
}
]
},
"options": {}
},
"id": "rc-api-003",
"name": "CapSolver Error?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
512,
-32
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"id": "rc-api-004",
"name": "Respond to Webhook (Error)",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
880,
-128
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"id": "rc-api-005",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
880,
32
]
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "Solve reCAPTCHA",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA": {
"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"
}
}
```</details>
---
## Fluxo de Trabalho: Enviando Tokens para Sites
Até agora, os fluxos de trabalho da API acima mostram como **obter** um token de captcha resolvido. Mas o que você realmente **faz** com ele?
Na automação do mundo real, resolver o captcha é apenas metade do trabalho. Você precisa **enviar o token** para o site alvo — exatamente como um navegador faria — para desbloquear os dados ou a ação por trás do captcha.
Aqui está o padrão geral:
1. **Resolver o captcha** → Obter o token `gRecaptchaResponse` do CapSolver
2. **Enviar o token** → Enviá-lo para o site alvo via uma requisição HTTP (geralmente como um campo de formulário `g-recaptcha-response` ou parâmetro de URL)
3. **Verificar a resposta** → Checar se o site aceitou o token e retornou os dados esperados
4. **Processar o resultado** → Extrair os dados que você precisa
### Exemplo: Resolvendo e Enviando reCAPTCHA v2
**Exemplo:** [example.com](https://example.com)

#### Fluxo do Workflow```
Manual Trigger → CapSolver reCAPTCHA v2 → HTTP POST Request → IF (check success) → Valid / Invalid
```#### Como Funciona
1. **Gatilho Manual** — Inicia o fluxo de trabalho manualmente (clique em "Execute workflow"). Você pode substituir isso por qualquer gatilho — Webhook, Agendamento, Evento de App, etc.
2. **CapSolver reCAPTCHA v2** — Resolve o captcha para a página de demonstração:
- URL do site: `https://example.com`
- Chave do site: `YOUR_SITE_KEY`
3. **Requisição HTTP POST** — Envia o token resolvido para a mesma URL como um POST de formulário:
- O token é enviado no campo de formulário `g-recaptcha-response`
- Isso é exatamente o que um navegador faz quando você clica em "Enviar" após resolver o captcha
4. **Nó IF** — Verifica se o HTML da resposta contém `"recaptcha-success"`, indicando que o captcha foi aceito
5. **Válido / Inválido** — O nó IF direciona para o ramo **Válido** em caso de sucesso (onde você extrai os dados necessários, por exemplo, com o **nó HTML** para listas de produtos, resultados de formulários, etc.) ou para o ramo **Inválido** em caso de falha (onde você trata o erro)
> **Conceito chave:** Cada site lida com o envio do token de forma diferente. Nesta demonstração, o token vai em um campo de formulário `g-recaptcha-response` via POST — mas outros sites podem esperar que ele seja enviado como parâmetro de URL, em um corpo JSON, ou através de um endpoint completamente diferente. Sempre inspecione o envio real do formulário do site (usando a aba Network das DevTools) para ver exatamente como o token precisa ser enviado.
<details>
<summary>Clique para expandir o JSON do fluxo de trabalho</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA v2 \u2014 All Triggers\n\n### How it works\n\n1. Receives solver requests through a webhook.\n2. Processes these requests using CapSolver and returns the results.\n3. Regularly triggers checks every hour using a schedule.\n4. Executes the scheduled process and checks the status of tasks.\n5. Allows manual testing of CapSolver through a manual trigger.\n\n### Setup steps\n\n- [ ] Set up webhook credentials for 'Receive Solver Request'.\n- [ ] Configure CapSolver with necessary keys for all CapSolver nodes.\n- [ ] Assign necessary permissions for HTTP request to reCAPTCHA endpoint.\n- [ ] Review and adjust the schedule in 'Schedule Trigger'.\n- [ ] Test manual execution with 'Manual Trigger'.\n",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-816,
-128
],
"id": "68e8c344-ce45-4e9f-859b-ca005db7c73e",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receive and handle requests\n\nStarts with receiving a solver request via webhook, processes it, and returns the solver result.",
"width": 800,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
-128
],
"id": "c26741c7-e0e6-4a4e-9fbf-2a623df014c8",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled recurrent process\n\nInitiates the process on an hourly schedule, sets target parameters, and sends them to CapSolver.",
"width": 800,
"height": 304,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
224
],
"id": "4b879cbf-e269-4260-9596-740b95df628a",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Process and validate token\n\nPosts to the reCAPTCHA validation endpoint and checks results, branching into pass or fail paths.",
"width": 736,
"height": 464,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
656,
96
],
"id": "7c860b53-f4a7-4d0b-8537-5253eec5a043",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Manual testing process\n\nAllows manual trigger testing with CapSolver and formats the result for review.",
"width": 800,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-256,
576
],
"id": "8936a2df-c5b5-4c63-a0d5-afd190553a57",
"name": "Sticky Note4"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solve-recaptcha-v2",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-208,
0
],
"id": "11111111-1111-1111-1111-111111111101",
"name": "Receive Solver Request",
"webhookId": "a1b2c3d4-e5f6-7890-abcd-ef1234567801",
"onError": "continueRegularOutput"
},
{
"parameters": {
"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": "11111111-1111-1111-1111-111111111102",
"name": "CapSolver [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json.data) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
400,
0
],
"id": "11111111-1111-1111-1111-111111111103",
"name": "Return Solver Result"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-208,
352
],
"id": "11111111-1111-1111-1111-111111111104",
"name": "Schedule Trigger (Every 1h)"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sa-001",
"name": "websiteURL",
"value": "https://www.google.com/recaptcha/api2/demo",
"type": "string"
},
{
"id": "sa-002",
"name": "websiteKey",
"value": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
112,
352
],
"id": "11111111-1111-1111-1111-111111111105",
"name": "Set Target Params"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
400,
352
],
"id": "11111111-1111-1111-1111-111111111106",
"name": "CapSolver [Schedule]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "https://www.google.com/recaptcha/api2/demo",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "content-type",
"value": "application/x-www-form-urlencoded"
},
{
"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": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
704,
352
],
"id": "11111111-1111-1111-1111-111111111107",
"name": "Submit Token"
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "if-001",
"leftValue": "={{ $json.data }}",
"rightValue": "recaptcha-success",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
1008,
352
],
"id": "11111111-1111-1111-1111-111111111108",
"name": "Check Result"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sp-001",
"name": "status",
"value": "passed",
"type": "string"
},
{
"id": "sp-002",
"name": "message",
"value": "reCAPTCHA v2 monitor passed successfully",
"type": "string"
},
{
"id": "sp-003",
"name": "timestamp",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1248,
224
],
"id": "11111111-1111-1111-1111-111111111109",
"name": "Monitor Passed"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "sf-001",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "sf-002",
"name": "message",
"value": "reCAPTCHA v2 monitor FAILED \u2014 token rejected",
"type": "string"
},
{
"id": "sf-003",
"name": "timestamp",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1248,
384
],
"id": "11111111-1111-1111-1111-111111111110",
"name": "Monitor Failed"
},
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-208,
688
],
"id": "11111111-1111-1111-1111-111111111111",
"name": "Manual Trigger (Test)"
},
{
"parameters": {
"websiteURL": "https://www.google.com/recaptcha/api2/demo",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
688
],
"id": "11111111-1111-1111-1111-111111111112",
"name": "CapSolver [Manual]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "mr-001",
"name": "token",
"value": "={{ $json.data.solution.gRecaptchaResponse }}",
"type": "string"
},
{
"id": "mr-002",
"name": "taskId",
"value": "={{ $json.data.taskId }}",
"type": "string"
},
{
"id": "mr-003",
"name": "status",
"value": "solved",
"type": "string"
},
{
"id": "mr-004",
"name": "solvedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
400,
688
],
"id": "11111111-1111-1111-1111-111111111113",
"name": "Format Result"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "CapSolver [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Webhook]": {
"main": [
[
{
"node": "Return Solver Result",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger (Every 1h)": {
"main": [
[
{
"node": "Set Target Params",
"type": "main",
"index": 0
}
]
]
},
"Set Target Params": {
"main": [
[
{
"node": "CapSolver [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Schedule]": {
"main": [
[
{
"node": "Submit Token",
"type": "main",
"index": 0
}
]
]
},
"Submit Token": {
"main": [
[
{
"node": "Check Result",
"type": "main",
"index": 0
}
]
]
},
"Check Result": {
"main": [
[
{
"node": "Monitor Passed",
"type": "main",
"index": 0
}
],
[
{
"node": "Monitor Failed",
"type": "main",
"index": 0
}
]
]
},
"Manual Trigger (Test)": {
"main": [
[
{
"node": "CapSolver [Manual]",
"type": "main",
"index": 0
}
]
]
},
"CapSolver [Manual]": {
"main": [
[
{
"node": "Format Result",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
> **Adaptando para outros tipos de reCAPTCHA:** Este mesmo padrão funciona para **v2 Invisível** e **v3**. Para o v2 Invisível, defina `isInvisible: true` no nó CapSolver. Para o v3, altere a Operação para `reCAPTCHA v3` e adicione o parâmetro `pageAction`. A etapa de envio da Requisição HTTP será diferente para cada site — sempre inspecione o envio real do formulário nas DevTools.
---
## Fluxo de Trabalho: Exemplos de Casos de Uso
A API do resolvedor e os exemplos de scraping acima mostram o padrão principal: resolver o captcha, enviar o token, processar o resultado. Os fluxos de trabalho a seguir estendem esse padrão para **casos de uso prontos para produção** — cada um com gatilhos duplos (agendamento + webhook), rastreamento persistente de estado e saída estruturada.
| Fluxo de Trabalho | Propósito |
|---|---|
| `reCAPTCHA Scraping — Preço & Detalhes do Produto — CapSolver + Agendamento + Webhook` | Raspagem do preço e nome do produto a cada 6 horas, compara com valores anteriores armazenados em `staticData`, alerta sobre mudanças |
| `reCAPTCHA Login de Conta — CapSolver + Agendamento + Webhook` | Faz login na sua própria conta em um site protegido por captcha resolvendo primeiro, depois enviando as credenciais via POST com o token |
### Exemplo 1: Raspagem — Preço & Detalhes do Produto
Este fluxo de trabalho raspa uma página de produto a cada 6 horas (agendamento) ou sob demanda (webhook), extrai o preço usando o nó HTML e compara com o valor armazenado anteriormente.
**Caminho do agendamento:**```
Every 6 Hours → Solve reCAPTCHA v3 → Fetch Product Page → Extract Data
→ Compare Data → Data Changed? → Build Alert / No Change
```> **Tratamento de erros:** Se o CapSolver falhar, a execução para e é marcada como falhada no n8n. Verifique em **Executions** para ver o erro, ou configure o [Error Workflow](https://docs.n8n.io/flow-logic/error-handling/) do n8n para ser notificado automaticamente.
Comportamentos principais:
- Usa **reCAPTCHA v3** com um parâmetro `pageAction` (configurável)
- O token é enviado como um cabeçalho `x-recaptcha-token` (adapte ao formato esperado pelo seu site)
- O **nó HTML** extrai preço e nome do produto via seletores CSS (`.product-price`, `h1`)
- `$workflow.staticData.lastPrice` persiste o preço anterior entre execuções
- A comparação de preços detecta tanto **quedas** (gravidade: `deal`) quanto **aumentos** (gravidade: `info`)
- O tipo de tarefa é `ReCaptchaV3TaskProxyLess` (fixo) — edite o nó Solve reCAPTCHA v3 diretamente para alterar o tipo de tarefa ou proxy
<details>
<summary>Clique para expandir o JSON completo do fluxo (17 nós)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Scraping \u2014 Price & Product Monitor\n\n### How it works\n\n1. Triggers the workflow every 6 hours or via webhook.\n2. Configures target website URL and key for scraping.\n3. Solves reCAPTCHA to access the webpage.\n4. Fetches and extracts product data from the webpage.\n5. Compares current data with previous data to check for changes.\n6. Builds alert or updates status based on data changes.\n\n### Setup steps\n\n- [ ] Configure the 'Every 6 Hours' trigger to set the appropriate time schedule.\n- [ ] Set up the target website URL and key parameters in the 'Set Target Config [Schedule]' node.\n- [ ] Ensure the 'Solve reCAPTCHA' and 'Solve reCAPTCHA [Webhook]' nodes are configured with the correct CAPTCHA services.\n- [ ] Set up webhook endpoint in the 'Webhook Trigger' node.\n- [ ] Configure the 'Respond to Webhook' node for handling webhook responses.\n\n### Customization\n\nAdjust the 'Compare Data' and 'Compare Data [Webhook]' code to fit specific data comparison logic or data formats.",
"height": 896,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1312,
-352
],
"id": "871c5a60-20b4-4cc0-a357-d5cecb8a322a",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled trigger setup\n\nTriggers every 6 hours and sets the target config for scraping.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-128
],
"id": "43acb039-cfcd-47c3-892e-e13da011b721",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled CAPTCHA solving and page fetch\n\nSolves the CAPTCHA and fetches the product page based on schedule.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-128
],
"id": "68fc53a6-181e-4ca8-bf7d-f3f8e9b12f9d",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Scheduled data extraction and comparison\n\nExtracts and compares data from the fetched page.",
"height": 272,
"width": 784,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
-112
],
"id": "155fc92b-721a-40bf-80e6-6dd2082b126a",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Scheduled alert or status update\n\nHandles response based on data comparison for scheduled runs.",
"height": 560,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1296,
-352
],
"id": "ee2c8c8e-d21d-42aa-b261-49a6fffb3d11",
"name": "Sticky Note4"
},
{
"parameters": {
"content": "## Webhook trigger setup\n\nInitiates the workflow via a webhook request.",
"height": 368,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
304
],
"id": "6957473e-81a0-4afd-a0ea-e6f61c3be715",
"name": "Sticky Note5"
},
{
"parameters": {
"content": "## Webhook CAPTCHA solving and page fetch\n\nSolves the CAPTCHA and fetches the product page via webhook.",
"height": 304,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
304
],
"id": "48990176-a5b5-48db-ac09-bcc207318f0a",
"name": "Sticky Note6"
},
{
"parameters": {
"content": "## Webhook data extraction and comparison\n\nProcesses data fetched from the page and checks for changes via webhook.",
"height": 272,
"width": 784,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
464,
320
],
"id": "844166d1-75f7-4192-8bfb-3a1381fb6235",
"name": "Sticky Note7"
},
{
"parameters": {
"content": "## Webhook alert or status update\n\nResponds to webhook trigger with alert or status update.",
"height": 544,
"width": 384,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1328,
240
],
"id": "c1926a60-dfb3-4520-a530-82aa40c6341c",
"name": "Sticky Note8"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
0
],
"id": "rc-s-901",
"name": "Every 6 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://YOUR-TARGET-SITE.com/product-page",
"type": "string"
},
{
"id": "cfg-002",
"name": "websiteKey",
"value": "YOUR_SITE_KEY_HERE",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
0
],
"id": "rc-s-900",
"name": "Set Target Config [Schedule]"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "rc-s-902",
"name": "Solve reCAPTCHA",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"method": "POST",
"url": "={{ $('Set Target Config [Schedule]').first().json.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": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "rc-s-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": "rc-s-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": "rc-s-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": "rc-s-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": [
1344,
-160
],
"id": "rc-s-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": [
1344,
48
],
"id": "rc-s-908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-704,
480
],
"id": "rc-s-909",
"name": "Webhook Trigger",
"webhookId": "rc-s-909-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
432
],
"id": "rc-s-910",
"name": "Solve reCAPTCHA [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": "g-recaptcha-response",
"value": "={{ $json.data.solution.gRecaptchaResponse }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
432
],
"id": "rc-s-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": "rc-s-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": "rc-s-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,
432
],
"id": "rc-s-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": [
1376,
368
],
"id": "rc-s-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": [
1392,
608
],
"id": "rc-s-916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1568,
512
],
"id": "rc-s-917",
"name": "Respond to Webhook"
}
],
"connections": {
"Every 6 Hours": {
"main": [
[
{
"node": "Set Target Config [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Set Target Config [Schedule]": {
"main": [
[
{
"node": "Solve reCAPTCHA",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA": {
"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 [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve reCAPTCHA [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"
}
}
```</details>
### Exemplo 2: Login de Conta
Este fluxo de trabalho automatiza o login em um site protegido por captcha. Um nó **Set Login Config** centraliza todos os parâmetros — **[Schedule]** para o caminho agendado e **[Webhook]** para o caminho de webhook sob demanda. Edite o nó de configuração apropriado para configurar cada caminho.
**Caminho agendado:**```
Every 24 Hours → Set Login Config → Solve Captcha → Submit Login
→ Login Successful? → Mark Login Success / Mark Login Failed
```> **Tratamento de erros:** Se o CapSolver falhar, a execução para e é marcada como falha no n8n. Verifique **Executions** para ver o erro, ou configure o [Error Workflow](https://docs.n8n.io/flow-logic/error-handling/) do n8n para ser notificado automaticamente.
Comportamentos principais:
- Padrão para **reCAPTCHA v2** (`ReCaptchaV2TaskProxyLess`) — altere `taskType` em **Set Login Config [Schedule]** ou **Set Login Config [Webhook]** para o caminho respectivo; altere a `Operation` no nó Solve Captcha se alternar entre v2 e v3
- Os campos do formulário são fixos como `email`, `password` e `g-recaptcha-response` — edite diretamente o nó **Submit Login** para corresponder aos nomes dos campos do site alvo
- A verificação **Login Successful?** avalia tanto `statusCode < 400` quanto a presença de um `successMarker` configurável no corpo da resposta
- O **caminho Webhook** usa **Set Login Config [Webhook]** com os mesmos valores fixos de espaço reservado — edite esse nó para configurar o caminho do webhook sob demanda
- O caminho Webhook retorna o resultado como JSON via **Respond to Webhook**
<details>
<summary>Clique para expandir o JSON completo do fluxo de trabalho (15 nós)</summary>```json
{
"nodes": [
{
"parameters": {
"content": "## reCAPTCHA Account Login\n\n### How it works\n\n1. The workflow triggers every 24 hours to initiate a login process.\n2. It solves reCAPTCHA challenges for login attempts.\n3. Submits login credentials via HTTP requests.\n4. Checks if login is successful and records the outcome.\n5. A webhook can trigger the login process manually.\n6. Responds to webhook calls with login status.\n\n### Setup steps\n\n- [ ] Configure the schedule trigger for desired intervals.\n- [ ] Set up the webhook URL for manual login attempts.\n- [ ] Ensure that credentials for solving reCAPTCHA are valid.\n- [ ] Configure the HTTP request nodes with the correct login endpoint.\n- [ ] Confirm that response nodes are set with the correct output format.\n\n### Customization\n\nCustomizable time intervals for automated login attempts and custom webhook endpoints can be configured.",
"width": 480,
"height": 896
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1248,
-352
],
"id": "b76c0299-05e6-4d65-ba90-63a8148242af",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Scheduled login initialization\n\nTriggers login attempts every 24 hours and configures necessary parameters.",
"width": 1408,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-688,
-112
],
"id": "0610b8c8-fce5-4efd-b3d2-1eeeb6eba648",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Scheduled login results\n\nDetermines and marks the results of scheduled login attempts.",
"width": 240,
"height": 528,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
816,
-352
],
"id": "73eec9f0-dbe8-43a5-bff7-2308b4cac998",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Webhook login initialization\n\nManual login attempts triggered by webhook, solving reCAPTCHA.",
"width": 1408,
"height": 272,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-688,
320
],
"id": "0680f603-0a47-429f-81cb-69ff7741a9bd",
"name": "Sticky Note3"
},
{
"parameters": {
"content": "## Webhook login results and response\n\nRecords results of webhook login attempts and sends response.",
"width": 512,
"height": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
816,
208
],
"id": "4f244d27-03e3-4670-8e6f-67ed6264ac8d",
"name": "Sticky Note4"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-640,
0
],
"id": "rc-l-921",
"name": "Every 24 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "l1",
"name": "websiteURL",
"value": "https://YOUR-LOGIN-PAGE.com",
"type": "string"
},
{
"id": "l2",
"name": "websiteKey",
"value": "YOUR_SITE_KEY_HERE",
"type": "string"
},
{
"id": "l3",
"name": "successMarker",
"value": "account-dashboard",
"type": "string"
},
{
"id": "l4",
"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": "rc-l-922",
"name": "Set Login Config [Schedule]"
},
{
"parameters": {
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
0
],
"id": "rc-l-923",
"name": "Solve Captcha [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": "email",
"value": "your-email@example.com"
},
{
"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": "rc-l-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": "rc-l-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": [
864,
-192
],
"id": "rc-l-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": [
864,
16
],
"id": "rc-l-927",
"name": "Mark Login Failed [Schedule]"
},
{
"parameters": {
"httpMethod": "POST",
"path": "account-login-recaptcha",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-640,
432
],
"id": "rc-l-928",
"name": "Webhook Trigger",
"webhookId": "rc-l-928-webhook",
"onError": "continueRegularOutput"
},
{
"parameters": {
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-32,
432
],
"id": "rc-l-929",
"name": "Solve Captcha [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": "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,
432
],
"id": "rc-l-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": "rc-l-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": [
864,
336
],
"id": "rc-l-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,
528
],
"id": "rc-l-933",
"name": "Mark Login Failed [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1184,
496
],
"id": "rc-l-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": "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": "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
}
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
```</details>
Você aprendeu como construir APIs para resolver reCAPTCHA e fluxos de trabalho de scraping prontos para produção usando n8n e CapSolver — sem necessidade de codificação tradicional.
Neste guia, abordamos:
A principal lição: resolver o captcha é apenas metade do trabalho — você também precisa enviar o token para o site alvo para desbloquear os dados protegidos.
Dica: Esses fluxos de trabalho usam gatilhos Schedule + Webhook, mas você pode trocar o nó de gatilho por qualquer gatilho n8n — manual, evento de app, envio de formulário, etc. Após buscar os dados, use os nós integrados do n8n para salvar resultados no Google Sheets, bancos de dados, armazenamento na nuvem, ou enviar alertas via Telegram/Slack/Email.
Pronto para começar? Cadastre-se no CapSolver e use o código bônus n8n para um bônus extra de 8% na sua primeira recarga!

O preço varia conforme o tipo de captcha. O reCAPTCHA v2 normalmente custa cerca de US$ 1-3 por 1.000 resoluções. Confira a página de preços do CapSolver para as tarifas atuais.
A maioria dos desafios reCAPTCHA v2 é resolvida em 5-20 segundos. O reCAPTCHA v3 é geralmente mais rápido, pois não envolve desafio de imagem.
Sim! Esses fluxos funcionam tanto com o n8n auto-hospedado quanto com o n8n Cloud. O nó CapSolver já está disponível como uma integração oficial — basta adicionar suas credenciais de API.
O método mais fácil é usar a extensão do navegador CapSolver — abra o DevTools, vá para a aba "CapSolver Captcha Detector" e acione o captcha. A extensão exibirá todos os parâmetros automaticamente. Alternativamente, você pode buscar no código-fonte da página por data-sitekey ou render= na URL do script do reCAPTCHA.
Ambos usam a mesma tecnologia subjacente, mas o v2 mostra uma caixa de seleção visível ("Não sou um robô"), enquanto o v2 Invisível roda em segundo plano sem nenhum widget visível. Ao resolver, a única diferença é definir isInvisible: true.
Vários fatores podem causar isso. Primeiro, os tokens expiram rapidamente — certifique-se de enviar o token imediatamente. Segundo, verifique se está enviando o token para o lugar correto: inspecione a requisição de rede real que o navegador faz ao enviar o formulário (DevTools → aba Network) e confirme o nome do campo, método da requisição e endpoint correspondem ao que você configurou no n8n. Terceiro, alguns sites exigem parâmetros adicionais como enterprisePayload ou cookies e cabeçalhos específicos — use a extensão CapSolver para verificar se algum deles se aplica. Se o token ainda for rejeitado, contate o suporte do CapSolver para ajuda específica do site.
Aprenda arquitetura de raspagem web escalável em Rust com reqwest, scraper, raspagem assíncrona, raspagem de navegador headless, rotação de proxies e tratamento de CAPTCHA compatível.

Compare o Selenium vs Puppeteer para resolver CAPTCHA. Descubra benchmarks de desempenho, notas de estabilidade e como integrar o CapSolver para o máximo de sucesso.
