Troubleshooting

reCAPTCHA v3 Score Always 0.1: Root Causes and Fixes

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

  1. Open target page → DevTools → Sources tab
  2. Search for grecaptcha.execute
  3. Find: grecaptcha.execute('sitekey', {action: 'submit'})
  4. 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.



Get high v3 scores — solve with CaptchaAI.

Discussions (0)

No comments yet.