Troubleshooting

Errores comunes al resolver reCAPTCHA v2 y cómo solucionarlos

La mayoría de las fallas de reCAPTCHA v2 se dividen en tres grupos: errores en la etapa de solicitud (parámetros incorrectos enviados a la API), problemas en la etapa de resultados (problemas de sondeo o tareas sin solución) y rechazos de la página de destino (la API devuelve un token válido pero la página lo ignora). Los mayores culpables son casi siempre los mismos: googlekey incorrecto, pageurl incorrecto, omitir la función callback o tokens caducados.

Esta guía analiza cada patrón de falla común con la solución exacta para cada uno. Si eres nuevo resolviendo reCAPTCHA v2, lee Cómo resolver reCAPTCHA v2 usando la API primero.


Los cuatro mayores puntos de falla de reCAPTCHA v2

Antes de profundizar en los códigos de error individuales, verifíquelos primero: cubren el 80% de las fallas.

1. googlekey incorrecto o faltante

El googlekey (clave del sitio) proviene del atributo data-sitekey en el widget reCAPTCHA o del parámetro k en la URL de anclaje. Si este valor es incorrecto, está en blanco o se copia de una página diferente, la API rechaza la tarea inmediatamente con ERROR_GOOGLEKEY o ERROR_WRONG_GOOGLEKEY.

Cómo encontrar la clave de sitio correcta:

# Look for data-sitekey in the page HTML
# <div class="g-recaptcha" data-sitekey="6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-"></div>

# Or find it in the anchor URL
# https://www.google.com/recaptcha/api2/anchor?k=6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-

2. pageurl incorrecto

pageurl debe ser la URL exacta donde se carga el widget reCAPTCHA. Si el widget está dentro de un iframe alojado en un dominio diferente, necesitará la URL del iframe, no la URL de la página principal. Enviar la URL incorrecta provoca ERROR_PAGEURL o ERROR_BAD_TOKEN_OR_PAGEURL.

3. Callback no ejecutado

Algunas páginas utilizan una función callback de JavaScript en lugar del campo oculto g-recaptcha-response. Si inyectas el token en el campo oculto pero la página espera un callback, el formulario nunca se envía. Busca data-callback en el widget o una propiedad callback en grecaptcha.render().

4. Token caducado o reutilizado

Los tokens reCAPTCHA son válidos para un solo uso y caducan después de aproximadamente 2 minutos. Si su automatización tarda demasiado entre recibir el token y enviar el formulario, o si reutiliza un token, la página de destino lo rechaza silenciosamente.


Errores en la etapa de solicitud (en.php)

Estos errores ocurren cuando envía la tarea CAPTCHA a https://ocr.captchaai.com/in.php.

Código de error Causa Solución
ERROR_WRONG_USER_KEY El formato de la clave API no es válido (no tiene 32 caracteres) Verifica tu clave API en captchaai.com/api.php
ERROR_KEY_DOES_NOT_EXIST La clave API no existe en el sistema. Verifica que hayas copiado la clave completa sin espacios adicionales
ERROR_ZERO_BALANCE El saldo de la cuenta es cero. Recarga tu cuenta o comprueba el número de hilos activos
ERROR_PAGEURL Falta el parámetro pageurl Agrega la URL completa donde aparece el widget reCAPTCHA
ERROR_GOOGLEKEY googlekey tiene un formato incorrecto o está vacío Extrae la sitekey correcta de la página
ERROR_WRONG_GOOGLEKEY Falta por completo el parámetro googlekey Agrega googlekey a tu solicitud de API
ERROR_BAD_TOKEN_OR_PAGEURL El par googlekey + pageurl no es válido Comprueba si el widget está en un iframe; usa la URL del iframe
ERROR_BAD_PARAMETERS Faltan parámetros requeridos o están mal formados Revisa la documentación de la API para campos obligatorios

Ejemplo: solicitud correcta con manejo de errores

import requests

def submit_recaptcha_v2(api_key, sitekey, page_url):
    response = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": page_url,
        "json": 1
    })

    data = response.json()

    if data.get("status") == 1:
        return data["request"]  # task ID

    error = data.get("request", "UNKNOWN_ERROR")

    if error == "ERROR_WRONG_USER_KEY":
        raise ValueError("API key format is invalid. Must be 32 characters.")
    elif error == "ERROR_ZERO_BALANCE":
        raise RuntimeError("Account balance is zero. Top up at captchaai.com")
    elif error == "ERROR_PAGEURL":
        raise ValueError("pageurl parameter is missing from request")
    elif error in ("ERROR_GOOGLEKEY", "ERROR_WRONG_GOOGLEKEY"):
        raise ValueError(f"Invalid sitekey. Verify the data-sitekey value on the page.")
    elif error == "ERROR_BAD_TOKEN_OR_PAGEURL":
        raise ValueError("Sitekey/pageurl mismatch. Check if widget is in an iframe.")
    else:
        raise RuntimeError(f"API error: {error}")

# Usage
task_id = submit_recaptcha_v2("YOUR_API_KEY", "6Le-wvkSAAAAAN...", "https://staging.example.com/qa-login")
print(f"Task submitted: {task_id}")
async function submitRecaptchaV2(apiKey, sitekey, pageUrl) {
  const params = new URLSearchParams({
    key: apiKey,
    method: "userrecaptcha",
    googlekey: sitekey,
    pageurl: pageUrl,
    json: 1,
  });

  const res = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
  const data = await res.json();

  if (data.status === 1) return data.request;

  const error = data.request || "UNKNOWN_ERROR";
  const fixes = {
    ERROR_WRONG_USER_KEY: "API key format is invalid. Must be 32 characters.",
    ERROR_ZERO_BALANCE: "Account balance is zero. Top up at captchaai.com",
    ERROR_PAGEURL: "pageurl parameter is missing from request",
    ERROR_GOOGLEKEY: "Invalid sitekey. Check the data-sitekey attribute.",
    ERROR_BAD_TOKEN_OR_PAGEURL: "Sitekey/pageurl mismatch. Check iframe context.",
  };

  throw new Error(fixes[error] || `API error: ${error}`);
}

// Usage
const taskId = await submitRecaptchaV2("YOUR_API_KEY", "6Le-wvkSAAAAAN...", "https://staging.example.com/qa-login");
console.log(`Task submitted: ${taskId}`);

Errores en la etapa de resultados (res.php)

Estos errores ocurren al sondear https://ocr.captchaai.com/res.php para obtener el resultado.

Código de error Causa Solución
CAPCHA_NOT_READY La solución aún está en progreso. Espera 5 segundos y vuelve a sondear. Esto es normal.
ERROR_CAPTCHA_UNSOLVABLE El CAPTCHA no se pudo solucionar Envía una nueva tarea con nuevos parámetros
ERROR_WRONG_ID_FORMAT El formato de ID de tarea no es válido Verifica el ID devuelto por in.php
ERROR_WRONG_CAPTCHA_ID El ID de tarea no existe Comprueba que has guardado el ID de tarea correcto
ERROR_EMPTY_ACTION Falta el parámetro action=get Agrega action=get a tu solicitud de sondeo

Ejemplo: sondeo con manejo adecuado de errores

import time
import requests

def poll_result(api_key, task_id, timeout=120):
    start = time.time()

    while time.time() - start < timeout:
        time.sleep(5)

        response = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key,
            "action": "get",
            "id": task_id,
            "json": 1
        })

        data = response.json()

        if data.get("status") == 1:
            return data["request"]  # solved token

        error = data.get("request", "")

        if error == "CAPCHA_NOT_READY":
            continue  # normal — keep waiting
        elif error == "ERROR_CAPTCHA_UNSOLVABLE":
            raise RuntimeError("CAPTCHA unsolvable. Submit a new task with fresh params.")
        elif error in ("ERROR_WRONG_ID_FORMAT", "ERROR_WRONG_CAPTCHA_ID"):
            raise ValueError(f"Invalid task ID: {task_id}")
        else:
            raise RuntimeError(f"Polling error: {error}")

    raise TimeoutError(f"Solve timed out after {timeout}s")

# Usage
token = poll_result("YOUR_API_KEY", task_id)
print(f"Token: {token[:50]}...")
async function pollResult(apiKey, taskId, timeout = 120000) {
  const start = Date.now();

  while (Date.now() - start < timeout) {
    await new Promise((r) => setTimeout(r, 5000));

    const params = new URLSearchParams({
      key: apiKey,
      action: "get",
      id: taskId,
      json: 1,
    });

    const res = await fetch(`https://ocr.captchaai.com/res.php?${params}`);
    const data = await res.json();

    if (data.status === 1) return data.request;

    if (data.request === "CAPCHA_NOT_READY") continue;
    if (data.request === "ERROR_CAPTCHA_UNSOLVABLE")
      throw new Error("Unsolvable. Submit a new task.");
    throw new Error(`Polling error: ${data.request}`);
  }

  throw new Error(`Solve timed out after ${timeout / 1000}s`);
}

Rechazos de página de destino

La API devolvió un token válido pero el sitio de destino aún lo rechaza. Estos son los fallos más difíciles de depurar porque la API cree que todo funcionó.

Token inyectado en el campo equivocado

Algunas páginas buscan el token en el área de texto g-recaptcha-response. Otros usan grecaptcha.getResponse(). Otros esperan una devolución de llamada. Si elige el método de inyección incorrecto, el envío del formulario falla silenciosamente.

Solución: Inspeccione la página para determinar la ruta esperada:

# Method 1: Hidden field injection
driver.execute_script(
    'document.getElementById("g-recaptcha-response").innerHTML = arguments[0];',
    token
)

# Method 2: Callback execution (check data-callback attribute)
driver.execute_script(f'onCaptchaSuccess("{token}");')

# Method 3: Direct form field + submit
driver.execute_script(
    'document.querySelector("[name=g-recaptcha-response]").value = arguments[0];',
    token
)
driver.find_element("css selector", "form").submit()

Callback no activado

Si el widget tiene data-callback="onSuccess" o usa grecaptcha.render() con una propiedad callback, llenar el campo oculto por sí solo no hace nada. Debes llamar a la función callback directamente.

Solución: Busca y llama al callback:

// In browser console or Puppeteer/Playwright
// Check for data-callback
const widget = document.querySelector('.g-recaptcha');
const callbackName = widget?.getAttribute('data-callback');
if (callbackName && window[callbackName]) {
  window[callbackName](token);
}

Token caducado

Si pasan más de ~2 minutos entre la recepción del token y el envío del formulario, Google lo rechaza. Esto es común en procesos de automatización lentos.

Solución: Envíe el formulario inmediatamente después de recibir el token. Si su proceso es lento, solicite la solución más cerca del paso de envío en lugar de al principio.

El widget está en un iframe.

Si el reCAPTCHA se carga dentro de un iframe de un dominio diferente, debe usar la URL de origen del iframe como pageurl, no la URL de la página principal. El error ERROR_BAD_TOKEN_OR_PAGEURL suele indicar este problema.

Solución: Inspeccione la página, busque el iframe que contiene reCAPTCHA y use la URL src de ese iframe como su pageurl.


Lista de verificación de diagnóstico rápido

Síntoma Lo primero que hay que comprobar
ERROR_GOOGLEKEY o ERROR_WRONG_GOOGLEKEY ¿Se ha copiado correctamente la sitekey de data-sitekey?
ERROR_PAGEURL ¿Incluíste la URL de la página completa?
ERROR_BAD_TOKEN_OR_PAGEURL ¿Está el widget dentro de un iframe? Usa la URL del iframe.
CAPCHA_NOT_READY durante más de 3 minutos Normal para desafíos difíciles. Aumenta el timeout a 180 s.
ERROR_CAPTCHA_UNSOLVABLE Envía una nueva tarea. Si se repite, verifica la sitekey + pageurl.
El token funciona pero la página no hace nada. Comprueba si hay data-callback. Llama a la función callback.
El token regresa pero el formulario aún falla El token puede estar caducado (>2 min). Envía más rápido.
Fallos intermitentes Agrega lógica de reintento con IDs de tarea nuevos.

Preguntas frecuentes

¿Por qué falla reCAPTCHA v2 incluso cuando la solicitud parece correcta?

Las tres causas más comunes son: (1) pageurl no coincide con el contexto real del widget, especialmente cuando el widget está dentro de un iframe, (2) la página espera una función callback pero solo completaste el campo oculto, o (3) el token expiró antes de enviar el formulario.

¿Cuál es el error más común al resolver reCAPTCHA v2?

Usar el googlekey incorrecto o el pageurl incorrecto. Esto es especialmente común cuando el widget reCAPTCHA se carga en un iframe de un dominio o subdominio diferente: la sitekey y la URL deben coincidir con el contexto del iframe, no con la página principal.

¿Qué significa CAPCHA_NOT_READY?

Significa que el CAPTCHA todavía se está resolviendo. Esto no es un error. Espera 5 segundos y vuelve a sondear res.php. Los tiempos típicos de resolución de reCAPTCHA v2 son de 15 a 60 segundos.

¿Qué debo hacer si la API devuelve un token pero la página aún lo rechaza?

Verifica tres cosas en orden: (1) ¿La página utiliza un callback? Busca data-callback en el widget. (2) ¿Tu pageurl es correcto, especialmente si el widget está en un iframe? (3) ¿Pasaron más de 2 minutos entre la recepción y el uso del token?

¿Cómo manejo ERROR_CAPTCHA_UNSOLVABLE?

Envía una nueva tarea con parámetros nuevos. No vuelvas a intentar el mismo ID de tarea. Si este error ocurre repetidamente, verifica que la sitekey y la pageurl coincidan con la página real y que el tipo CAPTCHA sea reCAPTCHA v2 estándar (no Enterprise, que requiere parámetros diferentes).


Optimiza tu workflow de reCAPTCHA v2

  1. Verifica tus entradas: extrae googlekey de data-sitekey y usa la URL de la página exacta (verifica si hay iframes)
  2. Verifica el método de inyección: determina si la página espera un campo oculto, un callback o ambos.
  3. Envía de inmediato: usa el token dentro de los 2 minutos posteriores a su recepción
  4. Agrega manejo de errores: usa los ejemplos de código anteriores para detectar y manejar cada tipo de error

Comienza a resolver reCAPTCHA v2 con el solucionador CaptchaAI. Obtén tu clave API en captchaai.com/api.php.


Guías relacionadas

  • Cómo resolver reCAPTCHA v2 usando la API — tutorial completo paso a paso
  • Cómo resolver el callback de reCAPTCHA v2 usando la API — guía específica de callbacks
  • Errores comunes de reCAPTCHA v2 Enterprise — errores específicos de Enterprise
  • Referencia de códigos de error CaptchaAI — lista completa de códigos de error
Los comentarios están deshabilitados para este artículo.

Publicaciones relacionadas

Explainers Guía de extracción de URL de reCAPTCHA Anchor y Bframe
Explicación clara sobre Guía de extracción de URL de re CAPTCHA Anchor y Bframe y lo que implica para automatización, integración y tasas de éxito con Captcha A...

Explicación clara sobre Guía de extracción de URL de re CAPTCHA Anchor y Bframe y lo que implica para automati...

Apr 28, 2026
Explainers Análisis profundo de la API de evaluación empresarial reCAPTCHA
Explicación clara sobre Análisis profundo de la API de evaluación empresarial re CAPTCHA y lo que implica para automatización, integración y tasas de éxito con...

Explicación clara sobre Análisis profundo de la API de evaluación empresarial re CAPTCHA y lo que implica para...

Apr 28, 2026