Get Captcha Statistics

February 4, 2026 (June 4, 2026)

Table of contents

  1. Request Headers
  2. Query Parameters
  3. Responses
  4. Model
  5. Examples
  6. Try It

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}

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

  • 200 OK

    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 summary object provides aggregated statistics (omitted if no data).

    Understanding the 429 buckets

    Google returns HTTP 429 RESOURCE_EXHAUSTED in at least four known distinct situations. The by_status_code_images / by_status_code_videos summary 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_TRAFFIC Captcha-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 captchaRetry attempts, default 3); this share represents requests where the retry budget exhausted. Counts as a captcha failure in success_rate_by_provider because it reflects token quality from the provider. Spread the load across multiple captcha providers via POST /accounts/captcha-providers and use captchaOrder on 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 bump captchaRetry higher.
    429:PUBLIC_ERROR_USER_REQUESTS_THROTTLED Google-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_REACHED This 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_REACHED This 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 email to let load balancing pick a healthier account.

    How success_rate_by_provider is calculated

    This 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 429 with reason PUBLIC_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. HTTP 503 is also excluded (Google-side outage, unrelated to the provider).

    Actionable reading: if one provider has noticeably lower success_rate_by_provider than others over the same period, its tokens are scoring poorly with reCAPTCHA Enterprise. Either drop that provider from your rotation, reduce its weight in captchaOrder, or top up its balance (some providers prioritize higher-balance accounts when issuing fresh proxies/IPs).

    How by_status_code_images / by_status_code_videos are aggregated

    The 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 tier and sku

    Every row carries the Google userPaygateTier (tier) and sku strings captured at submission time. These come straight from Google’s /credits response — the same wire-format strings, no translation. Aggregate breakdowns in summary (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.tiers and summary.lookup.skus are 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
    tier PAYGATE_TIER_NOT_PAID Free Free tier
    tier PAYGATE_TIER_ZERO Plus Google AI Plus
    tier PAYGATE_TIER_ONE Pro Google AI Pro
    tier PAYGATE_TIER_TIER1P5 Ultra $99 Google AI Ultra $99/mo
    tier PAYGATE_TIER_TWO Ultra $199 Google AI Ultra $199/mo
    sku G1_FREEMIUM Free Google AI consumer Free
    sku G1_TIER0 Plus Google AI consumer Plus
    sku G1_TIER1 Pro Google AI consumer Pro
    sku G1_TIER1P5 Ultra $99 Google AI consumer Ultra $99
    sku G1_TIER2 Ultra $199 Google AI consumer Ultra $199
    sku WS_FREEMIUM Workspace Free Google Workspace, no AI add-on
    sku WS_ULTRA Workspace Ultra Google Workspace + AI Ultra add-on

    Rows written before 2026-05-21 lack tier and sku (the columns didn’t exist yet) — they’re bucketed under "(empty)" in the per-tier and per-sku aggregates.

  • 400 Bad Request

    Missing or invalid parameters.

    {
      "error": "<error message>"
    }
    
  • 401 Unauthorized

    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
    )
    

Try It