Query Usage Statistics
January 31, 2026 (September 19, 2026)
Table of contents
Query your API usage statistics. Returns detailed information about jobs/requests for a specific bot.
Note:
- Data latency is at least 5 minutes, but should not exceed 15 minutes.
- Data is retained for 3 months.
https://api.useapi.net/v2/account/stats
Request Headers
Authorization: Bearer {API token}
API tokenis required, see Setup useapi.net for details.
Query Parameters
| Parameter | Required | Description |
|---|---|---|
bot | Yes | Bot to query stats for. Supported: google-flow, dreamina, kling, runwayml, pixverse, minimax, mureka, flowmusic, tempolor, ltxstudio, luma |
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. |
config | No | Filter by specific config (channel/email/account depending on bot). |
Responses
-
Returns usage statistics for the specified bot.
{ "bot": "google-flow", "date": "2026-02-13", "total": 2402, "summary": { "from": "2026-02-13T00:00:03.000Z", "to": "2026-02-13T23:58:38.000Z", "time_span": "23 hours 58 minutes", "by_config": { "user1@gmail.com": 670, "user2@gmail.com": 547, "user3@gmail.com": 438, "user4@gmail.com": 321, "user5@gmail.com": 306, "user6@gmail.com": 120 }, "by_code": { "200": 548, "201": 796, "400": 130, "403": 684, "429": 239, "500": 3, "503": 2 }, "by_endpoint": { "post-images": 1334, "post-videos": 1046, "post-videos-upscale": 22 }, "by_status": { "Created": 796, "OK": 548, "Forbidden": 684, "Too Many Requests": 239, "Bad Request": 130, "Internal Server Error": 3, "Service Unavailable": 2 }, "success_rate": "56.0%", "avg_msec": 17759, "by_model": { "veo-3.1-lite-low-priority": 1032, "nano-banana-pro": 702, "imagen-4": 449, "nano-banana": 181, "veo-3.1-fast": 14 }, "by_captcha_provider": { "CapSolver": 4856 }, "avg_captcha_retry": 2, "by_tier": { "PAYGATE_TIER_TWO": 1684, "PAYGATE_TIER_ONE": 612, "PAYGATE_TIER_NOT_PAID": 106 }, "by_sku": { "WS_ULTRA": 1430, "G1_TIER2": 254, "G1_TIER1": 612, "G1_FREEMIUM": 106 }, "lookup": { "tiers": { "PAYGATE_TIER_TWO": "Ultra $199", "PAYGATE_TIER_ONE": "Pro", "PAYGATE_TIER_NOT_PAID": "Free" }, "skus": { "WS_ULTRA": "Workspace Ultra", "G1_TIER2": "Ultra $199", "G1_TIER1": "Pro", "G1_FREEMIUM": "Free" } } }, "data": [ { "timestamp": "2026-02-13T10:30:00.000Z", "jobid": "20260213103000-user:123-bot:google-flow", "config": "user1@gmail.com", "endpoint": "post-images", "status": "OK", "func": "v1-google-flow-images", "code": 200, "msec": 5432, "model": "imagen-4", "captchaProviders": "CapSolver", "captchaRetry": 1, "tier": "PAYGATE_TIER_TWO", "sku": "WS_ULTRA", "backend": "flow", "bytes": 0 } ] }The
summaryobject provides aggregated statistics (omitted if no data).For
google-flow,dreamina,kling,minimax,pixverse, andluma, additional fields are included in bothdatarows andsummary:model/by_model: AI model used for generation
For
google-flowonly:captchaProviders/by_captcha_provider: Captcha providers usedcaptchaRetry/avg_captcha_retry: Captcha retry attemptstier/by_tier: GoogleuserPaygateTier(plan family —PAYGATE_TIER_NOT_PAID/_ONE/_TIER1P5/_TWO). Available since 2026-05-21. Rows written before that date have emptytier/sku, and so do upload rows (post-assets, see below) — all of them bucket under"(empty)".sku/by_sku: Google sku string (specific subscription —G1_FREEMIUM/G1_TIER1/G1_TIER1P5/G1_TIER2/WS_FREEMIUM/WS_ULTRA).backend: which Google backend served the call —flowfor the flow.google.com path,labsfor the older one. Empty on rows written before 2026-09-14, and on a call that failed before a backend was chosen.bytes: size of an uploaded file. See below — it is0on every row that is notpost-assets.summary.lookup.tiers/summary.lookup.skus: canonical enum → human-readable label map (e.g.WS_ULTRA → "Workspace Ultra"). Resolve enums through this map rather than hard-coding strings. Unknown enums map to themselves so new values aren’t lost.
Image and video uploads (google-flow)
Since 2026-09-19,
POST /assetswrites a row like every other endpoint, so image and video uploads appear indataand count underby_endpointaspost-assets. Three things to know when reading them:- An upload has no model, tier or sku, so those fields are empty on its rows, and it counts under
"(empty)"inby_tierandby_sku. - Uploads are often the highest-volume call an account makes. There is no endpoint filter on this endpoint, so if you pass
limit, uploads can fill the window and push generations out of it. Request adatewithoutlimitand filterdataonendpointyourself when you want one or the other. bytescarries the size of the file sent to Google, recorded before the upload is attempted — so a refused upload reports the bytes Google declined. It is0on any row that is notpost-assets, and0on an upload only when no body was read, which answers400. There is no summary equivalent: sumbytesoverdatayourself, filtering onendpoint == "post-assets". Like the row counts, that sum is a floor, because rows are sampled.- Not every request writes a row. Ones rejected before they reach the upload handler — an invalid token, or every account on your token already being upload-limited — write none, so this counts attempts that got as far as Google. For uploads Google actually accepted, count the rows with
code200.
These rows exist so you can count uploads per account. Google limits how many files an account may upload, separately from generation, and an account that reaches the limit refuses every upload while generating normally. The limit does appear to clear after a period we are still measuring, so watching
post-assetsperconfigtells you how much of an allowance an account has spent and when it is worth resting rather than replacing.Known tier/sku values (google-flow)
Field Enum value Label Plan tierPAYGATE_TIER_NOT_PAIDFree Free tier 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_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 -
Missing or invalid parameters.
{ "error": "<error message>" } -
Invalid API token.
{ "error": "Unauthorized" }
Model
// Response structure
{
bot: string // Bot name
date?: string // Date filter applied (YYYY-MM-DD)
limit?: number // Limit filter applied
config?: string // Config 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")
by_config: Record<string, number> // Count per config/account
by_code: Record<string, number> // Count per HTTP status code
by_endpoint: Record<string, number> // Count per endpoint/verb
by_status: Record<string, number> // Count per job status
success_rate: string // Percentage of 2xx codes (e.g., "86.7%")
avg_msec: number // Average response time in ms
// google-flow, dreamina, minimax:
by_model?: Record<string, number> // Count per AI model
// google-flow only:
by_captcha_provider?: Record<string, number> // Count per captcha provider
avg_captcha_retry?: number // Average captcha retries
by_tier?: Record<string, number> // Count per Google userPaygateTier (since 2026-05-21). Pre-existing rows bucket under "(empty)".
by_sku?: Record<string, number> // Count per Google sku (since 2026-05-21). Pre-existing rows bucket under "(empty)".
lookup?: { // Canonical enum -> human-readable label map for the tier/sku values present here.
tiers: Record<string, string> // e.g. { PAYGATE_TIER_TWO: "Ultra $199" }. Unknown enums map to themselves.
skus: Record<string, string> // e.g. { WS_ULTRA: "Workspace Ultra" }. Unknown enums map to themselves.
}
}
data: Array<{
timestamp: string // ISO 8601 timestamp
jobid: string // Job/task identifier
config: string // Account/config used (channel for MJ, email/account for others)
endpoint: string // API endpoint called
status: string // Job status
func: string // Function name
code: number // HTTP status code
msec: number // Duration in milliseconds
// google-flow, dreamina, minimax:
model?: string // AI model used for generation
// google-flow only:
captchaProviders?: string // Captcha providers tried (comma-separated)
captchaRetry?: number // Number of captcha retries
tier?: string // Google userPaygateTier (PAYGATE_TIER_*). Empty for rows pre-2026-05-21. Resolve to a label via summary.lookup.tiers.
sku?: string // Google sku (G1_*/WS_*). Empty for rows pre-2026-05-21. Resolve to a label via summary.lookup.skus.
backend?: string // "flow" | "labs" — which Google backend served it. Empty for rows pre-2026-09-14.
bytes?: number // Size of an uploaded file. 0 on every row that is not post-assets.
}>
}
Examples
-
# Today's stats for google-flow curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v2/account/stats?bot=google-flow" # Specific date curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v2/account/stats?bot=google-flow&date=2026-01-31" # Last 1000 records curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v2/account/stats?bot=kling&limit=1000" # Filter by config curl -H "Authorization: Bearer YOUR_API_TOKEN" \ "https://api.useapi.net/v2/account/stats?bot=runwayml&config=user@email.com" -
const token = 'YOUR_API_TOKEN'; const bot = 'google-flow'; const date = '2026-01-31'; const response = await fetch( `https://api.useapi.net/v2/account/stats?bot=${bot}&date=${date}`, { headers: { 'Authorization': `Bearer ${token}` } } ); const stats = await response.json(); console.log(`Total records: ${stats.total}`); console.log('Stats:', stats.data); -
import requests token = 'YOUR_API_TOKEN' headers = {'Authorization': f'Bearer {token}'} # Today's stats for google-flow response = requests.get( 'https://api.useapi.net/v2/account/stats', params={'bot': 'google-flow'}, headers=headers ) stats = response.json() print(f"Total records: {stats['total']}") print('Stats:', stats['data'])