reCAPTCHA v3 Enterprise combines score-based verification with Google's Enterprise backend. It runs silently and returns a risk score, but token verification goes through recaptchaenterprise.googleapis.com instead of the public siteverify endpoint. To solve it through CaptchaAI, add two flags: version=v3 and enterprise=1.
What you need
| Requirement | Details |
|---|---|
| CaptchaAI API key | captchaai.com/api.php |
| Sitekey | From enterprise.js?render=SITEKEY |
| Action | From grecaptcha.enterprise.execute(key, {action: '...'}) |
| Page URL | Full URL where v3 Enterprise runs |
Detect v3 Enterprise
// Enterprise v3 indicators:
// 1. Script: <script src="https://www.google.com/recaptcha/enterprise.js?render=SITEKEY"></script>
// 2. Execute call: grecaptcha.enterprise.execute('SITEKEY', {action: 'login'})
// 3. No visible checkbox or challenge — it runs silently
// Standard v3 uses api.js and grecaptcha (not enterprise)
Submit to CaptchaAI
import requests
import time
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"enterprise": 1,
"googlekey": "6LfZil0UAAAAADM1Dpzsw9q...",
"action": "login",
"pageurl": "https://example.com/login",
"json": 1
})
data = response.json()
task_id = data["request"]
# Poll for result
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
print(f"Token: {token[:50]}...")
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Error: {result['request']}")
const params = new URLSearchParams({
key: "YOUR_API_KEY", method: "userrecaptcha", version: "v3",
enterprise: 1, googlekey: "6LfZil0UAAAAADM1Dpzsw9q...",
action: "login", pageurl: "https://example.com/login", json: 1,
});
const submitRes = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const { request: taskId } = await submitRes.json();
let token;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const res = await fetch(`https://ocr.captchaai.com/res.php?${new URLSearchParams({
key: "YOUR_API_KEY", action: "get", id: taskId, json: 1,
})}`);
const data = await res.json();
if (data.status === 1) { token = data.request; break; }
if (data.request !== "CAPCHA_NOT_READY") throw new Error(data.request);
}
Use the token
Submit the token with your request — v3 Enterprise tokens go in the g-recaptcha-response field:
response = requests.post("https://example.com/api/login", data={
"username": "user",
"password": "pass",
"g-recaptcha-response": token
})
Enterprise v3 vs standard v3
| Feature | Standard v3 | Enterprise v3 |
|---|---|---|
| Script | api.js?render=KEY |
enterprise.js?render=KEY |
| JS object | grecaptcha.execute() |
grecaptcha.enterprise.execute() |
| Verification | siteverify |
recaptchaenterprise.googleapis.com |
| CaptchaAI params | version=v3 |
version=v3 + enterprise=1 |
FAQ
What parameters do I add for Enterprise v3?
Two: version=v3 and enterprise=1. Both are required.
What score does CaptchaAI return for Enterprise v3?
Typically 0.3. Most Enterprise implementations accept this score.
How do I find the action for Enterprise v3?
Search for grecaptcha.enterprise.execute in the page JavaScript. The second argument contains {action: 'value'}.
Can Enterprise v3 use data-s?
Some implementations include data-s. If present on the page, include it in your CaptchaAI request.
Why is my Enterprise v3 token rejected?
Common causes: missing enterprise=1, wrong action value, wrong sitekey, or token expired (>2 min).
Start solving reCAPTCHA v3 Enterprise
Get your API key at captchaai.com/api.php. Add version=v3 and enterprise=1 to your request.
Discussions (0)
Join the conversation
Sign in to share your opinion.
Sign InNo comments yet.