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
truefor 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.