Vidu API — 27 Operations and Pricing
The Vidu API gives you one URL-only task endpoint for Vidu video, image, audio, motion, lip-sync, template, and film workflows. OmnAPI handles authentication, credit authorization, task polling, cancellation rules, and webhooks while your application supplies public media URLs.
Use this flow:
POST /api/v1/vidu/quotewith anoperationandinput.POST /api/v1/vidu/taskswith the same core fields, optional create-only guards, and anIdempotency-Key.- Poll
GET /api/v1/vidu/tasks/{taskId}or configureconfig.webhookUrl. - Download completed resources immediately and no later than one hour. Honor an earlier expiry when the returned resource provides one.
Request envelope
Section titled “Request envelope”Quote and create share operation, input, and pricingContext. Create also
accepts the create-only fields shown below:
| Field | Type | Required | Meaning |
|---|---|---|---|
operation | enum | yes | One of the 27 values in Supported operations. |
input | object | yes | The selected Vidu Enterprise v2 request body, nested unchanged except for the restrictions below. |
pricingContext.durationSec | number, > 0, max 3,600 | conditional | Media duration used when pricing cannot be derived from a URL. Supply it for duration-priced lip-sync, motion, upscale, or edit calls when input.duration is absent. |
pricingContext.providerCreditCap | number, 1–100,000 | conditional | Vidu-credit authorization reserve required for replace-video, digital-human, template, and template-story. |
maxCredits | number, >= 1 | create only | Reject creation before debit when the latest OmnAPI quote exceeds this amount. |
config | object | create only | Standard priority, tags, metadata, and webhookUrl task config. |
Copy the fields from the linked Vidu request-body reference into input, not
beside it. Do not copy Vidu’s callback_url / callbackUrl; OmnAPI rejects
those fields and uses config.webhookUrl instead. Do not send Vidu credentials.
Where Vidu accepts either Base64 or a URL, OmnAPI accepts only a public
http:// or https:// URL. For general-film-edit and
general-film-compose, include Vidu’s parent id in input; OmnAPI moves it
to the fixed Vidu URL path and does not forward it in the JSON body.
Complete input field index
Section titled “Complete input field index”The table below is the complete set of Vidu body fields currently documented by
OmnAPI. Names are case-sensitive. “One of” means at least one member of that
group must be supplied. Vidu’s callback_url is deliberately absent because
OmnAPI rejects it; use config.webhookUrl. Follow the linked operation
reference in the next section for model-dependent ranges, media formats,
dimensions, and file-size limits.
input is intentionally an open pass-through object in the OmnAPI contract.
OmnAPI validates the wrapper, pricing inputs, public-URL-only rule, and callback
restriction; operation-level request validation is completed by Vidu. Fields
outside this table may be forwarded, but they are not part of OmnAPI’s stable
documented contract. This distinction matters to generated SDKs: do not assume
the OpenAPI schema statically validates every nested Vidu field.
operation | Required input fields | Optional input fields and nested shape |
|---|---|---|
image-to-video | model: string, images: string[1] | prompt, voice_id, is_rec, bgm, audio, audio_type, duration, seed, resolution, movement_amplitude, payload, off_peak |
reference-to-video | model, subjects[], prompt | auto_subjects, audio, audio_type, duration, seed, aspect_ratio, resolution, movement_amplitude, payload, off_peak; each subject requires name and images[], with optional voice_id |
start-end-to-video | model, images: string[2] | prompt, is_rec, duration, seed, resolution, movement_amplitude, bgm, audio, payload, off_peak |
text-to-video | model, prompt | style, duration, seed, aspect_ratio, resolution, movement_amplitude, bgm, audio, payload, off_peak |
reference-to-image | model, prompt | images (0–7 for viduq2, 1–7 for viduq1), seed, aspect_ratio, resolution, payload |
text-to-audio | model, prompt | duration, seed |
timing-to-audio | model, timing_prompts[] | duration, seed; each timing item uses from, to, and prompt |
text-to-speech | text, voice_setting_voice_id | voice_setting_speed, voice_setting_volume, voice_setting_pitch, voice_setting_emotion, payload |
voice-clone | audio_url, voice_id, text | prompt_audio_url, prompt_text, payload |
lip-sync | video_url, one of audio_url or text | speed, voice_id, ref_photo_url, volume |
motion-sync-v1 | image_url, video_url | payload |
motion-sync-v2 | images, video_urls | template (motion_control_2 by default; motion_control_2.5 is accepted), payload |
extend-video | model, one of video_creation_id or video_url | images, prompt, duration, resolution, payload |
multi-frame-video | model, start_image, image_settings[] | resolution, payload; every image_settings item requires key_image and may include prompt and duration |
upscale-video | one of video_url or video_creation_id | upscale_resolution, payload |
replace-video | video_url, object, image | prompt, start_from, payload; also requires pricingContext.providerCreditCap |
digital-human | model, image, plus the speech/prompt fields required by the selected mode | prompt, audio_url, text, voice_id, resolution, payload; also requires pricingContext.providerCreditCap |
prompt-recommendation | images, type[] (template, img2video, or both) | resolution, count (1–10) |
template | template, images[] | prompt, seed, aspect_ratio, area, beast, bgm, payload; also requires pricingContext.providerCreditCap |
template-story | story, images[] | payload; also requires pricingContext.providerCreditCap |
general-film-create | images[], duration (10–180) | prompt, aspect_ratio, payload |
general-film-edit | id, job_id, prompt | None |
general-film-compose | id, job_ids | None |
ad-film-create | images[] | prompt, duration, aspect_ratio, language |
ad-film-edit | ad_one_click_task_id, type, prompt | storyboard_video_index (required when type is generate_video), payload |
ad-film-compose | ad_one_click_task_id, video_task_ids[], bgm_task_id, narration_task_id | payload |
trending-replicate | video_url, images[] | prompt, aspect_ratio, resolution, remove_audio |
Complete price matrix
Section titled “Complete price matrix”Every Vidu credit is billed at 2 OmnAPI credits. At OmnAPI’s $0.002 public
quote benchmark, that is $0.004 or 80% of Vidu’s $0.005 dollar list price;
your effective cash cost depends on the credit package you purchase. Direct
pricing is separate from the Music Video API. Always use /quote; video rates
vary by model, resolution, duration, and off-peak selection.
Example: viduq3-turbo, 720p, 5-second image-to-video uses 55 Vidu credits and
quotes 110 OmnAPI credits at the standard rate.
OmnAPI credits = ceil(Vidu provider credits) × 2The tables below show both quantities so you can calculate a request before
calling /quote. “Normal / off-peak” values are shown in that order. Vidu bills
whole provider credits; formulas that produce a fraction are rounded up at the
provider-credit boundary and then multiplied by 2.
The source rate card is Vidu API Pricing. The OmnAPI amount is the public customer charge, not an internal cost figure. The runtime quote remains authoritative if Vidu changes a supported combination.
Q3 image, text, and start/end video
Section titled “Q3 image, text, and start/end video”These rates apply per generated second for image-to-video, text-to-video,
and start-end-to-video. Q3 Pro Fast is available only for image-to-video.
| Model | Resolution | Vidu credits/s normal / off-peak | OmnAPI credits/s normal / off-peak |
|---|---|---|---|
| Q3 Pro | 540p | 9 / 5 | 18 / 10 |
| Q3 Pro | 720p | 20 / 10 | 40 / 20 |
| Q3 Pro | 1080p | 24 / 12 | 48 / 24 |
| Q3 Turbo | 540p | 7 / 4 | 14 / 8 |
| Q3 Turbo | 720p | 11 / 6 | 22 / 12 |
| Q3 Turbo | 1080p | 13 / 7 | 26 / 14 |
| Q3 Pro Fast (image-to-video) | 720p | 20 / 10 | 40 / 20 |
| Q3 Pro Fast (image-to-video) | 1080p | 25 / 13 | 50 / 26 |
Q3 reference-to-video
Section titled “Q3 reference-to-video”| Model | Resolution | Vidu credits/s normal / off-peak | OmnAPI credits/s normal / off-peak |
|---|---|---|---|
| Q3 Mix | 720p | 24 / not supported | 48 / not supported |
| Q3 Mix | 1080p | 29 / not supported | 58 / not supported |
| Q3 Turbo | 540p | 4 / 2 | 8 / 4 |
| Q3 Turbo | 720p | 10 / 5 | 20 / 10 |
| Q3 Turbo | 1080p | 13 / 7 | 26 / 14 |
| Q3 | 540p | 7 / 4 | 14 / 8 |
| Q3 | 720p | 12 / 6 | 24 / 12 |
| Q3 | 1080p | 15 / 7 | 30 / 14 |
Q2 video generation
Section titled “Q2 video generation”In the formulas below, s = ceil(duration seconds). Q2 off-peak is half of the
normal Vidu total, rounded up, and is then converted at 2×. Setting audio: true
on Q2 image-to-video or reference-to-video adds 15 Vidu credits / 30 OmnAPI
credits. Setting is_rec: true on a supported video operation adds 10 Vidu
credits / 20 OmnAPI credits.
| Operation and model | Resolution | Vidu credit formula | OmnAPI credit formula |
|---|---|---|---|
| Image/start-end · Q2 Turbo | 540p | 6 + 2 × (s−1) | 12 + 4 × (s−1) |
| Image/start-end · Q2 Turbo | 720p | s=1: 8; s≥2: 10 + 10 × (s−2) | s=1: 16; s≥2: 20 + 20 × (s−2) |
| Image/start-end · Q2 Turbo | 1080p | 35 + 10 × (s−1) | 70 + 20 × (s−1) |
| Image/start-end · Q2 Pro | 540p | s=1: 8; s≥2: 10 + 5 × (s−2) | s=1: 16; s≥2: 20 + 10 × (s−2) |
| Image/start-end · Q2 Pro | 720p | 15 + 10 × (s−1) | 30 + 20 × (s−1) |
| Image/start-end · Q2 Pro | 1080p | 55 + 15 × (s−1) | 110 + 30 × (s−1) |
| Image/start-end · Q2 Pro Fast | 720p | 8 + 2 × (s−1) | 16 + 4 × (s−1) |
| Image/start-end · Q2 Pro Fast | 1080p | 16 + 4 × (s−1) | 32 + 8 × (s−1) |
| Text-to-video · Q2 | 540p | 10 + 2 × (s−1) | 20 + 4 × (s−1) |
| Text-to-video · Q2 | 720p | 15 + 5 × (s−1) | 30 + 10 × (s−1) |
| Text-to-video · Q2 | 1080p | 20 + 10 × (s−1) | 40 + 20 × (s−1) |
| Reference-to-video · Q2 | 540p | 15 + 5 × (s−1) | 30 + 10 × (s−1) |
| Reference-to-video · Q2 | 720p | 25 + 5 × (s−1) | 50 + 10 × (s−1) |
| Reference-to-video · Q2 | 1080p | 75 + 10 × (s−1) | 150 + 20 × (s−1) |
| Reference-to-video · Q2 Pro | 540p | 20 + 5 × (s−1) | 40 + 10 × (s−1) |
| Reference-to-video · Q2 Pro | 720p | 30 + 5 × (s−1) | 60 + 10 × (s−1) |
| Reference-to-video · Q2 Pro | 1080p | 85 + 10 × (s−1) | 170 + 20 × (s−1) |
Q1 and Vidu 2.0 video
Section titled “Q1 and Vidu 2.0 video”| Model and operation | Supported output | Vidu credits normal / off-peak | OmnAPI credits normal / off-peak |
|---|---|---|---|
| Q1 image/reference/start-end/text | 5s · 1080p | 80 / 40 | 160 / 80 |
| Vidu 2.0 image/start-end | 4s · 360p | 20 / 10 | 40 / 20 |
| Vidu 2.0 image/start-end | 4s · 720p | 40 / 20 | 80 / 40 |
| Vidu 2.0 image/start-end | 4s · 1080p | 100 / 50 | 200 / 100 |
| Vidu 2.0 image/start-end | 8s · 720p | 100 / 50 | 200 / 100 |
| Vidu 2.0 reference-to-video | 4s · 360p or 720p | 80 / 40 | 160 / 80 |
Image, audio, and speech
Section titled “Image, audio, and speech”| Operation | Scope | Vidu credits | OmnAPI credits |
|---|---|---|---|
| Q2 text-to-image (0 references) | 1080p / 2K / 4K | 6 / 8 / 10 | 12 / 16 / 20 |
| Q2 reference-to-image (1–3 references) | 1080p / 2K / 4K | 8 / 12 / 20 | 16 / 24 / 40 |
| Q2 reference-to-image (4–7 references) | 1080p / 2K / 4K | 10 / 16 / 30 | 20 / 32 / 60 |
| Q1 reference-to-image (1–7 references) | 1080p | 20 | 40 |
| Text/timing-to-audio | up to 5s / over 5s through 10s | 10 / 20 | 20 / 40 |
| Text-to-speech | each started 500 characters | 10, minimum 10 | 20, minimum 20 |
| Voice clone | per voice + required TTS preview | 300 + TTS | 600 + TTS |
Video tools, prompt, and motion
Section titled “Video tools, prompt, and motion”| Operation | Billing unit | Vidu credits | OmnAPI credits |
|---|---|---|---|
| Prompt recommendation | each started 5 prompts, per requested type | 10 | 20 |
| Lip sync | each started 5 seconds | 20 | 40 |
| Motion Sync V1 | each started second · 720p | 10 | 20 |
| Motion Control 2 | each started second · 720p | 19 | 38 |
| Motion Control 2.5 | each started second · 1080p | 34 | 68 |
| Upscale Pro | each started second · 1080p / 2K / 4K / 8K | 10 / 20 / 40 / 160 | 20 / 40 / 80 / 320 |
For URL inputs, put the known duration in pricingContext.durationSec. OmnAPI
does not download or inspect the source to discover its duration.
Video extension and multi-frame
Section titled “Video extension and multi-frame”s = ceil(extension or segment seconds). Multi-frame prices every
frame-to-frame segment independently and sums the results.
| Model | Resolution | Vidu credit formula | OmnAPI credit formula |
|---|---|---|---|
| Q2 Turbo extension | 540p | 10 + 2 × (s−1) | 20 + 4 × (s−1) |
| Q2 Turbo extension | 720p | 15 + 5 × (s−1) | 30 + 10 × (s−1) |
| Q2 Turbo extension | 1080p | 40 + 10 × (s−1) | 80 + 20 × (s−1) |
| Q2 Pro extension | 540p | 15 + 5 × (s−1) | 30 + 10 × (s−1) |
| Q2 Pro extension | 720p | 30 + 10 × (s−1) | 60 + 20 × (s−1) |
| Q2 Pro extension | 1080p | 60 + 15 × (s−1) | 120 + 30 × (s−1) |
| Multi-frame | up to 9 segments | sum all Q2 segment prices | 2 × summed Vidu credits |
Film and advertising solutions
Section titled “Film and advertising solutions”General-film and ad-film operations share the same create, edit, and compose
rates. ad-film-create uses 15 seconds when input.duration is omitted.
| Operation | Billing unit | Vidu credits | OmnAPI credits |
|---|---|---|---|
| General film / Ad film create | 1080p · per second | 40 | 80 |
| Edit footage | 1080p · per second | 40 | 80 |
| Edit narration | each started 500 characters | 10 | 20 |
| Edit BGM | per second | 2 | 4 |
| Compose film | per call | 1 | 2 |
| Trending replicate | 540p / 720p / 1080p · per second | 12 / 16 / 20 | 24 / 32 / 40 |
Authorization-cap operations
Section titled “Authorization-cap operations”Some template and character workflows do not have a deterministic public rate.
The following four operations require pricingContext.providerCreditCap:
| Operation | Authorization | Final settlement |
|---|---|---|
template | providerCreditCap × 2 OmnAPI credits | reported Vidu credits × 2 |
template-story | providerCreditCap × 2 OmnAPI credits | reported Vidu credits × 2 |
replace-video | providerCreditCap × 2 OmnAPI credits | reported Vidu credits × 2 |
digital-human | providerCreditCap × 2 OmnAPI credits | reported Vidu credits × 2 |
OmnAPI deducts the authorized cap at creation and refunds the unused difference when Vidu reports a lower actual total. The cap is a spend authorization, not a quoted fixed price.
Supported operations
Section titled “Supported operations”| Category | operation | What it does | Exact input body reference |
|---|---|---|---|
| Video | image-to-video | Animate one image. | Image to Video |
| Video | reference-to-video | Generate video from subject/style references. | Reference to Video |
| Video | start-end-to-video | Generate between start and end frames. | Start/End to Video |
| Video | text-to-video | Generate video from a prompt. | Text to Video |
| Image | reference-to-image | Text-to-image, reference generation, and image editing with 0-7 references. | Reference to Image |
| Audio | text-to-audio | Generate a sound effect or short audio clip. | Text to Audio |
| Audio | timing-to-audio | Generate timed audio segments. | Timing to Audio |
| Speech | text-to-speech | Synthesize speech with a Vidu voice. | Text to Speech |
| Speech | voice-clone | Clone a voice and synthesize a preview. | Voice Clone |
| Video edit | lip-sync | Synchronize video speech to text or audio. | Lip Sync |
| Motion | motion-sync-v1 | Transfer motion from a reference video. | Motion Sync |
| Motion | motion-sync-v2 | Use the current motion-control template. | Motion Sync plus OmnAPI’s injected motion_control_2 template |
| Video edit | extend-video | Extend an existing Vidu creation or public video. | Video Extension |
| Video edit | multi-frame-video | Generate transitions across multiple keyframes. | Multi-Frame |
| Video edit | upscale-video | Upscale a video to 1080p, 2K, 4K, or 8K. | Upscale Pro |
| Video edit | replace-video | Replace an object or region in a video. | Video Replacement |
| Character | digital-human | Generate a speaking character from an image and text/audio. | Digital Human |
| Prompt | prompt-recommendation | Recommend image-to-video prompts. | Prompt Recommendation |
| Template | template | Run a Vidu effect template. | Template |
| Template | template-story | Run a story template. | Template Story |
| Film | general-film-create | Create a general-purpose finished film. | One Click General Film — create |
| Film | general-film-edit | Edit a general-film job; input.id selects the parent. | One Click General Film — edit |
| Film | general-film-compose | Compose selected general-film jobs; input.id selects the parent. | One Click General Film — compose |
| Advertising | ad-film-create | Create a finished advertising film. | One Click Ad-Film — create |
| Advertising | ad-film-edit | Edit advertising footage, narration, or music. | One Click Ad-Film — edit |
| Advertising | ad-film-compose | Compose selected advertising jobs. | One Click Ad-Film — compose |
| Trends | trending-replicate | Recreate a trending video format. | One Click Trending Replicate |
Real-time Vidu S1 sessions are not included because they require a live RTC connection rather than the asynchronous REST task lifecycle.
curl -X POST https://api.omnapi.com/api/v1/vidu/quote \ -H "x-api-key: $OMNAPI_KEY" \ -H "Content-Type: application/json" \ -d '{ "operation": "image-to-video", "input": { "model": "viduq3-turbo", "images": ["https://cdn.example.com/frame.jpg"], "prompt": "A slow cinematic push-in", "duration": 5, "resolution": "720p" } }'Response:
{ "operation": "image-to-video", "viduCredits": 55, "credits": 110, "publicUsd": 0.22, "pricingMode": "rate-card", "pricingVersion": "vidu-direct-public-v1", "customerRate": 2}credits is the OmnAPI amount to authorize. viduCredits explains the Vidu
rate-card quantity. publicUsd is a display estimate; your balance and final
settlement remain denominated in OmnAPI credits.
For URL-based tools whose price depends on media length, include the known duration without asking OmnAPI to inspect the file:
{ "operation": "lip-sync", "input": { "video_url": "https://cdn.example.com/source.mp4", "audio_url": "https://cdn.example.com/voice.mp3" }, "pricingContext": { "durationSec": 11 }}Create
Section titled “Create”curl -X POST https://api.omnapi.com/api/v1/vidu/tasks \ -H "x-api-key: $OMNAPI_KEY" \ -H "Idempotency-Key: vidu-i2v-demo-001" \ -H "Content-Type: application/json" \ -d '{ "operation": "image-to-video", "input": { "model": "viduq3-turbo", "images": ["https://cdn.example.com/frame.jpg"], "prompt": "A slow cinematic push-in", "duration": 5, "resolution": "720p" }, "maxCredits": 110, "config": { "webhookUrl": "https://example.com/webhooks/omnapi", "metadata": { "assetId": "asset_123" } } }'Response:
{ "taskId": "task_01J...", "status": "PENDING", "creditsRequired": 110, "viduCredits": 55, "pricingMode": "rate-card", "pollUrl": "/api/v1/vidu/tasks/task_01J..."}Reuse operation, input, and pricingContext from quote, then add
maxCredits and config only to create. maxCredits rejects the create before
deduction if the current quote is higher. Use a unique Idempotency-Key for
each logical job so a network retry cannot create a second paid task.
Poll and download
Section titled “Poll and download”curl https://api.omnapi.com/api/v1/vidu/tasks/task_01J... \ -H "x-api-key: $OMNAPI_KEY"{ "taskId": "task_01J...", "status": "COMPLETED", "progress": 100, "resources": [ { "id": "res_01J...", "index": 0, "role": "output", "type": "video", "url": "https://..." } ], "outputUrlTtlHours": 1}outputUrlTtlHours is a conservative cross-operation window, not a promise
that the URL expires exactly at that time. OmnAPI does not copy these assets;
download them within one hour even when a standard Vidu creation URL would
remain valid for up to 24 hours.
The status values are the standard OmnAPI task states: PENDING, PROCESSING,
COMPLETED, FAILED, and CANCELLED.
Cancellation and callbacks
Section titled “Cancellation and callbacks”POST /api/v1/vidu/tasks/{taskId}/cancel refunds a task immediately before
submission. After submission, OmnAPI requests remote cancellation and refunds
only after Vidu confirms it. A 409 means cancellation was not confirmed, so
the task remains active and was not refunded; keep polling.
Do not put callback_url in input. Use config.webhookUrl so lifecycle events
use the standard OmnAPI webhook contract, including
signatures and retries.