reCAPTCHA

Best reCAPTCHA v2 Solver

reCAPTCHA v2 is the most widely deployed CAPTCHA challenge on the web. It appears in two forms: the familiar checkbox ("I'm not a robot") and the invisible variant that triggers silently based on user behavior signals. Both require a solving service to return a g-recaptcha-response token.

This guide ranks the best solvers for reCAPTCHA v2 based on current CaptchaRank benchmark data.

reCAPTCHA v2 Solver Rankings

Rank Provider Solve Speed Success Rate Notes
1 CaptchaAI 7–12s ~98–99% Best overall for v2
2 Anti-Captcha 8–14s ~95–97% Excellent; JSON API
3 CapMonster Cloud 8–15s ~94–96% Anti-Captcha compatible
4 NopeCHA 6–10s ~90–94% Fast within supported set
5 2Captcha 12–18s ~75–80% Best type coverage overall

How reCAPTCHA v2 Solving Works

Solving services submit the site key, page URL, and optionally proxy information to their API. The solver returns a g-recaptcha-response token that you inject into the form before submission.

Key Parameters

  • websiteURL: The URL of the page containing the CAPTCHA
  • websiteKey: The reCAPTCHA site key (found in the page source: data-sitekey)
  • isInvisible: Set to true for invisible variant (important for correct challenge type)

Python Integration Example

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_recaptcha_v2(page_url: str, site_key: str, invisible: bool = False) -> str:
    """Submit reCAPTCHA v2 task and return token."""
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url,
        "invisible": int(invisible),
        "json": 1,
    })
    resp.raise_for_status()
    data = resp.json()
    if data["status"] != 1:
        raise ValueError(f"Task submission failed: {data}")

    task_id = data["request"]

    # Poll for result
    time.sleep(5)
    for _ in range(24):
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        })
        r = result.json()
        if r["status"] == 1:
            return r["request"]
        if "ERROR" in str(r.get("request", "")):
            raise ValueError(f"Solve error: {r['request']}")
        time.sleep(5)

    raise TimeoutError("reCAPTCHA v2 solve timed out")

# Usage with Playwright
from playwright.sync_api import sync_playwright

def bypass_recaptcha_v2(url: str, sitekey: str):
    token = solve_recaptcha_v2(url, sitekey)
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        page.goto(url)
        # Inject token
        page.evaluate(f'document.getElementById("g-recaptcha-response").value = "{token}"')
        page.evaluate('document.querySelector("form").submit()')
        browser.close()

Finding the Site Key

The reCAPTCHA v2 site key is embedded in the page HTML:

<div class="g-recaptcha" data-sitekey="6Lc...YOUR_SITE_KEY"></div>

To find it programmatically:

from bs4 import BeautifulSoup
import requests

def get_sitekey(url: str) -> str:
    page = requests.get(url)
    soup = BeautifulSoup(page.text, "html.parser")
    recaptcha_div = soup.find("div", {"class": "g-recaptcha"})
    if recaptcha_div:
        return recaptcha_div["data-sitekey"]
    # Also check for alternative render
    scripts = soup.find_all("script")
    for script in scripts:
        if "sitekey" in str(script):
            # Parse sitekey from script content
            pass
    raise ValueError("No reCAPTCHA v2 sitekey found on page")

reCAPTCHA v2 Checkbox vs. Invisible

Checkbox: Renders a visible checkbox UI. User interaction expected. When solving programmatically, set invisible=False.

Invisible: No visible widget. Activates on form submit based on behavioral signals. When solving programmatically, set invisible=True to signal to the solver that no click interaction is expected.

Failing to distinguish between the two can result in incorrect challenge difficulty and lower success rates.

FAQ

What is the g-recaptcha-response token? It is a signed response from Google's reCAPTCHA service confirming that the challenge was completed. You submit this token in the form field where the CAPTCHA is embedded.

How long does a reCAPTCHA v2 token remain valid? Approximately 2 minutes. Solve the CAPTCHA and submit the form within this window.

Why does my token get rejected by the server? Most common reasons: (1) token expired before use, (2) solving service returned a token from a different page/sitekey, (3) the site uses reCAPTCHA v2 Enterprise with stricter validation. Verify pageurl and websiteKey are correct.

Can I solve reCAPTCHA v2 Enterprise? Most major providers support Enterprise. Specify the task type as Enterprise-specific in the API call.


Compare reCAPTCHA v2 solvers at captcharank.com/compare.

Production Readiness Notes

Use Best reCAPTCHA v2 Solver as a decision and implementation aid, not just as a one-time reference. The practical test for best recaptcha v2 solver is whether the same approach behaves reliably when traffic is messy: rotating sessions, expired tokens, changing widget parameters, intermittent solver delays, and target pages that refresh without warning. For Automation developer / scraping engineer, the safest rollout is to start with a narrow fixture, record every submitted task, and compare the solver response with the browser state that finally submits the form. That makes failures explainable instead of mysterious, especially when a target alternates between visible challenges, invisible checks, and server-side verification.

Evaluation Criteria

A type-specific guide should map the widget parameters to the solver task fields, then verify that the returned token is accepted by the target page rather than merely returned by the API. For reCAPTCHA work, the most useful scorecard combines technical acceptance with operational cost. A low nominal price is not enough if retries double the real cost per accepted token, and a fast median solve time is not enough if p95 latency stalls the queue. Track these criteria before you standardize the workflow:

  • The challenge subtype, sitekey, action, rqdata, blob, captchaId, or page URL used for each task.
  • Median and p95 solve time, separated by provider and target domain.
  • Accepted-token rate on the target page, not just successful API responses.
  • Retry count, timeout count, zero-balance incidents, and invalid-parameter errors.
  • The exact browser, proxy region, and user-agent that submitted the solved token.

Rollout Checklist

Before this guidance moves into a production job, build a small acceptance suite around the pages that matter most. Run it with a fixed browser profile, then repeat with the proxy and concurrency settings you expect in production. Keep the first release conservative: bounded polling, clear timeout handling, and a fallback path when the solver cannot return a usable answer. For reCAPTCHA, watch score thresholds, hostname checks, action names, token age, and fallback behavior when Google returns a low-confidence response. That checklist keeps the article useful after the first copy-paste, because the integration is judged by end-to-end completion rather than by whether a code sample returned a string.

Monitoring Signals

Healthy CAPTCHA automation is observable. Log the task id, provider, challenge type, target host, queue time, solve time, final submit status, and normalized error code for every attempt. Review those logs in daily batches at first, then move to alerts once the baseline is stable. Sudden drops usually come from target-side changes: a new sitekey, a changed action name, a stricter hostname check, an added managed challenge, or a proxy pool that no longer matches the expected geography. When you can see those shifts quickly, provider switching becomes a controlled decision instead of a late-night rewrite.

Maintenance Cadence

Revisit the setup whenever the target UI changes, when the solver provider changes task names or pricing, or when benchmark data shows a sustained latency or solve-rate shift. Keep one known-good fixture for each CAPTCHA subtype and rerun it after dependency upgrades, browser updates, and proxy changes. If the article is used for vendor selection, repeat the same fixture across at least two providers before renewing a balance or migrating the whole pipeline. That habit keeps best recaptcha v2 solver work aligned with the real target behavior rather than with stale assumptions.

Comments are disabled for this article.

Related Posts

reCAPTCHA reCAPTCHA Guide — v2, v3, and Enterprise Explained
Complete guide to Google re CAPTCHA for developers — covers v 2 checkbox, v 2 invisible, v 3 score-based, and Enterprise variants, plus which solvers support ea...

Complete guide to Google re CAPTCHA for developers — covers v 2 checkbox, v 2 invisible, v 3 score-based, and...

May 03, 2026
Cloudflare CAPTCHA Cloudflare Turnstile vs reCAPTCHA — Which to Pick
Side-by-side technical comparison of Cloudflare Turnstile and Google re CAPTCHA — privacy model, integration effort, solver economics, and which one is harder t...

Side-by-side technical comparison of Cloudflare Turnstile and Google re CAPTCHA — privacy model, integration e...

May 05, 2026
Image CAPTCHA Best Image CAPTCHA Solver (OCR)
A ranked comparison of the best CAPTCHA solvers for image text and OCR challenges, covering solve accuracy, speed, and supported image types.

A ranked comparison of the best CAPTCHA solvers for image text and OCR challenges, covering solve accuracy, sp...

May 05, 2026