Seedance 2.0 API

Seedance 2.0 supports broad video workflows, including text-to-video, frame control, reference video, video-to-video, and optional audio inputs.

Model keys

  • doubao/seedance-2.0-fast — Seedance 2.0 Fast
  • doubao/seedance-2.0 — Seedance 2.0

Supported modes and inputs

Model Mode Label Input requirements
doubao/seedance-2.0-fast text_to_video Text to Video Prompt max 20000 chars
Audio: 0-3 files, 15 MB, max 15s, formats mp3, wav
doubao/seedance-2.0-fast frames_to_video Frames to Video Prompt max 20000 chars
Images start_frame,end_frame: 1-2 files, 30 MB, formats jpg, png, webp, bmp, gif
doubao/seedance-2.0-fast reference_to_video Reference to Video Prompt max 20000 chars
Images reference: 0-9 files, 30 MB, formats jpeg, png, webp, bmp, tiff, gif
Audio: 0-3 files, 15 MB, max 15s, formats mp3, wav
doubao/seedance-2.0-fast video_to_video Video to Video Prompt max 20000 chars
Images reference: 0-9 files, 30 MB, formats jpeg, png, webp, bmp, tiff, gif
Videos: 1-3 files, 50 MB, max 15s, formats mp4, mov
Audio: 0-3 files, 15 MB, max 15s, formats mp3, wav
doubao/seedance-2.0 text_to_video Text to Video Prompt max 20000 chars
Audio: 0-3 files, 15 MB, max 15s, formats mp3, wav
doubao/seedance-2.0 frames_to_video Frames to Video Prompt max 20000 chars
Images start_frame,end_frame: 1-2 files, 30 MB, formats jpg, png, webp, bmp, gif
doubao/seedance-2.0 reference_to_video Reference to Video Prompt max 20000 chars
Images reference: 0-9 files, 30 MB, formats jpeg, png, webp, bmp, tiff, gif
Audio: 0-3 files, 15 MB, max 15s, formats mp3, wav
doubao/seedance-2.0 video_to_video Video to Video Prompt max 20000 chars
Images reference: 0-9 files, 30 MB, formats jpeg, png, webp, bmp, tiff, gif
Videos: 1-3 files, 50 MB, max 15s, formats mp4, mov
Audio: 0-3 files, 15 MB, max 15s, formats mp3, wav

Options

Model Option Default Allowed values Applies to
doubao/seedance-2.0-fast duration 5s 4s, 5s, 6s, 7s, 8s, 9s, 10s, 11s, 12s, 13s, 14s, 15s All modes
doubao/seedance-2.0-fast resolution 720p 480p, 720p All modes
doubao/seedance-2.0-fast aspect_ratio 16:9 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive All modes
doubao/seedance-2.0-fast audio false true, false All modes
doubao/seedance-2.0-fast web_search false true, false All modes
doubao/seedance-2.0 duration 5s 4s, 5s, 6s, 7s, 8s, 9s, 10s, 11s, 12s, 13s, 14s, 15s All modes
doubao/seedance-2.0 resolution 720p 480p, 720p, 1080p All modes
doubao/seedance-2.0 aspect_ratio 16:9 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 All modes
doubao/seedance-2.0 audio false true, false All modes
doubao/seedance-2.0 web_search false true, false All modes

Pricing

Model Pricing
doubao/seedance-2.0-fast 2 credits per second; option multipliers: resolution={"480p":1,"720p":2}
doubao/seedance-2.0 3 credits per second; option multipliers: resolution={"480p":1,"720p":2,"1080p":4}

Production guidance

  • Pass mode explicitly.
  • Use only option values listed above.
  • Upload media with POST /api/v1/files before calling media-input modes.
  • Use the exact model key for the variant you want.

Example: text to video

curl https://img2vid.net/api/v1/generations \
  -H "Authorization: Bearer $BUBLE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao/seedance-2.0-fast",
    "mode": "text_to_video",
    "prompt": "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
    "duration": "5s",
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "audio": "false",
    "web_search": "false"
  }'

Example: media-guided video

curl https://img2vid.net/api/v1/generations \
  -H "Authorization: Bearer $BUBLE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao/seedance-2.0-fast",
    "mode": "frames_to_video",
    "prompt": "Animate the source into a polished cinematic motion shot with natural camera movement",
    "start_frame": "https://example.com/start.png",
    "duration": "5s",
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "audio": "false",
    "web_search": "false"
  }'

SDK examples

The examples below use this page's public model key, mode, and parameter values. They assume you have already initialized the SDK client as shown in the Quickstart and imported the required language SDK types. For media-input modes, upload local files first and pass the returned URL through public fields such as image_urls, start_frame, or video_urls.

JavaScript / TypeScript

const task = await buble.generations.create({
  model: 'doubao/seedance-2.0-fast',
  mode: 'text_to_video',
  prompt:
    'A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion',
  duration: '5s',
  resolution: '720p',
  aspect_ratio: '16:9',
  audio: 'false',
  web_search: 'false',
});

const result = await buble.generations.wait(task.data.id);
console.log(result.data.result?.videos?.[0]?.url);

Python

task = client.generations.create(
    model="doubao/seedance-2.0-fast",
    mode="text_to_video",
    prompt="A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
    duration="5s",
    resolution="720p",
    aspect_ratio="16:9",
    audio="false",
    web_search="false",
)

result = client.generations.wait(task["data"]["id"])
print(result["data"]["result"]["videos"][0]["url"])

Go

task, err := client.Generations.Create(ctx, &buble.CreateGenerationRequest{
	Model:  "doubao/seedance-2.0-fast",
	Mode:   "text_to_video",
	Prompt: "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
	Params: map[string]any{
		"duration": "5s",
		"resolution": "720p",
		"aspect_ratio": "16:9",
		"audio": "false",
		"web_search": "false",
	},
})
if err != nil {
	return err
}

result, err := client.Generations.Wait(ctx, task.Data.ID)
if err != nil {
	return err
}
fmt.Println(result.Data.Result.Videos[0].URL)

Rust

let task = client.generations().create(
    CreateGenerationRequest::new("doubao/seedance-2.0-fast")
        .mode("text_to_video")
        .prompt("A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion")
        .param("duration", "5s")?
        .param("resolution", "720p")?
        .param("aspect_ratio", "16:9")?
        .param("audio", "false")?
        .param("web_search", "false")?,
).await?;

let result = client
    .generations()
    .wait(&task.data.id, WaitOptions::default())
    .await?;

Swift

let task = try await client.generations.create(
    try CreateGenerationRequest(model: "doubao/seedance-2.0-fast")
        .mode("text_to_video")
        .prompt("A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion")
        .param("duration", "5s")
        .param("resolution", "720p")
        .param("aspect_ratio", "16:9")
        .param("audio", "false")
        .param("web_search", "false")
)

let result = try await client.generations.wait(task.data.id)
print(result.data.result?.videos?.first?.url.absoluteString ?? "")

Dart / Flutter

final task = await client.generations.create(
  CreateGenerationRequest(
    model: 'doubao/seedance-2.0-fast',
    mode: 'text_to_video',
    prompt: 'A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion',
  ).withParam('duration', '5s').withParam('resolution', '720p').withParam('aspect_ratio', '16:9').withParam('audio', 'false').withParam('web_search', 'false'),
);

final result = await client.generations.wait(task.data.id);
print(result.data.result?.videos.firstOrNull?.url);

Elixir

{:ok, task} =
  Buble.Generations.create(client, %{
    model: "doubao/seedance-2.0-fast",
    mode: "text_to_video",
    prompt: "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
    duration: "5s",
    resolution: "720p",
    aspect_ratio: "16:9",
    audio: "false",
    web_search: "false"
  })

{:ok, result} = Buble.Generations.wait(client, task["data"]["id"])
IO.puts(result["data"]["result"]["videos"] |> List.first() |> Map.fetch!("url"))

Java

Envelope<GenerationTask> task = client.generations().create(
        CreateGenerationRequest.builder()
                .model("doubao/seedance-2.0-fast")
                .mode("text_to_video")
                .prompt("A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion")
                .param("duration", "5s")
                .param("resolution", "720p")
                .param("aspect_ratio", "16:9")
                .param("audio", "false")
                .param("web_search", "false")
                .build());

Envelope<GenerationTask> result = client.generations().wait(task.getData().getId());

.NET

var task = await client.Generations.CreateAsync(new CreateGenerationRequest
{
    Model = "doubao/seedance-2.0-fast",
    Mode = "text_to_video",
    Prompt = "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion"
}.WithParam("duration", "5s").WithParam("resolution", "720p").WithParam("aspect_ratio", "16:9").WithParam("audio", "false").WithParam("web_search", "false"));

var result = await client.Generations.WaitAsync(task!.Data!.Id!);

PHP

$task = $client->generations()->create(
    CreateGenerationRequest::make(
        model: 'doubao/seedance-2.0-fast',
        mode: 'text_to_video',
        prompt: 'A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion',
    )
    ->withParam('duration', '5s')
    ->withParam('resolution', '720p')
    ->withParam('aspect_ratio', '16:9')
    ->withParam('audio', 'false')
    ->withParam('web_search', 'false')
);

$result = $client->generations()->wait($task['data']['id']);

Ruby

task = client.generations.create(
  model: "doubao/seedance-2.0-fast",
  mode: "text_to_video",
  prompt: "A cinematic product launch shot with slow camera movement, premium lighting, and realistic motion",
  duration: "5s",
  resolution: "720p",
  aspect_ratio: "16:9",
  audio: "false",
  web_search: "false"
)

result = client.generations.wait(task.dig("data", "id"))
puts result.dig("data", "result", "videos", 0, "url")