# Seedance 2.5 Upscaled (`bytedance/seedance-2.5-upscaled`): API > bytedance/seedance-2.5-upscaled is a video generation model from ByteDance you can call on the OceanToken API. Endpoint: `POST https://api.oceantoken.ai/v1/videos`. Auth: `Authorization: Bearer $OCEANTOKEN_API_KEY`. OpenAI-compatible; the OpenAI SDKs work with base URL https://api.oceantoken.ai/v1. The call creates a job: poll `GET /v1/videos/{video_id}`, then download `GET /v1/videos/{video_id}/content`. ## Request parameters - `model` (string; required): This model's ID. - `prompt` (string; required): 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 10 videos, up to 10 audios. Each `{"type": "image_url" | "video_url" | "audio_url", ...: {"url": ...}}`. ## Example: Text to video ```bash 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.5-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" ``` ```python 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.5-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 ``` ## Response - `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`. ```json { "id": "video_...", "object": "video", "status": "completed", "model": "bytedance/seedance-2.5-upscaled", "seconds": "5", "size": "1280x720", "created_at": 1792000000, "completed_at": 1792000095, "content_url": "https://...", "error": null } ``` ## More - Model page: https://docs.oceantoken.ai/models/bytedance/seedance-2.5-upscaled - This spec as JSON (with a JSON Schema of the request): https://docs.oceantoken.ai/models/bytedance/seedance-2.5-upscaled/spec.json - Guide: https://docs.oceantoken.ai/guides/video - All models: https://docs.oceantoken.ai/llms.txt