Skip to content

Omn V1 Music Video engine

GuideAvailability varies by operation

Omn V1 is a pilot generation version for Fast MV. It renders a song as a sequence of short shots, one per MV scene, and joins them over the original audio. Each shot has a type: a story shot, a singing shot, a performance or dance shot, or a continuity shot that starts where the previous shot ended. Omn V1 has its own price card, four render tiers and an off-peak economy schedule. Finished Omn V1 videos support per-shot edits and render-tier upgrades.

Music Video overview · Create a video · Quotes and billing

Set generation.engineVersion to "omn-v1" on POST /api/v1/mv/preflight, POST /api/v1/mv or the POST /api/v1/tasks MV create bridge, and engineVersion: "omn-v1" on POST /api/v1/mv/quote. A creative draft selects it with its own engineVersion. generation.managedVersion still names the purchase: oneclick-v1 (default) or premium-v2 with a generation.performanceMode. Studio does not offer an engine choice.

The Omn-only fields generation.renderTier, generation.schedule, generation.motionReferenceVideo and generation.motionRightsConfirmed return 400 VALIDATION_ERROR without omn-v1 or on Studio.

native.defaultEngine in capabilities reports whether requests that omit generation.engineVersion are evaluated for Omn V1 first. When enabled is true and contracts lists the purchase (oneclick-v1, premium-v2:perform, premium-v2:sing, premium-v2:sing_perform or premium-v2:dance), accounts included in rolloutPercent are evaluated for Omn V1 at its price. The rollout percentage defaults to zero and account selection is stable. The request stays on the existing engine when the account is outside the rollout or Omn V1 cannot admit it. Default-engine rules:

  • An explicit engineVersion is never changed.
  • A request that carries a quoteId keeps the engine it was quoted for.
  • Reusing a saved preflight keeps its original engine, including older Vidu OneClick V1 or Premium V2 preflights issued before Omn rollout.
  • With maxCredits, Omn V1 is used only when its price fits the limit.
  • A quote without engineVersion still prices the existing engine; preflight returns the price that will apply.
  • When the deployment has closed OneClick V2 on the existing engine, an implicit OneClick V2 request listed in contracts is still evaluated for Omn V1 first. It returns 503 MV_PROVIDER_UNAVAILABLE only when it stays on the existing engine.

To stay on the existing engines, set engineVersion to vidu-v1 or vidu-v2; MVView.generation.engineVersion reports the engine an MV used.

  1. Read GET /api/v1/mv/capabilities and confirm that the purchase is ready and lists the tier, schedule, resolution and aspect ratio you need (see Read capabilities).

  2. Preflight the exact request. Replace the example URLs with your own files:

    Terminal window
    curl -X POST https://api.omnapi.com/api/v1/mv/preflight \
    -H "x-api-key: $OMNAPI_KEY" \
    -H "Content-Type: application/json" \
    -d '{
    "mode": "fast",
    "source": { "type": "audio", "audioUrl": "https://media.example.com/song.mp3" },
    "prompt": "rooftop at night, warm neon, handheld camera",
    "resolution": "540p",
    "lipSync": true,
    "characterImage": "https://media.example.com/singer.jpg",
    "subtitles": false,
    "generation": { "engineVersion": "omn-v1", "renderTier": "draft", "schedule": "economy" }
    }'
  3. Review the validated price and warnings, then create with the same inputs, the returned preflightId, a reviewed maxCredits (400 below is illustrative) and a saved Idempotency-Key:

    Terminal window
    # Save once for this MV; reuse the saved key and body on retries.
    export OMN_MV_KEY="$(uuidgen)"
    curl -X POST https://api.omnapi.com/api/v1/mv \
    -H "x-api-key: $OMNAPI_KEY" \
    -H "Idempotency-Key: $OMN_MV_KEY" \
    -H "Content-Type: application/json" \
    -d '{
    "mode": "fast",
    "source": { "type": "audio", "audioUrl": "https://media.example.com/song.mp3" },
    "prompt": "rooftop at night, warm neon, handheld camera",
    "resolution": "540p",
    "lipSync": true,
    "characterImage": "https://media.example.com/singer.jpg",
    "subtitles": false,
    "generation": { "engineVersion": "omn-v1", "renderTier": "draft", "schedule": "economy" },
    "preflightId": "replace-with-your-preflight-id",
    "maxCredits": 400
    }'
  4. Save taskId and mvId, poll the Task to a terminal status, then read the final video as in the Fast quickstart.

Omn V1 prices the video by render tier and delivery resolution, in credits per second of output. The machine-readable source for these numbers is the Omn V1 price card in GET /api/v1/pricing/catalog:

generation.renderTier540p720p1080p1440p
draft6———
standard1216——
hd——20—
ultra—485868

A dash marks a combination that is not offered. Output is billed in whole seconds, rounded up, with a 10-second minimum. Singing, performance and dance shots cost the same as story shots. Visual Board images, subtitles and other add-ons are priced separately, and an Omn-specific account discount applies to the video item only. Purchased Tasks keep the price they were created with.

For example, a 50.2-second song at standard 720p is billed as 51 seconds: 51 × 16 = 816 credits for the video. Use quote or preflight for the amount that applies to your account.

draft is a lower-cost 540p pass for reviewing a video before you upgrade it. Choose a tier explicitly, or omit generation.renderTier and let resolution and quality select it:

RequestRender tier
resolution: "1440p", or generation.quality: "high" at 720p or 1080pultra
Standard quality at 540p or 720pstandard
Standard quality at 1080phd
Only when requesteddraft

When you set a tier without resolution, draft uses 540p, hd 1080p and ultra 720p; standard keeps the normal Fast default (540p, or 720p with lipSync). A tier with a resolution it does not deliver returns 400 MV_RESOLUTION_INVALID; a deployment without shot-based rendering treats standard differently (see Read capabilities). generation.quality: "high" with a tier other than ultra returns 400 VALIDATION_ERROR, and at 540p returns 400 MV_RESOLUTION_INVALID. resolution: "1440p" is available only on Omn V1; other engines return 400 MV_RESOLUTION_INVALID. OneClick V2 on Omn V1 uses the standard tier at 720p only; another tier returns 400 VALIDATION_ERROR.

Quote with the same options you will create:

Terminal window
curl -X POST https://api.omnapi.com/api/v1/mv/quote \
-H "x-api-key: $OMNAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"mode":"fast","engineVersion":"omn-v1","durationSec":60,"renderTier":"draft","schedule":"economy"}'

The Omn V1 quote also accepts managedVersion, performanceMode, lipSync, quality, resolution, referenceImageCount, hasMotionReferenceVideo and the Visual Board quote fields. It applies the same option rules as preflight and returns 422 MV_ENGINE_UNSUPPORTED instead of a price for an unsupported request. Preflight is the authoritative check because it also validates your media and the capacity that will run the video.

GET /api/v1/pricing/catalog is public, cacheable and needs no API key. Its mvOmnV1 section is the Omn V1 price card, generated from the same configuration that prices Omn V1 Tasks. Read prices from it rather than copying the table above:

Terminal window
curl https://api.omnapi.com/api/v1/pricing/catalog
{
"updatedAt": "2026-10-01",
"mvOmnV1": {
"engineVersion": "omn-v1",
"pricingVersion": "omn-v1-public-2026-09-30-v3",
"pricingPolicy": "omn-render-tiers-v3",
"unit": "credits_per_output_second",
"renderTiers": [
{ "renderTier": "draft", "prices": [{ "resolution": "540p", "creditsPerSecond": 6 }] },
{
"renderTier": "standard",
"prices": [
{ "resolution": "540p", "creditsPerSecond": 12 },
{ "resolution": "720p", "creditsPerSecond": 16 }
]
},
{ "renderTier": "hd", "prices": [{ "resolution": "1080p", "creditsPerSecond": 20 }] },
{
"renderTier": "ultra",
"prices": [
{ "resolution": "720p", "creditsPerSecond": 48 },
{ "resolution": "1080p", "creditsPerSecond": 58 },
{ "resolution": "1440p", "creditsPerSecond": 68 }
]
}
],
"generation": { "minimumBilledSeconds": 10 },
"economySchedule": {
"videoMultiplier": 0.75,
"timeZone": "Asia/Shanghai",
"windowStart": "00:00",
"windowEnd": "08:00",
"lastShotStart": "07:40"
},
"sceneEdit": { "minimumBilledSeconds": 1, "economyDiscount": false },
"upgrade": { "minimumBilledSeconds": 10, "economyDiscount": false },
"composeCreditsPerOperation": 2
}
}
FieldMeaning
engineVersionAlways omn-v1
pricingVersion, pricingPolicyIdentify the card; a changed card has a new pricingVersion. Purchased Tasks keep the price they were created with
unitcredits_per_output_second: every price is in credits per second of delivered video
renderTiers[]Each generation.renderTier with its prices[]: the delivery resolution values the tier offers and their creditsPerSecond. A resolution that is not listed is not offered at that tier
generation.minimumBilledSecondsMinimum billed length of a new MV, in seconds; output seconds are rounded up
economySchedulevideoMultiplier for the video item of a schedule: "economy" MV; the off-peak window from windowStart to windowEnd (HH:MM) in the IANA timeZone; and lastShotStart, the latest time a new shot starts in that window
sceneEditShot-edit pricing: minimumBilledSeconds, whether the economy multiplier applies (economyDiscount), and the rule as text in rule
upgradeRender-tier upgrade pricing, with the same fields; recomposition is included
composeCreditsPerOperationCredits for each recomposition with POST /api/v1/mv/{mvId}/finalize after edits
notesThe card’s billing rules as text

The card lists standard prices. Visual Board images, subtitles and other add-ons are priced separately, and account pricing such as an Omn-specific discount can lower the video item. For a concrete request, use the amount from quote, preflight or upgrade preflight. A purchased Task itemizes its Omn V1 charge in pricing.components; see Omn V1 price items.

generation.schedule is standard (default) or economy. An economy MV renders its shots only during the daily off-peak window, 00:00–08:00 Beijing time (UTC+8), which is 16:00–24:00 UTC. In exchange:

  • The video item costs 0.75 × the tier price. Add-ons are not discounted. For example, 60 seconds of draft 540p costs 60 × 6 × 0.75 = 270 credits for the video.
  • The delivery deadline is 48 hours after creation instead of 24 hours. An MV that is not delivered by its deadline fails and is refunded under the normal Task timeout rules.
  • Shot edits and upgrades are not discounted and start immediately.

The price card publishes the multiplier, the window and the 07:40 last shot start in mvOmnV1.economySchedule.

New shots start only between 00:00 and 07:40 Beijing time, so that no shot runs into the peak period; a shot that has started finishes normally. Expect an MV created outside those hours to wait until the next window before its shots begin. Shots that have not started by 07:40 wait for the next window. capabilities.schedules lists economy when the deployment offers it. Economy also needs off-peak rendering for every shot type in the MV; otherwise the request returns 422 MV_ENGINE_UNSUPPORTED with reason: "not_eligible". Resend it with schedule: "standard".

Track an economy MV with GET /api/v1/mv/{mvId}. generation.scheduleWindow gives the off-peak window the waiting shots will use: the current window until 07:40, otherwise the next one. offPeakEndsAt is the 08:00 end of that window; the last shot starts 20 minutes earlier. The field becomes null once every shot has started:

{
"mvId": "mv_01J...",
"generation": {
"engineVersion": "omn-v1",
"renderTier": "draft",
"schedule": "economy",
"scheduleWindow": {
"nextOffPeakStartAt": "2026-10-01T16:00:00.000Z",
"offPeakEndsAt": "2026-10-02T00:00:00.000Z"
}
}
}

In GET /api/v1/mv/{mvId}/operations, each active item adds progress (0–100) and deliveryDeadlineAt; the economy generation also adds estimatedStartAt, when its shots are expected to start (now until 07:40, otherwise the next 00:00 Beijing time):

{
"items": [
{
"operation": "create",
"taskId": "task_01J...",
"taskStatus": "PROCESSING",
"progress": 10,
"deliveryDeadlineAt": "2026-10-03T09:00:00.000Z",
"estimatedStartAt": "2026-10-01T16:00:00.000Z"
}
]
}

These times are estimates, not delivery guarantees.

PurchaseRequestSingers and references
OneClick V1 storyoneclick-v1 (default)referenceImages or a generated Visual Board; optional characterImage
OneClick V1 singinglipSync: trueOne singer. characterImage is optional; without it, OmnAPI generates a consistent singer identity
OneClick V2 performpremium-v2 + performanceMode: "perform"referenceImages or a generated Visual Board
OneClick V2 sing, sing_performpremium-v2 + the modeOne or two ordered portraits in generation.lipReferenceImages, optionally with characterImage; or characterImage alone for one singer
OneClick V2 dancepremium-v2 + performanceMode: "dance"referenceImages or a generated Visual Board; optional motion reference video

Singing shots show the singer performing the vocal with visible mouth movement; other shots avoid singing and lip movement. When lipReferenceImages and characterImage are both sent, each singing shot is led by its singer’s portrait. On Omn V1, OneClick V1 singing is also available at 540p. characterImage is kept as the identity reference on every shot that shows the cast. OneClick V2 on Omn V1 costs 16 credits per second at 720p for every performance mode.

Capabilities report what the deployment offers: lipSync (singing shots), maxSingers (1 for OneClick V1, up to 2 for OneClick V2), dance, motionVideo and characterImage. They are checked with reference images. A text-only request, with no reference images, Visual Board, character image or singer portraits, also needs text-only rendering for every requested singing, performance or dance shot type. Omn V1 never renders a requested specialist shot as a story shot: when the tier, aspect ratio or available capacity cannot serve it, the request returns 422 MV_ENGINE_UNSUPPORTED with lip_sync_unsupported, specialist_mode_unsupported or aspect_ratio_unsupported before any charge.

For OneClick V2 dance, generation.motionReferenceVideo supplies a public HTTPS video whose moves drive the dance shots. Each dance shot follows the part of the reference that matches its time in the song, looping a shorter reference. The reference’s own sound is not used. Send it together with generation.motionRightsConfirmed: true:

{
"mode": "fast",
"source": { "type": "audio", "audioUrl": "https://media.example.com/song.mp3" },
"aspectRatio": "9:16",
"referenceImages": ["https://media.example.com/dancer.jpg"],
"generation": {
"engineVersion": "omn-v1",
"managedVersion": "premium-v2",
"performanceMode": "dance",
"motionReferenceVideo": "https://media.example.com/choreography.mp4",
"motionRightsConfirmed": true
}
}

Replace the example URLs with your own files. Motion references are available at the draft and standard tiers; OneClick V2 on Omn V1 uses standard.

RequirementChecked
Public HTTPS URL that declares a size of at most 128MB and, if it declares a content type, video/* or application/octet-streamBefore any charge
generation.motionRightsConfirmed: true and OneClick V2 danceBefore any charge
2–660 seconds long, short side at least 240px, long side at most 4096pxWhile the Task runs

A failed pre-charge check returns 400 VALIDATION_ERROR, with the field in details.field (generation.motionReferenceVideo, or generation.motionRightsConfirmed when the confirmation is missing). Quote the same request with hasMotionReferenceVideo: true.

Motion transfer applies only to 16:9 and 9:16 videos:

  • At 16:9 or 9:16, a request for which motion transfer is not available returns 422 MV_ENGINE_UNSUPPORTED with specialist_mode_unsupported before any charge; check motionVideo in capabilities.
  • At 1:1, 4:3 or 3:4 the request is accepted and planned exactly like OneClick V2 dance without a reference; the video is not used.
  • A reference that is unusable while the Task runs (unreachable, not decodable or outside the limits above) also dances without motion transfer, at the same price.

Like every OneClick V2 MV, an MV with a motion reference cannot be upgraded.

Omn V1 accepts 10 seconds up to each purchase’s maxDurationSec in capabilities: at most 600 seconds for OneClick V1 where the deployment permits it, and 300 seconds for OneClick V2. A longer song is rendered as more shots at the same per-second rate. Outside the range Omn V1 returns duration_unsupported; one whose rendering cost would exceed the published price returns cost_limit_exceeded.

Omn V1 burns in visible subtitles only from srtUrl or Suno lyric timing, not automatic transcription; otherwise visible subtitles return subtitle_timeline_required. An Omn V1 creative draft with an audio source and no subtitle choice compiles with subtitles off and returns MV_SUBTITLE_DISABLED_NO_TIMELINE. An MV with visible subtitles cannot be upgraded.

GET /api/v1/mv/capabilities keeps the boolean native.selectableContracts fields. native.selectableContractDetails.oneclickV1 describes OneClick V1; premiumV2Perform describes OneClick V2, and its singing, dance and motion fields cover the other performance modes of that purchase.

{
"native": {
"newAdmissionEnabled": true,
"defaultEngine": { "enabled": false, "contracts": [] },
"selectableContracts": { "oneclickV1": true, "premiumV2Perform": true },
"selectableContractDetails": {
"oneclickV1": {
"selectable": true,
"ready": true,
"minDurationSec": 10,
"maxDurationSec": 300,
"resolutions": ["540p", "720p", "1080p", "1440p"],
"aspectRatios": ["16:9", "9:16", "1:1"],
"renderTiers": ["draft", "standard", "hd", "ultra"],
"schedules": ["standard", "economy"],
"shotTypes": ["narrative", "bridge", "lipsync"],
"lipSync": true,
"maxSingers": 1,
"dance": false,
"motionVideo": false,
"characterImage": true
},
"premiumV2Perform": {
"selectable": true,
"ready": false,
"unavailableReason": "capacity_unavailable",
"resolutions": ["720p"],
"renderTiers": ["standard"],
"shotTypes": ["narrative", "bridge", "performance", "lipsync", "dance"],
"lipSync": true,
"maxSingers": 2,
"dance": true,
"motionVideo": true
}
}
}
}
FieldMeaning
selectable, ready, unavailableReasonWhether Omn V1 is open for the purchase and can accept new generations now; the reason matches MV_PROVIDER_UNAVAILABLE
minDurationSec, maxDurationSecAccepted effective duration range in seconds; maxDurationSec is 0 when not selectable
resolutions, aspectRatiosDelivery options a plain request can use, including 1440p and 4:3/3:4 when offered
renderTiers, schedulesAccepted generation.renderTier and generation.schedule values
shotTypesShot types planning can use: narrative, lipsync, performance, dance, bridge. For the types a finished MV’s shot edits accept, read its MVView.capabilities.editShotTypes
lipSync, maxSingersWhether singing shots are available and the largest number of ordered singer portraits
dance, motionVideoWhether OneClick V2 dance and a motion reference video are available; motion transfer applies to 16:9 and 9:16
characterImageWhether characterImage is accepted

These values are hints for a plain request with reference images, not approval of a specific one; a text-only request may still be rejected. A deployment that offers Omn V1 without shot-based rendering reports only standard in renderTiers, only narrative in shotTypes, and false for the singing, dance, motion and character fields; those options then return 422 MV_ENGINE_UNSUPPORTED. There, standard is the single render tier: an explicit renderTier: "standard" is accepted at every resolution the capabilities list, including 1080p.

After the Task is created:

  • Shot types appear on each scene’s renderingHistory[].shotType, with the tier in renderingHistory[].renderTier. Scene indexes are zero-based.
  • A shot that fails during rendering is regenerated once at OmnAPI’s cost. Shots rejected by content review are not regenerated; the Task fails.
  • If a shot’s outcome cannot be confirmed within 1 hour, or a started shot has not finished within 3 hours, the Task fails and is refunded instead of waiting for the delivery deadline. Time an economy shot spends waiting for the off-peak window does not count.
  • Shot prompts carry imagery from the lyrics rather than the lyrics themselves and ask for no on-screen text. Only singing shots show singing or lip movement.

Omn V1 Tasks can also end with these codes. Each stops before any video is rendered, and the Task is refunded:

errorCodeMeaningRetry
MV_NATIVE_SHOT_PROMPT_TOO_LONGThe planned shot prompts would exceed the video prompt limit.Shorten the prompt or character descriptions, then create a new Task.
MV_NATIVE_REFERENCE_REJECTEDThe pre-video check found the reference images do not fit the song or story, for example the wrong number of characters. The message says what to change.Change the reference images or prompt, then create a new Task.
MV_NATIVE_REFERENCE_REVIEW_UNAVAILABLEThe pre-video check could not finish.Retry later with a new Idempotency-Key.

Failure messages describe the problem in OmnAPI terms. When a failure’s internal details cannot be shown, errorMessage on the Task, the Task list and webhooks, MVView.lastErrorMessage and failureReason.message, and failureMessage on GET /api/v1/mv/{mvId}/final read This MV could not be processed. Please retry later with a new idempotency key. A failed scene’s scenes[].sourceJob.errorMessage reads This scene could not be rendered. Edit the scene to render it again. The errorCode is unchanged. Branch on errorCode, retryable and refunded, not on the message text.

Every Omn V1 rejection happens before a Task is created or credits are charged. The message and details.reason never name an internal service.

HTTP / codeMeaningdetails
422 MV_ENGINE_UNSUPPORTEDThis request can never run on Omn V1 with the current configuration. Quote and preflight apply the same rules. Change the request or choose another engineVersion; do not retry unchanged.{ "engineVersion": "omn-v1", "reason": "...", "retryable": false }
503 MV_PROVIDER_UNAVAILABLEOmn V1 is temporarily unavailable. Retry later when retryable is true.{ "engineVersion": "omn-v1", "reason": "...", "retryable": true }

MV_ENGINE_UNSUPPORTED reasons:

reasonChange
specialist_mode_unsupportedThe requested performance or dance shots, singer count or motion reference cannot be served, for example for a text-only request; add reference images, or check dance, maxSingers and motionVideo
lip_sync_unsupportedSinging shots are not available for this tier, aspect ratio or deployment, or for a text-only request; add reference images, remove lipSync or the singing mode, or choose another tier
character_image_unsupportedRemove characterImage; see characterImage in capabilities
output_profile_unsupportedChoose a render tier, resolution and quality from the price table and capabilities
aspect_ratio_unsupportedChoose an aspect ratio listed in capabilities that can render every requested shot type
duration_unsupportedStay within the capabilities duration range
cost_limit_exceededShorten the song, lower the tier or reduce reference images
subtitle_timeline_requiredProvide srtUrl, use a Suno source with timing, or turn subtitles off
contract_unsupportedUse oneclick-v1 or premium-v2, without providerOverride
source_unsupportedUse a supported Suno clip or public audio source
reference_images_unsupportedReduce the reference images or Visual Board images; for an upgrade, edit the scene with fewer references
mode_unsupportedOmn V1 is available for Fast only
not_eligibleEconomy is not available for this request (use schedule: "standard"), the MV cannot be upgraded, or Omn V1 is not offered for it; choose another option or engineVersion

MV_PROVIDER_UNAVAILABLE reasons: engine_closed (Omn V1 is not accepting new requests; retryable: false), capacity_unavailable, workers_unavailable, engine_configuration_unavailable and scheduling_unavailable (all retryable: true).

{
"success": false,
"error": {
"code": "MV_ENGINE_UNSUPPORTED",
"message": "Omn V1 does not support this request: output_profile_unsupported",
"details": {
"engineVersion": "omn-v1",
"reason": "output_profile_unsupported",
"retryable": false
}
}
}

Unsupported values for the Omn-only fields return 400 before admission: VALIDATION_ERROR for a field sent without omn-v1, an invalid renderTier or schedule value, a tier or quality conflict, or any motion reference problem, and MV_RESOLUTION_INVALID for a tier and resolution mismatch or 1440p on another engine. Field-level errors for generation.renderTier, generation.schedule and the motion reference fields name the field in details.field.