# Sora 2 > OpenAI's video generation model supporting text-to-video and image-to-video at 720p resolution with durations up to 20 seconds ## Quick Reference - Model ID: sora-2 - Creator: OpenAI - Status: active - Family: sora - Base URL: https://api.lumenfall.ai/v1 ## Specifications - Max Video Duration: 20 seconds - Input Modalities: text, image - Output Modalities: video - Supported Modes: Text to Video, Image to Video ## API Parameters The compiled parameter schema for this model is available via the API: `GET /v1/models/sora-2?schema=true`. ### Core Parameters - `prompt` (string) — REQUIRED: Text prompt for video generation. Modes: Image to Video, Text to Video - `duration` (number): Video duration in seconds. Modes: Image to Video, Text to Video ### Size & Layout - `size` (string): Video dimensions as WxH pixels (e.g. "1920x1080") or aspect ratio (e.g. "16:9"). Values: auto, 1365x768, 768x1365. Modes: Image to Video, Text to Video - `aspect_ratio` (string): Aspect ratio of the output video (e.g. "16:9", "1:1"). Values: auto, 9:16, 16:9. Modes: Image to Video, Text to Video - `resolution` (string): Output resolution tier (e.g. "1K", "4K"). Values: auto, 1K. Modes: Image to Video, Text to Video ### Output & Format - `n` (integer): Number of videos to generate. Default: 1. Modes: Image to Video, Text to Video ### Additional Parameters - `character_ids` (array): Up to two character IDs (from create-character) to use in the video. Refer to characters by name in the prompt. When set, only the OpenAI provider is used.. Modes: Image to Video, Text to Video. Only available via fal - `delete_video` (boolean): Whether to delete the video after generation for privacy reasons. If True, the video cannot be used for remixing and will be permanently deleted.. Modes: Image to Video, Text to Video. Only available via fal - `detect_and_block_ip` (boolean): If enabled, the prompt (and image for image-to-video) will be checked for known intellectual property references and the request will be blocked if any are detected.. Modes: Image to Video, Text to Video. Only available via fal - `input_reference` (string): An optional image to use as the first frame of the video. The image must be the same aspect ratio as the video.. Modes: Text to Video, Image to Video. Only available via replicate - `model` (string): The model to use for the generation. When the default model is selected, the latest snapshot of the model will be used - otherwise, select a specific snapshot of the model.. Values: sora-2, sora-2-2025-10-06, sora-2-2025-12-08. Modes: Image to Video, Text to Video. Only available via fal - `openai_api_key` (string): Optional: Your OpenAI API key. If you use your own OpenAI API key, you will be charged directly by OpenAI.. Modes: Text to Video, Image to Video. Only available via replicate - `seconds` (integer): Duration of the video in seconds. Modes: Text to Video, Image to Video. Only available via replicate ## Model Identifiers - Primary Slug: sora-2 ## Tags video-generation, text-to-video, image-to-video ## Available Providers ### fal.ai - Config Key: fal/sora-2-i2v - Provider Model ID: fal-ai/sora-2/image-to-video - Pricing: $0.100/second - Source: https://fal.ai/models/fal-ai/sora-2/image-to-video ### fal.ai - Config Key: fal/sora-2 - Provider Model ID: fal-ai/sora-2/text-to-video - Pricing: $0.100/second - Source: https://fal.ai/models/fal-ai/sora-2/text-to-video ### OpenAI - Config Key: openai/sora-2 - Provider Model ID: sora-2 - Pricing: $0.100/second - Source: https://openai.com/api/pricing/ ### Replicate - Config Key: replicate/sora-2 - Provider Model ID: openai/sora-2 - Pricing: $0.100/second - Source: https://replicate.com/openai/sora-2 ## Performance Metrics Provider performance over the last 30 days. ### openai - Median Generation Time (p50): 1444ms - 95th Percentile Generation Time (p95): 59437ms - Average Generation Time: 11863ms - Success Rate: 100.0% - Total Requests: 10 ## Image Gallery 1 images available for this model. Browse all at https://lumenfall.ai/models/openai/sora-2/gallery ### Arena Video Results - : Elo . Prompt: "Cinematic drone shot of a sleek, futuristic orange sports car gliding effortlessly through a rain..." ## Example Prompt The following prompt was used to generate an example video in our playground: Cinematic drone shot of a sleek, futuristic orange sports car gliding effortlessly through a rain-drenched neon street in a cyberpunk city. The wet pavement perfectly reflects the vibrant signs and "SORA 2" glowing on a nearby billboard. As the car zooms past a modern bus stop, a capybara is calmly sitting on the bench under an umbrella, waiting for the bus. Hyper-realistic textures, fluid camera motion, and cinematic lighting showcasing incredible consistency and detail. ## Code Examples ### Text to Video (/v1/videos/generations) — Async #### cURL # Step 1: Submit video generation request VIDEO_ID=$(curl -s -X POST \ https://api.lumenfall.ai/v1/videos \ -H "Authorization: Bearer $LUMENFALL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "sora-2", "prompt": "", "size": "1024x1024" }' | jq -r '.id') echo "Video ID: $VIDEO_ID" # Step 2: Poll for completion while true; do RESULT=$(curl -s \ https://api.lumenfall.ai/v1/videos/$VIDEO_ID \ -H "Authorization: Bearer $LUMENFALL_API_KEY") STATUS=$(echo $RESULT | jq -r '.status') echo "Status: $STATUS" if [ "$STATUS" = "completed" ]; then echo $RESULT | jq -r '.output.url' break elif [ "$STATUS" = "failed" ]; then echo $RESULT | jq -r '.error.message' break fi sleep 5 done #### JavaScript const BASE_URL = 'https://api.lumenfall.ai/v1'; const API_KEY = 'YOUR_API_KEY'; // Step 1: Submit video generation request const submitRes = await fetch(`${BASE_URL}/videos`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'sora-2', prompt: '', size: '1024x1024' }) }); const { id: videoId } = await submitRes.json(); console.log('Video ID:', videoId); // Step 2: Poll for completion while (true) { const pollRes = await fetch(`${BASE_URL}/videos/${videoId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); const result = await pollRes.json(); if (result.status === 'completed') { console.log('Video URL:', result.output.url); break; } else if (result.status === 'failed') { console.error('Error:', result.error.message); break; } await new Promise(r => setTimeout(r, 5000)); } #### Python import requests import time BASE_URL = "https://api.lumenfall.ai/v1" API_KEY = "YOUR_API_KEY" HEADERS = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # Step 1: Submit video generation request response = requests.post( f"{BASE_URL}/videos", headers=HEADERS, json={ "model": "sora-2", "prompt": "", "size": "1024x1024" } ) video_id = response.json()["id"] print(f"Video ID: {video_id}") # Step 2: Poll for completion while True: result = requests.get( f"{BASE_URL}/videos/{video_id}", headers=HEADERS ).json() if result["status"] == "completed": print(f"Video URL: {result['output']['url']}") break elif result["status"] == "failed": print(f"Error: {result['error']['message']}") break time.sleep(5) ### Image to Video (/v1/videos/generations) — Async #### cURL # Step 1: Submit image-to-video request VIDEO_ID=$(curl -s -X POST \ https://api.lumenfall.ai/v1/videos \ -H "Authorization: Bearer $LUMENFALL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "sora-2", "prompt": "", "image_url": "https://example.com/start-frame.jpg", "duration": "10", "aspect_ratio": "16:9" }' | jq -r '.id') echo "Video ID: $VIDEO_ID" # Step 2: Poll for completion while true; do RESULT=$(curl -s \ https://api.lumenfall.ai/v1/videos/$VIDEO_ID \ -H "Authorization: Bearer $LUMENFALL_API_KEY") STATUS=$(echo $RESULT | jq -r '.status') echo "Status: $STATUS" if [ "$STATUS" = "completed" ]; then echo $RESULT | jq -r '.output.url' break elif [ "$STATUS" = "failed" ]; then echo $RESULT | jq -r '.error.message' break fi sleep 5 done #### JavaScript const BASE_URL = 'https://api.lumenfall.ai/v1'; const API_KEY = 'YOUR_API_KEY'; // Step 1: Submit image-to-video request const submitRes = await fetch(`${BASE_URL}/videos`, { method: 'POST', headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'sora-2', prompt: '', image_url: 'https://example.com/start-frame.jpg', duration: '10', aspect_ratio: '16:9' }) }); const { id: videoId } = await submitRes.json(); console.log('Video ID:', videoId); // Step 2: Poll for completion while (true) { const pollRes = await fetch(`${BASE_URL}/videos/${videoId}`, { headers: { 'Authorization': `Bearer ${API_KEY}` } }); const result = await pollRes.json(); if (result.status === 'completed') { console.log('Video URL:', result.output.url); break; } else if (result.status === 'failed') { console.error('Error:', result.error.message); break; } await new Promise(r => setTimeout(r, 5000)); } #### Python import requests import time BASE_URL = "https://api.lumenfall.ai/v1" API_KEY = "YOUR_API_KEY" HEADERS = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # Step 1: Submit image-to-video request response = requests.post( f"{BASE_URL}/videos", headers=HEADERS, json={ "model": "sora-2", "prompt": "", "image_url": "https://example.com/start-frame.jpg", "duration": "10", "aspect_ratio": "16:9" } ) video_id = response.json()["id"] print(f"Video ID: {video_id}") # Step 2: Poll for completion while True: result = requests.get( f"{BASE_URL}/videos/{video_id}", headers=HEADERS ).json() if result["status"] == "completed": print(f"Video URL: {result['output']['url']}") break elif result["status"] == "failed": print(f"Error: {result['error']['message']}") break time.sleep(5) ## About ## Overview Sora 2 is a high-fidelity video generation model developed by OpenAI that transforms text prompts or static images into cinematic video sequences. It represents an evolution in the Sora family, capable of producing content at 720p resolution with extended durations reaching up to 20 seconds. This model is distinguished by its ability to maintain temporal consistency and complex motion dynamics over longer spans than many first-generation video models. ## Strengths * **Temporal Consistency:** Maintains the identity of characters, objects, and environmental details across the entire 20-second duration, minimizing the "morphing" or warping effects common in shorter-clip models. * **Physical Simulation:** Demonstrates a sophisticated understanding of physical interactions, such as fluid dynamics, lighting reflections, and gravity, leading to more realistic movement. * **Multimodal Input Flexibility:** Supports both text-to-video for purely generative tasks and image-to-video for animating existing assets or extending still photography into motion. * **Enhanced Resolution:** Outputs native 720p video, providing sufficient clarity for social media content, prototyping, and digital backgrounds without immediate need for upscaling. ## Limitations * **Causal Reasoning:** While physically grounded, the model may still struggle with complex "cause and effect" sequences, such as a character taking a bite out of a cookie and the cookie not showing a bite mark. * **Spatial Confusion:** In high-action scenes involving multiple moving parts (e.g., a crowded street), the model can occasionally mix up left/right orientations or produce impossible limb movements. * **Resolution Ceiling:** At 720p, it lacks the native 4K or 1080p detail required for professional film production pipelines without significant post-processing. ## Technical Background Sora 2 utilizes a diffusion transformer (DiT) architecture, which combines the scaling properties of transformers with the generative capabilities of diffusion models. It operates on spacetime patches, treating video data as a three-dimensional collection of patches that allow the model to train on diverse aspect ratios and resolutions. This architecture enables the model to look ahead and behind in a sequence to ensure global coherence rather than generating frames in a strictly linear, autoregressive fashion. ## Best For Sora 2 is best suited for rapid prototyping in creative agencies, generating b-roll for digital marketing, and creating environmental backgrounds for web design. It excels at animating conceptual art where maintaining character consistency is a priority. This model is available for testing and integration through Lumenfall's unified API and playground, allowing developers to compare its outputs directly against other video generation frameworks. ## Frequently Asked Questions ### How much does Sora 2 cost? Sora 2 starts at $0.1 per video through Lumenfall. Pricing varies by provider. Lumenfall does not add any markup to provider pricing. ### How do I use Sora 2 via API? You can use Sora 2 through Lumenfall's OpenAI-compatible API. Send requests to the unified endpoint with model ID "sora-2". Code examples are available in Python, JavaScript, and cURL. ### Which providers offer Sora 2? Sora 2 is available through fal.ai, OpenAI, and Replicate on Lumenfall. Lumenfall automatically routes requests to the best available provider. ## Links - Model Page: https://lumenfall.ai/models/openai/sora-2 - About: https://lumenfall.ai/models/openai/sora-2/about - Providers, Pricing & Performance: https://lumenfall.ai/models/openai/sora-2/providers - API Reference: https://lumenfall.ai/models/openai/sora-2/api - Benchmarks: https://lumenfall.ai/models/openai/sora-2/benchmarks - Use Cases: https://lumenfall.ai/models/openai/sora-2/use-cases - Gallery: https://lumenfall.ai/models/openai/sora-2/gallery - Playground: https://lumenfall.ai/playground?model=sora-2 - API Documentation: https://docs.lumenfall.ai