Pruna P-Video-Replace
Quickly puts the character from 1–3 photos in place of the person in your video. Motion, camera and sound stay as filmed.
Good for: ad variations, localizing clips, mascots in video
You pay per second of your video. The result is the same length: 4 to 30 seconds; longer clips are trimmed to 30.
For developers →How to get a better result
"Replace the background with a beach", "make it a watercolor".
The AI keeps everything else better: the face, the pose, the clothes.
Sharp, not blurry, so the person or object is clearly visible.
Pass this model in the request pruna-p-video-replace
1. Create a task POST /api/v1/jobs/createTask
curl -X POST https://mixmedia.tech/api/v1/jobs/createTask \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-123" \
-d '{
"model": "pruna-p-video-replace",
"callBackUrl": "https://your-app.example/callback",
"input": {
"prompt": "Put the person from the photo in place of the hero",
"image_urls": [
"https://example.com/photo.jpg"
],
"resolution": "720p",
"target_fps": "original"
}
}'import time, requests
API = "https://mixmedia.tech/api/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
task = requests.post(f"{API}/jobs/createTask", headers=HEADERS, json={
"model": "pruna-p-video-replace",
"callBackUrl": "https://your-app.example/callback",
"input": {
"prompt": "Put the person from the photo in place of the hero",
"image_urls": [
"https://example.com/photo.jpg"
],
"resolution": "720p",
"target_fps": "original"
}
}).json()
task_id = task["data"]["taskId"]
while True:
info = requests.get(f"{API}/jobs/recordInfo", headers=HEADERS, params={"taskId": task_id}).json()["data"]
if info["state"] in ("success", "fail"):
break
time.sleep(4)
print(info["state"], info.get("resultJson") or info.get("failMsg"))const API = "https://mixmedia.tech/api/v1";
const headers = { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" };
const { data } = await fetch(`${API}/jobs/createTask`, {
method: "POST", headers,
body: JSON.stringify({
"model": "pruna-p-video-replace",
"callBackUrl": "https://your-app.example/callback",
"input": {
"prompt": "Put the person from the photo in place of the hero",
"image_urls": [
"https://example.com/photo.jpg"
],
"resolution": "720p",
"target_fps": "original"
}
}),
}).then((r) => r.json());
let info;
do {
await new Promise((r) => setTimeout(r, 4000));
info = (await fetch(`${API}/jobs/recordInfo?taskId=${data.taskId}`, { headers }).then((r) => r.json())).data;
} while (!["success", "fail"].includes(info.state));
console.log(info.state, info.resultJson ?? info.failMsg);Response: data.taskId. callBackUrl and Idempotency-Key are optional.
2. Status and result GET /api/v1/jobs/recordInfo
curl "https://mixmedia.tech/api/v1/jobs/recordInfo?taskId=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
data.state: waiting, queuing, generating, success, fail. On success data.resultJson is a JSON string with resultUrls.
3. Upload a file POST /api/v1/files/upload
curl -X POST https://mixmedia.tech/api/v1/files/upload \
-H "Authorization: Bearer YOUR_API_KEY" -F "file=@photo.jpg"
The response has data.url. Pass that URL in the file field. Any public https URL works too.
Input fields
| Field | What to send |
|---|---|
prompt | text, up to 30000 characters |
video_url * | video |
image_urls * | list of URLs, up to 3 |
resolution | 720p · 1080p · default 720p |
target_fps | original · 24 · 48 · default original |
save_audio | true or false, default true |
ignore_audio | true or false, default false |
turbo | true or false, default false |
seed | number from -1 to 4294967295 |
About the model
Pruna P-Video-Replace takes your video and 1–3 photos and puts the character from the photos in place of the person in the clip.
Motion, timing, camera and scene stay as in the source; the clip audio is kept. It is fast: about 3–4 seconds of generation per second of video.
The video is up to 30 seconds (longer is trimmed to 30); the result has the same length. Resolution 720p or 1080p, frame rate original, 24 or 48. The prompt is optional. You pay per second of your video.


