Use this file to discover all available pages before exploring further.
Try Sora 2 Pro in the Workbench
Run this model interactively, tune parameters, and compare outputs.
Model ID:openai-sora-2-proSora 2 Pro is a video generation model. It excels in producing higher-quality videos up to 12 seconds long at 1080p resolution with synchronized native audio, multi-scene reasoning, and improved narrative coherence compared to standard Sora 2, making it suitable for professional projects requiring polished outputs.Some other noteworthy features of Sora 2 Pro include text-to-video and image-to-video generation, timeline prompting for precise event timing, and enhanced physics simulation for realistic motion.
Use the Workbench as a request builder: configure parameters for this model in the UI, then open the API tab to copy the exact cURL or Python call.
Sync
Async
Async with SSE
This blocks until the video is ready (typically 5-15 minutes). Prefer Async or Async with SSE for anything beyond quick experimentation.See the video generation reference for more details.
Minimal
Basic parameters
All parameters
curl -X POST https://hub.oxen.ai/api/ai/videos/generate \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity."}'
curl -X POST https://hub.oxen.ai/api/ai/videos/generate \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity.", "input_image": "https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"}'
curl -X POST https://hub.oxen.ai/api/ai/videos/generate \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity.", "input_image": "https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png", "aspect_ratio": "landscape", "resolution": "standard", "seconds": "4"}'
# Enqueue, capture the generation id.GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity."}' | jq -r '.generations[0].generation_id')# Poll until the generation reaches a terminal status.while true; do STATUS=$(curl -s -H "Authorization: Bearer $OXEN_API_KEY" \ "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq -r '.status') echo "Status: $STATUS" case $STATUS in succeeded|failed|cancelled) break;; esac sleep 5done# Print the result.curl -s -H "Authorization: Bearer $OXEN_API_KEY" \ "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq .
# Enqueue, capture the generation id.GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity.", "input_image": "https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"}' | jq -r '.generations[0].generation_id')# Poll until the generation reaches a terminal status.while true; do STATUS=$(curl -s -H "Authorization: Bearer $OXEN_API_KEY" \ "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq -r '.status') echo "Status: $STATUS" case $STATUS in succeeded|failed|cancelled) break;; esac sleep 5done# Print the result.curl -s -H "Authorization: Bearer $OXEN_API_KEY" \ "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq .
# Enqueue, capture the generation id.GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity.", "input_image": "https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png", "aspect_ratio": "landscape", "resolution": "standard", "seconds": "4"}' | jq -r '.generations[0].generation_id')# Poll until the generation reaches a terminal status.while true; do STATUS=$(curl -s -H "Authorization: Bearer $OXEN_API_KEY" \ "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq -r '.status') echo "Status: $STATUS" case $STATUS in succeeded|failed|cancelled) break;; esac sleep 5done# Print the result.curl -s -H "Authorization: Bearer $OXEN_API_KEY" \ "https://hub.oxen.ai/api/ai/queue/$GEN_ID" | jq .
# Enqueue, capture the generation id.GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity."}' | jq -r '.generations[0].generation_id')# Stream the SSE channel, grab the data line that follows a# media_generation_completed event for our id, and pretty-print it.curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \ | awk -v id="$GEN_ID" ' /^event: media_generation_completed$/ { expect=1; next } /^data: / && expect { payload = substr($0, 7) if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit } expect = 0 } ' | jq .
# Enqueue, capture the generation id.GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity.", "input_image": "https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png"}' | jq -r '.generations[0].generation_id')# Stream the SSE channel, grab the data line that follows a# media_generation_completed event for our id, and pretty-print it.curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \ | awk -v id="$GEN_ID" ' /^event: media_generation_completed$/ { expect=1; next } /^data: / && expect { payload = substr($0, 7) if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit } expect = 0 } ' | jq .
# Enqueue, capture the generation id.GEN_ID=$(curl -s -X POST https://hub.oxen.ai/api/ai/queue \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OXEN_API_KEY" \ -d '{ "model": "openai-sora-2-pro", "prompt": "An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity.", "input_image": "https://hub.oxen.ai/api/repos/elau/assets/file/main/bloxy/bloxy_cropped_512x512.png", "aspect_ratio": "landscape", "resolution": "standard", "seconds": "4"}' | jq -r '.generations[0].generation_id')# Stream the SSE channel, grab the data line that follows a# media_generation_completed event for our id, and pretty-print it.curl -sN -H "Authorization: Bearer $OXEN_API_KEY" https://hub.oxen.ai/api/events \ | awk -v id="$GEN_ID" ' /^event: media_generation_completed$/ { expect=1; next } /^data: / && expect { payload = substr($0, 7) if (index(payload, "\"generation_id\":\"" id "\"")) { print payload; exit } expect = 0 } ' | jq .
"An ox being given a speeding ticket by a police officer. The ox is driving a Porsche 911, with sunglasses and a hat on like a high profile celebrity."
Text description of the scene to generate, or instructions for how to transform the input image.
Optional image used as the first frame. The image must exactly match the target output dimensions. Valid dimensions are 720x1280, 1280x720, 1024x1792, or 1792x1024. Format: uri.
aspect_ratio
string
"landscape"
Target video orientation. Portrait outputs are vertical, landscape outputs are horizontal. Valid dimensions depend on the selected resolution. One of: landscape, portrait.
resolution
string
"standard"
Output resolution. Standard produces 720x1280 (portrait) or 1280x720 (landscape). High produces 1024x1792 (portrait) or 1792x1024 (landscape). One of: standard, high.
seconds
string
"4"
Total video length in seconds. One of: 4, 8, 12.
⌘I
Assistant
Responses are generated using AI and may contain mistakes.