Sora 2 vs Sora 2 Pro
Quale scegliere e quando
sora-2-pro costa 3x in più al secondo di uscita ($0.3 contro $0.1) e ciò che compra è un gradino di risoluzione: 720p o 1024p contro solo 720p. Tutto il resto coincide - 4-12 s a 24 fps, 16:9 e 9:16, audio nativo e immagine-a-video da una sola immagine di riferimento. Scegli sora-2 a meno che il formato di consegna non richieda l'inquadratura più grande.
Benchmark
Sora 2: il provider non ha pubblicato risultati di benchmark.
Sora 2 Pro: 6 pubblicati, ma nessun benchmark in comune con abbastanza altri modelli per fare un confronto.
Dati pubblicati dai provider: ByteDance
Prezzi
| Sora 2 | Sora 2 Pro | Δ | |
|---|---|---|---|
| Al secondo di output (con audio) | $0.1 | $0.3 | 0.33× |
Tariffe lette dal catalogo live al momento della build; il listino aggiornato è sulla pagina di ciascun modello.
Dove si collocano: prezzo al secondo di output tra tutti i modelli di generazione di video con questa unità di fatturazione (7, scala logaritmica)
Funzionalità
| Sora 2 | Sora 2 Pro | |
|---|---|---|
| Audio nativo | sì | sì |
Specifiche
| Sora 2 | Sora 2 Pro | |
|---|---|---|
| Modalità di input | testo immagine | testo immagine |
| Modalità di output | video | video |
| Rilascio | 2025-09 | 2025-09 |
| Risoluzione | 720p | 720p / 1024p (insieme fisso) |
| Durata della clip | 4-12 s (intervallo) | 4-12 s (intervallo) |
| Frame rate | 24 fps | 24 fps |
| Proporzioni |
|
|
| Modalità di input |
|
|
| Formato | .mp4 | .mp4 |
Le specifiche sono riprese dalla documentazione di ciascun provider; se un provider non pubblica un dato, la riga viene omessa e non dedotta. Fonti complete: Sora 2 · Sora 2 Pro
Un solo prompt, entrambi i modelli, misurati attraverso il gateway
Restituito dal modello 720×1280 Durata 4s latenza 68 s
Restituito dal modello 1280×720 Durata 4s latenza 130 s
Un prompt, una richiesta per modello, nessun nuovo tentativo e nessuna selezione: è il primo risultato restituito da ciascun modello. Non abbiamo fissato né le dimensioni né la durata: ogni modello ha usato il proprio default, perché una richiesta costruita per andare bene a tutti non avrebbe valorizzato nessuno. I file sono stati ricodificati per il web, quindi valuta la composizione e l'aderenza al prompt, non la compressione.
Passa dall'uno all'altro cambiando una sola riga
In ogni scheda qui sotto ci sono entrambi gli id: le due righe evidenziate sono l'unica modifica. Stesso endpoint, stessa chiave, stessa struttura della richiesta.
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",
# "model": "sora-2-pro", # decommenta questa riga, commenta quella sopra
"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",
// model: "sora-2-pro", // decommenta questa riga, commenta quella sopra
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",
# "model": "sora-2-pro", # decommenta questa riga, commenta quella sopra
"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",
// "model": "sora-2-pro", // decommenta questa riga, commenta quella sopra
"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",
// {"model": "sora-2-pro", // decommenta questa riga, commenta quella sopra
"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).FAQ
Qual è il più economico, Sora 2 o Sora 2 Pro?
Sora 2 costa meno alla voce Al secondo di output (con audio) ($0.1 contro $0.3, 3.0× di differenza). Altre voci potrebbero dire il contrario: la tabella qui sopra riporta il listino completo, e il costo reale dipende dal tuo mix di utilizzo.
Posso fare un A/B test di Sora 2 contro Sora 2 Pro senza due integrazioni?
Sì. Si chiamano entrambi dallo stesso endpoint compatibile con OpenAI, con una sola chiave API. Per passare dall'uno all'altro basta cambiare la stringa del modello in una riga, quindi puoi mandare una parte del traffico a ciascuno e confrontare direttamente i costi.
Quali durate delle clip e quali risoluzioni supportano?
La tabella delle specifiche qui sopra elenca le risoluzioni e le durate delle clip pubblicate per ciascun modello, e indica se un valore è un insieme fisso di opzioni o un intervallo continuo. Le due cose si somigliano ma incidono in modo diverso sul prezzo, perché con la fatturazione al secondo il costo cresce con la durata.