Openai Sora 2 Image To Video API Documentation

Openai Sora 2 Image To Video API Documentation

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

ParameterRequiredDescription
imageYesSource image to animate
promptYesDescribe the motion, action, and audio cues
durationNoVideo length: 4, 8, 12, 16, or 20 seconds

How to Use

  1. Upload your image — the still photo you want to animate.
  2. Write your prompt — describe the action, motion, camera movement, and audio.
  3. Set duration — choose 4, 8, 12, 16, or 20 seconds.
  4. Submit — generate, preview, and download your video.

Pricing

DurationCost
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


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",
  "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
  "duration": 4
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/openai/sora-2/image-to-video" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}")

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
' >&2
  exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi

# 2. Poll until the prediction finishes.
while true; do
  RESPONSE=$(curl --silent --show-error --fail-with-body \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}")
  RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
  esac
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes-The positive prompt for the generation.
imagestringYes-The image for generating the output.
durationintegerNo44, 8, 12, 16, 20The duration of the generated video in seconds.

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.urls.getstringURL to retrieve the prediction result
data.statusstringStatus of the task: created, processing, completed, or failed
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.urls.getstringURL to poll for the prediction result
data.statusstringStatus: created, processing, completed, or failed
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.