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.


The four root causes that pin your score at 0.1

flowchart TD
  START[Score returned: 0.1] --> Q1{action parameter<br/>matches site?}
  Q1 -->|no| F1[Root cause 1:<br/>wrong action<br/>&rarr; pass exact action]
  Q1 -->|yes| Q2{version=v3<br/>in solver payload?}
  Q2 -->|no| F2[Root cause 2:<br/>missing version=v3<br/>&rarr; add version=v3]
  Q2 -->|yes| Q3{sitekey is a real<br/>v3 sitekey?}
  Q3 -->|no, v2 sitekey| F3[Root cause 3:<br/>v2 sitekey used for v3<br/>&rarr; extract correct sitekey]
  Q3 -->|yes| Q4{standard v3 or<br/>v3 Enterprise?}
  Q4 -->|Enterprise, no enterprise=1| F4[Root cause 4:<br/>missing enterprise=1<br/>&rarr; add enterprise=1 to the payload]
  Q4 -->|matched correctly| OTHER[Move on to<br/>proxy / browser signals]
  F1 --> FIX[Re-submit clean payload]
  F2 --> FIX
  F3 --> FIX
  F4 --> FIX

Walk this tree top-to-bottom on any failing token before touching browser/proxy code — in this order, these four causes account for the large majority of stuck-at-0.1 reports.


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: Treating Standard v3 Like v3 Enterprise

A reCAPTCHA v3 Enterprise sitekey submitted as plain v3 (no enterprise=1) is the fourth major reason scores stay pinned at 0.1. The CaptchaAI request schema for v3 Enterprise requires enterprise=1 alongside key, method, version=v3, googlekey, and pageurl — there is no score-target or score-target parameter in either v3 or v3 Enterprise.

If the page loads recaptcha/enterprise.js and calls grecaptcha.enterprise.execute(...), your CaptchaAI payload must include enterprise=1. To influence the score, attach signals via cookies, userAgent, and proxy — those are the only score-influencing levers on the API.

# CORRECT (standard v3)
std = {
    "method": "userrecaptcha",
    "version": "v3",
    "googlekey": "V3_SITEKEY",
    "pageurl": "https://example.com/login",
    "action": "login",
    # optional score-influencing signals:
    # "cookies": "name1=val1; name2=val2",
    # "userAgent": "Mozilla/5.0 ...",
    # "proxy": "user:pass@host:port", "proxytype": "HTTP",
}

# CORRECT (v3 Enterprise)
ent = {
    "method": "userrecaptcha",
    "version": "v3",
    "enterprise": 1,        # required for Enterprise sitekeys
    "googlekey": "V3E_SITEKEY",
    "pageurl": "https://example.com/login",
    "action": "login",
    # same score-influencing signals as above
}

Recommended approach: detect whether the page loads api.js (standard v3) or enterprise.js (v3 Enterprise) and set enterprise=1 accordingly.


Complete Correct v3 Submission

import requests
import time

def solve_v3(api_key, sitekey, pageurl, action="submit", enterprise=False):
    """Solve reCAPTCHA v3 with correct parameters.

    There is no score-target parameter on the CaptchaAI API. To influence
    the score, pass cookies / userAgent / proxy via the optional fields
    documented at https://docs.captchaai.com.
    """
    payload = {
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "version": "v3",
        "action": action,
        "json": 1,
    }
    if enterprise:
        payload["enterprise"] = 1
    resp = requests.post("https://ocr.captchaai.com/in.php", data=payload, 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 — standard v3
token = solve_v3(
    api_key="YOUR_API_KEY",
    sitekey="V3_SITEKEY",
    pageurl="https://example.com/login",
    action="login",
)

# Usage — v3 Enterprise
token_ent = solve_v3(
    api_key="YOUR_API_KEY",
    sitekey="V3E_SITEKEY",
    pageurl="https://example.com/login",
    action="login",
    enterprise=True,
)

Troubleshooting

Issue Cause Fix
Score always 0.1 Wrong action parameter Extract correct action from page
v3 returns v2-style token Missing version=v3 Add version parameter

FAQ

Can CaptchaAI guarantee a specific score?

No — Google decides the score, and CaptchaAI does not expose any score-target parameter on its API (no score-target, no equivalent field on either v3 or v3 Enterprise). The CaptchaAI v3 Enterprise schema requires only key, method, version, googlekey, pageurl, and enterprise. To improve the score, attach better signals using cookies, userAgent, and proxy.

What if the score I get back is below my site's threshold?

There is no parameter to demand a higher floor. The fixes are signal-side: pass a realistic userAgent, warmed-up cookies, and a residential proxy — or, if the page exposes a v2 fallback, switch paths.

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.

Comments are disabled for this article.