MiniMax H3 Open Weights | Try in Video Generator →

Video Outpainter | AI Video Enhancement API

wavespeed-ai/

WaveSpeedAI Video Outpainter expands any video beyond its original boundaries while preserving motion, identity, and scene coherence. Perfect for aspect-ratio changes, reframing, adding safe margins, or generating new visual context without cropping or losing content.

video-to-video
Input

Idle

$0.2per run·~50 / $10

Next:

ExamplesView all

Related Models

README

Video Outpainter

What is Video Outpainter?

Video Outpainter expands your video outward in any direction, synthesizing new, coherent surroundings while preserving the original motion, characters, and scene continuity. It is ideal for reframing shots, adding safe margins, and converting aspect ratios (for example, 9:16 → 16:9) without cropping or losing key content.

Input Parameters

video (required)

The source video you want to expand. This defines all core motion, composition, and subject identity that the model will preserve.

prompt (optional)

A positive text description of how the newly generated surroundings should look. Examples:

  • Extend skyline with modern city buildings
  • Add a dense forest around the subject
  • Fill the sides with a matching indoor studio background

If left empty, the model automatically generates a visually coherent extension based on the original footage.

aspect_ratio

Controls the aspect ratio of the outpainted output.

Available options:

  • auto (default)
  • 1:1, 4:3, 3:4
  • 16:9, 9:16
  • 3:2, 2:3
  • 21:9, 9:21

Use this to widen or heighten shots, convert between social and cinematic formats, or create ultra-wide canvases.

seed

Controls randomness and reproducibility.

  • −1 → a random seed is used for each run
  • Any integer → repeatable results for the same inputs

Designed For

  • Social teams – Export one master shot into multiple formats (TikTok, Shorts, Reels, YouTube, ads) without cropping faces or key actions.
  • Editors and studios – Deliver different aspect ratios for clients, broadcast, or film-safe reframing from a single source clip.
  • Marketing and ads – Repurpose existing assets for new placements by adding context and safe margins around the subject.
  • Creators – Add cinematic space, environmental detail, or breathing room around shots while keeping the original take.

How to Use

  1. Upload the video you want to outpaint.
  2. Choose an aspect_ratio (auto or any supported cinematic/social ratio).
  3. Optionally add a prompt to guide how the extended environment should look.
  4. Set the seed (or leave it at −1 for variation).
  5. Run the model, preview the result, and iterate until the framing and environment feel right.

Pricing

OutputPrice per 5 sMax Length
Video Outpainting$0.1560 s

Key Capabilities

  • Expands video content in any direction (top, bottom, left, right).
  • Converts aspect ratios without cropping the original frame.
  • Preserves identity, motion, and temporal consistency across all frames.
  • Generates natural, coherent backgrounds and surroundings that blend with the source video.
  • Perfect for reframing, platform adaptation, and turning standard shots into more cinematic compositions.
Note:This website uses AI models provided by third parties.

Video Outpainter API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/video-outpainter with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Video Outpainter below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "aspect_ratio": "auto",
    "seed": -1
}
JSON
)

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

TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; 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 has("data") then .data else . end')
  STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
  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
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/video-outpainter";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');

async function requestJson(url, options = {}) {
  const response = await fetch(url, options);
  if (!response.ok) throw new Error(await response.text());
  return response.json();
}

// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
        "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
        "aspect_ratio": "auto",
        "seed": -1
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;

// 2. Poll until the prediction finishes.
while (true) {
  const resultBody = await requestJson(resultUrl, {
    headers: { "Authorization": `Bearer ${apiKey}` },
  });
  const result = resultBody.data ?? resultBody;
  if (result.status === "completed") {
    console.log(result.outputs);
    break;
  }
  if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
import json
import os
import time
from urllib.request import Request, urlopen

api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
    "video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
    "aspect_ratio": "auto",
    "seed": -1
}

def request_json(url, data=None):
    request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
    with urlopen(request) as response:
        return json.load(response)

# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/video-outpainter", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
    raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"

# 2. Poll until the prediction finishes.
while True:
    result_body = request_json(result_url)
    result = result_body.get("data", result_body)
    status = result.get("status")
    if status == "completed":
        print(result.get("outputs", []))
        break
    if status in {"failed", "cancelled", "timeout"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Video Outpainter API — Frequently asked questions

What is the Video Outpainter API?

Video Outpainter is a WaveSpeedAI model for video editing, exposed as a REST API on WaveSpeedAI. WaveSpeedAI Video Outpainter expands any video beyond its original boundaries while preserving motion, identity, and scene coherence. Perfect for aspect-ratio changes, reframing, adding safe margins, or generating new visual context without cropping or losing content. You can call it programmatically or try it from the playground above.

How do I call the Video Outpainter API?

POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/video-outpainter.

How much does Video Outpainter cost per run?

Video Outpainter starts at $0.20 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.

What inputs does Video Outpainter accept?

Key inputs: `prompt`, `video`, `aspect_ratio`, `seed`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/video-outpainter.

How do I get started with the Video Outpainter API?

Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.

Can I use Video Outpainter outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.