Pruna P-Video-2-Pro Replace Video Character Swap API

pruna-ai/p-video-2-pro/replace

Pruna AI P-Video-2-Pro Replace swaps the person in a video for the person in one or two reference photos while keeping the motion, camera and soundtrack, with lips following the original audio. Supports 1 to 120 second videos and up to 4K output. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Video Editing
Input

Drag & drop or click to upload

Drag & drop or click to upload

preview

Idle

$0.1per run·~10 / $1

ExamplesView all

Related Models

README

Pruna AI P-Video-2 Pro Replace

Pruna AI P-Video-2 Pro Replace replaces one or two people in an existing video using reference photos while preserving the source motion, camera movement, timing, and soundtrack. Lip movements follow the original audio unless ignore_audio is enabled.

Why Choose This?

  • Character replacement — Replace one or two people in an existing video using reference photos.
  • Performance preserved — Keep the source motion, camera movement, timing, and framing.
  • Audio-aware lip movement — Lip movements follow the source audio by default.
  • Original soundtrack preserved — Keep the source audio in the final video with save_audio.
  • Up to 120 seconds — Process source videos from 1 to 120 seconds.
  • Up to 4K output — Choose 480p, 768p, 1080p, 2k, or 4k.

Parameters

ParameterRequiredDescription
videoYesSource video URL. Supports MP4, MOV, and WebM from 1 to 120 seconds, with an aspect ratio between 1:4 and 4:1. Longer videos are limited to the first 120 seconds.
imagesYes1 or 2 reference image URLs, one for each person to replace.
promptNoOptional instructions describing who should be replaced, especially when multiple people appear in the video.
resolutionNoOutput resolution: 480p, 768p, 1080p, 2k, or 4k. Default: 768p. 1080p, 2k, and 4k are upscaled from 768p.
save_audioNoPreserve the source video's soundtrack in the output. Default: true.
ignore_audioNoIgnore the source audio when generating lip movement. Default: false. The soundtrack can still be preserved when save_audio=true.
seedNoOptional random seed for reproducible generation.

How to Use

  1. Upload a source video — Provide the video containing the person or people you want to replace.
  2. Add reference photos — Upload one photo per person to replace.
  3. Add a prompt optional — Describe who should be replaced when multiple people appear.
  4. Choose a resolution — Select 480p, 768p, 1080p, 2k, or 4k.
  5. Configure audio optional — Choose whether to preserve or use the source audio during generation.
  6. Submit — Generate and retrieve the replaced video.

When replacing two people, use prompt to clarify which reference image corresponds to which person. Without a prompt, the reference images are matched from left to right.

Pricing

Pricing is based on the source video duration and selected resolution.

ResolutionPrice per Second
480p$0.05
768p$0.10
1080p$0.12
2K$0.14
4K$0.18

Example Costs

ConfigurationPrice
10s at 480p$0.50
10s at 768p$1.00
10s at 1080p$1.20
10s at 2K$1.40
10s at 4K$1.80

The number of reference images, prompt, save_audio, and ignore_audio do not add separate charges.

Best Use Cases

  • Character replacement — Replace actors or people while preserving the original performance.
  • Creative recasting — Reuse existing footage with different character appearances.
  • Marketing content — Adapt existing video performances with new people.
  • Social content — Create alternate character versions of existing clips.
  • Multi-person replacement — Replace up to two people within the same source video.

Pro Tips

  • Use clear reference photos with the subject's face easily visible.
  • Choose source footage where the people being replaced remain clearly visible.
  • Use prompt when several people appear and the replacement order may be ambiguous.
  • Keep ignore_audio=false when lip movements should follow the source speech.
  • Use save_audio=true when the original soundtrack should remain in the final result.
  • Use a fixed seed when comparing different settings or reference images.

Notes

  • video and images are required.
  • Supports 1 or 2 reference images.
  • Source videos can be up to 120 seconds.Longer source videos use only the first 120 seconds.
  • Supported source formats include MP4, MOV, and WebM.
  • Source aspect ratio must be between 1:4 and 4:1.
  • When ignore_audio=false, lip movements follow the source audio.
  • When ignore_audio=true, lip movement is generated without using the source audio.

Related Models

  • P-Video Replace — Replace people in existing videos using reference images.
  • P-Video Upscale — Increase the resolution of existing videos while preserving their framing and soundtrack.
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.

P Video 2 Pro Replace API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/pruna-ai/p-video-2-pro/replace 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 Replace 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",
    "images": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "resolution": "768p",
    "save_audio": true,
    "ignore_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/replace" \
  -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/pruna-ai/p-video-2-pro/replace";
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",
        "images": [
                "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
        ],
        "resolution": "768p",
        "save_audio": true,
        "ignore_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));
}
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",
    "images": [
        "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
    ],
    "resolution": "768p",
    "save_audio": True,
    "ignore_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/replace", 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 Replace API — Frequently asked questions

What is the P Video 2 Pro Replace API?

P Video 2 Pro Replace is a Pruna Ai model for video editing, exposed as a REST API on WaveSpeedAI. Pruna AI P-Video-2-Pro Replace swaps the person in a video for the person in one or two reference photos while keeping the motion, camera and soundtrack, with lips following the original audio. Supports 1 to 120 second videos and up to 4K output. 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 P Video 2 Pro Replace 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/pruna-ai/pruna-ai-p-video-2-pro-replace.

How much does P Video 2 Pro Replace cost per run or per second?

P Video 2 Pro Replace starts at $0.1 per run or per second. 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 P Video 2 Pro Replace accept?

Key inputs: `prompt`, `images`, `video`, `resolution`, `seed`, `ignore_audio`. 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-replace.

How do I get started with the P Video 2 Pro Replace 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 P Video 2 Pro Replace outputs commercially?

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.

llms.txt — pruna-ai/p-video-2-pro/replace for AI agents and LLMs