Image inputs
Upload, confirm and use images owned by your account.
Image inputs must first be uploaded and confirmed under the same account. External URLs, base64 and data URLs are not accepted. JPEG, PNG and WebP are supported; each file is at most 30 MiB and each preparation request contains at most five files.
1. Prepare uploads
curl --fail-with-body "$SEEDANCE_BASE_URL/uploads" \
-H "Authorization: Bearer $SEEDANCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"files":[{"name":"reference.png","type":"image/png","size":12345}]}'Replace 12345 with the actual byte length. The response data[] contains asset_id, upload_url and upload_headers.
2. PUT the file bytes
PUT the exact file bytes to upload_url within five minutes, using every returned upload_headers entry, including Content-Length. Do not send your API Bearer key to the upload URL. Do not wrap the file in multipart/form-data.
3. Confirm the upload
curl --fail-with-body "$SEEDANCE_BASE_URL/uploads/complete" \
-H "Authorization: Bearer $SEEDANCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"asset_ids":["RETURNED_ASSET_ID"]}'Use data[].url from the completion response as the generation input. Ownership, readiness, expiry and model-specific limits are checked before generation.
4. Generate with the image
{
"model": "seedance-2.5-lite",
"mode": "image-to-video",
"prompt": "The subject slowly turns toward the camera.",
"inputs": [
{
"type": "image",
"url": "URL_FROM_UPLOAD_COMPLETE"
}
],
"parameters": {
"duration_seconds": 8,
"resolution": "720p",
"aspect_ratio": "16:9",
"image_mode": "first-frame"
},
"max_cost_credits": 80
}Replace URL_FROM_UPLOAD_COMPLETE, then quote and POST this body to /videos with an idempotency key. For image-to-image use an image model, image-to-image, and /images, without video duration or image_mode.