# Cloudflare Turnstile

> Obtén tokens de Cloudflare Turnstile con YesCaptcha: TurnstileTaskProxyless, TurnstileTaskProxylessM1 y TurnstileTask con tu propio proxy, parámetros, ejemplos y formato del resultado; y en qué se diferencia de la página de verificación de Cloudflare.

Source: https://docs.yescaptcha.com/es/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/

Una tarea de Cloudflare Turnstile devuelve un token (`token`) que envías al sitio de destino para superar la verificación. `TurnstileTaskProxyless` cuesta 25 puntos (≈ $3.75 / 1k) por tarea y es asíncrona: primero `createTask` y después `getTaskResult` cada 5 segundos. Si la tarea falla o expira, se hace un reembolso de puntos automático.

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

El cuerpo de la solicitud es JSON y se autentica con `clientKey`. Consulta el resultado en el mismo endpoint en el que creaste la tarea.

## Cuándo usarlo

Un formulario de la página incluye el cuadro de verificación de Cloudflare (“Confirma que eres humano”) y la página carga el script de `challenges.cloudflare.com/turnstile`.

Si Cloudflare bloquea toda la página y muestra “Un momento…” o “Verificando su navegador”, se trata de la página de verificación de Cloudflare, no de Turnstile; usa [página de verificación de Cloudflare](https://docs.yescaptcha.com/es/tasks/cloudflare-challenge.md). Consulta las diferencias en [Identificar el tipo de captcha](https://docs.yescaptcha.com/es/guides/identify-captcha.md).

## Tipos de tarea y precios

| Tipo de tarea | Precio | Modo | Notas |
| --- | --- | --- | --- |
| `TurnstileTaskProxyless` | $3.75 / 1k; 25 puntos/tarea · ¥25 / 1k | Asíncrono |  |
| `TurnstileTaskProxylessM1` | $4.50 / 1k; 30 puntos/tarea · ¥30 / 1k | Asíncrono |  |
| `TurnstileTask` | $3.75 / 1k; 25 puntos/tarea · ¥25 / 1k | Asíncrono | Proxy propio |

Los precios en dólares son estimaciones con US$1 ≈ ¥6.67; las tareas se cobran en puntos.

-   `TurnstileTaskProxyless` y `TurnstileTaskProxylessM1` tienen los mismos parámetros y distinta ruta; puedes usar uno como respaldo del otro.
-   `TurnstileTask` carga el captcha con tu propio proxy y requiere los campos de proxy.

## Parámetros de la solicitud

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `type` | string | Sí | Tipo de tarea; consulta "Tipos de tarea y precios" en esta página |
| `websiteURL` | string | Sí | URL completa de la página que muestra el captcha. Usa el sitio donde ves el captcha, no el dominio del proveedor del captcha |
| `websiteKey` | string | Sí | La clave del sitio (sitekey) de Turnstile, normalmente empieza por 0x |
| `pageAction` | string | No | La `action` que la página pasa a Turnstile (una opción de `turnstile.render`, o `data-action` en el elemento del widget), p. ej. `login`. No es necesaria en la mayoría de los casos; agrégala solo cuando las tareas sigan fallando |
| `data` | string | No | El `cData` que la página pasa a Turnstile (una opción de `turnstile.render`, o `data-cdata` en el elemento del widget), p. ej. `c0bd4b36-7419-4e18-83c6-378699f2a9a2`. No es necesario en la mayoría de los casos; agrégalo solo cuando las tareas sigan fallando |
| `proxyType` | string | Algunos tipos | Protocolo del proxy: `http`, `https`, `socks4` o `socks5` (Obligatorio para TurnstileTask) |
| `proxyAddress` | string | Algunos tipos | Dirección IP o nombre de host del proxy. Las direcciones locales o privadas como 127.0.0.1 o 192.168.x.x no funcionan porque nuestros servidores no pueden acceder a ellas (Obligatorio para TurnstileTask) |
| `proxyPort` | integer | Algunos tipos | Puerto del proxy (Obligatorio para TurnstileTask) |
| `proxyLogin` | string | No | Usuario del proxy, si el proxy requiere autenticación (solo TurnstileTask) |
| `proxyPassword` | string | No | Contraseña del proxy, si el proxy requiere autenticación (solo TurnstileTask) |
| `userAgent` | string | No | User-Agent del navegador. Si el resultado contiene un `userAgent`, usa ese valor al enviar el token (solo TurnstileTask) |

`websiteKey` suele empezar por `0x`. Para saber cómo encontrarlo, consulta [Encontrar los parámetros de Turnstile](https://docs.yescaptcha.com/es/guides/find-turnstile-parameters.md).

### Si la tarea no pasa: pageAction y data

En la gran mayoría de los casos basta con `websiteURL` y `websiteKey`, y no necesitas estos dos parámetros. Si estás seguro de que `websiteURL` y `websiteKey` son correctos y la tarea sigue sin pasar, revisa si la página pasa `action` y `cData` a Turnstile (opciones de `turnstile.render`, o `data-action` y `data-cdata` en el elemento del cuadro de verificación). Si los pasa, envíalos tal cual:

-   `pageAction`: el `action` de la página, por ejemplo `login`
-   `data`: el `cData` de la página, por ejemplo `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"
  }
}
```

## Ejemplo de solicitud

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);
```

Sustituye `websiteURL` y `websiteKey` por los valores del sitio 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 | Descripción |
| --- | --- | --- |
| `token` | string | El token que debes enviar al sitio de destino. De un solo uso; envíalo lo antes posible |
| `userAgent` | string | El User-Agent usado para obtener el token. Usa este valor al enviar el token, aunque sea distinto del que enviaste |

Coloca el `token` en el campo `cf-turnstile-response` de la página (o en el campo que exija la API del sitio de destino) y envíalo, usando como User-Agent el `userAgent` devuelto.

Mientras se procesa, la respuesta es `{"errorId": 0, "status": "processing"}`; vuelve a consultar 5 segundos después. Si hay un error, gestiónalo según `errorCode`; consulta [Códigos de error](https://docs.yescaptcha.com/es/api/errors.md).

## Preguntas frecuentes

### ¿Cuánto tiempo es válido el token?

Es de un solo uso. Te recomendamos enviarlo lo antes posible tras obtenerlo (los tokens de Turnstile suelen caducar en pocos minutos, según lo decide Cloudflare).

### Tras el envío, el sitio sigue sin aceptarlo

Comprueba que `websiteURL` sea la página donde aparece el cuadro de verificación, que `websiteKey` sea correcto y que en el envío uses el `userAgent` devuelto. Si la página pasa `action` y `cData`, envíalos como `pageAction` y `data`; consulta [Si la tarea no pasa](#si-la-tarea-no-pasa-pageaction-y-data) más arriba. Si el sitio también comprueba la IP, usa `TurnstileTask` y haz el envío a través del mismo proxy.

## Tutoriales relacionados

-   [Identificar el tipo de captcha](https://docs.yescaptcha.com/es/guides/identify-captcha.md)
-   [Encontrar los parámetros de Turnstile](https://docs.yescaptcha.com/es/guides/find-turnstile-parameters.md)
