Animate this exact outdoor loom scene in one continuous five-second shot. The same Ghanaian weaver throws the wooden shuttle once through the open shed, then beats the weft so the navy-and-gold cloth settles with a slight sag. Preserve her face, hair, clothing, loom geometry, textile pattern, mango-tree background, and camera framing. Very slow gentle lateral camera drift. Tactile wood and cloth physics. No extra people, no cuts, no lettering, no logos, no brands, no advertising, no watermark.
Seedance 1.0 Pro Image to Video API
bytedance/seedance/v1/pro/image-to-videoSeedance 1.0 Pro Image to Video animates a single reference image into high-fidelity cinematic video, with 720p and 1080p resolutions, 5-second and 10-second durations, and physically accurate motion simulation. It faithfully preserves the source image's facial likeness, wardrobe textures, and spatial composition while introducing fluid subject actions and camera movements guided by your text prompt.

Image-to-video requires one HTTP(S) image URL. Playground uploads accept JPG, PNG or WebP up to 10 MiB; this is an upload policy. JSON/API does not accept Base64.
Examples
REST API Spec
Quick Start
API structure examples, not actual generation results. Replace the example prompt and media URLs.
Step 1: Configure API authentication
Obtain an API key from the dashboard and include Authorization: Bearer <API_KEY> in every request header.
- Submission Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Auth Header
- Authorization: Bearer VIDGO_API_KEY
Step 2: Submit a generation task
POST /api/generate/submit. Pass model and optional callback_url at the root level, with generation parameters inside input.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "bytedance/seedance/v1/pro/image-to-video",
"input": {
"prompt": "Animate this exact outdoor loom scene in one continuous five-second shot. The same Ghanaian weaver throws the wooden shuttle once through the open shed, then beats the weft so the navy-and-gold cloth settles with a slight sag. Preserve her face, hair, clothing, loom geometry, textile pattern, mango-tree background, and camera framing. Very slow gentle lateral camera drift. Tactile wood and cloth physics. No extra people, no cuts, no lettering, no logos, no brands, no advertising, no watermark.",
"resolution": "720p",
"duration": 5,
"image_urls": [
"https://cdn.vidgo.ai/apis/models/bytedance/seedance/v1/pro/image-to-video/v1/01/input.png"
]
}
}
JSON
)
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")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Step 3: Poll for task completion
Poll status with task_id; continue while not_started or running, and stop on finished or failed. Read video URLs from data.files[].file_url on success, or data.error_message on failure.
Status Endpoint
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll status using task_id; continue while not_started or running, stop when finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "AJQ924LPAZ9JVYP0",
"status": "running",
"created_time": "2026-09-22T19:06:33"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Complete end-to-end script example
Expand to view a production-ready script with retry logic, error handling, and timeout safeguards.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "bytedance/seedance/v1/pro/image-to-video",
"input": {
"prompt": "Animate this exact outdoor loom scene in one continuous five-second shot. The same Ghanaian weaver throws the wooden shuttle once through the open shed, then beats the weft so the navy-and-gold cloth settles with a slight sag. Preserve her face, hair, clothing, loom geometry, textile pattern, mango-tree background, and camera framing. Very slow gentle lateral camera drift. Tactile wood and cloth physics. No extra people, no cuts, no lettering, no logos, no brands, no advertising, no watermark.",
"resolution": "720p",
"duration": 5,
"image_urls": [
"https://cdn.vidgo.ai/apis/models/bytedance/seedance/v1/pro/image-to-video/v1/01/input.png"
]
}
}
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')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
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 "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters (input object)
Pass model and optional callback_url at the root and these fields inside input. Only the documented fields and types are accepted; defaults apply only when omitted. Unknown fields, aspect ratio, audio, start/end frames and fixed lens fields are rejected, including null or empty values.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | Required string containing 1–10,000 Unicode characters after trimming surrounding whitespace. Non-string and blank prompts are rejected. |
| image_urls | array | Yes | — | An array of exactly one HTTP(S) image URL with a hostname and no embedded credentials or whitespace. Base64 and bare strings are rejected. |
| resolution | string | No | 720p | Only the strings 720p and 1080p are supported. Defaults to 720p only when omitted; aliases, different casing, surrounding whitespace, null and empty strings are rejected. |
| duration | integer | No | 5 | Only numeric integers 5 and 10 seconds are supported. Defaults to 5 only when omitted; strings, booleans, null and fractional values are rejected. Numeric 5.0 is equivalent to 5. |
Response Fields (query result)
Task details returned when polling GET /api/generate/status/{task_id}:
| Field | Type | Description |
|---|---|---|
| code | integer | Business response code, 200 on success. |
| data.task_id | string | Globally unique asynchronous task identifier. |
| data.status | string | Execution status: not_started, running, finished, or failed. |
| data.files | array | Generated video files upon completion, each with file_url and file_type. |
| data.error_message | string | null | Error description if task fails. |
Task Lifecycle
Clients should inspect the status field and stop polling when reaching finished or failed:
not_startedTask received and queued for execution.
runningGeneration is in progress.
finishedGeneration complete; retrieve video URL from data.files.
failedGeneration failed; inspect data.error_message; deducted credits are refunded per standard policy.
Polling & Error Handling
- Recommended Polling IntervalThe playground increases the polling interval from 2 seconds up to 10 seconds and stops on finished or failed.
- Network Fluctuations & RetriesA failed status query does not mean generation failed. Retry the status query for the same task without resubmitting.
- Asynchronous Webhook CallbackProvide callback_url at the root of the request payload to receive the completed task result automatically via POST.
Specifications
| Specification | Value | Description |
|---|---|---|
| Model ID | bytedance/seedance/v1/pro/image-to-video | Root-level model field. |
| Resolution | 720p / 1080p | Only the strings 720p and 1080p are supported. Defaults to 720p only when omitted; aliases, different casing, surrounding whitespace, null and empty strings are rejected. |
| Duration | 5 / 10s | Only numeric integers 5 and 10 seconds are supported. Defaults to 5 only when omitted; strings, booleans, null and fractional values are rejected. Numeric 5.0 is equivalent to 5. |
Related Models
Seedance 1.0 Pro Image to Video API frequently asked questions
What is the Seedance 1.0 Pro Image to Video API?
Seedance 1.0 Pro Image to Video is a ByteDance model for image-to-video generation. It produces high-fidelity videos in 720p and 1080p resolutions from a single reference image and natural language prompt, supporting 5-second and 10-second durations with realistic physical simulation and camera motion control. Built on ByteDance's advanced video generation architecture, it preserves the source subject's identity, wardrobe details, and environmental framing while adding natural, physically coherent motion. You can call it programmatically or try it from the playground above.
How many reference images can I upload to Seedance 1.0 Pro Image to Video?
The image_urls array must contain exactly one starting reference image. The model anchors this image as the visual origin and subject reference, expanding it temporally according to your prompt.
How does Seedance 1.0 Pro Image to Video maintain subject consistency?
The model extracts facial contours, clothing textures, and lighting characteristics from the reference image and tracks them continuously throughout the generation. Focus your prompt on actions and camera motion rather than introducing conflicting physical descriptions.
Can Seedance 1.0 Pro Image to Video generate 10-second videos?
Yes. The model provides both 5-second and 10-second duration options (defaulting to 5 seconds). A 10-second generation allows more continuous motion progression and smoother camera transitions while maintaining subject fidelity.
What output resolutions are supported by Seedance 1.0 Pro Image to Video?
This endpoint supports 720p and 1080p output resolutions. If resolution is omitted, the model defaults to 720p; select 1080p when you need high-definition footage for commercial publishing or post-production.
How is Seedance 1.0 Pro Image to Video priced?
Pricing is billed per generation according to resolution and duration (1 credit = $0.005). At 720p, 5 seconds is 21 credits ($0.105) and 10 seconds is 42 credits ($0.210). At 1080p, 5 seconds is 43 credits ($0.215) and 10 seconds is 86 credits ($0.430). Failed tasks are automatically refunded.
Does Seedance 1.0 Pro Image to Video support camera motion control via text prompts?
Yes. You can include explicit camera movement instructions in your text prompt (such as 'slow dolly forward', 'subtle tracking pan', or 'low-angle orbit around subject'), and the model will execute the camera motion while preserving subject stability.















