Overview
Veo 3.1 official API forwarding is now available through
api.laozhang.ai and is compatible with the OpenAI Videos API style. For new integrations, create a dedicated token, keep it in the default group, and set Billing mode to Pay-per-request. This page documents the API format, parameters, pricing, and code examples.Pricing Advantage
Veo 3.1 official forwarding uses Pay-per-request billing with one unified price across supported duration and resolution combinations. Duration and resolution do not add extra charges. Based on public pricing from Google Gemini API Pricing, Google bills Veo 3.1 per second; the comparison below uses 8-second videos.| Model | LaoZhang price | Google 8s 1080p | Lower by | Google 8s 4K | Lower by |
|---|---|---|---|---|---|
veo-3.1-fast-generate-preview | $0.3/call | $0.96 | 68.8% | $2.40 | 87.5% |
veo-3.1-generate-preview | $1.2/call | $3.20 | 62.5% | $4.80 | 75.0% |
| Step | Method | Path | Response |
|---|---|---|---|
| Create a video task | POST | /v1/videos | JSON task object |
| Poll task status | GET | /v1/videos/{id} | JSON status object |
| Compatibility status polling | GET | /v1/video/generations/{id} | JSON status object |
| Download video output | GET | /v1/videos/{id}/content | video/mp4 bytes |
input_reference. For first/last-frame generation, use a JSON request body with images and metadata.lastFrame Data URIs. Do not treat multi-reference-image fields as production-ready capabilities yet.
On 2026-06-27, retesting with the upstream JSON example verified that
images[] + metadata.lastFrame produces videos matching both the first and last frame. Both 720p and 1080p passed frame extraction checks. The field is case-sensitive: use lastFrame, not lastframe; the request body must be JSON, not multipart; pass duration as the string "8", not the number 8. metadata.referenceImages still returns referenceImage isn't supported by this model, so multi-reference images remain unavailable.Token Setup
| Setting | Value |
|---|---|
| Console entry | Token management → create a new token |
| Group | Default group |
| Billing mode | Pay-per-request |
| Recommendation | Create a dedicated Veo 3.1 official-forward token for easier usage review |
Veo 3.1 official forwarding uses the
Pay-per-request billing mode across supported duration and resolution combinations. Duration and resolution do not add extra charges.Supported Models
| Model | Price per call | Description | Best for |
|---|---|---|---|
veo-3.1-fast-generate-preview | $0.3 | Veo 3.1 Fast preview model | Quick tests, drafts, cost-sensitive workflows |
veo-3.1-generate-preview | $1.2 | Veo 3.1 standard preview model | Higher-quality outputs, production assets, complex shots |
OpenAI SDK Quick Start
For text-to-video and single-image image-to-video, use the OpenAI SDK first. Setbase_url to https://api.laozhang.ai/v1.
input_reference:
Parameters
Core Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
model | string | Yes | veo-3.1-fast-generate-preview or veo-3.1-generate-preview |
prompt | string | Yes | Video prompt |
seconds | string | No | Duration. For production integrations, use "8" |
duration | string | No | Duration. Pass "8" for both multipart and JSON first/last-frame requests; do not pass numeric 8 |
size | string | No | Output size such as 1280x720, 720x1280, 1920x1080, 1080x1920, 3840x2160 |
resolution | string | No | 720p, 1080p, or 4k |
aspectRatio | string | No | 16:9 or 9:16 |
metadata | string / object | No | JSON string in multipart requests; object in JSON first/last-frame requests, such as {"lastFrame":"data:image/jpeg;base64,..."} |
negativePrompt | string | No | Negative prompt, such as blurry, watermark, distorted. For image-to-video requests, omit it unless you have verified the behavior yourself |
seed | string | No | Random seed for similar repeatability |
input_reference | file | No | Verified field for single first-frame image-to-video, uploaded as multipart/form-data |
images | string[] | No | First-frame Data URI array for JSON first/last-frame requests |
metadata.lastFrame | string | No | Last-frame Data URI for JSON first/last-frame requests; field name is case-sensitive |
referenceImages / metadata.referenceImages | file / string[] | No | Currently rejected upstream with referenceImage unsupported; do not expose it |
reference_image / reference_images | file | No | Compatible multi-reference fields, currently not available |
referenceType / reference_type | string | No | Reference image type field; do not rely on it alone |
video | file | No | Video extension field. Upload an existing MP4 as the continuation reference |
Duration and Resolution
| Use case | Suggested parameters |
|---|---|
| 4s landscape 720p | seconds="4", size="1280x720", resolution="720p", aspectRatio="16:9" |
| 8s landscape 720p | seconds="8", size="1280x720", resolution="720p", aspectRatio="16:9" |
| 8s landscape 1080p | seconds="8", size="1920x1080", resolution="1080p", aspectRatio="16:9" |
| 8s portrait 1080p | seconds="8", size="1080x1920", resolution="1080p", aspectRatio="9:16" |
| 8s landscape 4K | seconds="8", duration="8", size="3840x2160", resolution="4k", aspectRatio="16:9", metadata='{"durationSeconds":8,"resolution":"4k","aspectRatio":"16:9"}' |
4K requests use the unified price. If you need to verify native 4K output, download the MP4 and inspect its media metadata. Do not rely only on create-task parameters for final file resolution.
Text-to-Video
Create a Task
Create Response
Image-to-Video
Image-to-video uses the same create endpoint. Single first-frame image-to-video uses multipartinput_reference; first/last-frame generation uses JSON images[] + metadata.lastFrame. Do not use multipart last_frame / lastFrame file fields as a replacement for JSON metadata.lastFrame.
4K Landscape Image-to-Video
For 4K landscape image-to-video, upload a 16:9 reference image and pass bothresolution="4k" and metadata.resolution="4k".
First/Last-Frame Generation
First/last-frame generation must use a JSON request body. Pass the first frame as a Data URI insideimages, and pass the last frame as a Data URI inside metadata.lastFrame. Pass duration as a string, such as "8", so OpenAI-compatible gateways do not reject the numeric type. In testing, size="1920x1080" and duration="8" returned a 1920x1080, 8-second MP4 with extracted first and final frames matching the inputs.
Multi-Reference Images
Video Extension
Video extension uses thevideo file field to upload an existing MP4. Use 8-second requests. This mode continues the style and content from the uploaded video according to your prompt; it does not guarantee frame-perfect stitching.
Poll Status
Save theid or task_id from the create response, then poll status.
Status Values
| Status | Meaning |
|---|---|
queued | Queued |
in_progress | Generating |
completed | Completed and ready to download |
failed | Failed |
Compatibility Status Polling
If existing code uses the older video generations polling path, use this compatibility endpoint:The compatibility polling endpoint does not return a separate public video URL. Download video results through
/v1/videos/{id}/content.Download Video
After the task completes, use/content to retrieve MP4 bytes. The API returns video file bytes, not a public video URL.
Python Complete Example
FAQ
Does the API return a video URL or file bytes?
Does the API return a video URL or file bytes?
/v1/videos/{id}/content returns video/mp4 bytes, not a public video URL. /v1/video/generations/{id} returns a task status object, not a separate public video URL. In production, download it server-side, store it in your own OSS/CDN, and return your own URL to users.Which token group should I choose?
Which token group should I choose?
Use the default group for Veo 3.1 official forwarding. Create a dedicated token and set Billing mode to
Pay-per-request for cleaner billing review.Which duration and resolution should I use?
Which duration and resolution should I use?
Billing uses
Pay-per-request, not separate duration or resolution pricing. veo-3.1-fast-generate-preview is $0.3/call, and veo-3.1-generate-preview is $1.2/call. For production integrations, use 8-second requests; 1080p and 4k require 8 seconds. For 4K, also pass metadata.resolution="4k".Can image-to-video use multiple images?
Can image-to-video use multiple images?
Two verified image-control paths are available: single first-frame generation with multipart
input_reference, and first/last-frame generation with JSON images[] + metadata.lastFrame. Do not expose metadata.referenceImages as a material-reference feature right now; upstream currently returns referenceImage unsupported.Is video extension supported?
Is video extension supported?
Yes. Upload an MP4 through the
video file field and use seconds="8" plus duration="8". Video extension continues style and content from the uploaded video according to your prompt; it does not guarantee frame-perfect stitching.Can I pass generateAudio to control sound?
Can I pass generateAudio to control sound?
Do not pass
generateAudio. Veo 3 / Veo 3.1 models have native audio, but this API does not support toggling audio with generateAudio; describe the desired audio in the prompt instead.Can I use Chat Completions?
Can I use Chat Completions?
Not recommended. Veo 3.1 official forwarding should use the same
/v1/videos task API style as Sora2 official forwarding.