API reference · ByteDance
bytedance/seedance/2.5/image-to-video
Integrate this model through SandBase's unified API, with production-ready schemas and examples.
Production endpoint
Send your first request
OpenAI-compatible endpoint with unified authentication and usage tracking.
POST
https://api.sandbase.ai/v1/runModel ID
bytedance/seedance/2.5/image-to-video01
Input Schema
9 parameters · 0 required · 9 optional
| Parameter | Type | Required | Description |
|---|---|---|---|
seed | integer | Optional | Random seed for reproducible results. Omit or use -1 for a random seed. · Min: -1 · Max: 4294967295 |
draft | boolean | Optional | Draft mode step 1: render a fast, low-cost 480p draft (overrides `resolution`, billed at the 480p rate). Pass the result's `outputs[0].draft_id` back as `draft_id` within 7 days to render the same shot at 1080p. · Default: false |
image | string | Optional | The URL of the starting image for video generation. |
prompt | string | Optional | The text prompt to generate a video from. · Min length: 3 · Max length: 50000 · Default: "Create a 360-degree orbiting camera shot based on this photo." |
draft_id | string | Optional | Draft mode step 2: the `outputs[0].draft_id` of a succeeded draft from this same model (created with `draft: true` in the last 7 days). Renders the same shot at 1080p, billed at the 1080p rate for the actual output length. The prompt, media, duration, aspect ratio, seed, audio setting and task type are reused from the draft; any such fields sent with `draft_id` are ignored. · Min length: 1 |
duration | any | Optional | Output duration in seconds (4-30), or `auto` to let the model pick a length from the prompt and inputs. `auto` is pre-authorized at 30 seconds and billed on the actual output length. · Options: auto, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 · Default: 5 auto456789101112131415161718192021222324252627282930 |
end_image | string | Optional | The URL of the ending image for video generation. |
resolution | string | Optional | The resolution of the video to generate. · Options: 480p, 720p, 1080p · Default: "720p" 480p720p1080p |
generate_audio | boolean | Optional | Whether to generate synchronized audio (voice, SFX, BGM) for the video. · Default: true |
02
Output Schema
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for the generation task |
status | string | Task status: pending, running, completed, failed, timeout |
model | string | Model used for the generation |
outputs | array | Array of output items |
outputs[].url | string | URL of the generated artifact |
outputs[].content_type | string | MIME type (e.g. image/png, video/mp4) |
error | object | null | Error details if failed, null on success |
error.type | string | Machine-readable error type code |
error.message | string | Human-readable error description |
Async Workflow
This model uses asynchronous execution. Submit a request and poll for the result.
- Submit — POST to /v1/run, receive an
id - Poll — GET /v1/run/{id} until status is
completed,failed, ortimeout - Retrieve — Read
outputsfrom the completed response
03
Code Examples
Ready-to-run snippets
const apiKey = process.env.SANDBASE_API_KEY;
const response = await fetch("https://api.sandbase.ai/v1/run", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"model": "bytedance/seedance/2.5/image-to-video",
"draft": false,
"image": "https://p9-arcosite.byteimg.com/tos-cn-i-goo7wpa0wc/f8fc1008f23a4908b7c897e8b7eb87df~tplv-goo7wpa0wc-image.image",
"prompt": "Create a 360-degree orbiting camera shot based on this photo.",
"duration": 5,
"resolution": "720p",
"generate_audio": true
}),
});
if (!response.ok) throw new Error(await response.text());
let result = await response.json();
for (let attempt = 0; attempt < 120 && !["completed", "failed", "timeout"].includes(result.status); attempt++) {
await new Promise((resolve) => setTimeout(resolve, 2_000));
const poll = await fetch(`https://api.sandbase.ai/v1/run/${result.id}`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
if (!poll.ok) throw new Error(await poll.text());
result = await poll.json();
}
if (result.status !== "completed") throw new Error(`Generation ended: ${result.status}`);
console.log(result);