Sora 2 Pro is OpenAI's flagship video generation model, released 2026-03, built for production-quality output with physics-accurate motion and synchronized audio. It maintains world-state persistence across shots, so objects and spatial relationships stay consistent through multi-shot sequences. The model supports text-to-video and image-to-video, and includes C2PA provenance metadata and watermarking for content safety.
Channels
Every channel serves the same model, but they differ in price and stability. On each API key in the Platform, you pick a primary and a backup channel per vendor, and each billing line shows which channel served the request.
Video pricing
Billed per second of generated video. The rate depends on the output resolution, and on whether audio is generated with it.
- Duration
- 4–20s
- Aspect ratios
- 16:9 · 9:16
- Audio generation
- Yes
Capabilities
Parameters
Request parameters this model accepts through the API.
Quick start
# 1. start the job curl https://api.mirapi.ai/v1/videos \ -H "Authorization: Bearer $MIRAPI_API_KEY" \ -F "model=sora-2-pro" \ -F "prompt=A kite over the sea" \ -F "seconds=8" # 2. poll until status is "completed", then fetch /content curl https://api.mirapi.ai/v1/videos/$TASK_ID \ -H "Authorization: Bearer $MIRAPI_API_KEY"
import os, time, requests h = {"Authorization": f"Bearer {os.environ['MIRAPI_API_KEY']}"} job = requests.post( "https://api.mirapi.ai/v1/videos", # changed headers=h, files={"model": (None, "sora-2-pro"), "prompt": (None, "A kite over the sea"), "seconds": (None, "8")}, ).json() while job["status"] not in ("completed", "failed"): time.sleep(5) job = requests.get(f"https://api.mirapi.ai/v1/videos/{job['id']}", headers=h).json()
const h = { Authorization: `Bearer ${process.env.MIRAPI_API_KEY}` }; const form = new FormData(); form.append("model", "sora-2-pro"); form.append("prompt", "A kite over the sea"); form.append("seconds", "8"); let job = await (await fetch("https://api.mirapi.ai/v1/videos", { method: "POST", headers: h, body: form })).json(); // changed while (!["completed", "failed"].includes(job.status)) { await new Promise((r) => setTimeout(r, 5000)); job = await (await fetch(`https://api.mirapi.ai/v1/videos/${job.id}`, { headers: h })).json(); }
Links
1M free tokens to start, no card required. It’s OpenAI-compatible, so you only change the base URL.