Get Load Balancing Statistics
November 17, 2025 (November 19, 2025)
Table of contents
Get load balancing statistics across all configured Google Flow accounts. This endpoint provides real-time visibility into job distribution, account health, and performance metrics for both image and video generation.
To retrieve a specific job, use GET /jobs/jobId.
https://api.useapi.net/v1/google-flow/jobs/?options=
options
Request Headers
Authorization: Bearer {API token}
API tokenis required, see Setup useapi.net for details.
Query Parameters
optionsis optional, controls the level of detail in the response (default:summary).
Supported values:summary: Returns aggregated stats per account (executing, completed, failed, rate limited counts)executing: Adds details of currently executing jobs with elapsed timehistory: Includes top 10 most recent completed jobs from the last 15 minutes
Load Balancing Algorithm
When you have multiple Google Flow accounts configured and donβt specify an email parameter in POST /images or POST /videos, the API automatically selects the best account using a scoring algorithm:
Formula: score = executing + (failed Γ 10) + (rateLimited Γ 20)
Lower scores are better. The account with the lowest score receives the next job.
Components:
-
executing: Number of jobs currently running on this account Weight: 1Γ (each executing job adds 1 point) Purpose: Distribute load evenly across accounts -
failed: Number of failed jobs (non-429 4xx/5xx responses) in last 15 minutes Weight: 10Γ (each failure adds 10 points) Purpose: Heavily penalize unreliable accounts -
rateLimited: Number of 429 rate limit responses in last 15 minutes Weight: 20Γ (each rate limit adds 20 points) Purpose: Most heavily penalize rate-limited accounts to avoid hitting limits
Example scores:
- Idle account:
0 executing + 0 failed + 0 rateLimited = 0(best) - 2 jobs running:
2 executing + 0 failed + 0 rateLimited = 2 - 1 recent failure:
0 executing + 1 failed + 0 rateLimited = 10 - 1 rate limit hit:
0 executing + 0 failed + 1 rateLimited = 20 - Rate limited account:
0 executing + 0 failed + 2 rateLimited = 40(worst)
Randomization: When multiple accounts have the same score, one is selected randomly.
Stats expiration: Job statistics older than 15 minutes are automatically removed from load balancing calculations.
Responses
-
Returns load balancing statistics categorized by job type.
With
options=summary(default):{ "emails": [ "jo***@gmail.com", "an***@gmail.com" ], "videos": { "summary": { "jo***@gmail.com": { "executing": 2, "completed": 15, "failed": 0, "rateLimited": 0, "avgResponseTime": 125340.50, "score": 2 }, "an***@gmail.com": { "executing": 0, "completed": 8, "failed": 1, "rateLimited": 0, "avgResponseTime": 98234.75, "score": 10 } } }, "images": { "summary": { "jo***@gmail.com": { "executing": 1, "completed": 42, "failed": 0, "rateLimited": 0, "avgResponseTime": 12456.30, "score": 1 }, "an***@gmail.com": { "executing": 0, "completed": 38, "failed": 0, "rateLimited": 1, "avgResponseTime": 15234.80, "score": 20 } } }, "combined": { "summary": { "jo***@gmail.com": { "executing": 3, "completed": 57, "failed": 0, "rateLimited": 0, "avgResponseTime": 32145.60, "score": 3 }, "an***@gmail.com": { "executing": 0, "completed": 46, "failed": 1, "rateLimited": 1, "avgResponseTime": 42367.25, "score": 30 } } } }With
options=executing:Adds
executingobject with currently running jobs and their elapsed time inMM:SSformat:{ "emails": [ "jo***@gmail.com", "an***@gmail.com" ], "videos": { "summary": { "..." }, "executing": { "j1731...redacted...v-u12345-email:jo***@gmail.com-bot:google-flow": { "email": "jo***@gmail.com", "timestamp": 1731859234567, "elapsed": "1:23" }, "j1731...redacted...v-u12345-email:jo***@gmail.com-bot:google-flow-http:200": { "email": "jo***@gmail.com", "timestamp": 1731859123456, "elapsed": "3:45" } } }, "images": { "summary": { "..." }, "executing": { "j1731...redacted...i-u12345-email:jo***@gmail.com-bot:google-flow": { "email": "jo***@gmail.com", "timestamp": 1731859345678, "elapsed": "0:15" } } }, "combined": { "summary": { "..." } } }With
options=history:Adds both
executingandhistoryobjects with top 10 most recent completed jobs from last 15 minutes:{ "emails": [ "jo***@gmail.com", "an***@gmail.com" ], "videos": { "summary": { "..." }, "executing": { "..." }, "history": { "j1731...redacted...v-u12345-email:jo***@gmail.com-bot:google-flow": { "email": "jo***@gmail.com", "timestamp": 1731858123456, "httpStatus": 200, "responseTime": 125340 }, "j1731...redacted...v-u12345-email:an***@gmail.com-bot:google-flow": { "email": "an***@gmail.com", "timestamp": 1731858234567, "httpStatus": 500, "responseTime": 98234 } } }, "images": { "summary": { "..." }, "executing": { "..." }, "history": { "..." } }, "combined": { "summary": { "..." } } } -
Invalid
optionsparameter value.{ "error": "Invalid options parameter. Use: summary, executing, or history" } -
Invalid API token.
{ "error": "Unauthorized" }
Model
{
emails: string[] // List of all configured healthy account emails
videos: {
summary: {
[email: string]: {
executing: number // Currently running jobs
completed: number // Successfully completed (2xx) in last 15min
failed: number // Failed (4xx/5xx except 429) in last 15min
rateLimited: number // Rate limited (429) in last 15min
avgResponseTime: number // Average response time in milliseconds
score: number // Load balancing score (lower is better)
}
}
executing?: { // Only with options=executing or history
[jobId: string]: {
email: string // Account email
timestamp: number // Unix timestamp (milliseconds)
elapsed: string // Elapsed time in MM:SS format
}
}
history?: { // Only with options=history
[jobId: string]: {
email: string // Account email
timestamp: number // Unix timestamp (milliseconds)
httpStatus: number // HTTP status code (200, 429, 500, etc.)
responseTime: number // Response time in milliseconds
}
}
}
images: {
summary: {
[email: string]: {
executing: number // Currently running jobs
completed: number // Successfully completed (2xx) in last 15min
failed: number // Failed (4xx/5xx except 429) in last 15min
rateLimited: number // Rate limited (429) in last 15min
avgResponseTime: number // Average response time in milliseconds
score: number // Load balancing score (lower is better)
}
}
executing?: { // Only with options=executing or history
[jobId: string]: {
email: string // Account email
timestamp: number // Unix timestamp (milliseconds)
elapsed: string // Elapsed time in MM:SS format
}
}
history?: { // Only with options=history
[jobId: string]: {
email: string // Account email
timestamp: number // Unix timestamp (milliseconds)
httpStatus: number // HTTP status code (200, 429, 500, etc.)
responseTime: number // Response time in milliseconds
}
}
}
combined: {
summary: {
[email: string]: {
executing: number // Currently running jobs
completed: number // Successfully completed (2xx) in last 15min
failed: number // Failed (4xx/5xx except 429) in last 15min
rateLimited: number // Rate limited (429) in last 15min
avgResponseTime: number // Average response time in milliseconds
score: number // Load balancing score (lower is better)
}
}
}
}
Examples
-
# Get summary stats (default) curl "https://api.useapi.net/v1/google-flow/jobs" \ -H "Authorization: Bearer {API token}" # Get executing jobs with elapsed time curl "https://api.useapi.net/v1/google-flow/jobs/?options=executing" \ -H "Authorization: Bearer {API token}" # Get full history (last 15 minutes) curl "https://api.useapi.net/v1/google-flow/jobs/?options=history" \ -H "Authorization: Bearer {API token}" -
const apiToken = 'your-api-token' // Get summary stats (default) const response = await fetch('https://api.useapi.net/v1/google-flow/jobs', { headers: { 'Authorization': `Bearer ${apiToken}` } }) const stats = await response.json() // Check which account has lowest score for images const imagesSummary = stats.images.summary const bestAccount = Object.entries(imagesSummary) .sort(([, a], [, b]) => a.score - b.score)[0] console.log('Best account for images:', bestAccount[0], 'score:', bestAccount[1].score) // Get executing jobs const execResponse = await fetch('https://api.useapi.net/v1/google-flow/jobs/?options=executing', { headers: { 'Authorization': `Bearer ${apiToken}` } }) const execStats = await execResponse.json() console.log('Currently executing videos:', Object.keys(execStats.videos.executing || {}).length) -
import requests api_token = 'your-api-token' headers = {'Authorization': f'Bearer {api_token}'} # Get summary stats (default) response = requests.get( 'https://api.useapi.net/v1/google-flow/jobs', headers=headers ) stats = response.json() # Check which account has lowest score for videos videos_summary = stats['videos']['summary'] best_account = min(videos_summary.items(), key=lambda x: x[1]['score']) print(f"Best account for videos: {best_account[0]}, score: {best_account[1]['score']}") # Get full history history_response = requests.get( 'https://api.useapi.net/v1/google-flow/jobs/?options=history', headers=headers ) history_stats = history_response.json() print(f"Image job history entries: {len(history_stats['images'].get('history', {}))}")