Comparativas

reCAPTCHA v3 Enterprise vs estándar para automatización

¿Tu integración de reCAPTCHA v3 funcionaba y, de un día para otro, los tokens empezaron a rechazarse? Lo más habitual es que el sitio haya migrado de v3 estándar a Enterprise. La buena noticia para quien resuelve con CaptchaAI: toda la diferencia cabe en un parámetro, enterprise=1. El resto —códigos de motivo, umbrales por acción, defensor de cuentas— vive del lado del sitio, no del tuyo.

Esta comparativa va directa a lo que afecta a tu automatización, en tres puntos:

  • Qué añade Enterprise y cuánto de eso vive en tu código (casi nada).
  • Cómo saber cuál tienes delante antes de gastar una solicitud.
  • Por qué un mismo patrón puntúa distinto según la versión.

Diferencias entre v3 estándar y Enterprise, de un vistazo

Ambas funcionan de forma invisible y devuelven una puntuación entre 0.0 (bot) y 1.0 (humano). Enterprise solo añade una capa de administración y análisis encima.

Característica v3 estándar v3 Enterprise
Funcionamiento invisible
Puntuación (0.0–1.0)
Parámetro action Obligatorio Obligatorio
Códigos de motivo No
Umbrales por acción personalizables No Sí (desde la Cloud Console)
Detección de fugas de contraseña No
Defensor de cuentas No
Etiquetas de prevención de fraude No
Integración con MFA No
Endpoint de verificación siteverify (gratis) recaptchaenterprise.googleapis.com
Cuota mensual 1 millón de evaluaciones gratis Pago por evaluación
Archivo JS api.js?render=KEY enterprise.js?render=KEY
Parámetros en CaptchaAI version=v3 version=v3 + enterprise=1

Para tu automatización solo pesan dos filas de esa tabla:

  • El archivo JS (api.js frente a enterprise.js): qué versión tienes delante.
  • Los parámetros de CaptchaAI (enterprise=1 o no): lo único que cambias al resolver.

Por qué Enterprise puede puntuar distinto

El v3 estándar usa un modelo global; Enterprise añade capas encima, y eso explica muchas caídas de token tras migrar.

Aspecto de la puntuación Estándar Enterprise
Modelo base Modelo global de Google Modelo global de Google + señales propias del sitio
Umbrales por acción Uno solo para todas las acciones Distinto por acción (login = 0.7, checkout = 0.9)
Aprendizaje adaptativo Básico Aprende del tráfico concreto del sitio
Granularidad 0.0–1.0 (dos decimales) Mismo rango, con señales más matizadas
Falsos positivos Ajuste manual del umbral Automático, con análisis de códigos de motivo

Qué significa en la práctica:

  • Un sitio Enterprise puede exigir umbrales más estrictos en unas acciones que otras.
  • Por eso el action correcto pesa aún más: un 0.6 que servía para login quizá no llegue para checkout.

Códigos de motivo: qué te dicen y cómo usarlos

Las respuestas de Enterprise traen códigos de motivo que explican la puntuación asignada.

Código Qué significa Qué hacer en tu automatización
AUTOMATION Se detectó comportamiento automatizado Usa señales de navegador realistas
UNEXPECTED_ENVIRONMENT Entorno de navegador poco habitual Revisa la detección de navegador headless
TOO_MUCH_TRAFFIC Mucho volumen desde una misma fuente Aplica límite de solicitudes y reparte el tráfico entre IP de salida
UNEXPECTED_USAGE_PATTERNS Patrones de interacción anómalos Añade pausas realistas entre acciones
LOW_CONFIDENCE_SCORE Datos insuficientes para puntuar con confianza Envía más señales de comportamiento
SUSPECTED_CARDING Patrones de fraude con tarjetas Sin relevancia para la mayoría de automatizaciones
SUSPECTED_CHARGEBACK Patrones de fraude por contracargo Sin relevancia para la mayoría de automatizaciones

Nota: no verás estos códigos al resolver con CaptchaAI; Google los devuelve al backend del sitio durante la verificación. Conocerlos te sirve para entender por qué se rechaza un token que parece correcto.


Cómo saber qué versión usa una página

Detectarla antes de resolver evita gastar solicitudes; la pista está en el HTML, en tres señales:

  1. Si aparece enterprise.js, es Enterprise.
  2. Si aparece recaptcha/api.js con render=, es v3 estándar.
  3. La sitekey y la action salen de ese bloque, no de data-sitekey.

Detectar la versión desde el HTML

import requests
import re

def detect_v3_version(url):
    html = requests.get(url).text

    if "enterprise.js" in html:
        version = "enterprise"
    elif "recaptcha/api.js" in html and "render=" in html:
        version = "standard"
    else:
        return None

    # Extract sitekey
    key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
    sitekey = key_match.group(1) if key_match else None

    # Extract action
    action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
    action = action_match.group(1) if action_match else None

    return {"version": version, "sitekey": sitekey, "action": action}
const axios = require("axios");

async function detectV3Version(url) {
  const { data: html } = await axios.get(url);

  const version = html.includes("enterprise.js")
    ? "enterprise"
    : html.includes("recaptcha/api.js") && html.includes("render=")
      ? "standard"
      : null;

  const keyMatch = html.match(/render[=:]\s*['"]?([A-Za-z0-9_-]{40})/);
  const actionMatch = html.match(/action['"]?\s*[:=]\s*['"](\w+)/);

  return {
    version,
    sitekey: keyMatch?.[1],
    action: actionMatch?.[1],
  };
}

Resolver v3 estándar

Envías la tarea a in.php y consultas el resultado en res.php hasta que llega el token.

import requests
import time

resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "googlekey": sitekey,
    "action": "login",
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Resolver v3 Enterprise

Idéntico al anterior, con una línea de diferencia: enterprise=1.

import requests
import time

# Only difference: enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "enterprise": 1,
    "googlekey": sitekey,
    "action": "login",
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Un resolutor que detecta la versión solo

Como un sitio puede migrar sin avisar, lo robusto es detectar la versión en cada solicitud y activar la bandera enterprise sola:

class V3AutoSolver:
    def __init__(self, api_key):
        self.api_key = api_key

    def solve(self, page_url, action=None):
        import re
        html = requests.get(page_url).text

        is_enterprise = "enterprise.js" in html
        key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
        if not key_match:
            raise Exception("No v3 sitekey found")

        if not action:
            act_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
            action = act_match.group(1) if act_match else "verify"

        params = {
            "key": self.api_key,
            "method": "userrecaptcha",
            "version": "v3",
            "googlekey": key_match.group(1),
            "action": action,
            "pageurl": page_url
        }
        if is_enterprise:
            params["enterprise"] = 1

        resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit failed: {resp.text}")

        task_id = resp.text.split("|")[1]
        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key, "action": "get", "id": task_id
            })
            if result.text.startswith("OK|"):
                return result.text.split("|")[1]
            if result.text != "CAPCHA_NOT_READY":
                raise Exception(f"Solve error: {result.text}")
        raise Exception("Timed out")

Un caso práctico: QA de un login que migró a Enterprise

Imagina una agencia en Ciudad de México o Madrid con pruebas automáticas sobre el login de su propio SaaS. La secuencia típica de una migración, vista desde quien automatiza:

  1. Durante meses, las pruebas pasan con v3 estándar sin incidencias.
  2. Un lunes empiezan los rechazos de token sin que nadie haya tocado el test.
  3. En staging aparece enterprise.js donde antes había api.js: migró a Enterprise.
  4. El resolutor automático detecta el cambio y activa enterprise=1 sin que toques nada.

El modelo de CaptchaAI encaja con equipos que facturan en USD: se paga por thread concurrente, no por resolución, con resoluciones ilimitadas y sin recargos por tipo de CAPTCHA. Enterprise no cuesta más que estándar y el plan BASIC ($15/mes) suele bastar. Respeta siempre los términos de servicio y la normativa de datos aplicable.


Solución de problemas frecuentes

Síntoma Causa probable Qué revisar
Token rechazado en un sitio Enterprise Falta enterprise=1 Comprueba si hay enterprise.js y añade la bandera
Puntuación baja en Enterprise Parámetro action incorrecto Extrae la acción exacta de la llamada grecaptcha.enterprise.execute()
Funciona en pruebas y falla en producción El aprendizaje adaptativo marcó tu patrón Rota las IP de salida, añade pausas y varía el patrón de solicitudes
ERROR_WRONG_GOOGLEKEY La sitekey de v3 sale del parámetro render, no de data-sitekey Busca render=KEY en la URL del script
  • Falla siempre → parámetro: revisa enterprise=1 y que el action coincida.
  • Falla solo en producción → tráfico: rota las IP de salida y varía el ritmo.

Preguntas frecuentes

¿Tengo que cambiar mi código cuando un sitio migra de v3 estándar a Enterprise?

Casi nada: la integración es la misma salvo por añadir enterprise=1. Si tu resolutor detecta enterprise.js en cada solicitud, el cambio es automático.

¿Qué acción debo enviar cuando la página usa grecaptcha.enterprise.execute()?

La que aparece en esa misma llamada. Como Enterprise aplica umbrales distintos por acción, copiar la acción exacta (login, checkout…) evita rechazos.

¿Resolver Enterprise cuesta más que el v3 estándar con CaptchaAI?

No. CaptchaAI factura por thread concurrente y sin recargos por tipo de CAPTCHA: salen igual, y el código es idéntico salvo por un parámetro.

¿El "defensor de cuentas" de Enterprise puede bloquear mi automatización?

De forma indirecta, sí. Es una función del sitio, no de CaptchaAI, pero usa las mismas señales de comportamiento: si tus patrones se repiten, el aprendizaje adaptativo los marca. Reparte el tráfico entre IP de salida y varía el ritmo.


Guías relacionadas

Los comentarios están deshabilitados para este artículo.