Sora 2 Pro is the higher-fidelity tier of OpenAI's Sora 2, presented as its most advanced synced-audio video generation model.
- Input
- text image
- Output
- video
- Price
- $0.3-$0.5/s
Benchmarks
Sora 2 Pro: 6 published, but no benchmark it shares with enough other models to compare.
Vendor-published: ByteDance
Price in context
Where the price sits among 5 comparable models
The bar shows how this model’s price compares with every other model of the same kind on Synthorai. The cheapest and the most expensive are named at each end. These are base rates; batch, region and cache-write discounts are on the pricing page.
Specs & limits
Video
| Resolution | 720p / 1024p A fixed set of options, not a range. |
|---|---|
| Clip length | 4-12 s A continuous range, not a fixed set. |
| Frame rate | 24 fps |
| Aspect ratios | 16:9 · 9:16 |
| Video inputs | text-to-video · image-to-video (single reference image) |
| Native audio | Yes, generates sound |
| Format | .mp4 |
Model
| Modalities | text + image → video |
|---|
- OpenAI's deprecations page (announced 2026-03-24) lists this model for removal from the API on 2026-09-24 with no recommended replacement
- the pricing page carries no deprecation notice, so the two vendor pages disagree - the deprecations page is the one that names a date. The higher-fidelity tier of OpenAI's Sora 2, using more compute per generation for sharper detail and stronger prompt adherence, with the same synchronized-audio text-to-video and image-to-video capabilities. Synthorai serves it via the async /v1/videos job API at 720p or 1024p, 24 fps, 4-12 s, 16:9 or 9:16, and bills per output second at a rate that rises with resolution
One prompt, measured through the gateway
Sora 2 Pro
Model returned 1280×720 Length 4s latency 130 s
One prompt, one request per model, no retries and no cherry-picking - the first result each model returned. Neither size nor duration was pinned: each model used its own default, because a request shaped to fit all of them would flatter none. Files here are re-encoded for the web, so judge composition and prompt adherence, not compression.
Use Sora 2 Pro in 30 seconds
Asynchronous job API: create a task and poll it, or hold the request open with Prefer: wait. POST /v1/videos
import time
import requests
BASE = "https://synthorai.io/v1"
HEADERS = {"Authorization": "Bearer sk-syn-..."}
# 1) create the video generation job (POST /v1/videos)
task = requests.post(
f"{BASE}/videos",
headers=HEADERS,
json={
"model": "sora-2-pro",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5,
},
).json()
# 2) poll the job until it reaches a terminal state
while task["status"] in ("queued", "in_progress"):
time.sleep(5)
task = requests.get(f"{BASE}/videos/{task['id']}", headers=HEADERS).json()
# 3) completed → signed video URL (valid ~24h - download and store it promptly)
if task["status"] == "completed":
print(task["data"][0]["url"])
else:
print(task["error"])const HEADERS = {
Authorization: "Bearer sk-syn-...",
"Content-Type": "application/json",
};
interface VideoTask {
id: string;
status: "queued" | "in_progress" | "completed" | "failed" | "cancelled";
data?: Array<{ url: string }>;
error?: { code: string; message: string };
}
// 1) create the video generation job (POST /v1/videos)
const created = await fetch("https://synthorai.io/v1/videos", {
method: "POST",
headers: HEADERS,
body: JSON.stringify({
model: "sora-2-pro",
prompt: "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
resolution: "720p",
duration: 5,
}),
});
let task = (await created.json()) as VideoTask;
// 2) poll the job until it reaches a terminal state
while (task.status === "queued" || task.status === "in_progress") {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(`https://synthorai.io/v1/videos/${task.id}`, { headers: HEADERS });
task = (await res.json()) as VideoTask;
}
// 3) completed → signed video URL (valid ~24h — download and store it promptly)
if (task.status === "completed") console.log(task.data?.[0]?.url);
else console.error(task.error);# Create the job; "Prefer: wait" holds the request up to 60s and returns the
# completed task when generation finishes in time (else the queued task).
curl https://synthorai.io/v1/videos \
-H "Authorization: Bearer sk-syn-..." \
-H "Content-Type: application/json" \
-H "Prefer: wait=60" \
-d '{
"model": "sora-2-pro",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5
}'
# Still queued / in_progress? Poll until completed → data[0].url (valid ~24h).
curl https://synthorai.io/v1/videos/vid_9f2e8c1a4b7d \
-H "Authorization: Bearer sk-syn-..."package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
const base = "https://synthorai.io/v1"
type videoTask struct {
ID string `json:"id"`
Status string `json:"status"`
Data []struct {
URL string `json:"url"`
} `json:"data"`
}
func call(method, url string, body []byte) (t videoTask) {
req, _ := http.NewRequest(method, url, bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer sk-syn-...")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
json.NewDecoder(resp.Body).Decode(&t)
return t
}
func main() {
// 1) create the video generation job (POST /v1/videos)
payload, _ := json.Marshal(map[string]any{
"model": "sora-2-pro",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5,
})
task := call("POST", base+"/videos", payload)
// 2) poll the job until it reaches a terminal state
for task.Status == "queued" || task.Status == "in_progress" {
time.Sleep(5 * time.Second)
task = call("GET", base+"/videos/"+task.ID, nil)
}
// 3) completed → signed video URL (valid ~24h — download and store promptly)
if task.Status == "completed" {
fmt.Println(task.Data[0].URL)
}
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
// JDK built-in HttpClient — no extra dependency needed.
HttpClient http = HttpClient.newHttpClient();
// 1) create the job; "Prefer: wait=60" holds the request up to 60s and
// returns the completed task when generation finishes in time
HttpRequest create = HttpRequest.newBuilder(URI.create("https://synthorai.io/v1/videos"))
.header("Authorization", "Bearer sk-syn-...")
.header("Content-Type", "application/json")
.header("Prefer", "wait=60")
.POST(HttpRequest.BodyPublishers.ofString("""
{"model": "sora-2-pro",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p", "duration": 5}"""))
.build();
String task = http.send(create, HttpResponse.BodyHandlers.ofString()).body();
System.out.println(task); // {"id":"vid_…","status":…} — completed → data[0].url
// 2) still queued / in_progress? Poll GET https://synthorai.io/v1/videos/{id} until the
// status turns completed, then download data[0].url (valid ~24h).About Sora 2 Pro
- It spends more compute per generation for sharper detail and stronger prompt adherence, while keeping the same synchronized-audio, text-to-video and image-to-video capabilities.
- OpenAI's guidance is explicit about the trade: Pro takes longer to render and costs more to run, but produces more polished, stable results, and it is the tier to choose when you need production-quality output rather than exploratory drafts.
- Upstream it also offers an output size above the shared 720p pair - 1792x1024 landscape and 1024x1792 portrait - at a higher per-second rate.
- Everything else matches the standard tier: reference images must match the target size and arrive as JPEG, PNG, or WebP, extension and edit flows are available for continuing or adjusting a finished clip, reusable characters keep a subject consistent with a limit of two per video, and the same content rules apply, with real people, faces in input images, and copyrighted characters or music all refused.
- Synthorai serves it through the asynchronous /v1/videos job API at 720p or 1024p, 24 fps, 4 to 12 seconds, in 16:9 or 9:16, and bills per output second at a rate that rises with resolution, at a premium over the standard Sora 2.
FAQ
Is the Sora 2 Pro API free to try?
Yes: new accounts get 10 trial calls and up to $1 in free credit, no card required. That's enough to try Sora 2 Pro against your real workload before adding a payment method.
What is Sora 2 Pro best at?
Higher-fidelity Sora 2 tier, more compute per clip; sharper detail and prompt adherence; synchronized audio, 720p or 1024p, 4-12 seconds. See the About section for the full picture from the vendor's own release notes.
How much does Sora 2 Pro cost?
Sora 2 Pro costs $0.3-$0.5 per second of generated video on Synthorai. Only successful generations are billed: pay-as-you-go, no platform markup, no subscription.
How do I generate videos with the Sora 2 Pro API?
POST to /v1/videos on Synthorai with model="sora-2-pro" to create an asynchronous job, then poll the task (or hold the request open with a Prefer: wait header) until the video URL is ready. No vendor SDK is needed.
How do I get access to Sora 2 Pro?
Point your existing OpenAI SDK at base_url="https://synthorai.io/v1", set model="sora-2-pro", and you're done. One API key covers every model on the gateway.
Related models
Compare
Every value on this page is transcribed from the vendor's own documentation, linked above, and carries the date it was checked. Prices are compared across the catalogue; specification values that vendors define differently are shown with the difference stated rather than charted. Nothing here is measured by us, and nothing is scored.