Seedance 2.5 API

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.