Openai Sora 2 Image To Video
Playground
Try it on WavespeedAI!OpenAI Sora 2 generates realistic image-to-video content with synchronized audio, improved physics, sharper realism and steerability. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Notice — Service Stability
The Sora 2 family is currently unstable. Generations may fall back to alternative models without notice and the service can be temporarily unavailable. OpenAI is also expected to discontinue this model in the future.
If you need an equally capable, stable alternative, we recommend Seedance 2: bytedance/seedance-2.0/image-to-video.
OpenAI Sora 2 Image-to-Video
Sora 2 Image-to-Video brings your images to life with OpenAI’s state-of-the-art video generation. Upload an image and describe the motion — watch as AI transforms your still photo into a dynamic, cinematic video with synchronized audio.
Why Choose This?
-
Image animation Transform any still image into smooth, realistic video with natural motion.
-
Physics-aware motion Learns contact, inertia, and momentum so objects move and collide believably.
-
Synchronized audio Generates matching audio — ambient sounds, dialogue, and sound effects.
-
Temporal consistency Stable identities, minimal flicker/ghosting, and clean frame-to-frame transitions.
-
Cinematic quality Natural camera movements, high-frequency detail, and professional-grade output.
-
Flexible duration Generate videos from 4 to 20 seconds.
Parameters
| Parameter | Required | Description |
|---|---|---|
| image | Yes | Source image to animate |
| prompt | Yes | Describe the motion, action, and audio cues |
| duration | No | Video length: 4, 8, 12, 16, or 20 seconds |
How to Use
- Upload your image — the still photo you want to animate.
- Write your prompt — describe the action, motion, camera movement, and audio.
- Set duration — choose 4, 8, 12, 16, or 20 seconds.
- Submit — generate, preview, and download your video.
Pricing
| Duration | Cost |
|---|---|
| 4 s | $0.40 |
| 8 s | $0.80 |
| 12 s | $1.20 |
| 16 s | $1.60 |
| 20 s | $2.00 |
Billing Rules
- Rate: $0.10 per second
- Duration options: 4, 8, 12, 16, or 20 seconds
Best Use Cases
- Photo animation — Bring still photos to life with realistic motion.
- Product showcases — Animate product images for dynamic marketing.
- Art animation — Transform illustrations and artwork into videos.
- Social media content — Create eye-catching animated posts from images.
- Storytelling — Build narratives from key visual moments.
Pro Tips
- Be specific about motion in your prompt: “The kitten pounces toward the yarn” beats “kitten playing.”
- Include audio cues in your prompt for better synchronized sound.
- Higher resolution source images produce better results.
- Describe camera movement if you want dynamic cinematography.
- Start with shorter durations to test your prompt before generating longer videos.
Notes
- Image and prompt are both required fields.
- Duration options: 4, 8, 12, 16, or 20 seconds.
- Please follow OpenAI’s usage policies: What images are permitted and prohibited in Sora-2
Related Models
- Sora 2 Text-to-Video — Generate videos from text prompts.
- Sora 2 Characters — Create reusable character IDs.
- Sora 2 Pro Image-to-Video — Premium quality with more resolution options.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
# Submit the task
curl --location --request POST "https://api.wavespeed.ai/api/v3/openai/sora-2/image-to-video" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
--data-raw '{
"duration": 4
}'
# Get the result
curl --location --request GET "https://api.wavespeed.ai/api/v3/predictions/${requestId}/result" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}"
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | The image for generating the output. | |
| prompt | string | Yes | - | The positive prompt for the generation. | |
| duration | integer | No | 4 | 4, 8, 12, 16, 20 | The duration of the generated video in seconds. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Array of URLs to the generated content (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction, the ID of the prediction to get |
| data.model | string | Model ID used for the prediction |
| data.outputs | string | Array of URLs to the generated content (empty when status is not completed). |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |