GPT Image 2.5 is LIVE — Flare & Sunburst | Try in Image Generator →

vidu/

Vidu Reference-to-Video 2.0 turns references into videos that preserve characters, objects, and environments with Multi-Entity Consistency. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

image-to-video
Input
Enable Safety Checker

Idle

$0.2per run·~50 / $10

Next:

ExamplesView all

the girl walks from the painting to the room, put the coffee cup on the table

The camera cuts from an aerial shot to a deer running in the forest.

A girl walks from the desert to the busy city

A dog running with a woman.

A woman running in the forest.

A woman eating cake.

A man drinking juice.

A woman with a doll.

A woman with flowers.

Related Models

README

Vidu Reference-to-Video 2.0 — vidu/reference-to-video-2.0

Vidu Reference-to-Video 2.0 generates a short video from a text prompt while using multiple reference images to guide subject identity, style, and scene consistency. Upload one or more reference images, describe the action and camera intent in the prompt, and the model synthesizes a coherent clip that follows your references. Movement intensity can be adjusted with movement_amplitude, and seed can be fixed for repeatable results.

Key capabilities

  • Prompt-driven video generation guided by reference images
  • Supports multiple reference images to keep identity/style consistent
  • Movement amplitude control: auto / small / medium / large
  • Seed control for reproducible generations
  • Good for “merge two references into one scene” style storytelling

Use cases

  • Character + scene blending (e.g., a person from one reference enters a room from another)
  • Style-consistent short clips based on an artwork reference
  • Multi-reference continuity across a mini story sequence
  • Product storytelling using a reference setup and a subject reference
  • Quick concept videos for ads, trailers, and social

Pricing

DurationPrice per video
5s$0.20

Inputs

  • images (required): one or more reference images (add multiple items)
  • prompt (required): action + scene + camera direction

Parameters

  • aspect_ratio: output aspect ratio (e.g., 16:9)
  • movement_amplitude: motion intensity (auto, small, medium, large)
  • seed: random seed (set a number for reproducible results)

Prompting guide (multi-reference)

When you provide multiple references, explicitly assign what each reference is used for:

Template: Use reference image 1 for the room and lighting. Use reference image 2 for the character’s appearance and clothing. The character steps out of the painting into the room, walks to the table, and places the coffee cup down. Smooth motion, consistent style, fixed camera, no flicker.

Example prompts

  • Use reference 1 as the room scene and table setup. Use reference 2 for the girl’s identity and painting style. The girl steps out of the painting into the room, walks to the table, and gently places the coffee cup down. Warm morning light, cinematic, smooth transition.
  • Combine both references into one coherent scene. The character crosses the room, interacts with the cup, subtle cloth movement, soft shadows, realistic contact with the table surface.
Note:This website uses AI models provided by third parties. Documentation prices are for reference and may be outdated. The Generate button shows an estimate; the final task charge prevails.

Reference To Video 2.0 API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/vidu/reference-to-video-2.0 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 Reference To Video 2.0 below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "prompt": "A cinematic shot of a city at sunset, soft golden light",
    "images": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "aspect_ratio": "16:9",
    "movement_amplitude": "auto"
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/vidu/reference-to-video-2.0" \
  -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="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"

# 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|deleted) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/vidu/reference-to-video-2.0";
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({
        "prompt": "A cinematic shot of a city at sunset, soft golden light",
        "images": [
                "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
        ],
        "aspect_ratio": "16:9",
        "movement_amplitude": "auto"
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = `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", "deleted"].includes(result.status)) throw new Error(JSON.stringify(result));
  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 = {
    "prompt": "A cinematic shot of a city at sunset, soft golden light",
    "images": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "aspect_ratio": "16:9",
    "movement_amplitude": "auto"
}

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/vidu/reference-to-video-2.0", 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 = 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", "deleted"}:
        raise RuntimeError(result)
    time.sleep(2)

Reference To Video 2.0 API — Frequently asked questions

What is the Reference To Video 2.0 API?

Reference To Video 2.0 is a Vidu model for video generation from images, exposed as a REST API on WaveSpeedAI. Vidu Reference-to-Video 2.0 turns references into videos that preserve characters, objects, and environments with Multi-Entity Consistency. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Reference To Video 2.0 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 Python, JavaScript, and cURL examples for submitting requests and polling results. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/vidu/vidu-reference-to-video-2.0.

How much does Reference To Video 2.0 cost per run?

Reference To Video 2.0 starts at $0.2 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 Reference To Video 2.0 accept?

Key inputs: `prompt`, `images`, `aspect_ratio`, `seed`, `movement_amplitude`. 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/vidu/vidu-reference-to-video-2.0.

How long does Reference To Video 2.0 take to generate?

Reported generation time on WaveSpeedAI is around 92 seconds per request. This is an estimate, not a latency guarantee; queue time and input settings can change the total wait. live status is visible in the prediction record.

Can I use Reference To Video 2.0 outputs commercially?

Commercial usage rights depend on the model's license, set by its provider (Vidu). Check the provider's applicable terms and WaveSpeedAI's Terms of Service before commercial use.

Vidu Reference to Video 2.0 | Fast Image-to-Video API on WaveSpeedAI