Skip to main content
bytedance avatar

Seedance 2.5 Text to Video API

bytedance/seedance-v2.5/text-to-video

Generate a video with synchronized audio from a text prompt — single takes up to 30 seconds long, at 480p or 720p.

Priced by resolution

Model Input

Input

Describe the scene, the action, the camera move, and the sound you want in the clip.

Output resolution of the clip. 720p costs more per second of video than 480p.

Frame shape of the clip. Use adaptive to let the model pick the framing.

Clip length in seconds, from 4 to 30. Leave at -1 (the default) to let the model choose an appropriate whole-second length inside that range. Billing is per second of finished video, so -1 makes the cost of a run variable.

Additional Settings

Customize your input with more control.

Generate a synchronized soundtrack (dialogue, ambience and sound effects) together with the picture. Set false for a silent clip; the price is the same either way.

You need to be logged in to run this model and view results.
Log in

Model Output

Output

Loading
Generated in 99 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1

Model Pricing

Pricing

Model pricing varies by the target resolution of your output video.

480p
$0.154
per second of output video
or around 6 seconds for $1
720p
$0.347
per second of output video
or around 3 seconds for $1

Seedance 2.5 Text to Video API

Seedance 2.5 Text to Video is a text-to-video AI model by bytedance. On ModelRunner it runs through a REST API or via MCP from any AI assistant, at $0.347 per second of video.

POST https://queue.modelrunner.run/bytedance/seedance-v2.5/text-to-video

cURL

# Submit a request to the queue. Input fields go at the top level of the
# body. The optional reserved "metadata" object holds your own flat string
# tags — stored on the request, never sent to the model; filter later with
# GET https://queue.modelrunner.run/requests?metadata=<url-encoded JSON>.
curl -X POST https://queue.modelrunner.run/bytedance/seedance-v2.5/text-to-video \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A brass diving helmet rests on a tide-pool ledge as the surf pulls back, sunlight refracting through the thinning wav…",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": true,
    "metadata": {
      "project": "my-project"
    }
  }'
# → { "request_id": "...", "status_url": "...", "response_url": "..." }

# Poll status_url until "COMPLETED", then fetch the result
curl "https://queue.modelrunner.run/bytedance/seedance-v2.5/text-to-video/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/bytedance/seedance-v2.5/text-to-video/requests/$REQUEST_ID" \
  -H "Authorization: Key $MRUN_API_KEY"

JavaScript

import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("bytedance/seedance-v2.5/text-to-video", {
  input: {
    "prompt": "A brass diving helmet rests on a tide-pool ledge as the surf pulls back, sunlight refracting through the thinning wav…",
    "duration": 10,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": true
  },
});
console.log(result);

Python

import os
import requests

headers = {"Authorization": f"Key {os.environ['MRUN_API_KEY']}"}

submitted = requests.post(
    "https://queue.modelrunner.run/bytedance/seedance-v2.5/text-to-video",
    headers=headers,
    json={
      "prompt": "A brass diving helmet rests on a tide-pool ledge as the surf pulls back, sunlight refracting through the thinning wav…",
      "duration": 10,
      "resolution": "720p",
      "aspect_ratio": "16:9",
      "generate_audio": true
    },
).json()

# Poll submitted["status_url"] until "COMPLETED", then:
result = requests.get(submitted["response_url"], headers=headers).json()

Input parameters

NameTypeRequiredDescription
promptstringyesDescribe the scene, the action, the camera move, and the sound you want in the clip.
resolutionenumnoOutput resolution of the clip. 720p costs more per second of video than 480p. Default: "720p".
aspect_ratioenumnoFrame shape of the clip. Use adaptive to let the model pick the framing. Default: "16:9".
durationintegernoClip length in seconds, from 4 to 30. Leave at -1 (the default) to let the model choose an appropriate whole-second length inside that range. Billing is per second of finished video, so -1 makes the cost of a run variable. Default: -1.
generate_audiobooleannoGenerate a synchronized soundtrack (dialogue, ambience and sound effects) together with the picture. Set false for a silent clip; the price is the same either way. Default: true.

Machine-readable: OpenAPI schema · llms.txt

Use Seedance 2.5 Text to Video from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and Seedance 2.5 Text to Video becomes a tool your assistant can call directly — it authorizes via OAuth (no API key in config) and runs this model with the run_model tool using the endpoint bytedance/seedance-v2.5/text-to-video.

MCP client config (Claude Desktop, Cursor)

{
  "mcpServers": {
    "modelrunner": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.modelrunner.run/mcp"]
    }
  }
}

Claude Code

claude mcp add --transport http modelrunner https://mcp.modelrunner.run/mcp

Then ask your assistant, for example: “Run bytedance/seedance-v2.5/text-to-video on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

Seedance 2.5 turns a written prompt into a video clip with a matching soundtrack: dialogue, ambience, and sound effects are generated together with the picture rather than dubbed on afterwards. Its headline capability is length — a single take can run up to 30 seconds at 24 fps, twice the ceiling of the 2.0 generation, so a whole beat can play out in one shot instead of being cut together. Output is 480p or 720p, in seven frame shapes covering widescreen, square, vertical, and 21:9 cinematic. Leave `duration` at its default of `-1` and the model picks an appropriate whole-second length for the shot you described, anywhere from 4 to 30 seconds.

## Best for - One-take clips that need to run longer than a few seconds: a full action beat, a walk-and-talk, a short scene - Social, ad, and trailer cuts that need sound without a separate audio pass - Dialogue and singing shots where the voice has to line up with the mouth - Establishing shots, b-roll, and atmosphere plates with ambience already baked in - Cutting the same scene to 9:16, 1:1, and 16:9 for different placements

## Choose another model when - You need 1080p: this generation tops out at 720p, so use `bytedance/seedance-v2/text-to-video` instead - You want to animate a photo you already have: use `bytedance/seedance-v2/image-to-video`, which takes your still as the first frame - You need runs to be reproducible from a fixed seed: there is no seed input on this generation - You need a locked-off, perfectly static camera: camera lock is not offered here, so describe the framing in the prompt instead

## Tips - Describe the sound as explicitly as the picture (gulls calling, waves on shingle) and the audio track will follow the prompt - Set `duration` yourself when cost matters: billing is per second of finished video, so `-1` leaves the total open up to 30 seconds - Iterate at `480p`, then re-run the keeper at `720p` — resolution and length are the two cost drivers - Set `generate_audio` to false for a silent clip; the price is the same either way

## Limitations - Fast motion and crowds hold together better at 720p than at 480p - A prompt stacking many separate shots can drift in character, wardrobe, and lighting across a long take - Text rendered inside the frame is frequently misspelled

To run via the ModelRunner JavaScript client: ```js import { modelrunner } from "@modelrunner/client";

const result = await modelrunner.subscribe("bytedance/seedance-v2.5/text-to-video", { input: { prompt: "A lighthouse keeper climbs the spiral stair at dawn, lamp glass catching the first light, gulls calling outside as the storm clears", resolution: "720p", aspect_ratio: "9:16", duration: 12, generate_audio: true, }, }); ```