Runwayml Gen4 Turbo API Documentation
Playground
Try it on WaveSpeedAI!RunwayML Gen4 Turbo is an image-to-video model that generates high-quality videos from images. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Bring your images to life with AI-powered video generation. Runway Gen4 Turbo transforms static images into dynamic videos based on your text descriptions — perfect for creating cinematic motion, animated scenes, and engaging visual content.
Why It Looks Great
- Image-to-video synthesis: Animates your source image with natural, fluid motion guided by your prompt.
- Prompt Enhancer: Built-in tool to refine and improve your text descriptions for better results.
- Flexible aspect ratios: Supports 16:9, 4:3, 1:1, 3:4, and 9:16 for any output format.
- High-quality motion: Generates smooth, realistic movement that respects the original image composition.
- Turbo speed: Optimized for fast generation without compromising visual quality.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text description of the motion and action you want (e.g., “The model walks forward, fabric flowing in the wind”). |
| image | Yes | Source image to animate (upload or public URL). |
| aspect_ratio | No | Output aspect ratio: 16:9, 4:3, 1:1, 3:4, or 9:16. Leave empty to match source. |
How to Use
- Write your prompt — describe the motion, action, and atmosphere you want in the video.
- Use Prompt Enhancer (optional) — click the button to refine your description for better results.
- Upload your image — drag and drop or paste a public URL.
- Choose aspect ratio (optional) — select an output format or leave empty to match the source image.
- Run — click the button to generate.
- Download — preview and save your generated video.
Pricing
$0.28 per 5 seconds of output video.
| Duration | Price |
|---|---|
| 5s | $0.28 |
| 10s | $0.56 |
Best Use Cases
- Fashion & Lookbooks — Animate model shots with realistic fabric movement and poses.
- Product Showcases — Bring product images to life with subtle motion and dynamic angles.
- Social Media Content — Create eye-catching video content from existing photos.
- Art & Illustration — Add movement to artwork, illustrations, and concept art.
- Marketing & Ads — Transform static campaign images into engaging video ads.
Example Prompts
- “A model walks forward slowly, the sculptural gown catching the light as fabric flows gracefully”
- “Camera slowly zooms in as soft wind moves through the hair”
- “The subject turns their head to look at the camera with a subtle smile”
- “Gentle camera pan to the right, revealing more of the scene”
- “Leaves fall softly in the background while the subject remains still”
Pro Tips for Best Results
- Be specific about motion — describe what moves, how it moves, and the camera behavior.
- Use the Prompt Enhancer to add cinematic details to simple descriptions.
- High-quality source images with clear subjects produce the best animations.
- Describe both subject motion and camera movement for more dynamic results.
- Keep prompts focused — one clear action often works better than multiple complex movements.
- Match aspect ratio to your intended platform: 9:16 for TikTok/Reels, 16:9 for YouTube.
Notes
- If using a URL for the image, ensure it is publicly accessible. A preview thumbnail confirms successful loading.
- Generation time may vary based on current queue load.
- Complex motions or detailed prompts may require iteration to achieve desired results.
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": 5,
"aspect_ratio": "16:9"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/runwayml/gen4-turbo" \
-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
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | The positive prompt for the generation. | |
| image | string | Yes | - | The image for generating the output. | |
| duration | integer | No | 5 | 5 ~ 10 | The duration of the generated media in seconds. |
| aspect_ratio | string | No | - | 16:9, 4:3, 1:1, 3:4, 9:16 | The aspect ratio of the generated media. |
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 | Output values, usually URL strings; some models return text strings or structured result objects (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 |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<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.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to poll for the prediction result |
| data.status | string | Status: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created |
| 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 |