Video Generation

Seedance 2.5 Preview

The next generation of Seedance by ByteDance. Clips up to 30 seconds, richer multimodal references (up to 20 images, 6 videos, 6 audio clips), stronger character consistency, and better prompt adherence than Seedance 2.0.

seedance-2.5-previewAsyncPreviewUp to 30s

This model is in preview. Upstream capacity is limited, so failure rates are currently elevated and longer clips are the least stable. Failed generations are refunded automatically and in full, so a retry costs you nothing. For production workloads that need predictable throughput today, use Seedance 2.0.

Generate

POST/api/v1/generate

Returns a task_id immediately. Poll /api/v1/status for the result. Credits are deducted upfront and auto-refunded if the generation fails. Requires a paid plan.

Parameters

model
stringrequired
Must be seedance-2.5-preview. The bare seedance-2.5 id now resolves to the GA model, not this one.
prompt
stringrequired
Text prompt describing the video. Supports @image1 @video1 @audio1 tags to reference attached media (see References below).
duration
number
Video length in seconds. Range: 4-30. Default: 5. Values outside the range are clamped.
aspect_ratio
string
16:9 9:16 1:1 4:3 3:4 21:9 9:21. Default: 16:9
resolution
string
480p 720p. Default: 720p. 1080p is not yet available on this model; requests specifying it are served and billed at 720p.
reference_images
string[]
Up to 20 public image URLs. Use @image1, @image2 in your prompt. Upload via /api/v1/upload.
reference_videos
string[]
Up to 6 public video URLs. Use @video1 in your prompt. Motion transfer, camera movement reference, video-to-video.
reference_audio
string[]
Up to 6 public audio URLs. Use @audio1 in your prompt. Lipsync and beat-sync.
last_frame
string
Public image URL used as the end frame. The video animates from reference_images[0] to this frame.
reference_mode
boolean
Set true to force reference mode even with a single image, so the image acts as an identity and style hint instead of being pinned as the first frame.
tag
string
Tag the output for reuse: character object style location. Tagged outputs appear in your library.
Seedance 2.5 has no mode (speed) parameter and no separate audio toggle. Any mode value you send is ignored.

Pricing

Billed per second, by resolution. The rate is the same whether or not a reference video is attached; what changes is the number of seconds counted.

Billable seconds

A billable second is a second the model processes, which is not always a second of the video you get back. With no reference video the two are the same. With one or more, the model reads those clips in addition to producing yours:

billable seconds = duration + the full length of every reference video

Each length is rounded up to the next whole second and counted separately. The whole reference clip counts, not the portion that appears in the result. Reference images and reference audio contribute nothing.

Rate by resolution

ResolutionPer billable second5s, no ref10s, no ref30s, no ref
480p24 credits120240720
720p47 credits2354701,410

Worked examples

Request (720p)Billable secondsCredits
10s, no reference video10470
10s, 4 reference images10470
10s + one 5s reference video10 + 5 = 15705
10s + one 20s reference video10 + 20 = 301,410
10s + two references, 12s and 31s10 + 12 + 31 = 532,491

Every response includes credit_cost, so you always know the exact charge before you poll. Failed generations are refunded in full. Reference-video durations are measured at submit time; a clip whose duration cannot be read is counted as the output duration.

Seedance 2.5 costs less for the same request. It takes an identical request body, and runs 16 credits/sec at 480p and 34 at 720p, dropping to 11 and 23 per billable second once a reference video is attached. A 10-second 720p clip is 340 credits against 470 here; the same clip with a 20-second reference is 690 against 1,410.

Examples

Text-to-video
curl -X POST https://www.lunostudio.ai/api/v1/generate \
  -H "Authorization: Bearer luno_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.5-preview",
    "prompt": "A cinematic tracking shot through a city park after rain, wet pavement reflections, soft cloudy light",
    "duration": 5,
    "aspect_ratio": "16:9",
    "resolution": "720p"
  }'
Image-to-video (pinned first frame)
curl -X POST https://www.lunostudio.ai/api/v1/generate \
  -H "Authorization: Bearer luno_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.5-preview",
    "prompt": "She turns to the camera and smiles, gentle wind, shallow depth of field",
    "duration": 8,
    "reference_images": ["https://storage.lunostudio.ai/.../portrait.jpg"]
  }'
First-to-last frame transition
curl -X POST https://www.lunostudio.ai/api/v1/generate \
  -H "Authorization: Bearer luno_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.5-preview",
    "prompt": "A smooth transition from the cloudy sky to a quiet riverside path, natural camera movement",
    "duration": 8,
    "reference_images": ["https://storage.lunostudio.ai/.../clouds.jpg"],
    "last_frame": "https://storage.lunostudio.ai/.../riverside.jpg"
  }'
Multimodal reference (images + video + audio)
curl -X POST https://www.lunostudio.ai/api/v1/generate \
  -H "Authorization: Bearer luno_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.5-preview",
    "prompt": "@image1 is the protagonist. Match the camera motion of @video1 and the mood of @audio1.",
    "duration": 12,
    "resolution": "720p",
    "reference_images": [
      "https://storage.lunostudio.ai/.../hero.jpg",
      "https://storage.lunostudio.ai/.../wardrobe.jpg"
    ],
    "reference_videos": ["https://storage.lunostudio.ai/.../camera-move.mp4"],
    "reference_audio": ["https://storage.lunostudio.ai/.../score.mp3"]
  }'
Long-form 30 second clip
curl -X POST https://www.lunostudio.ai/api/v1/generate \
  -H "Authorization: Bearer luno_sk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.5-preview",
    "prompt": "An unbroken drone shot rising over a coastal village at golden hour",
    "duration": 30,
    "resolution": "480p"
  }'
Response
{
  "task_id": "task_e7uk96pezd21nr0f3ftx1kn3",
  "credit_cost": 235,
  "status": "pending",
  "model": "bytedance/seedance-2.5-preview",
  "type": "video",
  "resolution": "720p",
  "duration": 5
}

References & Modes

Use @ tags in your prompt to tell the model how to use each reference. The number matches the array index (1-based). All URLs must be publicly accessible — use /api/v1/upload to host your files.

@image1, @image2, ...via reference_images

Subject and style references, up to 20. Character consistency across shots, wardrobe, environment, and art direction.

Example: "@image1 walks through the location shown in @image2"

@video1, @video2, ...via reference_videos

Motion and camera references, up to 6. The model matches movement, camera work, or editing rhythm from the reference.

Example: "Recreate the camera movement from @video1 over a mountain range"

@audio1, @audio2, ...via reference_audio

Audio references, up to 6. Lipsync to dialogue, or match motion timing to music.

Example: "@image1 delivers the monologue from @audio1, close-up"

last_frame

Start-to-end motion. Provide a start image as reference_images[0] and an end image as last_frame. The video transitions from the start frame to the end frame.

How the mode is chosen

Your inputsModeBehaviour
Prompt onlytext-to-videoThe model composes the whole shot
At least one imagekeyframeFirst image is pinned as the opening frame
Image + last_framekeyframeTransitions from the first frame to the last
reference_mode: true, or videos/audio with no imagereferenceAll inputs are identity and style hints; no frame is pinned
In keyframe mode the model reads the first two images as the start and end frames. Because of that, additional entries in reference_images are only forwarded when you also set last_frame — otherwise your second image would be interpreted as the end frame. To combine a pinned opening frame with several identity references, set last_frame explicitly, or use reference_mode: true and describe the opening shot in the prompt.

Check Status

GET/api/v1/status?task_id={task_id}

Poll every 5-10 seconds. Longer clips take longer; a 30 second render can take well over 10 minutes. While the model is in preview, expect a meaningful share of requests to come back failed — always refunded, safe to retry.

Request
curl "https://www.lunostudio.ai/api/v1/status?task_id=task_e7uk96pezd21nr0f3ftx1kn3" \
  -H "Authorization: Bearer luno_sk_your_key_here"
Generating
{ "task_id": "task_e7uk96pezd21nr0f3ftx1kn3", "status": "generating" }
Success
{
  "task_id": "task_e7uk96pezd21nr0f3ftx1kn3",
  "status": "success",
  "output": ["https://storage.lunostudio.ai/generations/user/1716234567.mp4"]
}
Failed (auto-refunded)
{
  "task_id": "task_e7uk96pezd21nr0f3ftx1kn3",
  "status": "failed",
  "error": "Generation failed",
  "refunded": true
}
Credits are automatically refunded when a generation fails, in full and without any action from you.

Status values

pending

Queued, waiting

generating

Actively rendering

success

Done. Output in response.

failed

Failed. Credits refunded.

Need help?

Engineering team responds within 5 minutes.