Video model
Seedance 2.0 Fast Upscaled
bytedance/seedance-2.0-fast-upscaled
bytedance/seedance-2.0-fast-upscaled is a video generation model from ByteDance you can call on the OceanToken API.
At a glance
| Model ID | bytedance/seedance-2.0-fast-upscaled |
|---|---|
| Type | Video |
| Publisher | ByteDance |
| Price | On oceantoken.ai |
| Endpoint | /v1/videos |
| API shape | OpenAI-compatible |
API
POST /v1/videos. Base URL https://api.oceantoken.ai, your OceanToken key as the bearer token. The OpenAI SDKs work unchanged; see the Quickstart.
Download this spec (JSON) · llms.txt for AI assistants
The call starts a job: poll GET /v1/videos/{video_id}, then download GET /v1/videos/{video_id}/content.
Text to video
- curl
- Python
- JavaScript
curl https://api.oceantoken.ai/v1/videos \
-H "Authorization: Bearer $OCEANTOKEN_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2.0-fast-upscaled",
"prompt": "A paper boat drifting down a rain-soaked street",
"duration": 5,
"resolution": "720p"
}'
# then poll GET https://api.oceantoken.ai/v1/videos/{id} until "status" is "completed"
import os, time, uuid
import requests
BASE = "https://api.oceantoken.ai/v1"
headers = {"Authorization": f"Bearer {os.environ['OCEANTOKEN_API_KEY']}"}
job = requests.post(
f"{BASE}/videos",
headers={**headers, "Idempotency-Key": str(uuid.uuid4())},
json={
"model": "bytedance/seedance-2.0-fast-upscaled",
"prompt": "A paper boat drifting down a rain-soaked street",
"duration": 5,
"resolution": "720p",
},
).json()
while job["status"] in ("queued", "in_progress"):
time.sleep(15)
job = requests.get(f"{BASE}/videos/{job['id']}", headers=headers).json()
print(job["status"], job.get("content_url")) # the MP4, valid for 24 hours
const BASE = 'https://api.oceantoken.ai/v1';
const headers = {Authorization: `Bearer ${process.env.OCEANTOKEN_API_KEY}`, 'Content-Type': 'application/json'};
let job = await (await fetch(`${BASE}/videos`, {
method: 'POST',
headers: {...headers, 'Idempotency-Key': crypto.randomUUID()},
body: JSON.stringify({
"model": "bytedance/seedance-2.0-fast-upscaled",
"prompt": "A paper boat drifting down a rain-soaked street",
"duration": 5,
"resolution": "720p"
}),
})).json();
while (job.status === 'queued' || job.status === 'in_progress') {
await new Promise((r) => setTimeout(r, 15000));
job = await (await fetch(`${BASE}/videos/${job.id}`, {headers})).json();
}
console.log(job.status, job.content_url); // the MP4, valid for 24 hours
Request parameters
Only what this model takes. Anything else in the request is left out before it reaches the model.
| Parameter | Type | Description |
|---|---|---|
modelrequired | string | This model's ID. |
promptrequired | string | What happens in the clip. |
duration | integer 4 to 15 default 5 | Length in whole seconds. seconds is accepted too. |
resolution | string 720p, 1080p | Output resolution; lower is faster and cheaper. |
aspect_ratio | string 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive | Output aspect ratio. adaptive follows the first frame (the default when one is sent and no ratio is). If the request is served where adaptive is not available it is ignored and named in the x-oceantoken-dropped-params response header. |
generate_audio | boolean | true for a clip with sound, false for a silent one. |
frame_images | array up to 2 items | The first frame and last frame: {"type": "image_url", "frame_type": "first_frame", "image_url": {"url": ...}}. |
omni_reference_task_type | string auto, reference, edit, extend | What a request with reference media asks for: reference builds a new clip from them, edit changes the reference video, extend continues it, auto lets the model decide from the prompt. Say the same in the prompt (for example "continue this video"): the model also goes by the prompt. If the request is served where this is not available it is ignored and named in the x-oceantoken-dropped-params response header. Left out, the model decides from the prompt. |
input_references | array | Reference media the clip is built from: up to 9 images, up to 3 videos, up to 3 audios. Each {"type": "image_url" | "video_url" | "audio_url", ...: {"url": ...}}. |
Response
| Field | Type | Description |
|---|---|---|
id | string | The job's ID; poll it. |
status | string queued, in_progress, completed, failed | Where the job is. |
seconds | string | Length of the clip. |
size | string | Width x height of the clip. |
content_url | string | Once completed: the MP4, valid for 24 hours. |
error | object | On a failed job: code and message. |
Example response
{
"id": "video_...",
"object": "video",
"status": "completed",
"model": "bytedance/seedance-2.0-fast-upscaled",
"seconds": "5",
"size": "1280x720",
"created_at": 1792000000,
"completed_at": 1792000095,
"content_url": "https://...",
"error": null
}
More examples and how errors and billing work: Video.
Compared with similar models
Video models on OceanToken in the same price range as bytedance/seedance-2.0-fast-upscaled. Compare their prices on oceantoken.ai.
| Model | Publisher | Context |
|---|---|---|
Seedance 2.0 Fast Upscaledbytedance/seedance-2.0-fast-upscaled | ByteDance | — |
Kling V3.0 Stdkwaivgi/kling-v3.0-std | Kuaishou | — |
Hailuo 2.3minimax/hailuo-2.3 | MiniMax | — |
Veo 3.1 Fastgoogle/veo-3.1-fast | — |
More from ByteDance
- Seedance 1.5 Pro
bytedance/seedance-1-5-pro - Seedance 2.0
bytedance/seedance-2.0 - Seedance 2.0 Fast
bytedance/seedance-2.0-fast - Seedance 2.0 Mini
bytedance/seedance-2.0-mini - Seedance 2.0 Mini Upscaled
bytedance/seedance-2.0-mini-upscaled - Seedance 2.0 Upscaled
bytedance/seedance-2.0-upscaled - Seedance 2.0 Upscaled 4K
bytedance/seedance-2.0-upscaled-4k - Seedance 2.5
bytedance/seedance-2.5
All ByteDance models on OceanToken
Use it
Create an account Price on oceantoken.ai
The facts on this page were read from the live OceanToken catalog on 2026-11-05 (UTC), when the documentation was built. Prices are published on oceantoken.ai.