Pruna P-Video-2-Pro Reference-to-Video generates reference-guided videos from image, video, and audio inputs, supporting flexible multimodal guidance for consistent subjects, motion, visual style, and creative video production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle
$0.02per run·~50 / $1
Create a playful romantic-comedy scene using the reference image. Preserve both characters' identities, outfits, seating positions, and the Parisian cafe setting. Use the supplied audio as the woman's spoken dialogue. The man remains silent. Begin in a medium two-shot. While the man looks toward the street, the woman quickly steals one small bite of his chocolate pastry with her fork. He turns back just as she withdraws the fork. She freezes, then slowly lowers it, trying to look completely innocent. Cut to the woman as she delivers the supplied line with mock seriousness and a mischievous smile. Match her mouth movements to the audio. Cut back to the two-shot. The man raises one eyebrow, visibly amused, then gently slides the entire plate toward her. Her confident expression breaks into a genuine, slightly embarrassed laugh. They hold warm eye contact, sharing the joke. Keep the comedy natural and understated, with a brief pause when she gets caught. Realistic hand movements, consistent props, warm morning sunlight, gentle cafe ambience. No extra dialogue, no subtitles, no background music.
A single continuous cinematic shot. Preserve the woman's identity, olive coat, leather suitcase, and the abandoned station. The camera slowly moves closer as she waits beside the empty tracks. A distant warm headlight appears through the fog. Wind gently lifts her hair and the edge of her coat. She tightens her grip on the suitcase and turns toward the approaching light, her expression shifting from disbelief to quiet recognition. In the final moments, the dark silhouette of an old passenger train begins to emerge from the fog. Grounded, restrained acting. Slow, deliberate pacing. No cuts, no sudden action, no exaggerated expressions. The speech is an off-screen internal monologue; her lips remain still. No subtitles or on-screen text.
A single continuous shot from an intimate road movie. Preserve the woman's identity, cream shirt, blue jeans, vintage blue convertible, and desert gas station. She studies the paper map briefly, then folds it without choosing a destination and places it on the driver's seat. She pauses, looks toward the open road, and lets out a small, genuine smile. A gentle breeze moves the loose strands of her hair. The camera slowly tracks sideways, revealing more of the empty road and sunlit desert beyond her. Warm morning light, subtle natural movement, restrained acting, a quiet sense of freedom. No cuts or dramatic gestures. The speech is an off-screen internal monologue; she does not speak on camera. No subtitles or on-screen text.
P-Video-2 Pro Reference-to-Video generates videos from a text prompt with multimodal reference guidance. Combine reference images, video clips, optional audio, and opening or ending keyframes to control subjects, appearance, motion, scene direction, and the start or end of the generated sequence.
Multimodal reference guidance
Combine images, videos, and optional audio references in the same generation workflow.
Opening and ending keyframes
Use start_image or end_image to guide how the generated video begins or ends.
Multiple visual references
Use up to 9 images in total, including first- and last-frame images.
Video reference support
Add up to 3 reference videos for motion, appearance, or scene guidance.
Optional audio references
Add up to 3 audio references for additional sound or performance guidance.
Speed and cost modes
Choose speed for faster generation or cost when lower generation price is preferred.
480p and 768p output
Select the resolution that fits your quality and cost requirements.
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text description of the desired video, including scene, action, camera movement, and how supplied references should be used. |
| images | Conditional | Reference image URLs. Up to 9 images are supported in total when combined with start_image and end_image. |
| videos | Conditional | Up to 3 reference video URLs. Combined reference-video duration supports up to 15 seconds. |
| audios | No | Optional reference audio URLs. Supports up to 3 inputs with a combined duration of up to 15 seconds. Audio cannot be used as the only reference type. |
| keep_audio | No | Keep the supplied audio as the output soundtrack instead of using it only as a reference. Default: false. Requires exactly one file in audios when enabled. |
| start_image | No | Optional opening keyframe image URL. Counts toward the 9-image total limit. |
| end_image | No | Optional ending keyframe image URL. Counts toward the 9-image total limit. |
| duration | No | Requested output duration in seconds. Range: 5–15. Default: 5. |
| resolution | No | Output resolution: 480p or 768p. Default: 768p. |
| mode | No | Generation mode: speed or cost. Default: speed. |
| aspect_ratio | No | Optional output aspect ratio: 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, or 1:1. Leave empty to automatically adapt to the input references. |
| prompt_upsampler | No | Prompt enhancement mode: off, turbo, or max. Default: off. |
| seed | No | Optional random seed for generation. |
prompt is required.
At least one of the following visual reference inputs must also be provided:
imagesvideosstart_imageend_imageaudios can provide reference guidance or, with keep_audio=true, the output soundtrack. Audio cannot be used as the only reference input.
keep_audio.5 to 15 seconds.480p or 768p.speed for faster generation or cost for lower-priced generation.off, turbo, or max.Pricing includes the requested output duration plus any submitted image, video, and audio references.
| Resolution | Speed Mode | Cost Mode |
|---|---|---|
| 480p | $0.020 / second | $0.015 / second |
| 768p | $0.035 / second | $0.025 / second |
images, start_image, and end_image use the same per-image rate.
| Mode | Price per Image |
|---|---|
| Speed | $0.010 |
| Cost | $0.005 |
| Resolution | Speed Mode | Cost Mode |
|---|---|---|
| 480p | $0.040 / billed second | $0.030 / billed second |
| 768p | $0.060 / billed second | $0.060 / billed second |
Reference-video billing duration is rounded up to the next whole second and capped at 15 seconds in total. The billable duration may also be limited based on the requested output duration and number of reference videos.
| Mode | Price per Billed Second |
|---|---|
| Speed | $0.0025 |
| Cost | $0.0015 |
Combined reference-audio billing duration is rounded up to the next whole second and capped at 15 seconds.
A 5-second 480p output with one reference image costs:
| Mode | Calculation | Cost |
|---|---|---|
| Speed | 5 × $0.020 + 1 × $0.010 | $0.110 |
| Cost | 5 × $0.015 + 1 × $0.005 | $0.080 |
aspect_ratio, prompt_upsampler, keep_audio, and seed do not add separate charges. Supplied audio is still billed at the audio rate above.
start_image when the opening composition must be controlled.end_image when the final pose, framing, or scene state matters.480p for lower-cost testing before generating at 768p.cost mode when minimizing generation cost is more important than using the speed-oriented mode.prompt is required.images, start_image, and end_image share a combined maximum of 9 images.3 reference videos are supported.3 reference audio inputs are supported when keep_audio is off (the default). Enable keep_audio with exactly one audio file to use it as the output soundtrack.keep_audio=true, shorter audio plays first and generated audio fills the remainder; longer audio is trimmed. If its duration is within one second of duration, the video length follows the audio.15 seconds.5–15 seconds and defaults to 5.resolution defaults to 768p.mode defaults to speed.aspect_ratio empty to automatically adapt to the input references.prompt_upsampler defaults to off.Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/pruna-ai/p-video-2-pro/reference-to-video 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 P Video 2 Pro Reference To Video below.
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",
"duration": 5,
"resolution": "768p",
"mode": "speed",
"aspect_ratio": "16:9",
"prompt_upsampler": "off",
"keep_audio": false
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/pruna-ai/p-video-2-pro/reference-to-video" \
-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
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/pruna-ai/p-video-2-pro/reference-to-video";
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",
"duration": 5,
"resolution": "768p",
"mode": "speed",
"aspect_ratio": "16:9",
"prompt_upsampler": "off",
"keep_audio": false
}),
});
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));
}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",
"duration": 5,
"resolution": "768p",
"mode": "speed",
"aspect_ratio": "16:9",
"prompt_upsampler": "off",
"keep_audio": False
}
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/pruna-ai/p-video-2-pro/reference-to-video", 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)P Video 2 Pro Reference To Video is a Pruna Ai model for reference-guided video generation, exposed as a REST API on WaveSpeedAI. Pruna P-Video-2-Pro Reference-to-Video generates reference-guided videos from image, video, and audio inputs, supporting flexible multimodal guidance for consistent subjects, motion, visual style, and creative video production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
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/pruna-ai/pruna-ai-p-video-2-pro-reference-to-video.
P Video 2 Pro Reference To Video starts at $0.02 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.
Key inputs: `prompt`, `images`, `aspect_ratio`, `resolution`, `duration`, `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/pruna-ai/pruna-ai-p-video-2-pro-reference-to-video.
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.
Commercial usage rights depend on the model's license, set by its provider (Pruna Ai). Check the provider's applicable terms and WaveSpeedAI's Terms of Service before commercial use.