Generate Videos
November 17, 2025 (June 5, 2026)
Table of contents
- Model Capabilities
- Content Moderation
- Response Codes
- Request Headers
- Request Body
- Responses
- Model
- Examples
- Try It
Generate videos using Google Flow AI models (Veo 3.1 Quality, Veo 3.1 Fast, Veo 3.1 Lite, Veo 3.1 Lite Lower Priority, Gemini Omni Flash) from text prompts with optional start/end frames, reference images, reference video (Omni Flash V2V edit), and voice narration. Videos are returned as signed URLs ready for download.
This endpoint features dynamic concurrency management. Video generation typically completes within 60-180 seconds depending on the model and mode. The endpoint automatically polls for completion and returns the final result.
Veo 3.1 Lite Lower Priority is available only to Google AI Ultra $200 subscribers โ no credit cost but lower generation priority. The cheaper Ultra $100 plan does not include it.
Model Capabilities
Two model families: Veo 3.1 (four variants) and Gemini Omni Flash (one).
Models
Source: Google Flow โ Credits and pricing.
| Model | Generation type(s) | Credits per generation |
|---|---|---|
Veo 3.1 - Liteveo-3.1-lite | 4s, 6s, 8s videos Extend | Non-Ultra: 10 Ultra: 5 |
Veo 3.1 - Lite Lower Priorityveo-3.1-lite-low-priority | 4s, 6s, 8s videos Extend | Ultra $200 only: 0 (lower priority) |
Veo 3.1 - Fast (default)veo-3.1-fast | 4s, 6s, 8s videos Extend | Non-Ultra: 20 Ultra: 10 |
Veo 3.1 - Qualityveo-3.1-quality | 8s videos Extend | 100 |
Gemini Omni Flashomni-flash | 4s, 6s, 8s, 10s videos (does not include edits to uploaded & generated videos) | Pro / Ultra: 4s: 15 6s: 20 8s: 25 10s: 30 |
Gemini Omni Flashomni-flash + referenceVideo_1 | Edit uploaded & generated videos of all lengths | Pro / Ultra: 40 |
Aspect ratio (aspectRatio)
| Model | Supported values |
|---|---|
| All Veo variants | landscape (default), portrait, 1:1, 4:3, 3:4 |
omni-flash | landscape (default), portrait |
Duration (duration, sec)
| Mode / Model | Supported |
|---|---|
| Veo T2V / I2V / I2V-FL | 4, 6, 8 (default) โ 4/6 are Ultra-only |
| Veo R2V | 8 only |
omni-flash T2V / R2V | 4, 6, 8 (default), 10 |
omni-flash V2V edit | not accepted โ output matches input trim window (max 10 s, set via endFrameIndex_1) |
References
| Reference | Parameter(s) | Veo (all variants) | omni-flash |
|---|---|---|---|
| Start frame (I2V) | startImage | โ | โ (start frame only โ no referenceImage_*, no character_*, no referenceAudio_*) |
| Start + end frames (I2V-FL) | startImage + endImage | โ | โ (omni-flash supports start frame only โ no end frame) |
| Image refs (R2V / Ingredients) | referenceImage_1..7 | up to 3 (slots _1..3); not on veo-3.1-quality | up to 7 (R2V) / up to 5 (V2V edit) |
| Characters (R2V / Ingredients) | character_1..7 (from POST /characters) | 3 total with referenceImage_* โ Veo fast/lite/lite-low-priority only, 8 s only, not on veo-3.1-quality | 7 total with referenceImage_* (R2V) |
| Voice narration | referenceAudio_1..5 (POST /voices refs OR system voice names) | 1 (slot _1, requires an image ref or character, R2V only); not on veo-3.1-quality | up to 5 (R2V) / up to 3 (V2V edit) |
| Source video (V2V edit) | referenceVideo_1 (+ optional startFrameIndex_1 / endFrameIndex_1) | โ | โ (uploaded MP4, trim on a 24 fps virtual timeline, max 240 frames = 10 s) |
Content Moderation
If your generation is moderated, retrying with the same prompt often succeeds on subsequent attempts โ moderation decisions can vary between requests. Modifying the prompt, removing reference images, or swapping models can also help, as each has different content-moderation behavior.
Response Codes
429 โ Rate limit / quota exhausted
Google returns at least four known distinct RESOURCE_EXHAUSTED variants in the response body. Always check the reason field on the returned error to pick the right strategy:
| Reason code | What it means | What to do |
|---|---|---|
PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC | This is a captcha-provider issue, not a useapi.net issue. Googleโs reCAPTCHA Enterprise scored the captcha token below its risk threshold โ usually because the provider is overloaded or being fingerprinted by Google (the providerโs infrastructure is processing too many high-volume requests at once and Google flags them collectively). Our worker has already auto-retried with fresh captcha tokens (up to captchaRetry attempts, default 3) before returning this. | Spread the load across multiple captcha providers โ configure several providers via POST /accounts/captcha-providers (e.g. CapSolver + AntiCaptcha + 2Captcha) and use captchaOrder on the request to cycle through them. Adding balance to existing providers can also help, since some prioritize higher-balance accounts. As a short-term measure, wait 30-60s and retry, or bump captchaRetry higher in the request body. |
PUBLIC_ERROR_USER_REQUESTS_THROTTLED | Google-side per-user concurrency limit. The token was fine; this account is sending too many requests at once. | Hold for ~hour, retry after 10-60min. Reduce parallel generations per account. |
PUBLIC_ERROR_PER_MODEL_DAILY_QUOTA_REACHED | This account hit Googleโs per-model daily quota. Retrying within the day will not succeed. | Hold for the day (quota resets at UTC midnight), or switch to a different model. |
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. | Add more Google Flow accounts via POST /accounts so the load is spread. Hold this specific account until the quota resets, or omit email in your request to let load balancing pick a healthier account. |
Automatic quarantine. When you omit email, the load balancer automatically quarantines an account on any of PUBLIC_ERROR_USER_QUOTA_REACHED, PUBLIC_ERROR_PER_MODEL_DAILY_QUOTA_REACHED, or PUBLIC_ERROR_USER_REQUESTS_THROTTLED and routes subsequent requests to the remaining healthy accounts. See Quarantine pre-filter for the TTLs and exact behavior.
If every account is quarantined for the requested model, the response is 429 with error: "no_eligible_account" plus a Retry-After header โ see the example payload in the 429 response tab below.
503 โ Service unavailable
Transient Google-side issue. Wait 5-10 seconds and retry. If the response body says "Captcha service failed", the issue is with your captcha provider (check API key and balance) rather than Google โ donโt retry until the provider is back.
403 โ Request rejected by Google
Captcha token rejected by Google despite our internal retries โ a captcha-provider issue. Increase captchaRetry (default 3) in the request body to 5 or higher, and configure additional providers via POST /accounts/captcha-providers so captchaOrder can cycle across them. If issues persist, contact your reCAPTCHA provider(s) support.
https://api.useapi.net/v1/google-flow/videos
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API tokenis required, see Setup useapi.net for details.
Request Body
{
"prompt": "A serene mountain landscape at sunset with camera slowly panning right",
"model": "veo-3.1-fast",
"aspectRatio": "landscape",
"duration": 8,
"count": 2,
"seed": 123456
}
Parameters are grouped below. For per-model limits and modes see Model Capabilities above.
Core
promptis required, text description for video generation.modelis optional, the AI model to use for video generation (default:veo-3.1-fast). Supported values:veo-3.1-quality,veo-3.1-fast,veo-3.1-lite,veo-3.1-lite-low-priority,omni-flash. See Model Capabilities.aspectRatiois optional, output video aspect ratio (default:landscape). Supported values:landscape,portrait. Veo also accepts1:1,4:3,3:4; Omni Flash does not.durationis optional, output video length in seconds (default:8). Supported values:4,6,8,10. See Model Capabilities for per-model availability. Not accepted by Omni Flash V2V edit (output length matches the input trim window).countis optional, number of video variations to generate (1-4, default:1).seedis optional, random seed for reproducible results (integer โฅ 0).
Account selection
-
emailis optional, the Google Flow account to use.When only one account is configured, the API will automatically use that account.
With multiple accounts configured, omitting the email parameter triggers automatic load balancing based on video generation job statistics to select the healthiest account.
If
startImage,endImage,referenceImage_*, orreferenceVideo_1are provided, theemailparameter can be omitted โ the API will automatically use the same account where the references were uploaded.
Image references
startImageis optional, mediaGenerationId from POST /assets/emailfor I2V mode (video starts with this frame). Veo only โ Omni Flash frames mode coming soon.endImageis optional, mediaGenerationId from POST /assets/emailfor I2V-FL mode (video ends with this frame, requiresstartImage). End-frame-only is not supported.referenceImage_1toreferenceImage_7are optional, mediaGenerationId from POST /assets/emailfor R2V mode. Slots_1.._3work on Veo (max 3, notveo-3.1-quality) and Omni Flash; slots_4.._7areomni-flashonly. Cannot be combined withstartImage/endImage.
Characters
character_1tocharacter_7are optional, character reference-ids from POST /characters. Triggers R2V (Ingredients) mode just likereferenceImage_*does. Each characterโs image count rolls into the modelโs image-ref budget (see Model Capabilities โบ References):- Veo 3.1 Fast / Lite / Lite Lower Priority (
veo-3.1-fast,veo-3.1-lite,veo-3.1-lite-low-priority) โ characters supported in 8 s only;referenceImages.length + ฮฃ(character.imgs) โค 3. - Gemini Omni Flash (
omni-flash) โ characters supported in all durations;referenceImages.length + ฮฃ(character.imgs) โค 7. - Veo 3.1 Quality (
veo-3.1-quality) โ characters NOT supported (no Ingredients mode).
- Veo 3.1 Fast / Lite / Lite Lower Priority (
Voice narration
referenceAudio_1toreferenceAudio_5are optional. Each slot accepts either a system voice name (case-insensitive, one of the 30 presets) or a user voice from POST /voices. Per-model limits are in the References table above.
System voice presets (30 names):
[
"Achird", "Achernar", "Algieba", "Algenib", "Alnilam",
"Aoede", "Autonoe", "Callirrhoe", "Charon", "Despina",
"Enceladus", "Erinome", "Fenrir", "Gacrux", "Iapetus",
"Kore", "Laomedeia", "Leda", "Orus", "Puck",
"Pulcherrima", "Rasalgethi", "Sadachbia", "Sadaltager", "Schedar",
"Sulafat", "Umbriel", "Vindemiatrix", "Zephyr", "Zubenelgenubi"
]
System voice samples: https://www.gstatic.com/aitestkitchen/voices/samples/{Name}.wav
To list user (custom) voices on an account: GET /voices?email=โฆ&source=user. To preview a single voice (system or user): GET /voices/ref.
Video reference (Omni Flash V2V edit)
referenceVideo_1is optional (Omni Flash only), mediaGenerationId of a video uploaded via POST /assets/email. Switches the request into V2V edit mode. Cannot be combined withstartImage/endImage.startFrameIndex_1is optional (Omni Flash V2V only, paired withreferenceVideo_1), trim start on a 24 fps virtual timeline. Range: 0-239. Default:0.endFrameIndex_1is optional (Omni Flash V2V only, paired withreferenceVideo_1), trim end on a 24 fps virtual timeline. Range: 1-240 (240 = 10 s, the V2V input maximum). Default:min(round(durationSeconds ร 24), 240)derived from the uploaded clip. Must be greater thanstartFrameIndex_1.
Async & callbacks
asyncis optional, enables fire-and-forget mode (default:false). Whentrue, returns immediately with201 Createdand job metadata. Poll GET /jobs/jobIdfor completion status. Useful for avoiding long request timeouts since video generation takes 60-180 seconds.replyUrlis optional, webhook URL for job status callbacks. Receives POST requests with job status updates (created,started,completed,failed). The JSON payload shape matches GET /jobs/jobIdresponse.replyRefis optional, custom reference string passed back in webhook callbacks. Useful for tracking jobs on your end.
Captcha
captchaToken,captchaRetry,captchaOrderare optional, mutually exclusive captcha parameters. See Captcha Parameters for details.
Responses
-
Videos generated successfully. All video data is in the
media[]array.{ "jobId": "j1731859234567v-u12345-email:jo***@gmail.com-bot:google-flow", "media": [ { "name": "a1d95d21-75d2-482d-a354-14ef8802ce66", "projectId": "9f63078c-...redacted...", "workflowId": "fa986834-...redacted...", "workflowStepId": "CAE", "mediaMetadata": { "createTime": "2026-05-20T23:14:02.931677Z", "mediaTitle": "A serene mountain landscape at sunset with camera slowly panning right", "requestData": { "videoGenerationRequestData": { "videoModelControlInput": { "videoModelName": "veo_3_1_t2v", "videoGenerationMode": "VIDEO_GENERATION_MODE_TEXT_TO_VIDEO", "videoAspectRatio": "VIDEO_ASPECT_RATIO_LANDSCAPE" } }, "clientPlatform": "CLIENT_PLATFORM_WEB" }, "mediaStatus": { "mediaGenerationStatus": "MEDIA_GENERATION_STATUS_SUCCESSFUL" }, "visibility": "PRIVATE" }, "video": { "generatedVideo": { "seed": 123456, "prompt": "A serene mountain landscape at sunset with camera slowly panning right", "model": "veo_3_1_t2v", "baseImageMediaGenerationId": "", "isLooped": false, "aspectRatio": "VIDEO_ASPECT_RATIO_LANDSCAPE" }, "dimensions": { "length": "8s" }, "operation": { "name": "a1d95d21-75d2-482d-a354-14ef8802ce66" } }, "mediaGenerationId": "user:12345-email:6a6f...-video:a1d95d21-75d2-482d-a354-14ef8802ce66", "videoUrl": "https://flow-content.google/video/a1d95d21-...redacted...?Expires=...", "thumbnailUrl": "https://flow-content.google/image/a1d95d21-...redacted...?Expires=..." } ], "remainingCredits": 18760, "captcha": { "service": "AntiCaptcha", "taskId": "abc123...", "durationMs": 3500, "attempts": [ { "service": "AntiCaptcha", "taskId": "abc123...", "durationMs": 3500, "success": true } ] } } -
Job created in async mode (
async: true). Video generation is processing in the background.Use GET /jobs/
jobIdto poll for completion status.{ "jobid": "j1731859234567v-u12345-email:jo***@gmail.com-bot:google-flow", "type": "video", "status": "created", "created": "2025-11-17T12:34:56.789Z", "request": { "async": true, "prompt": "A serene mountain landscape at sunset with camera slowly panning right", "email": "jo***@gmail.com", "model": "veo-3.1-fast", "aspectRatio": "landscape", "duration": 8, "count": 2, "seed": 123456, "replyUrl": "https://your-domain.com/webhook", "replyRef": "custom-reference-123" }, "response": { "operations": [ { "operation": { "name": "1450903d...redacted...9c86f0" }, "sceneId": "1450903d...redacted...9c86f0", "status": "MEDIA_GENERATION_STATUS_PENDING" }, { "operation": { "name": "f2eec9bd...redacted...e16f7a" }, "sceneId": "f2eec9bd...redacted...e16f7a", "status": "MEDIA_GENERATION_STATUS_PENDING" } ], "captcha": { "service": "AntiCaptcha", "taskId": "14af1dbb-885c-4e25-8121-7a79489dfd0e", "durationMs": 5357 } } } -
Invalid request (validation error, mode conflict, email mismatch, or content policy violation).
Validation error:
{ "error": "Model 'veo-3.1-quality' does not support R2V mode (MULTI_REFERENCE_NO_STYLE)" }Content policy error:
{ "jobId": "j1731859234567v-u12345-email:jo***@gmail.com-bot:google-flow", "error": "API error: 400", "code": 400, "response": { "error": { "code": 400, "message": "Request contains an invalid argument.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "PUBLIC_ERROR_UNSAFE_GENERATION" } ] } } }Content policy error (direct):
{ "error": { "code": 400, "message": "Request contains an invalid argument.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "PUBLIC_ERROR_UNSAFE_GENERATION" } ] } }All operations failed (during polling):
{ "jobId": "j1731859234567v-u12345-email:jo***@gmail.com-bot:google-flow", "error": "All operations failed", "code": 400, "response": { "operations": [ { "operation": { "name": "a789f1...redacted", "error": { "code": 3, "message": "PUBLIC_ERROR_MINOR" } }, "sceneId": "a629a9...redacted", "status": "MEDIA_GENERATION_STATUS_FAILED" } ] } } -
Invalid API token.
{ "error": "Unauthorized" } -
Subscription expired or insufficient credits.
{ "error": "Account has no subscription or subscription expired" } -
Request rejected by Google. See Response Codes โบ 403 above for guidance. Example payload:
{ "code": 403, "created": "2025-12-23T21:54:26.393Z", "error": "API error: 403", "jobid": "j1223215426393445325v-u12345-email:us***@gmail.com-bot:google-flow", "request": { "aspectRatio": "landscape", "count": 1, "duration": 8, "email": "us***@gmail.com", "model": "veo-3.1-fast", "prompt": "A cinematic shot of a sunset over the ocean..." }, "response": { "captcha": { "attempts": [ { "service": "AntiCaptcha", "taskId": "14af1dbb-885c-4e25-8121-7a79489dfd0e", "durationMs": 5357, "success": true }, { "service": "AntiCaptcha", "taskId": "fd044078-0a4a-4303-a585-26fd5d2acb00", "durationMs": 5376, "success": true }, { "service": "AntiCaptcha", "taskId": "ab0251dc-6930-4a82-966a-71fe6ab6aa42", "durationMs": 5789, "success": true } ], "durationMs": 18091, "service": "AntiCaptcha", "taskId": "ab0251dc-6930-4a82-966a-71fe6ab6aa42" }, "error": { "code": 403, "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "PUBLIC_ERROR_SOMETHING_WENT_WRONG" } ], "message": "reCAPTCHA evaluation failed", "status": "PERMISSION_DENIED" } }, "status": "failed", "type": "video", "updated": "2025-12-23T21:54:45.319Z" } -
Account not found or not configured.
{ "error": "Google Flow account [email protected] not found" } -
Video generation polling timeout (after 10 minutes).
{ "error": "Video generation polling timeout after 120 attempts (600s)" } -
Google returns at least four known distinct
RESOURCE_EXHAUSTEDvariants. See Response Codes โบ 429 above for the right strategy per reason. Example payloads:Example โ reCAPTCHA evaluation failed (
PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC):{ "error": { "code": 429, "message": "reCAPTCHA evaluation failed", "status": "RESOURCE_EXHAUSTED", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "PUBLIC_ERROR_UNUSUAL_ACTIVITY_TOO_MUCH_TRAFFIC" } ] } }Example โ per-user throttling:
{ "error": { "code": 429, "message": "Resource has been exhausted (e.g. check quota).", "status": "RESOURCE_EXHAUSTED", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "PUBLIC_ERROR_USER_REQUESTS_THROTTLED" } ] } }Example โ per-model daily quota reached:
{ "error": { "code": 429, "message": "Resource has been exhausted (e.g. check quota).", "status": "RESOURCE_EXHAUSTED", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "PUBLIC_ERROR_PER_MODEL_DAILY_QUOTA_REACHED", "metadata": { "canUpgradeForQuota": "true" } } ] } }Example โ account-wide quota reached (
PUBLIC_ERROR_USER_QUOTA_REACHED):{ "error": { "code": 429, "message": "Resource has been exhausted (e.g. check quota).", "status": "RESOURCE_EXHAUSTED", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "PUBLIC_ERROR_USER_QUOTA_REACHED" } ] } }Example โ every configured account is quarantined for the requested model (
no_eligible_account):When you omit
emailand every one of your accounts is currently quarantined for the requested model (see Quarantine pre-filter), the API short-circuits with this429response โ no upstream call to Google is made. Response headers includeRetry-After: <seconds>per RFC 7231.{ "error": "no_eligible_account", "message": "All your Google Flow accounts have hit Google's daily per-user quota. Quota resets at UTC midnight (2026-05-20T00:00:10.000Z).", "retryAfter": "2026-05-20T00:00:10.000Z", "skipReasons": [ { "email": "[email protected]", "reason": "PUBLIC_ERROR_USER_QUOTA_REACHED", "model": "*" }, { "email": "[email protected]", "reason": "PUBLIC_ERROR_USER_QUOTA_REACHED", "model": "*" } ] }skipReasonslists every account considered and the reason it was filtered, so you can decide whether to wait, switch model, or add more accounts. To bypass the load balancer entirely, specifyemailexplicitly โ the request will be sent to Google regardless of quarantine state. -
Service temporarily unavailable or captcha provider error. See Response Codes โบ 503 above for guidance. Example payloads:
{ "error": { "code": 503, "message": "Service temporarily unavailable.", "status": "UNAVAILABLE" } }{ "error": "Captcha service failed: ERROR_ZERO_BALANCE", "code": 503 } -
596 Session Error
Google session refresh failed. The account needs to be reconfigured. Delete the account using DELETE /accounts/
emailand add it again by strictly following the procedure in Setup Google Flow.{ "error": "Failed to refresh session: 500 Internal Server Error" }
Model
-
Video generation completed. Returns full video data with signed URLs.
{ jobId: string // Job identifier media: Array<{ // All video data lives here name: string // Media identifier (raw UUID) projectId: string workflowId?: string workflowStepId?: string // e.g. "CAE" mediaMetadata: { createTime?: string // ISO 8601 timestamp mediaTitle?: string // Original prompt requestData?: object // Full Google Flow request payload (model, mode, refs, etc.) mediaStatus: { mediaGenerationStatus: string // MEDIA_GENERATION_STATUS_SUCCESSFUL | FAILED error?: { code: number; message: string } } visibility?: string // "PRIVATE" } video?: { generatedVideo: { seed: number prompt?: string model: string // veo_3_1_t2v | veo_3_1_i2v | veo_3_1_i2v_fl | veo_3_1_r2v | omni_flash_* etc. baseImageMediaGenerationId?: string // Source media ID for I2V/R2V (empty string for T2V) isLooped: boolean aspectRatio: string // VIDEO_ASPECT_RATIO_LANDSCAPE | PORTRAIT } dimensions?: { length?: string } // Duration string (e.g. "8s") operation: { name: string } } mediaGenerationId: string // Encoded reference ID for use in subsequent API calls videoUrl?: string // Signed video download URL (MP4, valid ~24h) thumbnailUrl?: string // Signed thumbnail download URL (JPEG, valid ~24h) }> remainingCredits?: number captcha?: { // Captcha metadata service: string // "CapSolver" | "AntiCaptcha" | "YesCaptcha" | "CapMonster" | "SolveCaptcha" | "2Captcha" | "EzCaptcha" | "UserProvided" taskId?: string durationMs: number attempts: Array<{ service: string taskId?: string durationMs: number success: boolean error?: string }> } } -
Job created and processing in background. Structure matches GET /jobs/
jobIdresponse.{ jobid: string // Job identifier type: 'video' // Job type status: 'created' // Job status created: string // ISO 8601 timestamp request: { async: true prompt: string email?: string model?: string aspectRatio?: string count?: number seed?: number startImage?: string endImage?: string referenceImage_1?: string referenceImage_2?: string referenceImage_3?: string replyUrl?: string replyRef?: string } response: { operations: Array<{ operation: { name: string // Operation identifier } sceneId: string // Scene identifier status: 'MEDIA_GENERATION_STATUS_PENDING' }> captcha?: { // Present when captcha was used service: string // Provider that generated final token or "UserProvided" taskId?: string // Task ID from provider (absent for UserProvided) durationMs: number // Total captcha solving time attempts?: Array<{ // All captcha attempts (if retries occurred) service: string taskId?: string durationMs: number success: boolean }> } } } -
Error response structure (applies to both sync and async modes).
{ jobId?: string // Present for job-related errors error: string // Error summary message code?: number // HTTP status code response?: { // API response with error details operations?: Array<{ // Present when operations failed operation: { name: string error?: { code: number; message: string } } sceneId: string status: string }> error?: { // Present for direct API errors code: number message: string status: string details?: Array<{ '@type': string reason: string }> } } // The following siblings appear only on the load-balancer empty-set 429, // i.e. when error === "no_eligible_account" (see 429 response tab). message?: string // Customer-facing explanation retryAfter?: string // ISO-8601 timestamp of earliest retry skipReasons?: Array<{ // Per-account filter rationale email: string reason: string // Google 429 reason that triggered the quarantine model: string // Quarantined model, or "*" for account-wide }> }
Examples
-
curl -X POST \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "prompt": "A serene mountain landscape at sunset with camera slowly panning right", "model": "veo-3.1-fast", "aspectRatio": "landscape", "duration": 8, "count": 2, "seed": 123456 }' \ "https://api.useapi.net/v1/google-flow/videos" > response.json # Extract video URLs using jq cat response.json | jq -r '.media[0].videoUrl' cat response.json | jq -r '.media[1].videoUrl' # Download videos using curl curl "$(cat response.json | jq -r '.media[0].videoUrl')" --output video_1.mp4 curl "$(cat response.json | jq -r '.media[1].videoUrl')" --output video_2.mp4 -
const token = 'YOUR_API_TOKEN'; const apiUrl = 'https://api.useapi.net/v1/google-flow/videos'; const response = await fetch(apiUrl, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ prompt: 'A serene mountain landscape at sunset with camera slowly panning right', model: 'veo-3.1-fast', aspectRatio: 'landscape', duration: 8, count: 2, seed: 123456 }) }); const result = await response.json(); console.log('Generated videos:', result.media.length); // Download videos for (const [index, item] of result.media.entries()) { console.log(`Video ${index + 1} seed:`, item.video?.generatedVideo?.seed); console.log(`mediaGenerationId:`, item.mediaGenerationId); console.log(`Video URL:`, item.videoUrl); // Download video (Node.js) const videoResponse = await fetch(item.videoUrl); const videoBuffer = await videoResponse.arrayBuffer(); const fs = require('fs'); fs.writeFileSync(`generated_video_${index + 1}.mp4`, Buffer.from(videoBuffer)); } -
import requests token = 'YOUR_API_TOKEN' api_url = 'https://api.useapi.net/v1/google-flow/videos' headers = { 'Authorization': f'Bearer {token}', 'Content-Type': 'application/json' } data = { 'prompt': 'A serene mountain landscape at sunset with camera slowly panning right', 'model': 'veo-3.1-fast', 'aspectRatio': 'landscape', 'duration': 8, 'count': 2, 'seed': 123456 } response = requests.post(api_url, headers=headers, json=data) result = response.json() print(f"Generated {len(result['media'])} videos") # Download videos for index, item in enumerate(result['media']): video = item.get('video', {}).get('generatedVideo', {}) print(f"Video {index + 1} seed:", video.get('seed')) print(f"mediaGenerationId:", item.get('mediaGenerationId')) # Download video video_response = requests.get(item['videoUrl']) with open(f'generated_video_{index + 1}.mp4', 'wb') as f: f.write(video_response.content)