Sora 2 vs Sora 2 Pro
Lequel, quand — verdict de synthèse, pas un tableau de benchmarks
sora-2-pro coûte 3x plus par seconde de sortie ($0.3 contre $0.1) et ce que cela achète, c'est un cran de résolution : 720p ou 1024p contre 720p seulement. Tout le reste est identique — 4–12 s à 24 fps, 16:9 et 9:16, audio natif, et image-vers-vidéo depuis une seule image de référence. Prenez sora-2 à moins que le format de livraison n'exige le cadre plus grand.
Tarification
| Sora 2 | Sora 2 Pro | Δ | |
|---|---|---|---|
| Par seconde de sortie (avec audio) | $0.1 | $0.3 | 0.33× |
Tarifs issus du catalogue en direct au moment de la compilation ; chaque page de modèle présente la fiche actuelle.
Où ils se situent — prix par seconde en sortie sur l'ensemble des 7 modèles génération de vidéos pour cette unité de facturation (échelle logarithmique)
Capacités
| Sora 2 | Sora 2 Pro | |
|---|---|---|
| Audio natif | oui | oui |
Spécifications
| Sora 2 | Sora 2 Pro | |
|---|---|---|
| Modalités d'entrée | texte image | texte image |
| Modalités de sortie | vidéo | vidéo |
| Sortie | 2025-09 | 2025-09 |
| Résolution | 720p | 720p / 1024p (ensemble fixe) |
| Durée du clip | 4-12 s (plage) | 4-12 s (plage) |
| Fréquence d'images | 24 fps | 24 fps |
| Ratios d'aspect |
|
|
| Modes d'entrée |
|
|
| Format | .mp4 | .mp4 |
Les spécifications sont transcrites à partir de la documentation de chaque fournisseur ; une ligne qu'un fournisseur ne publie pas est omise plutôt que déduite. Sources complètes : Sora 2 · Sora 2 Pro
Un prompt, deux modèles — mesurés via la passerelle
Renvoyé par le modèle 720×1280 Durée 4s latence 68 s
Renvoyé par le modèle 1280×720 Durée 4s latence 130 s
Un prompt, une requête par modèle, aucun nouvel essai et aucune sélection sur le volet — le premier résultat renvoyé par chaque modèle. Ni la taille ni la durée n'ont été fixées : chaque modèle a utilisé sa propre valeur par défaut, car une requête conçue pour s'adapter à tous n'en mettrait aucun en valeur. Les fichiers ici sont réencodés pour le web, jugez donc la composition et le respect du prompt, pas la compression.
Basculez de l'un à l'autre avec une seule ligne
Les deux ids sont dans chaque onglet ci-dessous — la paire de lignes en surbrillance est la seule modification. Même endpoint, même clé, même structure de requête.
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", # décommentez cette ligne, commentez celle du dessus
"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", // décommentez cette ligne, commentez celle du dessus
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", # décommentez cette ligne, commentez celle du dessus
"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", // décommentez cette ligne, commentez celle du dessus
"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", // décommentez cette ligne, commentez celle du dessus
"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
Lequel est le moins cher, Sora 2 ou Sora 2 Pro ?
Sora 2 est moins cher sur par seconde de sortie (avec audio) ($0.1 contre $0.3, avec un écart de 3.0×). D'autres lignes peuvent indiquer l'inverse — le tableau ci-dessus contient la fiche complète, et le coût réel dépend de votre combinaison.
Puis-je faire un test A/B de Sora 2 par rapport à Sora 2 Pro sans deux intégrations ?
Oui. Les deux sont servis via le même endpoint compatible OpenAI avec une seule clé API — le basculement est un changement de chaîne de modèle en une ligne, vous pouvez donc diriger une fraction du trafic vers chacun et comparer les factures directement.
Quelles durées de clip et résolutions prennent-ils en charge ?
Le tableau des spécifications ci-dessus dresse la liste des résolutions et des durées de clip publiées pour chaque modèle, et indique si une valeur est un ensemble fixe d'options ou une plage continue — les deux se ressemblent mais ont un prix différent, car la facturation à la seconde se multiplie par la durée.