Seedance 2.5 Upscaled
ByteDancevideolive~6m 18sSeedance 2.5 rendered one step lower and upscaled to 1080p or 4K, with native audio.
avg$2.92/ run
An estimate, trued up after the run. Failed runs cost $0.00.
How this model is billed
Quoted before you run. A failed run costs $0.00.
Typical run ~6m 18s: the measured mean, end to end.
Compare every priceRun Seedance 2.5 Upscaled
Seedance 2.5 Upscaled API
Async: the POST answers at once with a request id. Poll it, or take the webhook.
- 01
Submit
Parameters at the top level of the JSON body. Answers 202 with a request id.
curlPOST /v1/models/seedance-2.5-upscaled curl -X POST https://api.ezflows.io/v1/models/seedance-2.5-upscaled \ -H "Authorization: Bearer $EZFLOWS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "a wide shot of a desert at dusk", "duration": 5, "resolution": "1080p" }' # 202 Accepted, at once — it never waits for the model: # {"request_id": "req_8f2a41c9b70e4d15", "status": "queued", # "poll_url": "https://api.ezflows.io/v1/requests/req_8f2a41c9b70e4d15"} - 02
Poll
Same bearer header, every few seconds, until the status is final.
curlGET /v1/requests/:id REQUEST_ID=req_8f2a41c9b70e4d15 # from the POST while :; do BODY=$(curl -s https://api.ezflows.io/v1/requests/$REQUEST_ID \ -H "Authorization: Bearer $EZFLOWS_API_KEY") STATUS=$(echo "$BODY" | jq -r .data.status) case "$STATUS" in succeeded|failed|cancelled) break ;; esac sleep 3 done echo "$BODY" | jq -r '.data.output.artifacts[].url' # media.ezflows.io, kept 90 days - 03
Response
Files are on media.ezflows.io, kept 90 days. A failed run says why and costs nothing.
json200 · succeeded { "data": { "id": "req_8f2a41c9b70e4d15", "model_slug": "seedance-2.5-upscaled", "status": "succeeded", "http_status": 200, "cost": 2.921734, "auth_method": "api_key", "error": null, "submitted_at": "2026-09-12T18:07:21.114Z", "queue_started_at": "2026-09-12T18:07:21.402Z", "execution_started_at": "2026-09-12T18:07:22.010Z", "first_byte_at": "2026-09-12T18:07:52.871Z", "finished_at": "2026-09-12T18:07:55.203Z", "io_deleted_at": null, "canvas_id": null, "canvas_node_id": null, "client_attempt_id": null, "idempotency_key": null, "input": { "prompt": "a wide shot of a desert at dusk", "duration": 5, "resolution": "1080p" }, "output": { "artifacts": [ { "index": 0, "kind": "video", "contentType": "video/mp4", "url": "https://media.ezflows.io/outputs/<account>/req_8f2a41c9b70e4d15/0.mp4" } ] } } } - 04
Webhook
Skip polling: we POST the result to your endpoint, at least once.
- Register
- Create an endpoint under Webhooks in the dashboard; the signing secret is shown once.
- Events
- request.succeeded · request.failed · request.cancelled
- Headers
- ezflows-event-id (dedupe on it) · ezflows-timestamp (unix seconds) · ezflows-signature t=<ts>,v1=<hex HMAC-SHA256 of "<ts>.<raw body>">
- Verify
- Over the exact bytes received, in constant time; reject anything older than five minutes.
- Respond
- Any 2xx within 10 s. Redirects are not followed.
- Retries
- Five, with backoff: 30 s · 60 s · 2 min · 4 min · 8 min. Disabled after five consecutive dead deliveries.
jsonDelivery body { "id": "82cf46a4-841e-41d6-b3c7-facc937d3252", "type": "request.succeeded", "created_at": "2026-09-12T18:07:55Z", "data": { "id": "req_8f2a41c9b70e4d15", "model_slug": "seedance-2.5-upscaled", "status": "succeeded", "cost": 2.921734, "output": { "artifacts": [ { "url": "https://media.ezflows.io/…/0.mp4" } ] } } }curlverify.sh # Create the endpoint under Webhooks in the dashboard; the signing secret is shown once. # ezflows-signature: t=<ts>,v1=<hex HMAC-SHA256 of "<ts>.<raw body>"> # body.json = the exact bytes received. Reject anything older than five minutes. EXPECTED=$({ printf '%s.' "$TS"; cat body.json; } \ | openssl dgst -sha256 -hmac "$EZFLOWS_WEBHOOK_SECRET" -r | cut -d' ' -f1) [ "$EXPECTED" = "$V1" ] && echo "valid" || echo "reject"
Parameters 16
| Name | Type | Default | Allowed | Description |
|---|---|---|---|---|
| promptrequired | string | — | — | Text describing the video. Use Shot 1:, Shot 2: for multi-shot sequences. Reference uploaded assets as '@Image 1', '@Video 1', '@Audio 1' in your prompt. |
| first_frame_url | string | — | one image url | Starting frame image URL for image-to-video. Animates outward from this reference. Note: images with real human faces are blocked by the content policy. Cannot be used together with reference_images. |
| last_frame_url | string | — | one image url | Ending frame; requires first_frame_url. Guides transitions between two frames. |
| reference_images | string[] | — | up to 30 image urls | Up to 30 reference images (max 30MB each) for character/style consistency. Cite as '@Image 1', '@Image 2' in your prompt. Cannot be used together with first_frame_url. |
| reference_videos | string[] | — | up to 10 video urls | Up to 10 reference videos (2-30 seconds each, 30 seconds combined, mp4/mov, max 200MB each) for motion/style transfer. Cite as '@Video 1' in your prompt. Requests with reference videos are billed at the video-input token rate. |
| reference_audios | string[] | — | up to 10 audio urls | Up to 10 reference audio files (MP3, 2-30 seconds each, 30 seconds combined, max 15MB each). Cite as '@Audio 1' in your prompt. Audio-only reference is supported on seedance-2.5. |
| duration | enum | 5 | 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 | Video length in seconds (4-30), or -1 to let the model choose. Video-editing prompts require -1 (output follows the input video, which must be 4-30s). Cost scales with output duration (token-based). |
| resolution | enum | 1080p | 720p · 1080p · 4k | Output resolution delivered: 720p, 1080p or 4K. The model renders one step lower and upscales the result to this resolution. Higher resolutions cost more. |
| aspect_ratio | enum | — | 16:9 · 9:16 · 1:1 · 4:3 · 3:4 · 21:9 | Output aspect ratio. Defaults to adaptive, which lets the model match the prompt or the input media. adaptive is the only value accepted when you supply first_frame_url, or when the prompt asks for a video edit or extension — the output keeps the geometry of the input in those cases. Pick a fixed ratio (16:9 landscape, 9:16 vertical, 21:9 ultrawide) for text-to-video or plain reference-to-video. |
| generate_audio | boolean | true | — | Co-generate synchronized audio (dialogue, SFX, ambient, music) in the same pass. Best for scenes with speech, nature sounds, or music. |
| seed | integer | -1 | -1–2147483647 | Reproducibility seed. Use -1 for random output, set a fixed value to iterate on the same scene. |
| return_last_frame | boolean | false | — | Returns the final video frame as a separate image, delivered in the response as `video.last_frame_url`. Chain shots by feeding that URL into the next generation's `first_frame_url`. Note this is an output: it is distinct from the `last_frame_url` input parameter, which is an image you supply to steer how the clip ends. |
| bitrate_mode | enum | standard | standard · high | Output video encoding bitrate. 'standard' gives smaller files and faster downloads; 'high' produces ~5-6x higher bitrate for better visual fidelity and fewer compression artifacts (larger files). Does not affect price. |
| output_format | enum | mp4 | mp4 · mov | mp4 = best compatibility. mov (H.264 + yuv444p + PCM) = higher color fidelity; recommended for video editing/extension round-trips. |
| auto_resize | boolean | true | — | Automatically resizes an input image that falls outside the provider's accepted range (300-6000px per side, aspect ratio 0.4-2.5, 30MB) so the request succeeds instead of being rejected. Aspect ratio is preserved: oversized images are downscaled, undersized ones upscaled, and out-of-band ratios padded rather than cropped. On by default - set it to false to have the provider reject out-of-range images instead. When a resize happens the response carries an X-Input-Normalized header naming the field and the before/after dimensions. |
| output_codec | enum | auto | auto · h264 | Codec of the delivered file. The upscaled clip is always delivered as H.264 8-bit with AAC audio, which plays in every browser and editor, so this setting has no effect on this model. |
File inputs (first_frame_url: one image url · last_frame_url: one image url · reference_images: up to 30 image urls · reference_videos: up to 10 video urls · reference_audios: up to 10 audio urls) take URLs. Upload the raw file to POST /v1/uploads with its own Content-Type and pass the url it returns. Inputs are kept 90 days.
Sign in to see your runs of Seedance 2.5 Upscaled: status, cost, timings and outputs.
Sign inSign in to see what you spend on Seedance 2.5 Upscaled, and how often runs succeed.
Sign in