A score of 0.1 means Google considers the interaction highly likely to be a bot. Here's why this happens and how to fix it with CaptchaAI.
How reCAPTCHA v3 Scoring Works
| Score | Meaning |
|---|---|
| 0.9 | Very likely human |
| 0.7 | Probably human |
| 0.5 | Uncertain |
| 0.3 | Probably bot |
| 0.1 | Very likely bot |
Sites set their own threshold. Common thresholds:
- Login forms: 0.5+
- Registration: 0.7+
- Checkout: 0.3+ (more lenient)
Root Cause 1: Wrong Action Parameter
The action parameter must match exactly what the site uses.
# WRONG — generic or missing action
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITEKEY",
"pageurl": "https://example.com/login",
"version": "v3",
# No action specified — defaults to generic
"json": 1,
}
# CORRECT — matching site's action
data = {
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITEKEY",
"pageurl": "https://example.com/login",
"version": "v3",
"action": "login", # Must match site's grecaptcha.execute action
"json": 1,
}
How to Find the Correct Action
- Open target page → DevTools → Sources tab
- Search for
grecaptcha.execute - Find:
grecaptcha.execute('sitekey', {action: 'submit'}) - Use that exact action value
import re
import requests
def extract_v3_action(page_url):
"""Extract reCAPTCHA v3 action from page source."""
resp = requests.get(page_url, timeout=15)
# Pattern: grecaptcha.execute('key', {action: 'value'})
match = re.search(
r"grecaptcha\.execute\([^,]+,\s*\{[^}]*action:\s*['\"]([^'\"]+)",
resp.text,
)
if match:
return match.group(1)
return None
action = extract_v3_action("https://example.com/login")
print(f"Action: {action}") # e.g., "login", "submit", "homepage"
Root Cause 2: Missing version=v3
Without the version parameter, CaptchaAI may treat it as v2:
# WRONG — treated as v2, returns checkbox token
data = {
"method": "userrecaptcha",
"googlekey": "V3_SITEKEY",
"pageurl": "https://example.com",
"json": 1,
}
# CORRECT — explicitly v3
data = {
"method": "userrecaptcha",
"googlekey": "V3_SITEKEY",
"pageurl": "https://example.com",
"version": "v3",
"json": 1,
}
Root Cause 3: Using v2 Sitekey for v3
v2 and v3 use different sitekeys. Using the wrong one produces low scores.
def detect_recaptcha_version(page_url):
"""Detect whether page uses v2 or v3."""
resp = requests.get(page_url, timeout=15)
html = resp.text
# v3 indicators
if "recaptcha/api.js?render=" in html and "render=explicit" not in html:
return "v3"
if "grecaptcha.execute(" in html:
return "v3"
# v2 indicators
if 'data-sitekey="' in html:
return "v2"
if "grecaptcha.render(" in html:
return "v2"
return "unknown"
Root Cause 4: Using min_score Incorrectly
min_score tells CaptchaAI the minimum acceptable score. If the achieved score is lower, CaptchaAI reports an error instead of returning a low-score token.
# Request score of 0.9 — may take longer or fail
data = {
"method": "userrecaptcha",
"version": "v3",
"min_score": "0.9", # Very strict
# ...
}
# Request score of 0.3 — faster, more reliable
data = {
"method": "userrecaptcha",
"version": "v3",
"min_score": "0.3", # More lenient
# ...
}
Recommended approach: Start with the site's threshold and increase if needed.
Complete Correct v3 Submission
import requests
import time
def solve_v3(api_key, sitekey, pageurl, action="submit", min_score="0.7"):
"""Solve reCAPTCHA v3 with correct parameters."""
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"version": "v3",
"action": action,
"min_score": min_score,
"json": 1,
}, timeout=30)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(f"Submit error: {result.get('request')}")
task_id = result["request"]
# Poll
time.sleep(10)
for _ in range(16):
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
return data["request"]
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve error: {data['request']}")
time.sleep(5)
raise TimeoutError("v3 solve timeout")
# Usage
token = solve_v3(
api_key="YOUR_API_KEY",
sitekey="V3_SITEKEY",
pageurl="https://example.com/login",
action="login",
min_score="0.7",
)
Troubleshooting
| Issue | Cause | Fix |
|---|---|---|
| Score always 0.1 | Wrong action parameter | Extract correct action from page |
| Token works but site rejects | Score below site threshold | Increase min_score |
| v3 returns v2-style token | Missing version=v3 |
Add version parameter |
| Score varies randomly | Google's scoring algorithm | Normal — use min_score filter |
FAQ
Can CaptchaAI guarantee a specific score?
CaptchaAI aims for the minimum score you request via min_score. Typical results are 0.7-0.9. A score of exactly 0.9 is not guaranteed on every attempt.
What happens if the score is below min_score?
CaptchaAI returns an error instead of a low-score token. Your code should retry with a fresh request.
Does the action parameter affect the score?
Yes. Using the wrong action typically results in lower scores. Google validates that the action matches what the site expects.
Related Guides
Get high v3 scores — solve with CaptchaAI.
Discussions (0)
Join the conversation
Sign in to share your opinion.
Sign InNo comments yet.