Generate Videos

November 17, 2025 (June 5, 2026)

Table of contents

  1. Model Capabilities
    1. Models
    2. Aspect ratio (aspectRatio)
    3. Duration (duration, sec)
    4. References
  2. Content Moderation
  3. Response Codes
    1. 429 โ€” Rate limit / quota exhausted
    2. 503 โ€” Service unavailable
    3. 403 โ€” Request rejected by Google
  4. Request Headers
  5. Request Body
    1. Core
    2. Account selection
    3. Image references
    4. Characters
    5. Voice narration
    6. Video reference (Omni Flash V2V edit)
    7. Async & callbacks
    8. Captcha
  6. Responses
  7. Model
  8. Examples
  9. 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 - Lite
veo-3.1-lite
4s, 6s, 8s videos
Extend
Non-Ultra: 10
Ultra: 5
Veo 3.1 - Lite Lower Priority
veo-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 - Quality
veo-3.1-quality
8s videos
Extend
100
Gemini Omni Flash
omni-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 Flash
omni-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

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

  • prompt is required, text description for video generation.
  • model is 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.
  • aspectRatio is optional, output video aspect ratio (default: landscape). Supported values: landscape, portrait. Veo also accepts 1:1, 4:3, 3:4; Omni Flash does not.
  • duration is 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).
  • count is optional, number of video variations to generate (1-4, default: 1).
  • seed is optional, random seed for reproducible results (integer โ‰ฅ 0).

Account selection

  • email is 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_*, or referenceVideo_1 are provided, the email parameter can be omitted โ€” the API will automatically use the same account where the references were uploaded.

Image references

  • startImage is optional, mediaGenerationId from POST /assets/email for I2V mode (video starts with this frame). Veo only โ€” Omni Flash frames mode coming soon.
  • endImage is optional, mediaGenerationId from POST /assets/email for I2V-FL mode (video ends with this frame, requires startImage). End-frame-only is not supported.
  • referenceImage_1 to referenceImage_7 are optional, mediaGenerationId from POST /assets/email for R2V mode. Slots _1.._3 work on Veo (max 3, not veo-3.1-quality) and Omni Flash; slots _4.._7 are omni-flash only. Cannot be combined with startImage/endImage.

Characters

  • character_1 to character_7 are optional, character reference-ids from POST /characters. Triggers R2V (Ingredients) mode just like referenceImage_* 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).

Voice narration

  • referenceAudio_1 to referenceAudio_5 are 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_1 is optional (Omni Flash only), mediaGenerationId of a video uploaded via POST /assets/email. Switches the request into V2V edit mode. Cannot be combined with startImage/endImage.
  • startFrameIndex_1 is optional (Omni Flash V2V only, paired with referenceVideo_1), trim start on a 24 fps virtual timeline. Range: 0-239. Default: 0.
  • endFrameIndex_1 is optional (Omni Flash V2V only, paired with referenceVideo_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 than startFrameIndex_1.

Async & callbacks

  • async is optional, enables fire-and-forget mode (default: false). When true, returns immediately with 201 Created and job metadata. Poll GET /jobs/jobId for completion status. Useful for avoiding long request timeouts since video generation takes 60-180 seconds.
  • replyUrl is 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/jobId response.
  • replyRef is optional, custom reference string passed back in webhook callbacks. Useful for tracking jobs on your end.

Captcha

  • captchaToken, captchaRetry, captchaOrder are optional, mutually exclusive captcha parameters. See Captcha Parameters for details.

Responses

  • 200 OK

    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
          }
        ]
      }
    }
    
  • 201 Created

    Job created in async mode (async: true). Video generation is processing in the background.

    Use GET /jobs/jobId to 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
        }
      }
    }
    
  • 400 Bad Request

    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"
          }
        ]
      }
    }
    
  • 401 Unauthorized

    Invalid API token.

    {
      "error": "Unauthorized"
    }
    
  • 402 Payment Required

    Subscription expired or insufficient credits.

    {
      "error": "Account has no subscription or subscription expired"
    }
    
  • 403 Forbidden

    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"
    }
    
  • 404 Not Found

    Account not found or not configured.

    {
      "error": "Google Flow account [email protected] not found"
    }
    
  • 408 Request Timeout

    Video generation polling timeout (after 10 minutes).

    {
      "error": "Video generation polling timeout after 120 attempts (600s)"
    }
    
  • 429 Too Many Requests

    Google returns at least four known distinct RESOURCE_EXHAUSTED variants. 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 email and every one of your accounts is currently quarantined for the requested model (see Quarantine pre-filter), the API short-circuits with this 429 response โ€” no upstream call to Google is made. Response headers include Retry-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": "*" }
      ]
    }
    

    skipReasons lists 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, specify email explicitly โ€” the request will be sent to Google regardless of quarantine state.

  • 503 Service Unavailable

    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/email and 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/jobId response.

    {
      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)
    

Try It