Introduction
SeedVR2 Video is the video restoration model from ByteDance's Seed team, published in June 2025 as a one-step diffusion model trained with adversarial post-training. It is built for footage that a plain upscaler cannot save: low resolution, heavy compression, blur and noise. You send one clip (video_url) and choose an output tier (resolution); the clip comes back with rebuilt texture at 720p, 1080p, 2K or 4K, with the same length, framing, frame rate and audio track. There is no prompt.
Key features & highlights
Restoration, not just enlargement
Because SeedVR2 generates detail instead of sharpening existing pixels, compression blocks and smears do not get amplified. On a 3-second, 624×360 clip encoded at a very low bitrate, it rebuilt the cable knit of a sweater, the brass of a lantern and the horizon behind a lighthouse window; the same clip through a plain upscaler kept the blockiness, only sharper.
Same clip, higher tier
Length, cuts, motion and framing stay as sent, and the soundtrack is passed through: a 4-second, 640×360 clip with AAC audio came back at 1280×720, 24 fps, 4.0 seconds, with the same track. The tier is a pixel budget with the aspect ratio kept, so 624×360 at 1080p returned 1896×1094.
Predictable cost per second
The price is per second of the source clip, rounded up with a 3-second minimum, and the tier sets the rate: 720p is the cheapest, 2K is 1.5 times and 4K twice the 1080p rate. A failed task is not charged.
Request parameters
| Parameter | Required | Description |
|---|---|---|
video_url | Yes | The clip to restore, 3 to 60 seconds long, as a direct link to an MP4 file or an upload. at least 1 characters |
resolution | No | Output tier: 720p, 1080p (the default), 2k or 4k, a pixel budget with the aspect ratio kept, so a 624×360 clip at 1080p returns 1896×1094. |
Pricing
Restoration is charged by the second of footage you send, with part-seconds counted as a full second and 3 seconds as the floor, at the rate of the tier you pick. Before the task starts we hold the price of the upload's measured length plus a second, or of 60 seconds when you pass a link, and give back whatever the restored clip does not use.
| Specification | Price |
|---|---|
| $0.024 / second |
| $0.048 / second |
| $0.072 / second |
| $0.096 / second |
Use cases
Old and re-uploaded footage
Phone videos that have been compressed several times, clips saved from social apps and low-bitrate screen recordings are the material this model is meant for. Restore them at 1080p before editing so the soft, blocky look does not carry into the final cut.
Delivering AI-generated video
Draft generations at 480p or 720p often look soft. Run the selected take through SeedVR2 at 1080p or 4K as the last step before delivery, after the edit is locked, so you only pay for the seconds you keep.
Prompt guide & pro tips
Trim before you send
Billing follows the length of the source clip, so cut it to the part you need first. Clips must be 3 to 60 seconds; split longer footage and join the restored parts afterwards.
Choose the tier by destination
Use 720p for phones and previews, 1080p for most web and social delivery, and 2K or 4K only when the clip will be shown on a large screen. Higher tiers take longer and cost more per second.
Review faces, hands and text
Restoration fills in plausible detail. Watch faces, hands, logos and lettering in the result; if something important was redrawn, a less degraded source or a lower tier keeps closer to the original.
Keep clean footage on the cheaper path
If the clip is already sharp and only needs more pixels, a plain resolution upscale is faster and cheaper. SeedVR2 earns its price on footage that looks damaged.
API quick start
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "bytedance/seedvr2-video/upscale",
"input": {
"resolution": "1080p",
"video_url": "https://example.com/reference.mp4"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
See the API reference for authentication, the complete schema, polling, and error handling.


