Skip to main content
bytedance avatar

Seedance 2.5 Video to Video API

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

Turn existing footage into a new video — restyle, restage, reframe or extend a clip you already have, steering it with up to 10 source videos named in the prompt.

editextend
Priced per token

Model Input

Input

Describe the result you want and what to take from each reference. Address the reference assets positionally as @Video1..@Video10, @Image1..@Image30 and @Audio1..@Audio10, numbered by their order in reference_videos, reference_images and reference_audios: with one source clip and one product photo, 'Match the camera movement and pacing of @Video1, but restage it on a sunlit desert roadside at midday; the rider pulls up on the motorcycle from @Image1' borrows the motion from the clip and the subject from the image. A reference the prompt never names is usually ignored, so name every one you send.

1 to 10 source clips - the footage this generation is built from, and where its motion, camera movement and pacing come from. The first entry is @Video1 in the prompt, the second @Video2, and so on. MP4 or MOV (H.264/H.265 video, AAC or MP3 audio), 2-30 seconds per file and no more than 30 seconds COMBINED across all files, 300-6000 px per side, aspect ratio between 0.4 and 2.5, 24-60 fps, under 200 MB each. Billing counts the duration of everything you send here as well as the length of the clip you get back, so a 30-second source costs about as much again as a 30-second output - trim each clip to the part that matters.

  • https://media.modelrunner.ai/6M3U2hs7xUtWJGZmjkvuN.jpeg

Optional: up to 30 reference images that steer identity, wardrobe, product, location or style alongside the source footage. Addressed as @Image1, @Image2 and so on, numbered by their order in this array. JPEG, PNG, WebP, BMP, TIFF or GIF; 300-6000 px on a side, aspect ratio between 1:2.5 and 2.5:1, under 30 MB each. A still image has no duration, so reference images add nothing to the price.

Output resolution of the clip. 720p meters more tokens per second of video than 480p, so it costs more.

Frame shape of the generated clip. The source footage does not dictate the framing on this variant, so pick the shape you want - a 1280x720 (16:9) source asked for 9:16 came back as a 480x854 portrait clip. Use adaptive to keep the source's own shape instead.

Length of the generated clip in seconds, from 4 to 30. Leave at -1 (the default) to let the model choose a whole-second length close to the source footage. Billing counts this alongside the duration of the source clips you send.

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.

Experimental: up to 10 short audio references for the generated soundtrack, addressed as @Audio1, @Audio2 and so on. Each clip 2-30 seconds, 30 seconds combined at most; WAV or MP3, under 15 MB each. The clips are accepted and add nothing to the price, but their effect on the finished soundtrack has not been verified - treat the field as experimental. They cannot be sent on their own: at least one reference video is always required.

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

Model Output

Output

Loading
Generated in 204 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1

Seedance 2.5 Video to Video API

Seedance 2.5 Video to Video is a video-to-video AI model by bytedance. On ModelRunner it runs through a REST API or via MCP from any AI assistant with pay-per-use pricing.

POST https://queue.modelrunner.run/bytedance/seedance-v2.5/video-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/video-to-video \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Match the camera movement and pacing of @Video1, but restage it on a sunlit desert roadside at midday — the cherry-re…",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": true,
    "reference_images": [
      "https://media.modelrunner.ai/6M3U2hs7xUtWJGZmjkvuN.jpeg"
    ],
    "reference_videos": [
      "https://media.modelrunner.ai/6m0I6xs8DL2oaJhQoD8x9.mp4"
    ],
    "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/video-to-video/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/bytedance/seedance-v2.5/video-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/video-to-video", {
  input: {
    "prompt": "Match the camera movement and pacing of @Video1, but restage it on a sunlit desert roadside at midday — the cherry-re…",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "generate_audio": true,
    "reference_images": [
      "https://media.modelrunner.ai/6M3U2hs7xUtWJGZmjkvuN.jpeg"
    ],
    "reference_videos": [
      "https://media.modelrunner.ai/6m0I6xs8DL2oaJhQoD8x9.mp4"
    ]
  },
});
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/video-to-video",
    headers=headers,
    json={
      "prompt": "Match the camera movement and pacing of @Video1, but restage it on a sunlit desert roadside at midday — the cherry-re…",
      "duration": 5,
      "resolution": "720p",
      "aspect_ratio": "16:9",
      "generate_audio": true,
      "reference_images": [
        "https://media.modelrunner.ai/6M3U2hs7xUtWJGZmjkvuN.jpeg"
      ],
      "reference_videos": [
        "https://media.modelrunner.ai/6m0I6xs8DL2oaJhQoD8x9.mp4"
      ]
    },
).json()

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

Input parameters

NameTypeRequiredDescription
promptstringyesDescribe the result you want and what to take from each reference. Address the reference assets positionally as @Video1..@Video10, @Image1..@Image30 and @Audio1..@Audio10, numbered by their order in reference_videos, reference_images and reference_audios: with one source clip and one product photo, 'Match the camera movement and pacing of @Video1, but restage it on a sunlit desert roadside at midday; the rider pulls up on the motorcycle from @Image1' borrows the motion from the clip and the subject from the image. A reference the prompt never names is usually ignored, so name every one you send.
reference_videosarrayyes1 to 10 source clips - the footage this generation is built from, and where its motion, camera movement and pacing come from. The first entry is @Video1 in the prompt, the second @Video2, and so on. MP4 or MOV (H.264/H.265 video, AAC or MP3 audio), 2-30 seconds per file and no more than 30 seconds COMBINED across all files, 300-6000 px per side, aspect ratio between 0.4 and 2.5, 24-60 fps, under 200 MB each. Billing counts the duration of everything you send here as well as the length of the clip you get back, so a 30-second source costs about as much again as a 30-second output - trim each clip to the part that matters.
reference_imagesarraynoOptional: up to 30 reference images that steer identity, wardrobe, product, location or style alongside the source footage. Addressed as @Image1, @Image2 and so on, numbered by their order in this array. JPEG, PNG, WebP, BMP, TIFF or GIF; 300-6000 px on a side, aspect ratio between 1:2.5 and 2.5:1, under 30 MB each. A still image has no duration, so reference images add nothing to the price.
resolutionenumnoOutput resolution of the clip. 720p meters more tokens per second of video than 480p, so it costs more. Default: "720p".
aspect_ratioenumnoFrame shape of the generated clip. The source footage does not dictate the framing on this variant, so pick the shape you want - a 1280x720 (16:9) source asked for 9:16 came back as a 480x854 portrait clip. Use adaptive to keep the source's own shape instead. Default: "16:9".
durationintegernoLength of the generated clip in seconds, from 4 to 30. Leave at -1 (the default) to let the model choose a whole-second length close to the source footage. Billing counts this alongside the duration of the source clips you send. 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.
reference_audiosarraynoExperimental: up to 10 short audio references for the generated soundtrack, addressed as @Audio1, @Audio2 and so on. Each clip 2-30 seconds, 30 seconds combined at most; WAV or MP3, under 15 MB each. The clips are accepted and add nothing to the price, but their effect on the finished soundtrack has not been verified - treat the field as experimental. They cannot be sent on their own: at least one reference video is always required.

Machine-readable: OpenAPI schema · llms.txt

Use Seedance 2.5 Video 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 Video 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/video-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/video-to-video on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

Seedance 2.5 Video to Video generates a new clip from footage you already have — restage a shot elsewhere, change its look, carry its camera move and pacing into another scene, or continue the action past where the source ends. Send 1 to 10 source clips in `reference_videos`, optionally add reference images and audio, and describe the result. It is the only Seedance 2.5 variant that accepts existing footage, and the only one whose price scales with what you send as well as what you get back, so trim each source to the part that matters. Output is 480p or 720p, up to 30 seconds at 24 fps, with synchronized sound at no extra cost. The frame shape is yours: a 16:9 source can come back as a 9:16 vertical cut, or `adaptive` keeps the source's own shape.

**Name every reference in the prompt.** They are addressed positionally as `@Video1`…`@Video10`, `@Image1`…`@Image30` and `@Audio1`…`@Audio10`, numbered by their order in `reference_videos`, `reference_images` and `reference_audios`. A reference the prompt never names is usually ignored:

``` reference_videos: [ lantern-alley-night.mp4 ] reference_images: [ cherry-red-motorcycle.jpg ] prompt: "Match the camera movement and pacing of @Video1, but restage it on a sunlit desert roadside at midday; the rider pulls up on the motorcycle from @Image1." ```

## Best for - Restyling or restaging existing footage — new setting, season or look, with the source's camera move and pacing carried over - Extending or continuing a shot past where the source footage ends - Reframing as you transform — a landscape source into a vertical cut, or `adaptive` to keep the original shape - Mixing a source clip with reference images and audio in one generation, each addressed by name

## Choose another model when - You have no source footage: use `bytedance/seedance-v2.5/image-to-video` (one still), `bytedance/seedance-v2.5/first-last-frame` (a keyframe pair) or `bytedance/seedance-v2.5/text-to-video` (a prompt alone) - You have references but no video — `bytedance/seedance-v2.5/reference-to-video` costs less, pricing only the finished clip - You need more than 720p — `bytedance/seedance-v2/video-to-video` reaches 1080p - You need a frame-accurate edit of the original file — this returns a new generation, so exact frames, faces and on-screen text are not preserved - You need a fixed seed or a locked-off camera — neither exists on this generation

## Tips - Trim source clips before you send them: their duration is billed alongside the output, and a long or busy clip also dilutes the prompt's control - Order is the address: `@Video1` is the first URL in `reference_videos` - Say which property you are borrowing — motion, framing, light — not just "like the reference" - `reference_audios` is experimental: the clips are accepted and cost nothing, but their effect on the soundtrack is unverified

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

const result = await modelrunner.subscribe("bytedance/seedance-v2.5/video-to-video", { input: { prompt: "Match the camera movement and pacing of @Video1, but restage it on a sunlit desert roadside at midday; the rider pulls up on the cherry-red motorcycle from @Image1", reference_videos: ["https://media.modelrunner.ai/6m0I6xs8DL2oaJhQoD8x9.mp4"], reference_images: ["https://media.modelrunner.ai/6M3U2hs7xUtWJGZmjkvuN.jpeg"], resolution: "720p", aspect_ratio: "16:9", duration: 6, generate_audio: true, }, }); ```