跳到正文
文档版本 r8
OpenAPIJSONYAML
指南 / 模型

Seedance 2.5 API

Seedance 2.5 的全部输入字段、字段之间的规则、价格,以及完整的请求和响应示例。

POST/v1/generations"model": "seedance-2-5"

Generates a video from text, image frames, reference images, videos and audio, or a finished draft.

What it does

Seedance 2.5 makes a video of 4 to 30 seconds, with a synchronized soundtrack by default, from a prompt and optional media. Everything goes in one list, input.content: text items carry the prompt, and each image_url, video_url and audio_url item names its role. The items you send choose the mode:

Modecontent itemsOther fields to set
[Text to video](#text-to-video)text—
[First frame](#first-frame)text (optional), one image_url with role first_frameratio adaptive
[First and last frame](#first-and-last-frame)text (optional), first_frame and last_frame imagesratio adaptive
[Reference images](#reference-images)text, 1 to 30 image_url with role reference_image—
[Reference video and audio](#reference-video-and-audio)text, any mix of reference images, video_url with role reference_video, audio_url with role reference_audioomni_reference_task_type reference, only when there is a video_url (without one, leave it out: rule task_type_without_video)
[Edit a video](#edit-a-video)text, the source video_url (role reference_video)omni_reference_task_type edit, duration -1, ratio adaptive
[Extend a video](#extend-a-video)text, the source video_url (role reference_video)omni_reference_task_type extend, ratio adaptive
[Draft, then final](#draft-then-final)any of the above, then one draft_task itemdraft true and resolution 480p, then resolution 1080p

Every example below is a complete body for POST /v1/generations. Send the same body to POST /v1/estimates first: it is free, creates no task, holds no Credits, and refuses an invalid body with the same 422 as a create. The https://media.vizoapi.com/... files are public samples, so the examples run as they are; replace https://example.com/... with your own file or an uploaded ast_... asset ID.

Modes

Text to video

Only text items. Set ratio to one of 16:9, 4:3, 1:1, 3:4, 9:16 or 21:9; with adaptive (the default) the model picks one. duration is 4 to 30 seconds, default 5, or -1 to let the model choose.

Text to video
{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "A paper boat drifts across a still pond at dawn, mist on the water, slow push-in, soft natural light" }
    ],
    "resolution": "720p",
    "ratio": "16:9",
    "duration": 5,
    "generate_audio": true
  }
}

First frame

The video starts on your image. Send one image_url with role first_frame and set ratio to adaptive: the output takes the image's aspect ratio, and any other ratio is refused (rule ratio_must_be_adaptive). The prompt describes what happens next.

First frame
{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "The hominids step back as the sun rises behind the monolith, slow push-in" },
      { "type": "image_url", "role": "first_frame", "image_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/keyframes/monolith.jpg" } }
    ],
    "ratio": "adaptive",
    "duration": 5
  }
}

First and last frame

The video moves from the first image to the last. Send at most one first_frame and one last_frame; a last_frame without a first_frame is refused (rule last_frame_needs_first_frame). Frames cannot be combined with any reference image, video or audio (rule frames_with_references).

First and last frame
{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "The ring-shaped station slowly turns to face the camera as an amber planet rises behind it" },
      { "type": "image_url", "role": "first_frame", "image_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/keyframes/station.jpg" } },
      { "type": "image_url", "role": "last_frame", "image_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/keyframes/ending.jpg" } }
    ],
    "ratio": "adaptive",
    "duration": 6
  }
}

Reference images

Up to 30 images with role reference_image give the model characters, objects, places or a style to reuse. Unlike frames, they do not fix the first or last picture, so any ratio works. Name them in the prompt by their order (see [Prompting tips](#prompting-tips)).

Reference images
{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "Shot 1: the black monolith from image 1 stands on a savanna at dawn. Shot 2: match cut to the ring-shaped space station from image 2, tumbling slowly in black space." },
      { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/keyframes/monolith.jpg" } },
      { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/keyframes/station.jpg" } }
    ],
    "resolution": "480p",
    "ratio": "16:9",
    "duration": 8
  }
}

Reference video and audio

Reference videos (motion, camera, pacing) and reference audio (rhythm, voice, sound) can be mixed with reference images: up to 10 videos and 10 audio items. Audio may be the only media, as long as there is a text item. Any video_url item moves the task to the -video tier of its resolution, which bills the input video's seconds too (see [How it is billed](#how-it-is-billed)).

With a reference video, omni_reference_task_type says what to do with it: reference makes a new video, edit changes the source and extend lengthens it. If you omit it or send auto, the model infers the task from your prompt and media; the hold then covers the longest output, so set reference when you know you want a new video. omni_reference_task_type without any video is refused (rule task_type_without_video).

Reference video and audio
{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "Follow the camera movement and pacing of video 1, set on the space station from image 1, cut to the beat of audio 1" },
      { "type": "image_url", "role": "reference_image", "image_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/keyframes/station.jpg" } },
      { "type": "video_url", "role": "reference_video", "video_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/1.mp4" } },
      { "type": "audio_url", "role": "reference_audio", "audio_url": { "url": "https://example.com/beat.mp3" } }
    ],
    "resolution": "720p",
    "ratio": "16:9",
    "duration": 8,
    "omni_reference_task_type": "reference"
  }
}

Edit a video

Changes the source video and keeps its length: replace an object, restyle a scene, change the sound. Send the source as a video_url with role reference_video, 4 to 30 seconds long, and say the change in the prompt. duration must be -1 (rule duration_must_be_auto; leaving it out is refused too) and ratio must be adaptive.

Edit a video
{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "Replace the black monolith with a tall crystal obelisk; keep everything else unchanged" },
      { "type": "video_url", "role": "reference_video", "video_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/1.mp4" } }
    ],
    "resolution": "720p",
    "ratio": "adaptive",
    "duration": -1,
    "omni_reference_task_type": "edit"
  }
}

Extend a video

Continues the source video. duration is 4 to 30 seconds or -1; ratio must be adaptive. Say in the prompt what happens next.

Extend a video
{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "Continue the shot: the station drifts out of frame and the amber planet fills the screen" },
      { "type": "video_url", "role": "reference_video", "video_url": { "url": "https://media.vizoapi.com/samples/seedance-2-5/odyssey-v1/1.mp4" } }
    ],
    "resolution": "720p",
    "ratio": "adaptive",
    "duration": 8,
    "omni_reference_task_type": "extend"
  }
}

Draft, then final

Try an idea cheaply at 480p, then turn the draft you like into a 1080p video with the same content, length and settings.

  1. Send any of the bodies above with "draft": true and "resolution": "480p". Other resolutions, or no resolution at all, are refused (rule draft_needs_480p), and so is return_last_frame (rule draft_with_last_frame). A draft is a normal task, charged like any 480p video.
  2. Within 7 days, send a body whose only content item is a draft_task with the draft's generation ID. Do not repeat the prompt, media, duration, ratio, seed, generate_audio, omni_reference_task_type, draft or bitrate_mode: the final video reuses the draft's (rules draft_task_alone, draft_task_field_not_allowed). resolution may be left out or set to 1080p (rule draft_task_resolution). return_last_frame, watermark and execution_expires_after are allowed.

Draft

{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "text", "text": "A paper boat drifts across a still pond at dawn, mist on the water, slow push-in" }
    ],
    "draft": true,
    "resolution": "480p",
    "ratio": "16:9",
    "duration": 5
  }
}

Final from the draft

{
  "model": "seedance-2-5",
  "input": {
    "content": [
      { "type": "draft_task", "draft_task": { "id": "gen_01JD8Z7K3M9P4Q2R6S8T0V1W2X" } }
    ],
    "resolution": "1080p"
  }
}

The draft must be a succeeded "draft": true task of the same project. An ID the project does not have answers 404 resource_not_found; a task that is not a succeeded draft answers 404 draft_not_found; a draft older than 7 days answers 422 draft_expired.

Input limits

LimitValueChecked
content itemsAt least 1. Up to 30 images, 10 videos and 10 audio items; no other limit on the totalAt create, 422 invalid_input (too_many_images, too_many_videos, too_many_audios)
PromptUp to 4,000 characters per text itemAt create (out_of_range)
RolesEvery image, video and audio item needs role: first_frame, last_frame or reference_image for images, reference_video for video, reference_audio for audioAt create (required at /content/N/role, role_not_allowed)
Each video or audio item2 to 30 seconds; the source of an edit 4 to 30 secondsAt create when the file's length can be read, 422 input_duration_out_of_range (media_length); otherwise when the task runs
All videos togetherAt most 30 secondsSame, rule video_total_too_long
All audio togetherAt most 30 secondsSame, rule audio_total_too_long
Image filePNG, JPEG, WebP, BMP, TIFF, GIF, HEIC; up to 30 MBAt create when readable: 422 input_media_invalid (format) or input_media_too_large (size)
Video fileMP4, MOV; up to 200 MBSame
Audio fileMP3, WAV; up to 15 MBSame
Uploaded assetimage/png, image/jpeg, image/webp, video/mp4, audio/mpeg, audio/wav; up to 20,000,000 bytesWhen you request the upload, 422
Image pixel size and aspect ratio, video resolution and frame rateChecked by the model onlyWhen the task runs: the task fails with input_media_invalid (sometimes generation_failed) and is not charged

A media value is a public https URL (up to 4,000 characters) or an ast_... asset ID from your project. Plain http, private or local addresses, URLs with a user name or #fragment, and Base64 data are refused with 422 (rule bad_format). The model fetches a linked file itself, possibly some time after acceptance, so keep it reachable until the task closes; if it cannot, the task fails with input_media_unreachable. See Model inputs and media.

Output

SettingValues
resolution480p, 720p (default) or 1080p
ratio16:9, 4:3, 1:1, 3:4, 9:16, 21:9 or adaptive (default). adaptive follows the input media, or lets the model choose for text only
duration4 to 30 seconds (default 5), or -1 for the model to choose; an edit always runs as long as its source
generate_audiotrue (default) adds a synchronized soundtrack; false gives a silent video
seed-1 (or omitted) for random, or 0 to 4294967295 to repeat a result more closely
return_last_frametrue also returns the video's last frame as a PNG
watermarkfalse (default) or true for a visible watermark
output_format, bitrate_modeOnly mp4 and standard; you can leave them out

A succeeded task lists one MP4 in result.outputs: take its asset_id and get a download URL with download an asset. With return_last_frame, result.last_frame_asset_id is the PNG. result.metadata reports what was made when the model returns it, such as duration, resolution, ratio and seed. Outputs are kept for 7 days. See Get results.

How it is billed

The input selects the tier: resolution alone, or resolution plus -video when content has any video_url. Images and audio never change the tier or the price, and neither do ratio, generate_audio, seed or watermark.

TierCredits per secondSeconds billed
480p, 720p, 1080p26.4, 56.6, 136.4Output seconds
480p-video, 720p-video, 1080p-video15.8, 34, 81.8The larger of output + input seconds and output × 5/3 rounded up

Input seconds are the length of all input videos together, rounded down, at most 30. When a video's length cannot be read at create, the hold counts 30 input seconds. When the model chooses the length (duration: -1, or a reference video with omni_reference_task_type omitted or auto), the hold counts 30 output seconds. An edit holds the source's length, rounded up.

Holds at 720p:

RequestOutputInputBilledHeld (Credits)
Text or frames, duration: 55—5283.000
Text or frames, duration: -130—301698.000
Reference video of 10 s, reference, duration: 5510max(15, 9) = 15510.000
The same, video length not readable530max(35, 9) = 351190.000
Reference video of 10 s, task type omitted or auto3010max(40, 50) = 501700.000
Edit of a 10 s video1010max(20, 17) = 20680.000
Extend a 5 s video, duration: 10105max(15, 17) = 17578.000

A 5-second draft holds 132.000 Credits at 480p, and its 1080p final holds 682.000 Credits: the final is a separate task, priced at 1080p (or 1080p-video when the draft had a video) for the draft's output and input seconds. A draft made with duration: -1 has its final hold 30 output seconds, as any automatic length does.

The hold is only the estimate. A succeeded task is charged from the usage the model reports, at the tier's rate, so price.charged can be below the hold (the rest is released) or above it, with no cap. Usage above the hold comes from your available balance; what it cannot cover is owed, and new creates get 402 balance_negative until a top-up. A failed, canceled or unresolved task is not charged. Send the body to POST /v1/estimates to see the exact hold and its basis (output_seconds, input_seconds, billed_seconds, auto). See Billing.

Errors and behaviors

WhenResponseWhat to do
A field the schema does not list, a wrong value or type422 invalid_input, errors[].rule such as field_not_allowed, value_not_allowed, out_of_rangeSend only the fields in the reference below
A mode rule is broken422 invalid_input with the rule: frames_with_references, last_frame_needs_first_frame, first_frame_repeated, last_frame_repeated, ratio_must_be_adaptive, duration_must_be_auto, task_type_without_video, content_needs_text_or_visual, draft_needs_480p, draft_with_last_frame, draft_task_alone, draft_task_field_not_allowed, draft_task_resolutionFix the field at errors[].path
Too many images, videos or audio items422 invalid_input, rule too_many_images, too_many_videos or too_many_audiosSend at most 30 images, 10 videos and 10 audio items
The prompt has inline --flag parameters, such as --duration 10422 invalid_input, rule prompt_flag_syntaxUse the input fields instead
A measured video or audio is too short or too long, alone or in total422 input_duration_out_of_range; errors[] names the item (/content/N/video_url/url or /content/N/audio_url/url, rule media_length) or the total (/content, rule video_total_too_long or audio_total_too_long)Trim the media
A linked file has the wrong format or is too large422 input_media_invalid or input_media_too_largeConvert or shrink it
The model refuses a file when it fetches it (pixel size, aspect ratio, frame rate)Task fails with input_media_invalid, sometimes generation_failedCheck the file; nothing is charged
The model cannot fetch a URLTask fails with input_media_unreachableKeep the URL public until the task closes, or upload the file
Content safety refuses the prompt or mediaTask fails with input_moderatedChange the prompt or media; nothing is charged
Content safety refuses the resultTask fails with output_moderated, no resultChange the prompt; nothing is charged
Inferred task (auto) does not fit the settingsTask fails with input_rejectedSet omni_reference_task_type explicitly so the create checks it

Moderation is always on; no field turns it off. Each task has a deadline, execution_expires_after: 3600 to 259200 seconds (1 to 72 hours) from acceptance, default 86400. A task still unfinished then closes as unresolved, releases its hold and is not charged; if its result arrives later, it is added at no charge and late_result_available becomes true. See Errors and Get results.

Prompting tips

  • Name reference media by kind and order in content: "image 1", "image 2", "video 1", "audio 1". Say what to take from each: "the character from image 1", "the camera movement of video 1", "the rhythm of audio 1".
  • Write the shot, not just the subject: subject, action, setting, camera movement, light and style, in that order. For several shots, number them ("Shot 1: …, Shot 2: …") and give each its own camera move.
  • Describe the sound you want when generate_audio is on: ambience, effects, music or none, and any spoken line in quotes.
  • For an edit, say exactly what changes and what stays ("keep everything else unchanged"). For an extension, describe what happens next, not what is already in the video.
  • With first and last frames, describe the motion between them; the frames already fix the start and end.
  • Put settings in fields, never in the prompt: --ratio 16:9 style flags are refused.
  • Draft first at 480p while you iterate on the prompt, then upgrade the draft you like to 1080p.

价格

输入决定价格档位。视频按输出秒数计费;含输入视频的档位同时计入输入秒数。

档位选择条件价格时长
480presolution = 480p26.4 积分/秒4–30 秒
720presolution = 720p56.6 积分/秒4–30 秒
1080presolution = 1080p136.4 积分/秒4–30 秒
480p-videoresolution = 480p, 含输入视频15.8 积分/秒4–30 秒
720p-videoresolution = 720p, 含输入视频34 积分/秒4–30 秒
1080p-videoresolution = 1080p, 含输入视频81.8 积分/秒4–30 秒

规则

  • Apart from a draft_task request, content needs at least one text, image or video item.
  • Every image, video and audio item in content names its role.
  • Input limits: up to 30 images, 10 videos and 10 audio items in content, with no limit on the total. Each video and audio item runs 2 to 30 seconds, and an edit source video 4 to 30 seconds. Videos add up to at most 30 seconds, and audio to at most 30 seconds. Lengths are checked before the task is created when the file can be measured (422 input_duration_out_of_range).
  • Image pixel size and aspect ratio, and video resolution and frame rate, are not checked when the request is made: the model checks them when the task runs, and a file it refuses usually fails the task with input_media_invalid (otherwise generation_failed); the task is not charged.
  • first_frame and last_frame images (at most one each) cannot be combined with reference images, videos or audio, and a last_frame needs a first_frame.
  • ratio must be adaptive for first-frame, edit and extend input.
  • omni_reference_task_type may be omitted or auto with a reference video; it is not allowed without video. Automatic task selection holds the maximum output length to cover edit or extend; for edit, duration must be -1.
  • draft set to true needs resolution 480p and cannot be combined with return_last_frame.
  • A draft_task item must be the only item in content, and names a succeeded draft of your project from the last 7 days.
  • A draft_task request reuses the draft's settings: it does not accept duration, ratio, seed, generate_audio, omni_reference_task_type, draft or bitrate_mode, and resolution can only be 1080p.
  • Prompt text must not contain inline --flag parameters.

输入字段

在 input 中发送这些字段。表中没有的字段会被拒绝,返回 HTTP 422 invalid_input。

输入字段
字段说明
contentarray of objects必填

Prompt text and media items. Each image, video and audio item names its role.

至少 1 项

content[].typestring必填

Item kind.

可选值textimage_urlvideo_urlaudio_urldraft_task
type 为 text 的项
content[].textstring必填

Prompt text, up to 4000 characters per item.

最多 4000 个字符

type 为 image_url 的项
content[].rolestring必填

Image roles: first_frame, last_frame, reference_image. Video: reference_video. Audio: reference_audio.

content[].image_urlobject必填
content[].image_url.urlstring必填

An https URL or an uploaded asset id (ast_...).

最多 4000 个字符 · 格式^(https://|ast_)

type 为 video_url 的项
content[].rolestring必填

Image roles: first_frame, last_frame, reference_image. Video: reference_video. Audio: reference_audio.

content[].video_urlobject必填
content[].video_url.urlstring必填

An https URL or an uploaded asset id (ast_...).

最多 4000 个字符 · 格式^(https://|ast_)

type 为 audio_url 的项
content[].rolestring必填

Image roles: first_frame, last_frame, reference_image. Video: reference_video. Audio: reference_audio.

content[].audio_urlobject必填
content[].audio_url.urlstring必填

An https URL or an uploaded asset id (ast_...).

最多 4000 个字符 · 格式^(https://|ast_)

type 为 draft_task 的项
content[].draft_taskobject必填

The finished draft to upgrade. Must be the only content item.

content[].draft_task.idstring必填

Generation id of a succeeded draft (gen_...).

格式^gen_

resolutionstring可选

Output resolution. Defaults to 720p, or 1080p when the content is a draft.

可选值480p720p1080p

默认值 720p

ratiostring可选

Output aspect ratio. Must be adaptive for first-frame, edit and extend inputs. Defaults to adaptive.

可选值16:94:31:13:49:1621:9adaptive

默认值 adaptive

durationinteger可选

Output length in seconds, 4 to 30, or -1 to let the model choose. Defaults to 5. Must be -1 for edit.

默认值 5

4 到 30,或 -1

generate_audioboolean可选

Adds a synchronized soundtrack. Defaults to true.

默认值 true

seedinteger可选

Random seed. -1 or omitted picks one at random.

最小 -1 · 最大 4,294,967,295

return_last_frameboolean可选

Also returns the last frame of the video as an image.

output_formatstring可选

Container format. Only mp4.

固定值 mp4

bitrate_modestring可选

Encoding quality. Only standard.

固定值 standard

draftboolean可选

Generates a quick 480p preview that a later request can upgrade to 1080p.

omni_reference_task_typestring可选

With a reference video, omit or choose auto to infer the task. Reference makes a new video, edit changes the source, and extend lengthens it. Automatic selection holds the maximum output length.

可选值referenceeditextendauto
watermarkboolean可选

Add a visible watermark. Defaults to false; the tier price is unchanged.

默认值 false

execution_expires_afterinteger可选

Execution and delivery deadline in seconds from acceptance. Defaults to 86400. Credits remain held until completion or this deadline.

默认值 86400

最小 3600 · 最大 259,200

示例

完整的创建请求、202 响应,以及任务成功后的状态。

请求

cURL

curl https://api.vizoapi.com/v1/generations \
  -H "Authorization: Bearer $VIZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "seedance-2-5",
  "input": {
    "content": [
      {
        "type": "text",
        "text": "A paper boat drifting on a pond at dawn, slow dolly in"
      }
    ],
    "resolution": "720p",
    "ratio": "16:9",
    "duration": 5
  },
  "metadata": {
    "client_reference": "my-unique-reference-1"
  }
}'

Python

import os, requests

# Send once: do not retry this request automatically.
task = requests.post(
    "https://api.vizoapi.com/v1/generations",
    headers={"Authorization": f"Bearer {os.environ['VIZO_API_KEY']}"},
    json={
      "model": "seedance-2-5",
      "input": {
        "content": [
          {
            "type": "text",
            "text": "A paper boat drifting on a pond at dawn, slow dolly in"
          }
        ],
        "resolution": "720p",
        "ratio": "16:9",
        "duration": 5
      },
      "metadata": {
        "client_reference": "my-unique-reference-1"
      }
    },
    timeout=60,
).json()
print(task["id"], task["status"])

Node.js

// Send once: do not retry this request automatically.
const res = await fetch("https://api.vizoapi.com/v1/generations", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.VIZO_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "model": "seedance-2-5",
    "input": {
      "content": [
        {
          "type": "text",
          "text": "A paper boat drifting on a pond at dawn, slow dolly in"
        }
      ],
      "resolution": "720p",
      "ratio": "16:9",
      "duration": 5
    },
    "metadata": {
      "client_reference": "my-unique-reference-1"
    }
  }),
});
const task = await res.json();
console.log(task.id, task.status);

此输入选择 720p 档位,每秒 56.6 积分。5 秒共冻结 283.000 积分。

响应

202 已受理

{
  "id": "gen_01JD8Z5QW3XR",
  "model": "seedance-2-5",
  "source": "api",
  "created_at": "2026-11-08T09:00:00Z",
  "customer_resolution_deadline": "2026-11-09T09:00:00Z",
  "late_result_available": false,
  "metadata": {
    "client_reference": "my-unique-reference-1"
  },
  "status": "processing",
  "execution_status": "processing",
  "delivery_status": "pending",
  "billing_status": "pending",
  "version": 1,
  "price": {
    "unit": "credit",
    "estimated": "283.000",
    "reserved": "0.000",
    "charged": "0.000",
    "refunded": "0.000"
  },
  "allowed_actions": [],
  "closed_at": null,
  "error": null,
  "result": null
}

200 已成功

{
  "id": "gen_01JD8Z5QW3XR",
  "model": "seedance-2-5",
  "source": "api",
  "created_at": "2026-11-08T09:00:00Z",
  "customer_resolution_deadline": "2026-11-09T09:00:00Z",
  "late_result_available": false,
  "metadata": {
    "client_reference": "my-unique-reference-1"
  },
  "status": "succeeded",
  "execution_status": "succeeded",
  "delivery_status": "ready",
  "billing_status": "settled",
  "version": 4,
  "price": {
    "unit": "credit",
    "estimated": "283.000",
    "reserved": "0.000",
    "charged": "283.000",
    "refunded": "0.000"
  },
  "allowed_actions": [],
  "closed_at": "2026-11-08T09:01:31Z",
  "error": null,
  "result": {
    "asset_id": "ast_01JD8Z9M2C4V",
    "outputs": [
      {
        "index": 0,
        "asset_id": "ast_01JD8Z9M2C4V",
        "content_type": "video/mp4"
      }
    ]
  }
}