
Adélia Cruz
Neural Network Developer

O Cloudflare Turnstile está se tornando rapidamente a alternativa de CAPTCHA preferida para sites modernos. Ao contrário dos CAPTCHAs tradicionais que forçam os usuários a resolver quebra-cabeças de imagens, o Turnstile funciona silenciosamente em segundo plano — tornando-o mais difícil de detectar e contornar com ferramentas de automação padrão.
E se você pudesse resolver o Turnstile automaticamente dentro dos seus fluxos de trabalho do n8n — seja construindo uma API de resolução reutilizável, fazendo scraping de 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 fluxo de trabalho) com o CapSolver (um serviço de resolução de captcha baseado em IA) para resolver desafios do Cloudflare Turnstile sob demanda — seja como um endpoint de API independente ou como uma etapa dentro de qualquer fluxo de automação.
O que você vai construir:
APIs de Resolução — endpoints reutilizáveis que suas outras ferramentas podem chamar:
Fluxos de trabalho de uso direto — CapSolver incorporado como uma etapa dentro de automações maiores:
O Cloudflare Turnstile é uma alternativa de CAPTCHA que verifica os visitantes automaticamente usando sinais do navegador — sem quebra-cabeças, sem caixas de seleção. Ele aparece como um pequeno widget incorporado em formulários (login, cadastro, checkout) e vem em três modos: Gerenciado (Managed), Não Interativo (Non-Interactive) e Invisível (Invisible). Do ponto de vista da resolução, o modo não importa — você sempre precisará dos mesmos dois parâmetros: websiteURL e websiteKey.

Não é o mesmo que Cloudflare Challenge. Se você vir uma tela de página inteira dizendo "Performing security verification...", isso é um Cloudflare Challenge, não o Turnstile — ele requer um resolutor diferente.
Antes de começar, certifique-se de ter o seguinte:
Importante: Certifique-se de ter saldo suficiente em sua conta CapSolver. As tarefas de resolução do Turnstile consomem créditos com base no uso.
O CapSolver está disponível como uma integração oficial no n8n — não é necessária a instalação de nós da comunidade. Você pode encontrá-lo diretamente no painel de nós ao construir seus fluxos de trabalho.
Como é uma integração oficial, você precisa criar uma credencial no n8n para que o nó do CapSolver possa se autenticar com sua conta.
Vá para sua instância do n8n e navegue até Settings (Configurações) → Credentials (Credenciais). Você verá todas as suas credenciais configuradas aqui.

All (padrão)O n8n testará automaticamente a conexão. Você deverá ver um banner verde "Connection tested successfully" confirmando que sua chave de API é válida.

Importante: Cada nó do CapSolver em seus fluxos de trabalho fará referência a esta credencial. Você só precisa criá-la uma vez — todos os seus fluxos de resolução compartilharão a mesma credencial.
Agora você está pronto para construir seu fluxo de trabalho de resolução do Turnstile!
Este fluxo de trabalho cria um endpoint de API POST que aceita parâmetros do Turnstile e retorna um token resolvido.

O fluxo de trabalho consiste em quatro nós:
$json.error não está vazio){"error": "..."} em caso de falha| Configuração | Valor |
|---|---|
| HTTP Method | POST |
| Path | solver-turnstile |
| Respond | Response Node |
Isso cria um endpoint em: https://sua-instancia-n8n.com/webhook/solver-turnstile
| Parâmetro | Valor | Descrição |
|---|---|---|
| Operation | Cloudflare Turnstile |
Deve ser definido como Cloudflare Turnstile |
| Type | AntiTurnstileTaskProxyLess |
Este tipo de tarefa não requer proxy |
| Website URL | {{ $json.body.websiteURL }} |
A URL da página com o widget Turnstile |
| Website Key | {{ $json.body.websiteKey }} |
A chave do site Turnstile |
| metadata.action | (Opcional) | Alguns sites exigem uma string de ação específica para o desafio Turnstile |
| metadata.cdata | (Opcional) | Dados personalizados que alguns sites passam para o widget Turnstile para verificação |
Alguns sites também exigem metadata.action e/ou metadata.cdata — você pode adicioná-los na seção Optional do nó. Selecione também suas credenciais do CapSolver neste nó.
| Configuração | Valor |
|---|---|
| Condition | ={{ $json.error }} is not empty |
| True branch | Direciona para o nó Error Respond to Webhook |
| False branch | Direciona para o nó Success Respond to Webhook |
Isso torna o caminho de erro explícito na tela. O nó do CapSolver continua em caso de erro (onError: continueRegularOutput), portanto as falhas chegam aqui como { "error": "..." } em vez de interromper o fluxo de trabalho.
Ramo de Sucesso (saída falsa de CapSolver Error?):
| Configuração | Valor |
|---|---|
| Respond With | JSON |
| Response Body | ={{ JSON.stringify($json.data) }} |
Envie uma requisição POST para o seu endpoint de webhook:
curl -X POST https://sua-instancia-n8n.com/webhook/solver-turnstile \
-H "Content-Type: application/json" \
-d '{
"websiteURL": "https://exemplo.com/login",
"websiteKey": "0x4AAAAAAADV8V8V8V8V8V8V"
}'
Resposta Esperada:
{
"taskId": "abc123...",
"solution": {
"token": "0.XXXXXXXXXXXXXXXX..."
},
"status": "ready"
}
Copie o JSON abaixo e importe-o para o n8n via Menu → Import from JSON:
{
"nodes": [
{
"parameters": {
"content": "## Turnstile — API de Resolução\n\n### Como funciona\n- Acionado por webhook\n- CapSolver: Cloudflare Turnstile\n- Ramo condicional\n- Responder ao webhook\n- Responder ao webhook\n\n### Configuração\n- Adicione sua chave de API **CapSolver** em Settings → Credentials\n- Configure os valores de espaço reservado\n- Ative o fluxo de trabalho",
"height": 448,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-800,
-176
],
"id": "5ffd9cef-8202-4382-b878-6c99193e85c9",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Receber e Processar Requisição de Resolução\n\nLida com requisições de resolução recebidas e as processa através do Cloudflare Turnstile.",
"height": 336,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-240,
-176
],
"id": "6ad0812b-7141-41e4-96d6-e72e08a24405",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Avaliar Resposta do Resolutor\n\nVerifica erros na resposta do resolutor e direciona o fluxo adequadamente.",
"height": 336,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
352,
-176
],
"id": "8839e65a-8735-4135-9b0f-07ac081ebd70",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Responder ao Webhook\n\nEnvia uma resposta de volta ao webhook com base no sucesso ou falha do resolutor.",
"height": 528,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
656,
-256
],
"id": "2fec67ea-a216-4717-8336-2aa060c352ab",
"name": "Sticky Note3"
},
{
"parameters": {
"httpMethod": "POST",
"path": "solver-turnstile",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-192,
0
],
"id": "137be4f0-1762-4f0c-b993-c512d27e35de",
"name": "Receive Solver Request",
"webhookId": "901bdfa1-308c-4145-87fb-9c1958914751"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
112,
0
],
"id": "954ff1f0-d5de-4468-b0d1-fbce03676676",
"name": "Cloudflare Turnstile",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose",
"version": 2
},
"conditions": [
{
"id": "capsolver-err-001",
"leftValue": "={{ $json.error }}",
"operator": {
"type": "string",
"operation": "isNotEmpty",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
400,
0
],
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "CapSolver Error?"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ error: $json.error }) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
704,
-64
],
"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.5,
"position": [
704,
112
],
"id": "db264e2b-48ce-4887-9b2b-2b8077993c30",
"name": "Respond to Webhook"
}
],
"connections": {
"Receive Solver Request": {
"main": [
[
{
"node": "Cloudflare Turnstile",
"type": "main",
"index": 0
}
]
]
},
"Cloudflare Turnstile": {
"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
}
]
]
}
},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
O endpoint da API de resolução do Turnstile aceita os seguintes parâmetros:
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
websiteURL |
Sim | A URL da página que hospeda o widget Turnstile |
websiteKey |
Sim | A chave do site Turnstile |
metadata.action |
Não | String de ação exigida por alguns sites para o desafio Turnstile |
metadata.cdata |
Não | Dados personalizados passados para o widget Turnstile por alguns sites |
Dica: Você pode identificar o
websiteURLewebsiteKeyinspecionando o código-fonte da página ou usando a extensão de navegador CapSolver.
Comparado ao reCAPTCHA, o Turnstile é mais simples — você só precisa de dois parâmetros obrigatórios. Alguns sites podem exigir também os campos opcionais metadata.action ou metadata.cdata — adicione-os na seção Optional do nó se o token não estiver sendo aceito.
O fluxo de trabalho da API acima mostra como obter um token Turnstile resolvido. Mas o que você realmente faz com ele?
Na automação do mundo real, resolver o desafio é apenas metade do trabalho. Você precisa enviar o token para o site de destino — exatamente como um navegador faria — para desbloquear os dados ou a ação por trás da proteção do Turnstile.
Aqui está o padrão geral:
cf-turnstile-response)Exemplo: https://exemplo.com/ — Um site protegido por Turnstile
Manual Trigger → CapSolver Turnstile → HTTP POST Request → IF (check success) → Edit Fields (extract data)
Cloudflare Turnstilehttps://exemplo.com/login0x4AAAAAAA... (encontre-a inspecionando o código-fonte da página — veja Como Identificar Parâmetros do Turnstile)cf-turnstile-responseusername, password)Conceito chave: Cada site lida com o envio de tokens de forma diferente. Neste exemplo, o token vai em um campo
cf-turnstile-response.
A API de resolução e o exemplo de scraping acima mostram o padrão principal: resolver o Turnstile, enviar o token, processar o resultado. Os seguintes fluxos de trabalho estendem esse padrão para casos de uso prontos para produção — cada um com gatilhos duplos (agendamento + webhook), rastreamento de estado persistente e saída estruturada.
| Fluxo de Trabalho | Propósito |
|---|---|
Turnstile Scraping — Preço e Detalhes do Produto — CapSolver + Schedule + Webhook |
Faz o scraping do preço e nome do produto a cada 6 horas, compara com valores anteriores armazenados em staticData, alerta sobre mudanças |
Turnstile Account Login — CapSolver + Schedule + Webhook |
Faz login em sua própria conta em um site protegido por captcha, resolvendo primeiro e depois enviando as credenciais com o token |
Este fluxo de trabalho faz o scraping de uma página de produto a cada 6 horas (agendamento) ou sob demanda (webhook), extrai o preço usando o nó HTML e o compara com o valor armazenado anteriormente.
Caminho de agendamento:
A cada 6 Horas → Resolver Captcha → Buscar Página do Produto → Extrair Dados
→ Comparar Dados → Dados Alterados? → Construir Alerta / Sem Alteração
Comportamentos principais:
cf-turnstile-response (adapte ao formato esperado pelo seu site — alguns sites podem usar um nome de campo diferente).product-price, h1)$workflow.staticData.lastPrice persiste o preço anterior entre as execuçõesdeal) quanto aumentos (gravidade: info){
"nodes": [
{
"parameters": {
"content": "## Turnstile Scraping — Preço e Detalhes do Produto — CapSolver + Schedule + Webhook\n\n### Como funciona\n- Acionado por scheduleTrigger\n- Acionado por webhook\n- Define: websiteURL, websiteKey\n- CapSolver: Cloudflare Turnstile\n- Requisição GET\n- Extração HTML\n- Código personalizado\n\n### Configuração\n- Adicione sua chave de API **CapSolver** em Settings → Credentials\n- Configure os valores de espaço reservado\n- Ative o fluxo de trabalho",
"height": 928,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1312,
-272
],
"id": "e7600f37-30e2-414c-8482-136e850c7767",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Configuração de Scraping Agendado\n\nAciona o processo de scraping a cada 6 horas e configura as definições de destino.",
"height": 288,
"width": 496,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
-160
],
"id": "b5976b58-4e25-4db2-8968-b918d51ae3db",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Execução de Scraping Agendado\n\nResolve o Turnstile, busca a página do produto, extrai e compara os dados para o gatilho agendado.",
"height": 464,
"width": 1456,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-144,
-272
],
"id": "81ae9453-8fac-49c8-906e-f6054a1d5311",
"name": "Sticky Note2"
},
{
"parameters": {
"content": "## Configuração de Scraping via Webhook\n\nInicia o processo de scraping via gatilho de webhook e resolve o Turnstile.",
"height": 304,
"width": 528,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-752,
304
],
"id": "5b9d6820-6036-43d4-8d47-1c207864256e",
"name": "Sticky Note3"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 6
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-704,
-32
],
"id": "ts-s-901",
"name": "Every 6 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "websiteURL",
"value": "https://SEU-SITE-DESTINO.com/pagina-do-produto",
"type": "string"
},
{
"id": "cfg-002",
"name": "websiteKey",
"value": "SUA_CHAVE_DO_SITE_AQUI",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
-32
],
"id": "ts-s-900",
"name": "Set Target Config [Schedule]"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-96,
0
],
"id": "ts-s-902",
"name": "Solve Turnstile",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"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"
},
{
"name": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
208,
0
],
"id": "ts-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": "ts-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 || 'primeira verificação', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
688,
0
],
"id": "ts-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": [
864,
0
],
"id": "ts-s-906",
"name": "Data Changed?"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "alert",
"value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $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": [
1152,
-192
],
"id": "ts-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": [
1168,
32
],
"id": "ts-s-908",
"name": "No Change"
},
{
"parameters": {
"httpMethod": "POST",
"path": "price-monitor-turnstile",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-704,
432
],
"id": "ts-s-909",
"name": "Webhook Trigger",
"webhookId": "28b7ba21-7608-45c2-8552-ec91b8ce7c9b"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
-368,
432
],
"id": "ts-s-910",
"name": "Solve Turnstile [Webhook]",
"credentials": {
"capSolverApi": {
"id": "BeBFMAsySMsMGeE9",
"name": "CapSolver account"
}
}
},
{
"parameters": {
"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"
},
{
"name": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
-80,
432
],
"id": "ts-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": [
208,
432
],
"id": "ts-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 || 'primeira verificação', changed, direction, diff: changed ? `$${diff}` : null, checkedAt: new Date().toISOString() } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
512,
432
],
"id": "ts-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": [
704,
432
],
"id": "ts-s-914",
"name": "Data Changed? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a4",
"name": "alert",
"value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $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": [
960,
240
],
"id": "ts-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": [
992,
496
],
"id": "ts-s-916",
"name": "No Change [Webhook]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1248,
384
],
"id": "ts-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 Turnstile",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile": {
"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 Turnstile [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile [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
}
]
]
}
},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
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 de agendamento e [Webhook] para o caminho de webhook sob demanda. Edite o nó de configuração apropriado para configurar cada caminho.
Caminho de agendamento:
A cada 24 Horas → Definir Config de Login → Resolver Captcha → Enviar Login
→ Login Bem-sucedido? → Marcar Sucesso no Login / Marcar Falha no Login
Comportamentos principais:
Operation no nó Solve Captcha para outros tipos de captcha.email, password e cf-turnstile-response (edite o nó Submit Login diretamente para corresponder aos nomes dos campos do seu site).statusCode < 400 quanto a presença de um successMarker configurável no corpo da resposta.{
"nodes": [
{
"parameters": {
"content": "## Turnstile Account Login — CapSolver + Schedule + Webhook\n\n### Como funciona\n- Acionado por scheduleTrigger\n- Acionado por webhook\n- Define: websiteURL, websiteKey, successMarker\n- CapSolver: Cloudflare Turnstile\n- Requisição POST\n- Ramo condicional\n- Define: status, checkedAt\n\n### Configuração\n- Adicione sua chave de API **CapSolver** em Settings → Credentials\n- Configure os valores de espaço reservado\n- Ative o fluxo de trabalho",
"height": 768,
"width": 480
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-1168,
-128
],
"id": "887d0c97-af49-4830-99a3-8dd04a78ec10",
"name": "Sticky Note"
},
{
"parameters": {
"content": "## Processo de Login Agendado\n\nLida com o processo de login acionado a cada 24 horas",
"height": 416,
"width": 1920,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-608,
-128
],
"id": "3fac5b95-ad9c-4029-ac4b-c99952659970",
"name": "Sticky Note1"
},
{
"parameters": {
"content": "## Processo de Login via Webhook\n\nLida com o processo de login acionado por um webhook",
"height": 384,
"width": 2288,
"color": 7
},
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-624,
336
],
"id": "08fa3f86-8373-44ab-abb1-1358cbb3f963",
"name": "Sticky Note2"
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
-560,
48
],
"id": "ts-l-01",
"name": "Every 24 Hours"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "l1",
"name": "websiteURL",
"value": "https://SUA-PAGINA-DE-LOGIN.com",
"type": "string"
},
{
"id": "l2",
"name": "websiteKey",
"value": "SUA_CHAVE_DO_SITE_AQUI",
"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": [
-240,
48
],
"id": "ts-l-02",
"name": "Set Login Config [Schedule]"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.websiteURL }}",
"websiteKey": "={{ $json.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
256,
48
],
"id": "ts-l-03",
"name": "Solve Turnstile [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": "seu-email@exemplo.com"
},
{
"name": "password",
"value": "SUA_SENHA_DA_CONTA"
},
{
"name": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
576,
48
],
"id": "ts-l-04",
"name": "Submit Login [Schedule]"
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"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": [
896,
48
],
"id": "ts-l-05",
"name": "Login OK? [Schedule]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "s1",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "s2",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
-48
],
"id": "ts-l-06",
"name": "Mark Success"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f1",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "f2",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "f3",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
128
],
"id": "ts-l-07",
"name": "Mark Failed"
},
{
"parameters": {
"httpMethod": "POST",
"path": "account-login-turnstile",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-560,
448
],
"id": "ts-l-08",
"name": "Webhook Trigger",
"webhookId": "9c7a53a4-d3ee-495b-9381-3a9425bb1b36"
},
{
"parameters": {
"operation": "Cloudflare Turnstile",
"websiteURL": "={{ $json.body.websiteURL }}",
"websiteKey": "={{ $json.body.websiteKey }}",
"optional": {}
},
"type": "n8n-nodes-capsolver.capSolver",
"typeVersion": 1,
"position": [
256,
448
],
"id": "ts-l-09",
"name": "Solve Turnstile [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": "cf-turnstile-response",
"value": "={{ $json.data.solution.token }}"
}
]
},
"options": {
"response": {
"response": {
"fullResponse": true,
"neverError": true
}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.3,
"position": [
576,
448
],
"id": "ts-l-10",
"name": "Submit Login [Webhook]"
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": false,
"typeValidation": "strict"
},
"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": [
896,
448
],
"id": "ts-l-11",
"name": "Login OK? [Webhook]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "ws1",
"name": "status",
"value": "success",
"type": "string"
},
{
"id": "ws2",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
352
],
"id": "ts-l-12",
"name": "Mark Success [W]"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "wf1",
"name": "status",
"value": "failed",
"type": "string"
},
{
"id": "wf2",
"name": "statusCode",
"value": "={{ $json.statusCode }}",
"type": "number"
},
{
"id": "wf3",
"name": "checkedAt",
"value": "={{ new Date().toISOString() }}",
"type": "string"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1168,
544
],
"id": "ts-l-13",
"name": "Mark Failed [W]"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify($json) }}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.5,
"position": [
1504,
448
],
"id": "ts-l-14",
"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 Turnstile [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile [Schedule]": {
"main": [
[
{
"node": "Submit Login [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Schedule]": {
"main": [
[
{
"node": "Login OK? [Schedule]",
"type": "main",
"index": 0
}
]
]
},
"Login OK? [Schedule]": {
"main": [
[
{
"node": "Mark Success",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Failed",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Solve Turnstile [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Solve Turnstile [Webhook]": {
"main": [
[
{
"node": "Submit Login [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Submit Login [Webhook]": {
"main": [
[
{
"node": "Login OK? [Webhook]",
"type": "main",
"index": 0
}
]
]
},
"Login OK? [Webhook]": {
"main": [
[
{
"node": "Mark Success [W]",
"type": "main",
"index": 0
}
],
[
{
"node": "Mark Failed [W]",
"type": "main",
"index": 0
}
]
]
},
"Mark Success [W]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Mark Failed [W]": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"meta": {
"instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
}
}
Você aprendeu como construir uma API de resolução de Cloudflare Turnstile e fluxos de trabalho de scraping prontos para produção usando n8n e CapSolver — sem a necessidade de codificação tradicional.
Neste guia, cobrimos:
O ponto principal: resolver o desafio Turnstile é apenas metade do trabalho — você também precisa enviar o token para o site de destino para desbloquear os dados protegidos.
Dica: Esses fluxos de trabalho usam gatilhos de Agendamento (Schedule) + Webhook, mas você pode trocar o nó de gatilho por qualquer gatilho do n8n — manual, evento de app, envio de formulário, etc. Após buscar os dados, use os nós integrados do n8n para salvar os resultados no Google Sheets, bancos de dados, armazenamento em nuvem ou enviar alertas via Telegram/Slack/E-mail.
Pronto para começar? Cadastre-se no CapSolver e use o código de bônus n8n para um bônus extra de 8% em sua primeira recarga!

O Cloudflare Turnstile é uma alternativa de CAPTCHA que verifica os visitantes sem exigir que resolvam quebra-cabeças. Ele roda em segundo plano usando sinais do navegador e análise comportamental para determinar se um visitante é humano.
O preço varia com base no uso. Verifique a página de preços do CapSolver para as taxas atuais do Turnstile.
Os desafios do Turnstile são normalmente resolvidos em alguns segundos, já que não envolvem desafios de imagem.
Sim! Este fluxo de trabalho funciona tanto com o n8n auto-hospedado quanto com o n8n Cloud. O nó do CapSolver já está disponível como uma integração oficial — basta adicionar suas credenciais de API.
Pesquise no código-fonte da página por data-sitekey no HTML ou procure por turnstile.render() no JavaScript. Você também pode abrir o DevTools (F12) → aba Network (Rede) e filtrar por turnstile para encontrar a chave do site nas requisições. Para um guia detalhado, consulte a documentação do CapSolver.
Várias coisas podem causar isso. Primeiro, os tokens expiram rapidamente — certifique-se de enviar o token imediatamente. Segundo, verifique se você está enviando o token para o lugar certo: inspecione a requisição de rede real que o navegador faz quando você envia o formulário (DevTools → aba Network) e confirme o nome do campo (cf-turnstile-response é típico, mas não universal), o método da requisição e o endpoint — todos devem corresponder ao que você configurou no n8n. Terceiro, alguns sites exigem parâmetros metadata.action ou metadata.cdata — use a extensão CapSolver para verificar se algum deles se aplica. Se o token ainda for rejeitado, entre em contato com 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.
