ProdutosIntegraçõesRecursosDocumentaçãoPreços
Começar agora

© 2026 CapSolver. All rights reserved.

Contacte-nos

Slack: lola@capsolver.com

Produtos

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Extensão de Navegador
  • Mais tipos de CAPTCHA

Integrações

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Parceiros
  • Ver todas as integrações

Recursos

  • Programa de Referenciação
  • Documentação
  • Referência da API
  • Blog
  • FAQ
  • Glossário
  • Estado

Legal

  • Termos de Serviço
  • Política de Privacidade
  • Política de Reembolso
  • Não vender os meus dados pessoais
//Como resolver o Cloudflare Turnstile usando CapSolver e n8n
Mar09, 2026

Como resolver o Cloudflare Turnstile usando CapSolver e n8n

Adélia Cruz

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:

  • Uma API de resolução para Cloudflare Turnstile

Fluxos de trabalho de uso direto — CapSolver incorporado como uma etapa dentro de automações maiores:

  • Um scraper de preços e produtos que resolve o Turnstile, busca páginas protegidas e alerta sobre mudanças de preço
  • Uma automação de login de conta que resolve o Turnstile antes de enviar as credenciais

O que é o Cloudflare Turnstile?

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.


Pré-requisitos

Antes de começar, certifique-se de ter o seguinte:

  1. Uma instância do n8n — Seja auto-hospedada ou n8n Cloud
  2. Uma conta no CapSolver — Cadastre-se aqui e obtenha sua chave de API
  3. O nó do CapSolver no n8n — Já disponível como um nó oficial no n8n (sem necessidade de instalação)
  4. Extensão de navegador do CapSolver (opcional, mas recomendada) — Para identificar parâmetros de captcha em sites de destino

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.


Configurando o CapSolver no n8n

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.

Passo 1: Abra a Página de Credenciais

Vá para sua instância do n8n e navegue até Settings (Configurações) → Credentials (Credenciais). Você verá todas as suas credenciais configuradas aqui.

página de credenciais do n8n mostrando a conta CapSolver

Passo 2: Crie a Credencial do CapSolver

  1. Clique em Create credential (Criar credencial) (canto superior direito)
  2. Pesquise por "CapSolver" e selecione CapSolver API
  3. Insira sua API Key — copie-a diretamente do Painel do CapSolver
  4. Deixe Allowed HTTP Request Domains definido como All (padrão)
  5. Clique em Save (Salvar)

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

Configuração de credencial do CapSolver com teste de conexão bem-sucedido

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!


Fluxo de Trabalho: API de Resolução do Cloudflare Turnstile

Este fluxo de trabalho cria um endpoint de API POST que aceita parâmetros do Turnstile e retorna um token resolvido.

Cloudflare Turnstile

Como Funciona

O fluxo de trabalho consiste em quatro nós:

  1. Webhook — Recebe requisições POST com parâmetros do Turnstile
  2. Cloudflare Turnstile — Envia o desafio para o CapSolver e aguarda uma solução
  3. CapSolver Error? — Nó IF que ramifica dependendo se a resolução falhou ($json.error não está vazio)
  4. Respond to Webhook — Retorna a solução em caso de sucesso, ou {"error": "..."} em caso de falha

Configuração dos Nós

1. Nó Webhook

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

2. Nó CapSolver Cloudflare 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ó.

3. Nó CapSolver Error? (IF)

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.

4. Nós Respond to Webhook

Ramo de Sucesso (saída falsa de CapSolver Error?):

Configuração Valor
Respond With JSON
Response Body ={{ JSON.stringify($json.data) }}

Teste-o

Envie uma requisição POST para o seu endpoint de webhook:

bash Copy
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:

json Copy
{
  "taskId": "abc123...",
  "solution": {
    "token": "0.XXXXXXXXXXXXXXXX..."
  },
  "status": "ready"
}

Importar Este Fluxo de Trabalho

Copie o JSON abaixo e importe-o para o n8n via Menu → Import from JSON:

Clique para expandir o JSON do fluxo de trabalho
json Copy
{
  "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"
  }
}

Referência de Parâmetros da API

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 websiteURL e websiteKey inspecionando 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.


Fluxo de Trabalho: Enviando um Token Turnstile para um Site

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:

  1. Resolver o desafio → Obter o token do CapSolver
  2. Enviar o token → Enviá-lo para o site de destino via uma Requisição HTTP (geralmente como um campo de formulário cf-turnstile-response)
  3. Verificar a resposta → Verificar se o site aceitou o token
  4. Processar o resultado → Extrair os dados que você precisa

Exemplo: Resolvendo e Enviando o Turnstile

Exemplo: https://exemplo.com/ — Um site protegido por Turnstile

Fluxo do Trabalho

Copy
Manual Trigger → CapSolver Turnstile → HTTP POST Request → IF (check success) → Edit Fields (extract data)

Como Funciona

  1. Manual Trigger — Inicia o fluxo de trabalho manualmente (clique em "Execute workflow"). Você pode substituir isso por qualquer gatilho — Webhook, Agendamento (Schedule), Evento de App, etc.
  2. CapSolver Cloudflare Turnstile — Resolve o desafio Turnstile:
    • Operation: Cloudflare Turnstile
    • Website URL: https://exemplo.com/login
    • Website Key: 0x4AAAAAAA... (encontre-a inspecionando o código-fonte da página — veja Como Identificar Parâmetros do Turnstile)
  3. HTTP POST Request — Envia o token resolvido para o site de destino:
    • O token é enviado no campo de formulário cf-turnstile-response
    • Inclua quaisquer outros campos de formulário que o site espera (ex: username, password)
    • Isso é o que um navegador faz quando você envia o formulário após o Turnstile validá-lo
  4. IF Node — Verifica se a resposta indica sucesso (ex: um redirecionamento, uma mensagem de sucesso ou campos JSON específicos)
  5. Edit Fields — Extrai os dados necessários da resposta. Em um cenário real, é aqui que você analisaria o HTML usando o nó HTML para extrair elementos específicos (ex: dados do usuário, listagens de produtos, conteúdo do painel) e mapeá-los para seus campos de saída.

Conceito chave: Cada site lida com o envio de tokens de forma diferente. Neste exemplo, o token vai em um campo cf-turnstile-response.


Fluxo de Trabalho: Exemplos de Casos de Uso

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

Exemplo 1: Scraping

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:

Copy
A cada 6 Horas → Resolver Captcha → Buscar Página do Produto → Extrair Dados
  → Comparar Dados → Dados Alterados? → Construir Alerta / Sem Alteração

Comportamentos principais:

  • O token é enviado como um cabeçalho cf-turnstile-response (adapte ao formato esperado pelo seu site — alguns sites podem usar um nome de campo diferente)
  • O nó HTML extrai o preço e o nome do produto via seletores CSS (.product-price, h1)
  • $workflow.staticData.lastPrice persiste o preço anterior entre as execuções
  • A comparação de preços detecta tanto quedas (gravidade: deal) quanto aumentos (gravidade: info)
Clique para expandir o JSON completo do fluxo de trabalho (17 nós)
json Copy
{
  "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"
  }
}

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 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:

Copy
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:

  • O padrão é Cloudflare Turnstile — altere a Operation no nó Solve Captcha para outros tipos de captcha.
  • Os parâmetros do corpo são fixos: email, password e cf-turnstile-response (edite o nó Submit Login diretamente para corresponder aos nomes dos campos do seu site).
  • A verificação Login Successful? avalia tanto o statusCode < 400 quanto a presença de um successMarker configurável no corpo da resposta.
  • O caminho do Webhook usa o Set Login Config [Webhook] com os mesmos valores de espaço reservado fixos — edite esse nó para configurar o caminho sob demanda do webhook.
  • O caminho do webhook retorna o resultado como JSON via Respond to Webhook.
Clique para expandir o JSON completo do fluxo de trabalho (15 nós)
json Copy
{
  "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"
  }
}

Conclusão

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:

  • Um endpoint de API resolutor para Cloudflare Turnstile usando um fluxo de trabalho baseado em webhook.
  • Exemplos de casos de uso — scraping e login de conta — mostrando como enviar tokens resolvidos e processar dados protegidos.
  • Como identificar parâmetros do Turnstile inspecionando o código-fonte da página.
  • Melhores práticas para manuseio de tokens, gerenciamento de erros e uso em produção.

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!

Banner do código de bônus CapSolver

Perguntas Frequentes

O que é o Cloudflare Turnstile?

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.

Quanto custa para resolver um desafio Turnstile?

O preço varia com base no uso. Verifique a página de preços do CapSolver para as taxas atuais do Turnstile.

Quanto tempo leva para resolver um desafio Turnstile?

Os desafios do Turnstile são normalmente resolvidos em alguns segundos, já que não envolvem desafios de imagem.

Posso usar este fluxo de trabalho com o n8n Cloud?

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.

Como encontro a chave do site (site key) do Turnstile para um site?

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.

O CapSolver retornou um token, mas o site ainda o rejeitou — por quê?

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.

Ver mais

Web ScrapingApr 22, 2026

Arquitetura de Web Scraping em Rust para Extração de Dados Escalável

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.

Adélia Cruz
Adélia Cruz
Web ScrapingApr 08, 2026

Selenium vs Puppeteer para Resolução de CAPTCHA: Comparação de Desempenho e Caso de Uso

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.

Índice

Ethan Collins
Ethan Collins
Web ScrapingFeb 10, 2026

Dados como Serviço (DaaS): O que é e por que importa em 2026

Entenda Dados como Serviço (DaaS) em 2026. Descubra seus benefícios, casos de uso e como transforma os negócios com visões em tempo real e escalabilidade.

Ethan Collins
Ethan Collins
Web ScrapingFeb 05, 2026

Como corrigir erros comuns de raspagem da web em 2026

Dominar a correção de diversos erros de raspagem de web, como 400, 401, 402, 403, 429, 5xx e 1001 do Cloudflare em 2026. Aprenda estratégias avançadas para rotação de IPs, cabeçalhos e limitação de taxa adaptativa com o CapSolver.

Rajinder Singh
Rajinder Singh
Blog
Web Scraping