Skip to main content
bytedance avatar

Seedance 2.0 First and Last Frame API

bytedance/seedance-v2/first-last-frame

Generate a video that starts on one image and ends on another — pin the opening and closing frames and let the prompt fill in the motion and the sound between them.

0.227 per second of output video

Model Input

Input

Describe what happens between the two frames: the action, the camera move, and the sound. English, Chinese, Japanese, Indonesian, Spanish and Portuguese prompts are all understood.

Still image used as the FIRST frame of the clip. 300-6000 px on a side, under 30 MB, aspect ratio between 1:2.5 and 2.5:1.

Still image used as the LAST frame of the clip. May be the same image as the first frame, which produces a seamless loop. If its aspect ratio differs from the first frame's, the first frame wins and this image is cropped to fit.

Output resolution of the clip. Higher resolutions cost more per second of video.

Frame shape of the clip. adaptive keeps the shape of the first frame; any other value re-frames it.

Min: 4 - Max: 15

Clip length in seconds.

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 71 seconds
Logs (1 lines)

Model Example Requests

Examples

Example output 1

Seedance 2.0 First and Last Frame API

Seedance 2.0 First and Last Frame is a image-to-video AI model by bytedance. On ModelRunner it runs through a REST API or via MCP from any AI assistant, at $0.227 per second of video.

POST https://queue.modelrunner.run/bytedance/seedance-v2/first-last-frame

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/first-last-frame \
  -H "Authorization: Key $MRUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "https://media.modelrunner.ai/4TBsiIAoeDvW4S4KbGsqw.jpeg",
    "prompt": "Dawn mist drifts slowly across the wet meadow grass while the pink light along the horizon gradually warms.",
    "duration": 5,
    "end_image": "https://media.modelrunner.ai/1w4oW0Joi6KWugXfSNWBP.jpeg",
    "resolution": "480p",
    "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/first-last-frame/requests/$REQUEST_ID/status" \
  -H "Authorization: Key $MRUN_API_KEY"
curl "https://queue.modelrunner.run/bytedance/seedance-v2/first-last-frame/requests/$REQUEST_ID" \
  -H "Authorization: Key $MRUN_API_KEY"

JavaScript

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

const result = await modelrunner.subscribe("bytedance/seedance-v2/first-last-frame", {
  input: {
    "image": "https://media.modelrunner.ai/4TBsiIAoeDvW4S4KbGsqw.jpeg",
    "prompt": "Dawn mist drifts slowly across the wet meadow grass while the pink light along the horizon gradually warms.",
    "duration": 5,
    "end_image": "https://media.modelrunner.ai/1w4oW0Joi6KWugXfSNWBP.jpeg",
    "resolution": "480p",
    "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/first-last-frame",
    headers=headers,
    json={
      "image": "https://media.modelrunner.ai/4TBsiIAoeDvW4S4KbGsqw.jpeg",
      "prompt": "Dawn mist drifts slowly across the wet meadow grass while the pink light along the horizon gradually warms.",
      "duration": 5,
      "end_image": "https://media.modelrunner.ai/1w4oW0Joi6KWugXfSNWBP.jpeg",
      "resolution": "480p",
      "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 what happens between the two frames: the action, the camera move, and the sound. English, Chinese, Japanese, Indonesian, Spanish and Portuguese prompts are all understood.
imagestring (uri)yesStill image used as the FIRST frame of the clip. 300-6000 px on a side, under 30 MB, aspect ratio between 1:2.5 and 2.5:1.
end_imagestring (uri)yesStill image used as the LAST frame of the clip. May be the same image as the first frame, which produces a seamless loop. If its aspect ratio differs from the first frame's, the first frame wins and this image is cropped to fit.
resolutionenumnoOutput resolution of the clip. Higher resolutions cost more per second of video. Default: "720p".
aspect_ratioenumnoFrame shape of the clip. adaptive keeps the shape of the first frame; any other value re-frames it. Default: "adaptive".
durationintegernoClip length in seconds. Default: 5.
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.0 First and Last Frame from Claude & Cursor (MCP)

Point Claude Code, Claude Desktop, Cursor, or any MCP client at the ModelRunner MCP server and Seedance 2.0 First and Last Frame 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/first-last-frame.

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/first-last-frame on ModelRunner to generate video”. MCP setup guide.

Model Details

Model Details

Seedance 2.0 First and Last Frame generates a clip that begins on one image and ends on another. You supply both stills — `image` is the opening frame, `end_image` is the closing frame — and the prompt describes what happens in between: the action, the camera move, and the sound. Audio is generated together with the picture rather than dubbed on afterwards, so dialogue, ambience, and sound effects line up with what moves on screen. Clips run 4 to 15 seconds at 24 fps, from 480p up to 1080p.

## Best for - Morphing one image into another with a controlled, watchable transition - Pinning the exact opening and closing frames so the clip cuts cleanly into an edit - Animating between two storyboard keyframes, or two product states (closed to open, before and after) - Seamless loops — pass the same URL as `image` and `end_image` and the clip returns to where it started

## Choose another model when - You only have a starting frame and do not care where the clip lands — use `bytedance/seedance-v2/image-to-video` - You want to steer identity, wardrobe, or style with several reference photos instead of pinning two frames — use `bytedance/seedance-v2/reference-to-video` - You are restyling or extending footage you already have — use `bytedance/seedance-v2/video-to-video` - You need reproducible runs from a fixed seed, a locked-off camera, or one take longer than 15 seconds — none of those are offered here

## Tips - The two frames should be plausibly connected — the model invents a story between them rather than a cross-fade - If the two images have different aspect ratios the first frame wins and the last one is cropped to fit, so match them yourself when the crop matters - Leave `aspect_ratio` on `adaptive` to keep the first frame's shape; set it explicitly only for a deliberate re-frame - Spend the prompt on the transition: what moves, in what order, and what is heard

## Limitations - A large gap between the two frames (a full scene or identity change) can drift in the middle of the clip - Fine texture and small text in either still soften once the shot starts moving - Fast motion and crowds smear at 480p; 720p or higher holds detail

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

const result = await modelrunner.subscribe("bytedance/seedance-v2/first-last-frame", { input: { prompt: "The gull lifts off the railing and banks out over the bay as the mist thins, then wheels back and settles on the same railing exactly as it started", image: "https://media.modelrunner.ai/lLzL0kzIHxtmdFBBhc9WO.jpeg", end_image: "https://media.modelrunner.ai/lLzL0kzIHxtmdFBBhc9WO.jpeg", resolution: "720p", aspect_ratio: "adaptive", duration: 6, }, }); ```