Video model
Bach 1.0 Pro
videorebirth/bach-1.0-pro
videorebirth/bach-1.0-pro is a video generation model from Videorebirth you can call on the OceanToken API.
At a glance
| Model ID | videorebirth/bach-1.0-pro |
|---|---|
| Type | Video |
| Publisher | Videorebirth |
| 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": "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"
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
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": "videorebirth/bach-1.0-pro",
"prompt": "A paper boat drifting down a rain-soaked street",
"duration": 5,
"resolution": "1080p"
}),
})).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 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": ...}}. |
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 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. |
Example response
{
"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 examples and how errors and billing work: Video.
Compared with similar models
Video models on OceanToken in the same price range as videorebirth/bach-1.0-pro. Compare their prices on oceantoken.ai.
| Model | Publisher | Context |
|---|---|---|
Bach 1.0 Provideorebirth/bach-1.0-pro | Videorebirth | — |
Gen 4.5runway/gen-4.5 | Runway | — |
Kling V3.0 Omnikwaivgi/kling-v3.0-omni | Kuaishou | — |
Kling V3.0 Prokwaivgi/kling-v3.0-pro | Kuaishou | — |
Use it
Create an account Price on oceantoken.ai
The facts on this page were read from the live OceanToken catalog on 2026-11-14 (UTC), when the documentation was built. Prices are published on oceantoken.ai.