# reCAPTCHA v2

> Obtén tokens de reCAPTCHA v2 (casilla, invisible y Enterprise) con YesCaptcha: tipos de tarea y precios, parámetros de la solicitud, ejemplos en curl/Python/Node.js y formato del resultado.

Source: https://docs.yescaptcha.com/es/tasks/recaptcha-v2/ · Last verified: 2026-10-15

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

Una tarea de reCAPTCHA v2 devuelve un token (`gRecaptchaResponse`) que envías al sitio de destino para pasar la verificación, sin necesidad de hacer clic en imágenes. El tipo más usado, `NoCaptchaTaskProxyless`, cuesta 15 puntos (≈ $2.25 / 1k) por tarea y es asíncrono: crea la tarea con `createTask` y luego llama a `getTaskResult` cada 5 segundos para obtener el resultado. Las tareas fallidas o que superan el tiempo de espera reciben 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 tu `clientKey` (cópiala desde el Panel de [yescaptcha.com](https://yescaptcha.com/)). Consulta el resultado en el mismo endpoint en el que creaste la tarea.

## Cuándo usarlo

-   La página muestra la casilla “No soy un robot” (I’m not a robot): versión con casilla.
-   No hay casilla y el desafío con imágenes aparece solo después de pulsar el botón de envío: versión invisible. Añade `"isInvisible": true`.
-   La página carga `recaptcha/enterprise.js`, o las URL de las solicitudes contienen `enterprise`: versión Enterprise. Usa un tipo con `Enterprise` en el nombre.

Si no estás seguro de cuál es, consulta [Identificar el tipo de captcha](https://docs.yescaptcha.com/es/guides/identify-captcha.md). Si los tokens no pasan con la frecuencia suficiente, prueba el [reconocimiento de imágenes de reCAPTCHA v2](https://docs.yescaptcha.com/es/tasks/recaptcha-classification.md): la API te indica qué imágenes pulsar y tú haces clic en ellas en el navegador.

## Tipos y precios

| Tipo de tarea | Precio | Modo | Notas |
| --- | --- | --- | --- |
| `NoCaptchaTaskProxyless` | $2.25 / 1k; 15 puntos/tarea · ¥15 / 1k | Asíncrono |  |
| `RecaptchaV2TaskProxyless` | $3.00 / 1k; 20 puntos/tarea · ¥20 / 1k | Asíncrono | Mismos parámetros que NoCaptchaTaskProxyless en una ruta distinta; puedes usar cualquiera de los dos como respaldo |
| `NoCaptchaTask` | $2.25 / 1k; 15 puntos/tarea · ¥15 / 1k | Asíncrono | Proxy propio |
| `RecaptchaV2EnterpriseTaskProxyless` | $3.00 / 1k; 20 puntos/tarea · ¥20 / 1k | Asíncrono |  |
| `RecaptchaV2EnterpriseTask` | $3.00 / 1k; 20 puntos/tarea · ¥20 / 1k | Asíncrono | Proxy propio |

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

-   `NoCaptchaTaskProxyless` y `RecaptchaV2TaskProxyless` tienen los mismos parámetros y distinta ruta. Si uno no pasa con la frecuencia suficiente, prueba el otro.
-   Los tipos sin `Proxyless` en el nombre (`NoCaptchaTask`, `RecaptchaV2EnterpriseTask`) cargan el captcha a través de tu propio proxy y requieren `proxyType`, `proxyAddress`, `proxyPort` y otros campos. Úsalos cuando el sitio de destino compruebe la IP del visitante.

## Parámetros de la solicitud

Campos del objeto `task` en `createTask`:

| 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), que se encuentra en el código fuente de la página o en las solicitudes de red; normalmente no cambia |
| `isInvisible` | boolean | No | Envía true para la variante invisible; en otro caso, omítelo |
| `proxyType` | string | Algunos tipos | Protocolo del proxy: `http`, `https`, `socks4` o `socks5` (Obligatorio para NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `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 NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyPort` | integer | Algunos tipos | Puerto del proxy (Obligatorio para NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyLogin` | string | No | Usuario del proxy, si el proxy requiere autenticación (solo NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `proxyPassword` | string | No | Contraseña del proxy, si el proxy requiere autenticación (solo NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `userAgent` | string | No | User-Agent del navegador. Si el resultado contiene un `userAgent`, usa ese valor al enviar el token (solo NoCaptchaTask, RecaptchaV2EnterpriseTask) |
| `enterprisePayload` | object | No | Parámetros adicionales de la versión Enterprise, como el valor `s` de reCAPTCHA Enterprise: `{"s": "..."}`. Omítelo si la página no lo usa (solo RecaptchaV2EnterpriseTaskProxyless, RecaptchaV2EnterpriseTask) |

Para encontrar `websiteURL` y `websiteKey`, consulta [Encontrar los parámetros de reCAPTCHA](https://docs.yescaptcha.com/es/guides/find-recaptcha-parameters.md).

## Ejemplo de solicitud

Con la página de demostración oficial de Google:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
  }
}
```

Código completo que crea la tarea, consulta cada 5 segundos e imprime el token. Antes de ejecutarlo, guarda tu ClientKey en la variable de entorno `YESCAPTCHA_CLIENT_KEY`:

**curl**

```bash
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
  }
}'

# 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": "NoCaptchaTaskProxyless",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
})
print(solution["gRecaptchaResponse"])
```

**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: "NoCaptchaTaskProxyless",
  websiteURL: "https://www.google.com/recaptcha/api2/demo",
  websiteKey: "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
});
console.log(solution.gRecaptchaResponse);
```

Para la versión Enterprise, si la página pasa un valor `s` a reCAPTCHA, colócalo en `enterprisePayload`:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "RecaptchaV2EnterpriseTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "SITE_KEY_OF_THE_PAGE",
    "enterprisePayload": {
      "s": "S_VALUE_FROM_THE_PAGE"
    }
  }
}
```

Con tu propio proxy:

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

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "NoCaptchaTask",
    "websiteURL": "https://www.google.com/recaptcha/api2/demo",
    "websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "proxyType": "http",
    "proxyAddress": "proxy.example.com",
    "proxyPort": 8080,
    "proxyLogin": "user",
    "proxyPassword": "pass"
  }
}
```

## Resultado

`createTask` devuelve un ID de tarea:

```json
{
  "errorId": 0,
  "taskId": "61138bb6-19fb-11ec-a9c8-0242ac110006"
}
```

Úsalo para llamar a `getTaskResult`. Mientras la tarea sigue en proceso, recibes `{"errorId": 0, "status": "processing"}`; consulta de nuevo 5 segundos después. Cuando termina, devuelve:

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "gRecaptchaResponse": "03AGdBq25SxXT-pmSeBXjzScW-EiocHwwpwqtk1QXlJnGnU..."
  }
}
```

| Campo | Tipo | Descripción |
| --- | --- | --- |
| `gRecaptchaResponse` | string | El token que debes enviar al sitio de destino. De un solo uso, válido durante unos 120 segundos; úsalo en un plazo de 60 segundos |

Una tarea se procesa durante un máximo de unos 110 segundos; pasado ese tiempo devuelve `ERROR_TASK_TIMEOUT` y se reembolsan los puntos. Cuando hay un error, `errorId` es 1; gestiónalo según `errorCode`, como se describe en [Códigos de error](https://docs.yescaptcha.com/es/api/errors.md). Para saber cómo enviar el token, consulta [Completar reCAPTCHA con un token](https://docs.yescaptcha.com/es/guides/submit-recaptcha-token.md).

> **Consejo:** El token es de un solo uso y es válido durante unos 120 segundos; envíalo en los 60 segundos posteriores a recibirlo.

## Preguntas frecuentes

### ¿Por qué los tokens de un mismo sitio a veces pasan y a veces no?

Lo decide el sitio de destino. Puntúa cada verificación y aplica un umbral que puede cambiar en cualquier momento, por lo que la tasa de éxito varía según el sitio y no todos los tokens pasan. Puedes comparar con otro tipo de tarea del mismo captcha o cambiar al [reconocimiento de imágenes](https://docs.yescaptcha.com/es/tasks/recaptcha-classification.md).

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

Es de un solo uso y es válido durante unos 120 segundos. Envíalo en los 60 segundos posteriores a recibirlo. Google establece este límite.

### ¿Se cobran puntos si falla el reconocimiento?

No. Las tareas que devuelven `ERROR_CAPTCHA_UNSOLVABLE` o superan el tiempo de espera reciben un reembolso de puntos automático. Consulta [Facturación y reembolsos](https://docs.yescaptcha.com/es/getting-started/billing.md).

## Guías relacionadas

-   [Identificar el tipo de captcha](https://docs.yescaptcha.com/es/guides/identify-captcha.md)
-   [Encontrar los parámetros de reCAPTCHA](https://docs.yescaptcha.com/es/guides/find-recaptcha-parameters.md)
-   [Completar reCAPTCHA con un token](https://docs.yescaptcha.com/es/guides/submit-recaptcha-token.md)
-   [Clics de reconocimiento de imágenes de reCAPTCHA v2 con Selenium](https://docs.yescaptcha.com/es/guides/recaptcha-click-selenium.md)
