Get Captcha Statistics
February 4, 2026 (June 4, 2026)
Table of contents
Query captcha solving statistics for your account. Returns detailed information about captcha token requests and their success/failure rates. Compare success rates across all configured providers to help decide which one works best for your use case.
Use anonymized=true to get aggregated scores across all users and all captcha providers. This mode returns a summary only (no individual data rows) based on the last 10000 records across all accounts, giving you a broader picture of provider performance.
Note:
- Data latency is at least 5 minutes, but should not exceed 15 minutes.
- Data is retained for 3 months.
- Results are cached for 5 minutes.
https://api.useapi.net/v1/google-flow/accounts/captcha-stats
Request Headers
Authorization: Bearer {API token}
API tokenis required, see Setup useapi.net for details.
Query Parameters
| Parameter | Required | Description |
|---|---|---|
date | No | Date in YYYY-MM-DD format.Defaults to today if limit is not specified. |
limit | No | Number of records to return (max: 50000). If specified, date filter is ignored and returns last N records across all dates. |
provider | No | Filter by captcha provider. Supported: CapSolver, AntiCaptcha, YesCaptcha, CapMonster, SolveCaptcha, 2Captcha, EzCaptcha, UserProvided |
anonymized | No | Set to true to return aggregated scores across all users and all captcha providers.Returns summary only (no individual data rows). Uses last 10000 records across all accounts, ignores date/limit/provider filters. |
Responses
-
Returns captcha statistics for the specified filters.
{ "date": "2026-02-03", "total": 42, "summary": { "from": "2026-02-03T00:05:23.000Z", "to": "2026-02-03T23:58:47.000Z", "time_span": "23 hours 53 minutes", "sample_size_by_provider": { "CapSolver": 24, "AntiCaptcha": 10, "EzCaptcha": 8 }, "success_rate_by_provider": { "CapSolver": 73.20, "AntiCaptcha": 80.50, "EzCaptcha": 68.40 }, "sample_size_by_tier": { "PAYGATE_TIER_TWO": 30, "PAYGATE_TIER_ONE": 12 }, "success_rate_by_tier": { "PAYGATE_TIER_TWO": 81.00, "PAYGATE_TIER_ONE": 66.70 }, "sample_size_by_sku": { "WS_ULTRA": 22, "G1_TIER2": 8, "G1_TIER1": 12 }, "success_rate_by_sku": { "WS_ULTRA": 84.10, "G1_TIER2": 75.00, "G1_TIER1": 66.70 }, "by_status_code_images": { "200": 69.10, "403": 8.50, "429:PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC": 12.30, "429:PUBLIC_ERROR_PER_MODEL_DAILY_QUOTA_REACHED": 4.10, "429:PUBLIC_ERROR_USER_REQUESTS_THROTTLED": 1.00, "429:PUBLIC_ERROR_USER_QUOTA_REACHED": 1.40, "503": 3.60 }, "by_status_code_videos": { "200": 67.50, "403": 17.60, "429:PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC": 8.70, "429:PUBLIC_ERROR_USER_REQUESTS_THROTTLED": 1.00, "429:PUBLIC_ERROR_USER_QUOTA_REACHED": 1.40, "503": 3.80 }, "avg_captcha_ms": 8500, "avg_api_ms": 1200, "avg_attempt": 1.2, "lookup": { "tiers": { "PAYGATE_TIER_TWO": "Ultra $199", "PAYGATE_TIER_ONE": "Pro" }, "skus": { "WS_ULTRA": "Workspace Ultra", "G1_TIER2": "Ultra $199", "G1_TIER1": "Pro" } } }, "data": [ { "timestamp": "2026-02-03T10:30:00.000Z", "jobId": "20260203103000123-user:123-bot:google-flow", "provider": "AntiCaptcha", "taskId": "abc123-task-id", "route": "post-videos", "statusText": "OK", "pageAction": "VIDEO_GENERATION", "error": "", "reason": "", "tier": "PAYGATE_TIER_TWO", "sku": "WS_ULTRA", "statusCode": 200, "captchaDurationMs": 8500, "apiDurationMs": 1200, "attemptNumber": 1 } ] }The
summaryobject provides aggregated statistics (omitted if no data).Understanding the 429 buckets
Google returns
HTTP 429 RESOURCE_EXHAUSTEDin at least four known distinct situations. Theby_status_code_images/by_status_code_videossummary splits 429s by their reason code so you can tell them apart — each needs a different strategy.Bucket key What it means Customer strategy 429:PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFICCaptcha-provider issue, not a useapi.net issue. Google’s reCAPTCHA Enterprise scored the token below its risk threshold — usually because the provider is overloaded or being fingerprinted by Google. Our worker has already auto-retried with fresh captcha tokens (up to captchaRetryattempts, default 3); this share represents requests where the retry budget exhausted. Counts as a captcha failure insuccess_rate_by_providerbecause it reflects token quality from the provider.Spread the load across multiple captcha providers via POST /accounts/captcha-providers and use captchaOrderon the request to cycle through them. Top up balance on existing providers (some prioritize higher-balance accounts). Short-term: wait 30-60s and retry, or bumpcaptchaRetryhigher.429:PUBLIC_ERROR_USER_REQUESTS_THROTTLEDGoogle-side per-user concurrency limit. The captcha token was fine — this account is just sending too many requests at once. Does NOT count as a captcha failure. Hold for ~hour, pause this account, retry after 10-60 minutes. Reduce parallel generations per account. 429:PUBLIC_ERROR_PER_MODEL_DAILY_QUOTA_REACHEDThis account hit Google’s per-model daily quota. Does NOT count as a captcha failure. Hold for the day — quota resets at UTC midnight. Or switch to a different model. 429:PUBLIC_ERROR_USER_QUOTA_REACHEDThis account hit its overall Google Flow quota cap — separate from per-model limits, blocks all models on this account. Does NOT count as a captcha failure. Add more Google Flow accounts via POST /accounts so the load is spread. Hold this specific account until the quota resets, or omit emailto let load balancing pick a healthier account.How
success_rate_by_provideris calculatedThis is the end-to-end captcha effectiveness per provider — measured against Google’s reCAPTCHA Enterprise evaluation, not just whether the token was syntactically accepted. Use it to compare providers and decide which to prefer, drop, or rebalance.
A row counts as a captcha failure when:
- HTTP
403— token was rejected outright (PERMISSION_DENIED) - HTTP
429with reasonPUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC— Google’s response literally says"reCAPTCHA evaluation failed". The token was technically valid but scored too low. This typically means the provider is overloaded or being fingerprinted by Google.
The other 429 reasons (
PER_MODEL_DAILY_QUOTA_REACHED,USER_REQUESTS_THROTTLED,USER_QUOTA_REACHED) are NOT counted as captcha failures because they are account-level limits independent of token quality. HTTP503is also excluded (Google-side outage, unrelated to the provider).Actionable reading: if one provider has noticeably lower
success_rate_by_providerthan others over the same period, its tokens are scoring poorly with reCAPTCHA Enterprise. Either drop that provider from your rotation, reduce its weight incaptchaOrder, or top up its balance (some providers prioritize higher-balance accounts when issuing fresh proxies/IPs).How
by_status_code_images/by_status_code_videosare aggregatedThe status distribution shows customer-facing final outcomes per
jobId, not per attempt. A request that internally retried 5 times before succeeding contributes a single"200"to the bucket, not five entries. This makes the distribution a true outcome map.A
429:<reason>bucket therefore counts only requests where our internal retry budget was exhausted before resolving the condition.Understanding
tierandskuEvery row carries the Google
userPaygateTier(tier) andskustrings captured at submission time. These come straight from Google’s/creditsresponse — the same wire-format strings, no translation. Aggregate breakdowns insummary(sample_size_by_tier,success_rate_by_tier,sample_size_by_sku,success_rate_by_sku) let you compare captcha effectiveness across plan levels, which is useful when one plan tier is being scored more aggressively by Google’s reCAPTCHA Enterprise than another.summary.lookup.tiersandsummary.lookup.skusare the canonical human-readable mapping — resolve enum values through these maps rather than hard-coding strings on your side. They cover only the enums present in this response; unknown values map to themselves so you can still see them.Current known values:
Field Enum value Label Plan tierPAYGATE_TIER_NOT_PAIDFree Free tier tierPAYGATE_TIER_ZEROPlus Google AI Plus tierPAYGATE_TIER_ONEPro Google AI Pro tierPAYGATE_TIER_TIER1P5Ultra $99 Google AI Ultra $99/mo tierPAYGATE_TIER_TWOUltra $199 Google AI Ultra $199/mo skuG1_FREEMIUMFree Google AI consumer Free skuG1_TIER0Plus Google AI consumer Plus skuG1_TIER1Pro Google AI consumer Pro skuG1_TIER1P5Ultra $99 Google AI consumer Ultra $99 skuG1_TIER2Ultra $199 Google AI consumer Ultra $199 skuWS_FREEMIUMWorkspace Free Google Workspace, no AI add-on skuWS_ULTRAWorkspace Ultra Google Workspace + AI Ultra add-on Rows written before 2026-05-21 lack
tierandsku(the columns didn’t exist yet) — they’re bucketed under"(empty)"in the per-tier and per-sku aggregates. - HTTP
-
Missing or invalid parameters.
{ "error": "<error message>" } -
Invalid API token.
{ "error": "Unauthorized" }
Model
// Response structure
{
date?: string // Date filter applied (YYYY-MM-DD)
limit?: number // Limit filter applied
provider?: string // Provider filter applied
total: number // Total records returned
summary?: { // Aggregated statistics (omitted if no data)
from: string // Earliest timestamp (ISO 8601)
to: string // Latest timestamp (ISO 8601)
time_span: string // Human readable duration (e.g., "2 days 5 hours")
sample_size_by_provider: Record<string, number> // Records per provider across ALL attempts (excludes 503)
success_rate_by_provider: Record<string, number> // Captcha success rate % per provider. Failures: 403 (token rejected) AND 429:PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC (token scored too low by reCAPTCHA Enterprise). Other 429 reasons are NOT counted. (excludes 503)
sample_size_by_tier: Record<string, number> // Records per Google userPaygateTier across ALL attempts (excludes 503). Pre-2026-05-21 rows lack tier and bucket under "(empty)"
success_rate_by_tier: Record<string, number> // Captcha success rate % per tier (same failure definition as success_rate_by_provider)
sample_size_by_sku: Record<string, number> // Records per Google sku across ALL attempts (excludes 503). Pre-2026-05-21 rows lack sku and bucket under "(empty)"
success_rate_by_sku: Record<string, number> // Captcha success rate % per sku (same failure definition as success_rate_by_provider)
by_status_code_images: Record<string, number> // % per customer-facing final-attempt outcome for IMAGE. 429s split by reason — e.g. "429:PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC"
by_status_code_videos: Record<string, number> // Same as by_status_code_images but for VIDEO
avg_captcha_ms: number // Average captcha solve time in ms
avg_api_ms: number // Average API call time in ms
avg_attempt: number // Average attempt number
lookup: { // Canonical enum → human-readable label map for tier/sku enum values present in this response. Resolve enums through this map rather than hard-coding strings.
tiers: Record<string, string> // e.g. { PAYGATE_TIER_TWO: "Ultra $199", PAYGATE_TIER_NOT_PAID: "Free" }. Unknown enums map to themselves.
skus: Record<string, string> // e.g. { WS_ULTRA: "Workspace Ultra", G1_TIER1: "Pro" }. Unknown enums map to themselves.
}
}
data: Array<{
timestamp: string // ISO 8601 timestamp
jobId: string // Job identifier
provider: string // Captcha provider used (CapSolver, AntiCaptcha, YesCaptcha, CapMonster, SolveCaptcha, 2Captcha, EzCaptcha, UserProvided)
taskId: string // Provider's task ID
route: string // API route (post-videos, post-images, etc.)
statusText: string // HTTP status text (OK, Forbidden, NetworkError)
pageAction: string // reCAPTCHA action (VIDEO_GENERATION, IMAGE_GENERATION)
error: string // Error message (empty on success)
reason: string // Google ErrorInfo.reason — e.g. PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC (empty for non-Google errors or successful submits)
tier: string // Google userPaygateTier — PAYGATE_TIER_NOT_PAID / PAYGATE_TIER_ZERO / PAYGATE_TIER_ONE / PAYGATE_TIER_TIER1P5 / PAYGATE_TIER_TWO. Empty for rows pre-2026-05-21. Resolve to a label via summary.lookup.tiers.
sku: string // Google sku — G1_FREEMIUM / G1_TIER0 / G1_TIER1 / G1_TIER1P5 / G1_TIER2 / WS_FREEMIUM / WS_ULTRA. Empty for rows pre-2026-05-21. Resolve to a label via summary.lookup.skus.
statusCode: number // HTTP status code (200, 403, 429, 0 for network errors)
captchaDurationMs: number // Captcha solve duration in ms
apiDurationMs: number // API call duration in ms
attemptNumber: number // Attempt number (1 = first try, 2+ = retry)
}>
}
Examples
-
# Today's stats curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/google-flow/accounts/captcha-stats" # Specific date curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/google-flow/accounts/captcha-stats?date=2026-02-01" # Last 1000 records curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/google-flow/accounts/captcha-stats?limit=1000" # Filter by provider curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/google-flow/accounts/captcha-stats?provider=AntiCaptcha" # Aggregated scores across all users and providers (summary only) curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v1/google-flow/accounts/captcha-stats?anonymized=true" -
const apiUrl = 'https://api.useapi.net/v1/google-flow/accounts/captcha-stats'; const token = 'YOUR_API_TOKEN'; const response = await fetch(apiUrl, { headers: { 'Authorization': `Bearer ${token}` } }); const stats = await response.json(); console.log(`Total records: ${stats.total}`); console.log(`Success rates:`, stats.summary?.success_rate_by_provider); console.log('Data:', stats.data); -
import requests apiUrl = 'https://api.useapi.net/v1/google-flow/accounts/captcha-stats' token = 'YOUR_API_TOKEN' headers = { 'Authorization': f'Bearer {token}' } # Today's stats response = requests.get(apiUrl, headers=headers) stats = response.json() print(f"Total records: {stats['total']}") print(f"Success rates: {stats.get('summary', {}).get('success_rate_by_provider')}") # Filter by provider response = requests.get( apiUrl, params={'provider': 'AntiCaptcha'}, headers=headers )