# Bach 1.0 Pro (`videorebirth/bach-1.0-pro`): API > videorebirth/bach-1.0-pro is a video generation model from Videorebirth 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; 5 to 16; default 5): Length in whole seconds. `seconds` is accepted too. - `resolution` (string; 1080p, 4k): Output resolution; lower is faster and cheaper. - `aspect_ratio` (string; 16:9, 9:16, 4:3, 3:4, 21:9, 1:1, 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. - `seed` (integer; -1 to 4294967295): Same seed, prompt and settings give a similar clip; `-1` or none is random. If the request is served where a seed is not available it is ignored and named in the `x-oceantoken-dropped-params` response header. - `frame_images` (array; up to 2 items): The first frame and last frame: `{"type": "image_url", "frame_type": "first_frame", "image_url": {"url": ...}}`. - `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": ...}}`. ## 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": "videorebirth/bach-1.0-pro", "prompt": "A paper boat drifting down a rain-soaked street", "duration": 5, "resolution": "1080p" }' # 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": "videorebirth/bach-1.0-pro", "prompt": "A paper boat drifting down a rain-soaked street", "duration": 5, "resolution": "1080p", }, ).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 or null): The `size` the request asked for (width x height), not measured from the file; null when the request named a `resolution` instead. - `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": "videorebirth/bach-1.0-pro", "seconds": "5", "size": null, "created_at": 1792000000, "completed_at": 1792000095, "content_url": "https://...", "error": null } ``` ## More - Model page: https://docs.oceantoken.ai/models/videorebirth/bach-1.0-pro - This spec as JSON (with a JSON Schema of the request): https://docs.oceantoken.ai/models/videorebirth/bach-1.0-pro/spec.json - Guide: https://docs.oceantoken.ai/guides/video - All models: https://docs.oceantoken.ai/llms.txt