# Cloudflare Turnstile

> Obtenha tokens do Cloudflare Turnstile com o YesCaptcha: TurnstileTaskProxyless, TurnstileTaskProxylessM1 e TurnstileTask com proxy próprio, parâmetros, exemplos e formato do resultado, e a diferença em relação à página de desafio do Cloudflare.

Source: https://docs.yescaptcha.com/pt/tasks/turnstile/ · Last verified: 2026-10-21

> This page was machine-translated from the Chinese version. If anything differs, the Chinese version prevails: https://docs.yescaptcha.com/zh/tasks/turnstile/

Uma tarefa do Cloudflare Turnstile retorna um token (`token`) que você envia ao site de destino para passar na verificação. `TurnstileTaskProxyless` custa 25 pontos (≈ US$3.75 / 1k) por tarefa e é assíncrona: primeiro `createTask`, depois `getTaskResult` a cada 5 segundos. Tarefas com falha ou que expiram têm reembolso de pontos automático.

- POST `https://api.yescaptcha.com/createTask` (Endpoint global)
- POST `https://cn.yescaptcha.com/createTask` (Endpoint China)

O corpo da requisição é JSON, autenticado com `clientKey`. Consulte o resultado no mesmo endpoint em que criou a tarefa.

## Quando usar

Um widget de verificação do Cloudflare (“Confirme que você é humano”) está embutido em um formulário da página, e a página carrega um script de `challenges.cloudflare.com/turnstile`.

Se a página inteira é bloqueada pelo Cloudflare e exibe “Just a moment…” ou “Verificando seu navegador”, isso é a página de desafio do Cloudflare, não o Turnstile; use [página de desafio do Cloudflare](https://docs.yescaptcha.com/pt/tasks/cloudflare-challenge.md). A diferença está em [Identificar o tipo de captcha](https://docs.yescaptcha.com/pt/guides/identify-captcha.md).

## Tipos de tarefa e preços

| Tipo de tarefa | Preço | Modo | Observações |
| --- | --- | --- | --- |
| `TurnstileTaskProxyless` | US$3.75 / 1k; 25 pontos/tarefa · ¥25 / 1k | Assíncrono |  |
| `TurnstileTaskProxylessM1` | US$4.50 / 1k; 30 pontos/tarefa · ¥30 / 1k | Assíncrono |  |
| `TurnstileTask` | US$3.75 / 1k; 25 pontos/tarefa · ¥25 / 1k | Assíncrono | Proxy próprio |

Os preços em dólares americanos são estimativas com base em US$1 ≈ ¥6.67; as tarefas são cobradas em pontos.

-   `TurnstileTaskProxyless` e `TurnstileTaskProxylessM1` têm os mesmos parâmetros e rotas diferentes; um pode servir de reserva para o outro.
-   `TurnstileTask` carrega o captcha pelo seu próprio proxy e exige os campos de proxy.

## Parâmetros da requisição

| Campo | Tipo | Obrigatório | Descrição |
| --- | --- | --- | --- |
| `type` | string | Sim | Tipo de tarefa; veja "Tipos de tarefa e preços" nesta página |
| `websiteURL` | string | Sim | URL completa da página que exibe o captcha. Use o site em que você vê o captcha, não o domínio do fornecedor do captcha |
| `websiteKey` | string | Sim | A chave do site (sitekey) do Turnstile, normalmente começando com 0x |
| `pageAction` | string | Não | A `action` que a página passa ao Turnstile (uma opção de `turnstile.render`, ou `data-action` no elemento do widget), por exemplo `login`. Não é necessária na maioria dos casos; adicione somente quando as tarefas continuarem falhando |
| `data` | string | Não | O `cData` que a página passa ao Turnstile (uma opção de `turnstile.render`, ou `data-cdata` no elemento do widget), por exemplo `c0bd4b36-7419-4e18-83c6-378699f2a9a2`. Não é necessário na maioria dos casos; adicione somente quando as tarefas continuarem falhando |
| `proxyType` | string | Alguns tipos | Protocolo do proxy: `http`, `https`, `socks4` ou `socks5` (Obrigatório para TurnstileTask) |
| `proxyAddress` | string | Alguns tipos | Endereço IP ou nome de host do proxy. Endereços locais ou privados, como 127.0.0.1 ou 192.168.x.x, não funcionam porque nossos servidores não conseguem acessá-los (Obrigatório para TurnstileTask) |
| `proxyPort` | integer | Alguns tipos | Porta do proxy (Obrigatório para TurnstileTask) |
| `proxyLogin` | string | Não | Nome de usuário do proxy, se o proxy exigir autenticação (somente TurnstileTask) |
| `proxyPassword` | string | Não | Senha do proxy, se o proxy exigir autenticação (somente TurnstileTask) |
| `userAgent` | string | Não | User-Agent do navegador. Se o resultado contiver um `userAgent`, use esse valor ao enviar o token (somente TurnstileTask) |

`websiteKey` geralmente começa com `0x`. Como encontrá-lo: [Encontrar os parâmetros do Turnstile](https://docs.yescaptcha.com/pt/guides/find-turnstile-parameters.md).

### Se as tarefas continuam falhando: pageAction e data

Na maioria dos casos, basta enviar `websiteURL` e `websiteKey`; esses dois parâmetros não são necessários. Se você tem certeza de que `websiteURL` e `websiteKey` estão corretos e a tarefa ainda falha, verifique se a página passa `action` e `cData` ao Turnstile (opções de `turnstile.render`, ou `data-action` e `data-cdata` no elemento do widget). Se passar, envie-os exatamente como estão:

-   `pageAction`: o `action` da página, por exemplo `login`
-   `data`: o `cData` da página, por exemplo `c0bd4b36-7419-4e18-83c6-378699f2a9a2`

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY",
    "pageAction": "login",
    "data": "c0bd4b36-7419-4e18-83c6-378699f2a9a2"
  }
}
```

## Exemplo de requisição

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY"
  }
}
```

**curl**

```bash
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY"
  }
}'

# Returns {"errorId":0,"taskId":"..."}; then poll every 5 seconds:
curl -s https://api.yescaptcha.com/getTaskResult \
  -H 'Content-Type: application/json' \
  -d '{"clientKey": "YOUR_CLIENT_KEY", "taskId": "TASK_ID"}'
```

**Python**

solve.py

```python
import os
import time

import requests

API = "https://api.yescaptcha.com"
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]  # Read the clientKey from an environment variable

def call(method, payload):
    r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30)
    data = r.json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data

def solve(task):
    task_id = call("createTask", {"task": task})["taskId"]
    for _ in range(36):  # Poll every 5 seconds, for up to about 3 minutes
        time.sleep(5)
        result = call("getTaskResult", {"taskId": task_id})
        if result.get("status") == "ready":
            return result["solution"]
    raise TimeoutError(task_id)

solution = solve({
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY",
})
print(solution["token"])
```

**Node.js**

solve.mjs

```js
const API = 'https://api.yescaptcha.com';
const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable

async function call(method, payload) {
  const res = await fetch(`${API}/${method}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }),
  });
  const data = await res.json();
  if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  return data;
}

async function solve(task) {
  const { taskId } = await call('createTask', { task });
  for (let i = 0; i < 36; i++) { // Poll every 5 seconds, for up to about 3 minutes
    await new Promise((r) => setTimeout(r, 5000));
    const result = await call('getTaskResult', { taskId });
    if (result.status === 'ready') return result.solution;
  }
  throw new Error(`timeout: ${taskId}`);
}

const solution = await solve({
  type: "TurnstileTaskProxyless",
  websiteURL: "https://example.com/login",
  websiteKey: "0x4AAAAAAA_SITE_KEY",
});
console.log(solution.token);
```

Substitua `websiteURL` e `websiteKey` pelos valores do site de destino.

## Resultado

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "0.ufq5RgSVZd11DPSX1brdrxnEs28KcVlKj2ORchqxSy2q9yAW6ciq3hriXDF4x...",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
  }
}
```

| Campo | Tipo | Descrição |
| --- | --- | --- |
| `token` | string | O token a ser enviado ao site de destino. Uso único; envie-o o quanto antes |
| `userAgent` | string | O User-Agent usado para obter o token. Use este valor ao enviar o token, mesmo que seja diferente do que você enviou |

Preencha o campo `cf-turnstile-response` da página (ou o campo exigido pela API do site de destino) com o `token` e envie, usando como User-Agent da requisição o `userAgent` retornado.

Enquanto a tarefa está em andamento, a resposta é `{"errorId": 0, "status": "processing"}`; consulte novamente após 5 segundos. Em caso de erro, trate conforme o `errorCode`; veja [Códigos de erro](https://docs.yescaptcha.com/pt/api/errors.md).

## Perguntas frequentes

### Por quanto tempo um token é válido?

É de uso único. Envie-o o quanto antes após recebê-lo (o token do Turnstile geralmente expira em alguns minutos, conforme definido pelo Cloudflare).

### O site continua rejeitando o envio

Confirme que `websiteURL` é a página em que o widget aparece, que `websiteKey` está correto e que o envio usa o `userAgent` retornado. Se a página passa `action` e `cData`, envie-os como `pageAction` e `data`; veja [Se as tarefas continuam falhando](#se-as-tarefas-continuam-falhando-pageaction-e-data). Se o site também verifica o IP, use `TurnstileTask` e faça o envio pelo mesmo proxy.

## Guias relacionados

-   [Identificar o tipo de captcha](https://docs.yescaptcha.com/pt/guides/identify-captcha.md)
-   [Encontrar os parâmetros do Turnstile](https://docs.yescaptcha.com/pt/guides/find-turnstile-parameters.md)
