Begin exactly from Image 1 and finish on Image 2. In one continuous four-second shot, the same beige vintage compact car switches on its lights, rolls from the wet shoulder into the near lane, and drives away along the forest-road curve. Use one stable, gentle pan only. Preserve the exact car body, beige paint, wheels, forest, road geometry, camera height, mist, and dawn lighting. Keep the movement physically plausible, with restrained tire spray and stable reflections, and settle cleanly into the final composition without morphing. Synchronized audio: one quiet engine start, tires on wet asphalt, light rain, and distant forest ambience. No cuts, no people, no extra vehicles, no readable text, no logos, no products, no advertising, no watermark.
Seedance 2.0 Mini Image-to-Video API
bytedance/seedance-2.0-mini/image-to-videoSeedance 2.0 Mini Image-to-Video API turns one required start-frame image and one optional end-frame image into a 4–15 second video at 480p or 720p. Place the start frame first and the end frame second in image_urls; aspect_ratio accepts only auto.
Input
Generate audio
Ask the model to generate an audio track with the video.
Advanced
Return last frame
Keep the video result and request the final frame as an additional file.
Web search
Send the optional web_search Boolean field.
Output
IdleYour generated files will appear here
Set the inputs, choose a duration, then run the asynchronous video task.
Continue with
Examples
REST API
Quick Start
Authenticate, submit one public start-frame URL, then retrieve the asynchronous video result.
Connect to the Vidgo API
Store VIDGO_API_KEY on your server and send it as a Bearer token.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Send a prompt, duration, and one image_urls item in the smallest useful request.
curl --request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "seedance-2.0-mini/image-to-video",
"callback_url": "https://webhook.site/b3fc9007-e1ec-4df1-97da-fd65c209e5d6",
"input": {
"prompt": "Begin exactly from Image 1 and finish on Image 2. In one continuous four-second shot, the same beige vintage compact car switches on its lights, rolls from the wet shoulder into the near lane, and drives away along the forest-road curve. Use one stable, gentle pan only. Preserve the exact car body, beige paint, wheels, forest, road geometry, camera height, mist, and dawn lighting. Keep the movement physically plausible, with restrained tire spray and stable reflections, and settle cleanly into the final composition without morphing. Synchronized audio: one quiet engine start, tires on wet asphalt, light rain, and distant forest ambience. No cuts, no people, no extra vehicles, no readable text, no logos, no products, no advertising, no watermark.",
"duration": 4,
"resolution": "720p",
"aspect_ratio": "auto",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/bytedance/seedance-2.0-mini/image-to-video/v1/input-start-frame.png",
"https://cdn.vidgo.ai/apis/models/bytedance/seedance-2.0-mini/image-to-video/v1/input-end-frame.png"
],
"generate_audio": true,
"seed": 24082402
}
}'Wait for the result
Poll only non-terminal states or provide callback_url for a flat terminal callback body.
Track status
GET https://api.vidgo.ai/api/generate/status/ZC7XZS2EAVXDCRBQPoll every 2–5 seconds initially, back off for long tasks, and stop on finished or failed. Separate network timeouts from failed task results; callback_url remains an alternative.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "ZC7XZS2EAVXDCRBQ",
"status": "running",
"created_time": "2026-08-24T08:56:39"
}
}{
"code": 200,
"data": {
"task_id": "ZC7XZS2EAVXDCRBQ",
"status": "finished",
"created_time": "2026-08-24T08:56:39",
"progress": 100,
"error_message": null,
"files": [
{
"file_type": "video",
"file_url": "https://cdn.vidgo.ai/apis/models/bytedance/seedance-2.0-mini/image-to-video/v1/output.mp4"
}
]
}
}Complete runnable example
The expanded script handles submission, polling, failure, timeout, and result extraction.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "seedance-2.0-mini/image-to-video",
"callback_url": "https://webhook.site/b3fc9007-e1ec-4df1-97da-fd65c209e5d6",
"input": {
"prompt": "Begin exactly from Image 1 and finish on Image 2. In one continuous four-second shot, the same beige vintage compact car switches on its lights, rolls from the wet shoulder into the near lane, and drives away along the forest-road curve. Use one stable, gentle pan only. Preserve the exact car body, beige paint, wheels, forest, road geometry, camera height, mist, and dawn lighting. Keep the movement physically plausible, with restrained tire spray and stable reflections, and settle cleanly into the final composition without morphing. Synchronized audio: one quiet engine start, tires on wet asphalt, light rain, and distant forest ambience. No cuts, no people, no extra vehicles, no readable text, no logos, no products, no advertising, no watermark.",
"duration": 4,
"resolution": "720p",
"aspect_ratio": "auto",
"image_urls": [
"https://cdn.vidgo.ai/apis/models/bytedance/seedance-2.0-mini/image-to-video/v1/input-start-frame.png",
"https://cdn.vidgo.ai/apis/models/bytedance/seedance-2.0-mini/image-to-video/v1/input-end-frame.png"
],
"generate_audio": true,
"seed": 24082402
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
while true; do
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/ZC7XZS2EAVXDCRBQ" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep 2
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters
Send model and callback_url at the top level. input accepts only the listed common fields and ordered image_urls.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| model | string | Yes | — | Must be seedance-2.0-mini/image-to-video. |
| callback_url | string (URL) | No | — | Public terminal callback endpoint. |
| input | object | Yes | — | Model-specific input object. |
| input.prompt | string | Yes | — | Trimmed length 1–20,000. |
| input.image_urls | string[] | Yes | — | One Start URL and optional second End URL, in order. |
| input.duration | integer | Yes | — | Inclusive 4–15. |
| input.resolution | string | No | 720p | 480p or 720p. |
| input.aspect_ratio | string | No | — | Omit or send auto only. |
| input.generate_audio | boolean | No | — | Optional generated audio. |
| input.return_last_frame | boolean | No | — | Optional final-frame result. |
| input.web_search | boolean | No | — | Optional Boolean field. |
| input.seed | integer | No | — | Optional integer with no published range. |
Response Fields
Submission returns task identity; status returns progress, every output file, or a terminal error.
| Field | Type | Description |
|---|---|---|
| code | integer | Business code; success uses 0 or 200. |
| message | string | Response message when present. |
| data.task_id | string | Status-query identifier. |
| data.status | string | not_started, running, finished, or failed. |
| data.created_time | string | Creation timestamp. |
| data.progress | integer | Reported progress. |
| data.files[] | array | All successful files. |
| data.files[].file_url | string | Direct result URL. |
| data.files[].file_type | string | video, image, or another returned type. |
| data.files[].watermark_url | string | null | Watermarked URL when available. |
| data.error_message | string | null | Failure detail. |
Task Lifecycle
Only non-terminal states are polled.
not_startedAccepted and queued.
runningGenerating; continue polling.
finishedSuccessful terminal state; read all files.
failedFailed terminal state; stop and read the error.
Polling and Errors
- Authentication401 means the Bearer key is missing or invalid.
- Validation400 means a field, frame count, or ratio is invalid.
- Polling intervalStart around 2–5 seconds and back off for long tasks, 429, or 5xx.
- Terminal statesStop on finished or failed and enforce a client timeout.
- Callback optioncallback_url receives a flat terminal task object; polling remains available.
Model Specifications
| Specification | Value | Details |
|---|---|---|
| Input mode | 1–2 frames | Required Start and optional End in image_urls order. |
| Output | Video + optional last frame | Asynchronous mixed-file result. |
| Resolution | 480p / 720p | 720p is the API default. |
| Duration | 4–15 seconds | Inclusive integer range. |
| Aspect ratio | Auto | Other ratio values are rejected. |
| Billing basis | 10 or 24 credits/s | Output duration at the selected resolution. |
Seedance 2.0 Mini Image-to-Video API overview
Seedance 2.0 Mini Image-to-Video API receives one start frame and one optional end frame in image_urls. Use prompt to describe subject movement and camera movement between the two images; retrieve the asynchronous task through status polling or callback_url.
Why use Seedance 2.0 Mini Image-to-Video API?
Use the start frame for visual details.The first image_urls item supplies the subject appearance, environment, lighting, and opening composition.
Use the end frame to specify the closing image.Place a second image in image_urls when the video must end on a specified pose or composition.
Describe subject and camera movement separately.Write the subject movement first, followed by pan, track, push, orbit, or locked-camera instructions.
Choose resolution and integer duration.resolution accepts 480p or 720p; duration accepts an integer from 4–15.
Parameters
| Parameter | Requirement | Description |
|---|---|---|
| prompt | Required | Trimmed motion and camera instruction from 1 through 20,000 characters. |
| image_urls | Required | Ordered array of one start-frame URL and one optional end-frame URL; removing Start does not promote End. |
| duration | Required | Integer from 4 through 15 seconds; the Playground starts at 5. |
| resolution | Optional | 480p or 720p. The API and Playground default to 720p. Default 720p480p |
| aspect_ratio | Optional / fixed | Omit or send auto only. The Playground displays read-only Auto and sends auto. Default auto |
| generate_audio | Optional | Boolean audio request. The Playground sends true initially; the API declares no default. |
| return_last_frame | Optional | Boolean request for the final frame as an additional successful file. |
| web_search | Optional | Optional Boolean field. |
| seed | Optional | Integer with no published range. |
How to Use
Choose the start frameUse an image where the subject appearance, opening pose, environment, and composition are visible.
Add an end frame when neededPlace the end frame second in image_urls to specify the image shown at the end of the video.
Describe subject motionState the action that begins from the start frame and where the action should finish.
Direct camera motionSpecify pan, track, push, orbit, or a locked camera separately.
Submit and trackRun the task, then poll task_id or use callback_url to receive a finished or failed task object.
Pricing
Image-to-Video uses the no-reference-video rate. Frame count, generated audio, final-frame return, web search, and seed do not change current pricing.
| Usage | Rate | Details |
|---|---|---|
| 480p output | 10 credits / output second | $0.050/s. A 5 second task uses 50 credits ($0.250). |
| 720p output | 24 credits / output second | $0.120/s. A 5 second task uses 120 credits ($0.600). |
Best Use Cases
Product movement clipsSubmit a product image and describe rotation, translation, or component movement in prompt.
Character action clipsSubmit a portrait or full-body image and specify one subject action in prompt.
Start-to-end image transitionsUse the first image_urls item for the opening image and the second item for the closing image.
Camera-movement comparisonsGenerate locked, tracking, pushing, or orbiting camera instructions from the same start frame.
Pro Tips
- Treat the start frame as the source of composition, identity, wardrobe, environment, and light.
- Describe subject motion before camera motion so the two instructions do not compete.
- When using an end frame, describe the transition rather than redescribing both images.
- Keep identity-changing instructions out of the prompt unless transformation is intentional.
- Use one readable action beat for short clips and state where the movement should settle.
Notes
- image_urls must contain one or two public HTTP(S) URLs in Start then End order.
- Seedance 2.0 Mini Image-to-Video API does not accept reference-media fields or independent start_image_url and end_image_url fields.
- Only auto is accepted when aspect_ratio is provided.
- The Playground upload policy is JPEG/PNG/WebP up to 30 MB; it is not a complete upstream limit statement.
Related Models
Seedance 2.0 Mini Image-to-Video API — Frequently asked questions
What is Seedance 2.0 Mini Image-to-Video API?
Seedance 2.0 Mini Image-to-Video API turns one start frame and one optional end frame into video. The first image_urls item is the start frame and the second is the end frame; a successful submission returns task_id for the asynchronous task.
How do I call Seedance 2.0 Mini Image-to-Video API?
Send POST /api/generate/submit with a Bearer key, set model to seedance-2.0-mini/image-to-video, and provide one or two public HTTP(S) URLs in input.image_urls. Poll the returned task_id or provide callback_url.
How is Seedance 2.0 Mini Image-to-Video API billed?
480p uses 10 credits ($0.050) per output second and 720p uses 24 credits ($0.120) per output second. One or two images use the same rate when duration and resolution are unchanged.
What inputs does Seedance 2.0 Mini Image-to-Video API accept?
input must contain prompt, an integer duration from 4–15, and image_urls with one or two ordered image URLs. resolution accepts 480p or 720p; aspect_ratio must be omitted or set to auto.
How do I retrieve a Seedance 2.0 Mini Image-to-Video API result?
Poll the task only while status is not_started or running. Stop when status becomes finished or failed; data.files contains the video and any other files returned by the service.
How should I choose among the three Seedance 2.0 Mini APIs?
Use Seedance 2.0 Mini Image-to-Video API for a required start frame and optional end frame, Seedance 2.0 Mini Text-to-Video API without source media, or Seedance 2.0 Mini Reference-to-Video API for image, video, or audio references.


