# Seedance 2.5 Image to Video > Animate a still photo into a video with synchronized audio — single takes up to 30 seconds long that keep your image's exact shape. ## Overview - **Endpoint**: `https://queue.modelrunner.run/bytedance/seedance-v2.5/image-to-video` - **Model ID**: `bytedance/seedance-v2.5/image-to-video` - **Category**: image-to-video - **Kind**: inference - **Tags**: video, image-to-video, video generation, audio, bytedance, seedance, seedance 2.5, 30-second-video ## Pricing - **480p**: $0.154 per output second - **720p**: $0.347 per output second ## Request Lifecycle This model runs on the ModelRunner **asynchronous queue API** — a single POST does not return the output. Every call requires an `Authorization: Key $MODEL_RUNNER_KEY` header. Run three steps: 1. **Submit** — `POST https://queue.modelrunner.run/bytedance/seedance-v2.5/image-to-video` with a JSON body holding the input fields at the top level. The body may also include a reserved top-level `metadata` object — a flat string map (max 16 keys, key ≤64 / value ≤512 chars) stored on the request for your own tagging. It is never sent to the model; filter your request history with `GET https://queue.modelrunner.run/requests?metadata=` (exact key=value matches, AND-ed). The response carries request handles only (no output yet): ```json { "status": "IN_QUEUE", "request_id": "<21-char id>", "status_url": "https://queue.modelrunner.run/bytedance/seedance-v2.5/image-to-video/requests//status", "response_url": "https://queue.modelrunner.run/bytedance/seedance-v2.5/image-to-video/requests/", "cancel_url": "https://queue.modelrunner.run/bytedance/seedance-v2.5/image-to-video/requests//cancel" } ``` 2. **Poll status** — `GET ` until `status` is `COMPLETED`. Possible values are `IN_QUEUE`, `IN_PROGRESS`, `COMPLETED`, `FAILED`, `CANCELLED`. A `FAILED` request responds with HTTP 400 and an `error` field. 3. **Read result** — `GET `. Returns the finished request, including the generated `output`: ```json { "id": "", "status": "COMPLETED", "output": ..., "input": ... } ``` The JavaScript and Python SDKs below perform steps 2–3 for you. In any language without an SDK (Swift, Go, Kotlin, etc.) you must implement the polling loop and the final result fetch yourself — see the cURL example for the full flow. ### Input Schema - **`image`** (`string`, _required_): 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. JPEG, PNG, WebP, BMP, TIFF, GIF, HEIC and HEIF are accepted. The finished clip keeps this image's shape. - **`prompt`** (`string`, _required_): Describe what should happen from the first frame onwards: the action, the camera move, and the sound you want. - **`duration`** (`integer`, _optional_): 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. - Default: `-1` - **`resolution`** (`resolution`, _optional_): Output resolution of the clip. 720p costs more per second of video than 480p. - Default: `"720p"` - Options: `"480p"`, `"720p"` - **`aspect_ratio`** (`aspect_ratio`, _optional_): Frame shape of the clip. adaptive is the only value this model accepts: the clip always inherits the aspect ratio of the supplied image, so a vertical still produces a vertical clip. Crop the image before you send it if you need a different shape. - Default: `"adaptive"` - Options: `"adaptive"` - **`generate_audio`** (`boolean`, _optional_): 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. - Default: `true` ### Output Schema _No `Output` schema properties are available._ ## Default Example **Input** ```json { "image": "https://media.modelrunner.ai/GpTHw0l9Ac8nMcn3-youth-motorcycle-racing-memory-image.jpg", "prompt": "A 30-second cinematic coming-of-age racing short, 2D animation style. The protagonist is a teenage rider competing in a top-tier motorcycle race. The overall tone is hot-blooded, youthful, emotionally intense and strongly cinematic, with a complete four-act arc and a clear emotional curve. The whole film uses only two camera moves: high-speed tracking and slow-motion orbit. Dialogue is minimal, surfacing naturally like fragments of memory — sincere, gentle, restrained, never sloganeering, never over-sentimental. No sense of disaster, no negative framing, no exaggerated sci-fi. The emphasis is on love, support, the fightback and the growth found inside youthful racing.\n\n0-5s: A dusk circuit, opening on fast, fierce competition. The camera tracks the boy's bike at speed hugging the ground, tyres skimming the edge line, engine roaring, wind slicing past, the mood tense and blazing. The boy is entirely focused; the setting sun draws sharp highlights along the metal of the bike.\n\n5-9s: Coming out of a key corner, the boy is suddenly overtaken by a rival. The high-speed tracking continues, the frame conveying the pressure of a dropping position and a broken rhythm. A close-up inside the helmet catches a brief loss of focus, tightened breathing, a small wavering. The boy says under his breath: \"Can I still catch up...\"\n\n9-14s: The boy falls behind, his breathing heavier, his mood at its lowest. The race does not stop; the bike is still travelling flat out. Warm fragments of memory begin to flash through the high-speed riding: learning to ride as a child, someone steadying him from behind; his father adjusting his helmet, careful and quiet; before the finish line, a gentle smile watching him; two silhouettes walking side by side up a hill road at dusk. All of these are rendered in golden backlight, soft slow motion, fragmentary and felt rather than stated.\n\n14-18s: The music turns from suppressed to soaring. Restrained, gentle voices come through the memory: \"Don't be afraid — I'm always here.\" \"Stay steady. And look forward.\" The boy's eyes refocus, his breathing steadies, his state shifts from wavering to resolved.\n\n18-23s: The boy recovers his conviction, accelerates with everything he has and counter-attacks with a precise racing line. The high-speed tracking conveys the power and control of the bike leaning into the corner, driving out of it and closing on the rider ahead. Quietly and firmly, the boy says: \"I won't stop here.\"\n\n23-27s: An uphill section of circuit appears ahead and the boy sprints flat out into the setting sun. The soundtrack keeps only breathing, engine and rising music — no further dialogue. Carried by its own momentum the bike launches into the air, entering a breathtaking slow motion. From the depths of memory comes one last gentle voice, smiling: \"Go on.\"\n\n27-30s: The camera orbits the airborne bike in slow-motion close-up, pushing the hot-blooded, tender, free, upward-leaping feeling to its peak. Flowers bloom outward behind him, then the word \"seedance\" appears. Reference @Image1.", "duration": 30, "resolution": "480p", "aspect_ratio": "adaptive", "generate_audio": true } ``` **Output** ```json "https://media.modelrunner.ai/xdP0PWbjl4adasNa-youth-motorcycle-racing-memory-output.webm" ``` ## Usage Examples ### cURL The queue API is asynchronous: submit the request, poll `status_url` until it is `COMPLETED`, then read the result from `response_url`. Requires `jq`. ```bash # 1. Submit the request (returns request handles, not the output) SUBMIT=$(curl --silent --request POST \ --url https://queue.modelrunner.run/bytedance/seedance-v2.5/image-to-video \ --header "Authorization: Key $MODEL_RUNNER_KEY" \ --header "Content-Type: application/json" \ --data '{ "image": "https://media.modelrunner.ai/GpTHw0l9Ac8nMcn3-youth-motorcycle-racing-memory-image.jpg", "prompt": "A 30-second cinematic coming-of-age racing short, 2D animation style. The protagonist is a teenage rider competing in a top-tier motorcycle race. The overall tone is hot-blooded, youthful, emotionally intense and strongly cinematic, with a complete four-act arc and a clear emotional curve. The whole film uses only two camera moves: high-speed tracking and slow-motion orbit. Dialogue is minimal, surfacing naturally like fragments of memory — sincere, gentle, restrained, never sloganeering, never over-sentimental. No sense of disaster, no negative framing, no exaggerated sci-fi. The emphasis is on love, support, the fightback and the growth found inside youthful racing.\n\n0-5s: A dusk circuit, opening on fast, fierce competition. The camera tracks the boy'\''s bike at speed hugging the ground, tyres skimming the edge line, engine roaring, wind slicing past, the mood tense and blazing. The boy is entirely focused; the setting sun draws sharp highlights along the metal of the bike.\n\n5-9s: Coming out of a key corner, the boy is suddenly overtaken by a rival. The high-speed tracking continues, the frame conveying the pressure of a dropping position and a broken rhythm. A close-up inside the helmet catches a brief loss of focus, tightened breathing, a small wavering. The boy says under his breath: \"Can I still catch up...\"\n\n9-14s: The boy falls behind, his breathing heavier, his mood at its lowest. The race does not stop; the bike is still travelling flat out. Warm fragments of memory begin to flash through the high-speed riding: learning to ride as a child, someone steadying him from behind; his father adjusting his helmet, careful and quiet; before the finish line, a gentle smile watching him; two silhouettes walking side by side up a hill road at dusk. All of these are rendered in golden backlight, soft slow motion, fragmentary and felt rather than stated.\n\n14-18s: The music turns from suppressed to soaring. Restrained, gentle voices come through the memory: \"Don'\''t be afraid — I'\''m always here.\" \"Stay steady. And look forward.\" The boy'\''s eyes refocus, his breathing steadies, his state shifts from wavering to resolved.\n\n18-23s: The boy recovers his conviction, accelerates with everything he has and counter-attacks with a precise racing line. The high-speed tracking conveys the power and control of the bike leaning into the corner, driving out of it and closing on the rider ahead. Quietly and firmly, the boy says: \"I won'\''t stop here.\"\n\n23-27s: An uphill section of circuit appears ahead and the boy sprints flat out into the setting sun. The soundtrack keeps only breathing, engine and rising music — no further dialogue. Carried by its own momentum the bike launches into the air, entering a breathtaking slow motion. From the depths of memory comes one last gentle voice, smiling: \"Go on.\"\n\n27-30s: The camera orbits the airborne bike in slow-motion close-up, pushing the hot-blooded, tender, free, upward-leaping feeling to its peak. Flowers bloom outward behind him, then the word \"seedance\" appears. Reference @Image1.", "duration": 30, "resolution": "480p", "aspect_ratio": "adaptive", "generate_audio": true }') STATUS_URL=$(echo "$SUBMIT" | jq -r '.status_url') RESPONSE_URL=$(echo "$SUBMIT" | jq -r '.response_url') # 2. Poll until the request leaves the queue / in-progress state while true; do STATUS=$(curl --silent --url "$STATUS_URL" \ --header "Authorization: Key $MODEL_RUNNER_KEY" | jq -r '.status') echo "Status: $STATUS" case "$STATUS" in COMPLETED) break ;; FAILED|CANCELLED) echo "Request $STATUS"; exit 1 ;; esac sleep 1 done # 3. Read the finished request, including the generated output curl --silent --url "$RESPONSE_URL" \ --header "Authorization: Key $MODEL_RUNNER_KEY" ``` ### JavaScript ```javascript import { modelrunner } from "@modelrunner/client"; const result = await modelrunner.subscribe("bytedance/seedance-v2.5/image-to-video", { input: { "image": "https://media.modelrunner.ai/GpTHw0l9Ac8nMcn3-youth-motorcycle-racing-memory-image.jpg", "prompt": "A 30-second cinematic coming-of-age racing short, 2D animation style. The protagonist is a teenage rider competing in a top-tier motorcycle race. The overall tone is hot-blooded, youthful, emotionally intense and strongly cinematic, with a complete four-act arc and a clear emotional curve. The whole film uses only two camera moves: high-speed tracking and slow-motion orbit. Dialogue is minimal, surfacing naturally like fragments of memory — sincere, gentle, restrained, never sloganeering, never over-sentimental. No sense of disaster, no negative framing, no exaggerated sci-fi. The emphasis is on love, support, the fightback and the growth found inside youthful racing.\n\n0-5s: A dusk circuit, opening on fast, fierce competition. The camera tracks the boy's bike at speed hugging the ground, tyres skimming the edge line, engine roaring, wind slicing past, the mood tense and blazing. The boy is entirely focused; the setting sun draws sharp highlights along the metal of the bike.\n\n5-9s: Coming out of a key corner, the boy is suddenly overtaken by a rival. The high-speed tracking continues, the frame conveying the pressure of a dropping position and a broken rhythm. A close-up inside the helmet catches a brief loss of focus, tightened breathing, a small wavering. The boy says under his breath: \"Can I still catch up...\"\n\n9-14s: The boy falls behind, his breathing heavier, his mood at its lowest. The race does not stop; the bike is still travelling flat out. Warm fragments of memory begin to flash through the high-speed riding: learning to ride as a child, someone steadying him from behind; his father adjusting his helmet, careful and quiet; before the finish line, a gentle smile watching him; two silhouettes walking side by side up a hill road at dusk. All of these are rendered in golden backlight, soft slow motion, fragmentary and felt rather than stated.\n\n14-18s: The music turns from suppressed to soaring. Restrained, gentle voices come through the memory: \"Don't be afraid — I'm always here.\" \"Stay steady. And look forward.\" The boy's eyes refocus, his breathing steadies, his state shifts from wavering to resolved.\n\n18-23s: The boy recovers his conviction, accelerates with everything he has and counter-attacks with a precise racing line. The high-speed tracking conveys the power and control of the bike leaning into the corner, driving out of it and closing on the rider ahead. Quietly and firmly, the boy says: \"I won't stop here.\"\n\n23-27s: An uphill section of circuit appears ahead and the boy sprints flat out into the setting sun. The soundtrack keeps only breathing, engine and rising music — no further dialogue. Carried by its own momentum the bike launches into the air, entering a breathtaking slow motion. From the depths of memory comes one last gentle voice, smiling: \"Go on.\"\n\n27-30s: The camera orbits the airborne bike in slow-motion close-up, pushing the hot-blooded, tender, free, upward-leaping feeling to its peak. Flowers bloom outward behind him, then the word \"seedance\" appears. Reference @Image1.", "duration": 30, "resolution": "480p", "aspect_ratio": "adaptive", "generate_audio": true } }); console.log(result.data); ``` ### Python ```python import asyncio import modelrunner_ai async def main(): response = await modelrunner_ai.submit_async( "bytedance/seedance-v2.5/image-to-video", arguments={ "image": "https://media.modelrunner.ai/GpTHw0l9Ac8nMcn3-youth-motorcycle-racing-memory-image.jpg", "prompt": "A 30-second cinematic coming-of-age racing short, 2D animation style. The protagonist is a teenage rider competing in a top-tier motorcycle race. The overall tone is hot-blooded, youthful, emotionally intense and strongly cinematic, with a complete four-act arc and a clear emotional curve. The whole film uses only two camera moves: high-speed tracking and slow-motion orbit. Dialogue is minimal, surfacing naturally like fragments of memory — sincere, gentle, restrained, never sloganeering, never over-sentimental. No sense of disaster, no negative framing, no exaggerated sci-fi. The emphasis is on love, support, the fightback and the growth found inside youthful racing.\n\n0-5s: A dusk circuit, opening on fast, fierce competition. The camera tracks the boy's bike at speed hugging the ground, tyres skimming the edge line, engine roaring, wind slicing past, the mood tense and blazing. The boy is entirely focused; the setting sun draws sharp highlights along the metal of the bike.\n\n5-9s: Coming out of a key corner, the boy is suddenly overtaken by a rival. The high-speed tracking continues, the frame conveying the pressure of a dropping position and a broken rhythm. A close-up inside the helmet catches a brief loss of focus, tightened breathing, a small wavering. The boy says under his breath: \"Can I still catch up...\"\n\n9-14s: The boy falls behind, his breathing heavier, his mood at its lowest. The race does not stop; the bike is still travelling flat out. Warm fragments of memory begin to flash through the high-speed riding: learning to ride as a child, someone steadying him from behind; his father adjusting his helmet, careful and quiet; before the finish line, a gentle smile watching him; two silhouettes walking side by side up a hill road at dusk. All of these are rendered in golden backlight, soft slow motion, fragmentary and felt rather than stated.\n\n14-18s: The music turns from suppressed to soaring. Restrained, gentle voices come through the memory: \"Don't be afraid — I'm always here.\" \"Stay steady. And look forward.\" The boy's eyes refocus, his breathing steadies, his state shifts from wavering to resolved.\n\n18-23s: The boy recovers his conviction, accelerates with everything he has and counter-attacks with a precise racing line. The high-speed tracking conveys the power and control of the bike leaning into the corner, driving out of it and closing on the rider ahead. Quietly and firmly, the boy says: \"I won't stop here.\"\n\n23-27s: An uphill section of circuit appears ahead and the boy sprints flat out into the setting sun. The soundtrack keeps only breathing, engine and rising music — no further dialogue. Carried by its own momentum the bike launches into the air, entering a breathtaking slow motion. From the depths of memory comes one last gentle voice, smiling: \"Go on.\"\n\n27-30s: The camera orbits the airborne bike in slow-motion close-up, pushing the hot-blooded, tender, free, upward-leaping feeling to its peak. Flowers bloom outward behind him, then the word \"seedance\" appears. Reference @Image1.", "duration": 30, "resolution": "480p", "aspect_ratio": "adaptive", "generate_audio": true } ) result = await response.get() print(result["output"]) asyncio.run(main()) ``` ## Additional Resources - [Playground](https://modelrunner.ai/models/bytedance/seedance-v2.5/image-to-video) - [OpenAPI Schema](https://modelrunner.ai/models/bytedance/seedance-v2.5/image-to-video/openapi.json) - [LLM Instructions](https://modelrunner.ai/models/bytedance/seedance-v2.5/image-to-video/llms.txt)