¿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 | Sí | Sí |
| Puntuación (0.0–1.0) | Sí | Sí |
Parámetro action |
Obligatorio | Obligatorio |
| Códigos de motivo | No | Sí |
| Umbrales por acción personalizables | No | Sí (desde la Cloud Console) |
| Detección de fugas de contraseña | No | Sí |
| Defensor de cuentas | No | Sí |
| Etiquetas de prevención de fraude | No | Sí |
| Integración con MFA | No | Sí |
| 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.jsfrente aenterprise.js): qué versión tienes delante. - Los parámetros de CaptchaAI (
enterprise=1o 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
actioncorrecto pesa aún más: un 0.6 que servía paraloginquizá no llegue paracheckout.
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:
- Si aparece
enterprise.js, es Enterprise. - Si aparece
recaptcha/api.jsconrender=, es v3 estándar. - La sitekey y la
actionsalen de ese bloque, no dedata-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:
- Durante meses, las pruebas pasan con v3 estándar sin incidencias.
- Un lunes empiezan los rechazos de token sin que nadie haya tocado el test.
- En staging aparece
enterprise.jsdonde antes habíaapi.js: migró a Enterprise. - El resolutor automático detecta el cambio y activa
enterprise=1sin 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=1y que elactioncoincida. - 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.