Sora 2 icon
Video by OpenAI

Sora 2 API

OpenAI's Sora video generator.

Integrate Sora 2 with a single API call — one key, one unified endpoint, and shared billing across every model on Apiframe.

model: "sora-2"

What's special about Sora 2

  • Aspect ratios: 16:9, 9:16.
  • Generates clips from 4s to 15s.
  • Image-to-video and reference-image support.
  • Fast turnaround — about 180s per generation on average.
  • Pay-as-you-go pricing with no OpenAI account required — you only pay for successful generations.
  • One API key, unified billing, idempotency and webhooks across every Apiframe model.

Made with Sora 2

A few outputs generated through the Sora 2 API on Apiframe.

Sample coming soon

Drone shot flying over a tropical coastline at sunrise, smooth cinematic motion

Sample coming soon

A vintage car driving through a rainy neon city at night, reflections on the asphalt

Sample coming soon

Time-lapse of clouds rolling over a mountain range in warm golden light

Overview

Endpoint
POST /v2/videos/generate
Model ID
sora-2
Params key
soraParams
Modality
video
Provider
OpenAI
Pricing
Pay-as-you-go
Avg. completion
~180s

Capabilities

Aspect ratios16:9, 9:16
Durations4s, 8s, 10s, 12s, 15s
Image inputSupported
Avg. time~180s

Quick start

Send a single POST /v2/videos/generate request with your API key to generate with Sora 2. The call returns a jobId you can poll or receive via webhook.

curl -X POST https://api.apiframe.ai/v2/videos/generate \
  -H "X-API-Key: afk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
        "prompt": "a cinematic sunrise over a futuristic cityscape, smooth camera push-in",
        "model": "sora-2",
        "soraParams": {
            "start_image": "https://example.com/input.jpg"
        }
    }'
import requests

response = requests.post(
    "https://api.apiframe.ai/v2/videos/generate",
    headers={
        "X-API-Key": "afk_your_api_key_here",
        "Content-Type": "application/json",
    },
    json={
        "prompt": "a cinematic sunrise over a futuristic cityscape, smooth camera push-in",
        "model": "sora-2",
        "soraParams": {
            "start_image": "https://example.com/input.jpg"
        }
    },
)
print(response.json())  # { "jobId": "...", "status": "QUEUED" }
const response = await fetch("https://api.apiframe.ai/v2/videos/generate", {
  method: "POST",
  headers: {
    "X-API-Key": "afk_your_api_key_here",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "prompt": "a cinematic sunrise over a futuristic cityscape, smooth camera push-in",
    "model": "sora-2",
    "soraParams": {
      "start_image": "https://example.com/input.jpg"
    }
  }),
});
const { jobId } = await response.json();
console.log(jobId);

Response & job lifecycle

Generation is asynchronous. A successful submission returns 202 Accepted with a jobId. Poll GET /v2/jobs/{id} (or supply a webhook_url) until the status is COMPLETED; the result field then holds the output URL(s).

1. Submission response (202)

{
  "jobId": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
  "status": "QUEUED"
}

2. Poll for the result

curl https://api.apiframe.ai/v2/jobs/JOB_ID \
  -H "X-API-Key: afk_your_api_key_here"
import requests, time

while True:
    job = requests.get(
        "https://api.apiframe.ai/v2/jobs/JOB_ID",
        headers={"X-API-Key": "afk_your_api_key_here"},
    ).json()
    if job["status"] in ("COMPLETED", "FAILED"):
        break
    time.sleep(2)
print(job["result"])
let job;
do {
  await new Promise((r) => setTimeout(r, 2000));
  job = await fetch("https://api.apiframe.ai/v2/jobs/JOB_ID", {
    headers: { "X-API-Key": "afk_your_api_key_here" },
  }).then((r) => r.json());
} while (job.status !== "COMPLETED" && job.status !== "FAILED");
console.log(job.result);

Input schema

Request parameters accepted by the Sora 2 endpoint. Model-specific options are nested under the params object shown below.

Parameter Type Required Default Allowed / range Description
prompt string required Text description of what to generate.
model string required "sora-2" "sora-2" The model identifier for this endpoint.
soraParams.start_image string (URL) optional Image-to-video starting frame.

Frequently Asked Questions

Common questions about the Sora 2 API.

Is there an API for Sora 2?

Yes. Apiframe exposes Sora 2 through a single REST endpoint (`POST /v2/videos/generate` with `model: "sora-2"`). You get one unified API, key, and billing across every supported model — no separate OpenAI account required.

How much does the Sora 2 API cost?

Sora 2 uses simple pay-as-you-go pricing on Apiframe — you only pay for successful generations. See the pricing page for plans and volume discounts.

How do I call the Sora 2 API?

Send a POST request to `/v2/videos/generate` with your `X-API-Key` and a JSON body containing `model: "sora-2"`. The call returns a `jobId`; poll `GET /v2/jobs/{id}` or use a webhook to receive the result.

What parameters does Sora 2 support?

Sora 2 accepts 1 model-specific parameters (nested under `soraParams`) plus the common `prompt` and `webhook_url` fields. See the input schema above for the full list with types and defaults.

Still have questions?

Start building with the Sora 2 API

Get your API key and integrate Sora 2 in minutes — Pay-as-you-go.

Free credits to start
One API for every model
Webhooks, SDKs & idempotency
No provider account required

Questions? Join our Discord or contact sales.