media

Generate one short video (metered).

wait (default true) runs the provider render inside this call, which takes 30-300s. wait: false returns as soon as the render is submitted, with a task_id and a poll_url; poll it about every retry_after_ms until status is terminal. Nothing is charged at submission — the charge lands when a poll collects the finished video, so an abandoned task costs nothing.

post/media/generate-video

Request

  • Base URL
    https://api.moda.app/v1
  • URL
    https://api.moda.app/v1/media/generate-video
  • Auth
    HTTP bearer

Headers

Moda-Version'2026-04-12' | '2026-05-01'
Example:2026-05-01

Calendar-dated API version pin. New integrations should pin 2026-05-01 to opt into the newest response shapes. For back-compat the server also accepts requests with no header and resolves them to the current default (today: 2026-04-12); that default advances on each sunset date. Any unsupported value returns 400 unsupported_version.

Request body

promptstring required

Sent verbatim. For MiniMax H3 reference mode, bind inputs by modality and 1-based list order: Image 1, Video 1, Audio 1, and so on.

modelstring required

Concrete video model id; see GET /v1/media/models.

start_imagestring nullable
end_imagestring nullable
reference_imagesstring[] nullable

Subject/style references. For MiniMax H3, name them Image 1, Image 2, and so on in the prompt.

reference_videosstring[] nullable

Short reference clips: file_ ids from an upload or http(s) video URLs. Only some models accept them, and each states its own clip-count and length limits — read them off the reference_videos block on GET /v1/media/models, which a 422 also names in full. Naming the models here instead would drift on every model add. Each clip becomes a durable file in the team's library; the model card states whether its running time is billed too. For MiniMax H3, name them Video 1, Video 2, and so on in the prompt.

reference_audiosstring[] nullable

Short reference audio: file_ ids from an upload or http(s) audio URLs. See the reference_audios capability on GET /v1/media/models. For MiniMax H3, name them Audio 1, Audio 2, and so on in the prompt.

extend_videostring nullable

Make an EXISTING clip longer: a file_ id from an upload or an http(s) video URL, plus a prompt for what happens next. The response carries the source with new footage on the end. Only models whose card lists a video_extend mode accept it, and it cannot be combined with start/end frames or references. There duration_seconds is the length of the ADDED segment — the delivered clip is longer than it by the source's own running time. Read billing.duration_quantity and billing.input_seconds_priced_separately, plus the available framing controls, from the video_extend block on GET /v1/media/models.

lipsync_videostring nullable

Re-cut an EXISTING clip's mouth to a track you supply: a file_ id from an upload or an http(s) video URL, plus exactly one reference_audios entry — the speech being synced to. Only models whose card lists a video_lipsync mode accept it. Nothing else may accompany the pair: no frames, no other references, and not extend_video. The clip is returned at its OWN length, so duration_seconds is not a control here and prompt is not used at all. Billing meters the SOURCE clip rather than the returned file — read the video_lipsync block on GET /v1/media/models for its envelope, its basis, and any block rounding.

aspect_ratiostring nullable
widthinteger nullable
heightinteger nullable
resolutionstring nullable

Resolution tier from the selected mode's resolutions on GET /v1/media/models.

generate_audioboolean nullable
seedinteger nullable
model_paramsobject nullable
idempotency_keystring nullable

Keys the provider-job checkpoint: a retried call with the same key resumes the existing render instead of paying for a duplicate.

waitboolean

Whether the provider render runs inside this call. The default holds the request open for the whole render (30-300s). Pass false to get a task envelope back immediately and poll GET /v1/media/generate-video/{task_id} — the right choice for long renders and for starting several candidates at once. Nothing is charged until a poll collects the finished video.

Response

Successful Response

object required

Changes