Openai Sora 2 Text To Video Pro API Documentation

Openai Sora 2 Text To Video Pro API Documentation

Playground

Try it on WaveSpeedAI!

OpenAI Sora 2 Text-to-Video Pro creates high-fidelity videos with synchronized audio, realistic physics, and enhanced steerability. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

> Notice — Service Stability > > The Sora 2 family is being retired or has already been retired by its original provider. Until it is fully removed, the service is unstable: generations may fall back to alternative models without notice, results can differ from what this model used to produce, and the service can be temporarily unavailable. > > If you need an equally capable, stable alternative, we recommend Seedance 2: bytedance/seedance-2.0/text-to-video.


Sora 2 Text-to-Video Pro

Sora 2 Text-to-Video Pro is OpenAI’s premium text-to-video model. Describe any scene in natural language — AI renders it into a cinematic, high-resolution video with physics-aware motion, temporal consistency, and optional multi-character support. Compared to the standard version, Pro delivers higher fidelity output, broader resolution choices, and enhanced motion coherence for production-grade results.


Why Choose This?

  • Premium cinematic quality Higher fidelity output with enhanced detail, motion coherence, and richer scene composition than the standard version.

  • Physics-aware motion Understands contact, inertia, and momentum so objects, people, and environments move and interact believably.

  • Multi-character scene support Reference pre-defined character IDs to maintain consistent character identity across a single generation — no manual compositing required.

  • Broad resolution support Six output sizes spanning portrait and landscape orientations from 720p up to 1080p-class resolutions, suitable for social, cinematic, and broadcast workflows.

  • Temporal consistency Stable identities, minimal flicker and ghosting, and clean frame-to-frame transitions throughout.

  • Scalable duration Generate clips from 4 seconds up to 20 seconds to match your pacing and production needs.


Parameters

ParameterRequiredDescription
promptYesText description of the scene, action, environment, camera style, and mood.
sizeNoOutput resolution. Options: 720×1280, 1280×720, 1024×1792, 1792×1024, 1080×1920, 1920×1080.
durationNoClip length in seconds. Options: 4, 8, 12, 16, 20.

How to Use

1.2. Select size — choose portrait or landscape orientation and resolution tier based on your delivery target. 3. Set duration — choose 4, 8, 12, 16, or 20 seconds based on your scene length. 4.5. Submit — generate, preview, and download your video.

Example Prompt

In a 90s documentary-style interview, an old Swedish man sits in a study and says, “I still remember when I was young.”


Pricing

Duration720×1280 / 1280×7201024×1792 / 1792×10241080×1920 / 1920×1080
4s$1.20$2.00$2.80
8s$2.40$4.00$5.60
12s$3.60$6.00$8.40
16s$4.80$8.00$11.20
20s$6.00$10.00$14.00

Billing Rules

  • 720×1280 / 1280×720: $0.30 per second
  • 1024×1792 / 1792×1024: $0.50 per second
  • 1080×1920 / 1920×1080: $0.70 per second
  • Duration options: 4, 8, 12, 16, or 20 seconds
  • Billing is based on the selected duration and size, not actual playback length

Best Use Cases

  • Cinematic Storytelling — Render rich, narrative-driven scenes from detailed text descriptions.
  • Commercial & Brand Video — Produce premium-quality footage for marketing campaigns without a film crew.
  • Social Media Content — Generate portrait-format clips optimized for Reels, TikTok, and Shorts.
  • Documentary & Interview Style — Recreate specific camera aesthetics and era-accurate visual styles.
  • Multi-Character Scenes — Animate ensemble casts with consistent identity across the full clip.

Pro Tips

  • The more specific your prompt, the better the result — include camera style, lighting, era, mood, and character behavior.
  • Use portrait sizes (720×1280, 1024×1792, 1080×1920) for mobile-first platforms and landscape for cinematic or desktop formats.
  • Start with a 4-second generation at a lower resolution to validate your prompt before committing to longer, higher-resolution runs.
  • Character IDs must be created in advance — ensure they are saved and accessible in your account before adding them.

Notes

  • Character IDs reference existing character profiles — this model does not create new character definitions.
  • Please follow OpenAI’s usage policies when crafting prompts.

Authentication

For authentication details, please refer to the Authentication Guide.

API Endpoints

Submit Task & Query Result

set -euo pipefail

export WAVESPEED_API_KEY="your-api-key"

REQUEST_BODY=$(cat <<'JSON'
{
  "prompt": "A cinematic ocean wave at sunrise, highly detailed",
  "size": "720*1280",
  "duration": 4
}
JSON
)

# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 60 \
  -X POST "https://api.wavespeed.ai/api/v3/openai/sora-2/text-to-video-pro" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"); then
  printf 'Submit failed. %s\n' "${CHECK}" >&2
  exit 1
fi

TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
  printf 'Submission response did not contain a prediction id. %s\n' "${CHECK}" >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
  # Transient errors (429, 5xx) are retried, honoring Retry-After.
  HTTP_CODE=$(curl --silent --show-error --fail-with-body \
    --connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
    --output "${BODY_FILE}" --write-out '%{http_code}' \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
  case "${HTTP_CODE}" in
    2??) ;;
    000|429|5??)  # dropped connection or temporary error: keep polling
      printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      sleep 10; continue ;;
    *) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      cat "${BODY_FILE}" >&2; exit 1 ;;
  esac
  RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout|deleted)
      printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
      printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes-The positive prompt for the generation.
sizestringNo720*1280720*1280, 1280*720, 1024*1792, 1792*1024, 1920*1080, 1080*1920The size of the generated media in pixels (width*height).
durationintegerNo44, 8, 12, 16, 20The duration of the generated video in seconds.

Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<string | object>Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model.
data.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.