## Basic tool info Model name: pruna/p-video-2-pro-replace Model description: Swap 1–2 people in an existing video using reference photos. Keeps the original camera move, scene, motion, and optional soundtrack at up to 4K output. Model cover: https://cdn.wiro.ai/uploads/models/pruna-p-video-2-pro-replace-cover.mp4 Model categories: - tool - use-agent - quick-showcase - partner - pruna - fast-inference - image-to-video - nogpu-pipeline - video-to-video Run Task Endpoint (POST): https://api.wiro.ai/v1/Run/pruna/p-video-2-pro-replace Get Task Detail Endpoint (POST): https://api.wiro.ai/v1/Task/Detail ## Model Inputs: - name: inputVideo label: Input Video help: Required. Source video (mp4, mov or webm), 1 to 120 seconds, up to 8K, aspect ratio between 1:4 and 4:1. Its camera, scene, motion and soundtrack are kept. A longer video is cut to its first 120 seconds. type: combinefileinput default: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-1.mp4 - name: inputImage label: Reference Images help: Required. 1 or 2 pictures (jpg, jpeg, png, webp), one per person. One picture replaces the main person; two pictures replace two people, matched from left to right unless the instruction prompt says otherwise. type: combinefileinput default: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-5.webp - name: prompt label: Instruction Prompt help: Optional. Who replaces whom, or other placement instructions, e.g. The dancer on the left becomes the woman from image 1, the one on the right the man from image 2. type: textarea default: Replace the blonde woman walking on the street with the brunette woman from image 1, keeping her outfit from image 1. - name: resolution label: Resolution help: Required. Output resolution, aspect ratio kept. 480p ($0.05/sec), 768p ($0.10/sec), 1080p ($0.12/sec), 2k ($0.14/sec) or 4k ($0.18/sec). 1080p, 2k and 4k are upscaled from 768p and take longer. The output is 24 fps and as long as the source video. type: select default: 768p options: - value: "480p" label: 480p - value: "768p" label: 768p - value: "1080p" label: 1080p - value: "2k" label: 2k - value: "4k" label: 4k - name: saveAudio label: Save Audio help: Optional. Default true. Keep the source soundtrack in the output. type: select default: true options: - value: "true" label: true - value: "false" label: false - name: ignoreAudio label: Ignore Audio help: Optional. Default false. Generate without listening to the source audio, so the lips don't follow it. With Save Audio true, the soundtrack is still added to the output. type: select default: false options: - value: "true" label: true - value: "false" label: false - name: enableSafetyFilter label: Enable Safety Filter help: Optional. Default true. Check the inputs against the content policy. When false, only sexual content involving minors and self-harm are blocked. type: select default: true options: - value: "true" label: true - value: "false" label: false - name: seed label: Seed help: Optional. Random seed for reproducible results. Leave empty for a random seed. type: text default: ## Model Parameter Inspires: - inputVideo: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-1.mp4 - inputImage: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-5.webp - prompt: Replace the blonde woman walking on the street with the brunette woman from image 1, keeping her outfit from image 1. - inputVideo: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-2.mp4 - inputImage: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-6.webp - prompt: Replace the cucumber being sliced on the cutting board with the romaine lettuce from image 1, so the man chops lettuce instead. Keep the man, his motion and the kitchen unchanged. - inputVideo: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-3.mp4 - inputImage: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-7.webp - prompt: Replace the black kettlebell the woman is swinging with the light gray kettlebell from image 1. Keep the woman, her motion and the gym unchanged. - inputVideo: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-4.mp4 - inputImage: https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-8.webp - prompt: Replace the dancing woman on the beach with the woman from image 1, keeping her light blue sundress and white sneakers from image 1. ## Integration Header Prepare ```bash # Sign up Wiro dashboard and create project export YOUR_API_KEY="YOUR_WIRO_API_KEY"; export YOUR_API_SECRET="XXXXXXXXX"; # unix time or any random integer value export NONCE=$(date +%s); # hmac-SHA256 (YOUR_API_SECRET+Nonce) with YOUR_API_KEY export SIGNATURE="$(echo -n "${YOUR_API_SECRET}${NONCE}" | openssl dgst -sha256 -hmac "${YOUR_API_KEY}" | awk '{print $NF}')"; ``` ## Run Command - Make HTTP Post Request ```bash curl -X POST "https://api.wiro.ai/v1/Run/pruna/p-video-2-pro-replace" \ -H "Content-Type: application/json" \ -H "x-api-key: ${YOUR_API_KEY}" \ -H "x-nonce: ${NONCE}" \ -H "x-signature: ${SIGNATURE}" \ --data-binary @- <<'JSON' { "inputVideo": [ "https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-1.mp4" ], "inputImage": [ "https://cdn.wiro.ai/uploads/sampleinputs/pruna-p-video-2-pro-replace-sampleinput-5.webp" ], "prompt": "Replace the blonde woman walking on the street with the brunette woman from image 1, keeping her outfit from image 1.", "resolution": "768p", "saveAudio": "true", "ignoreAudio": "false", "enableSafetyFilter": "true", "seed": "", "callbackUrl": "You can provide a callback URL; Wiro will send a POST request to it when the task is completed." } JSON ``` ## Run Command - Response ```json { "errors": [], "taskid": "2221", "socketaccesstoken": "eDcCm5yyUfIvMFspTwww49OUfgXkQt", "result": true } ``` ## Get Task Detail - Make HTTP Post Request with Task ID ```bash curl -X POST "https://api.wiro.ai/v1/Task/Detail" \ -H "Content-Type: application/json" \ -H "x-api-key: ${YOUR_API_KEY}" \ -H "x-nonce: ${NONCE}" \ -H "x-signature: ${SIGNATURE}" \ -d '{ "taskid": "2221" }'; ``` ## Get Task Detail - Make HTTP Post Request with Socket Access Token ```bash curl -X POST "https://api.wiro.ai/v1/Task/Detail" \ -H "Content-Type: application/json" \ -H "x-api-key: ${YOUR_API_KEY}" \ -H "x-nonce: ${NONCE}" \ -H "x-signature: ${SIGNATURE}" \ -d '{ "tasktoken": "eDcCm5yyUfIvMFspTwww49OUfgXkQt" }'; ``` ## Get Task Detail - Response ```json { "total": "1", "errors": [], "tasklist": [ { "id": "2221", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "socketaccesstoken": "eDcCm5yyUfIvMFspTwww49OUfgXkQt", "parameters": {}, "debugoutput": "", "debugerror": "", "starttime": "1734513809", "endtime": "1734513813", "elapsedseconds": "6.0000", "status": "task_postprocess_end", "createtime": "1734513807", "canceltime": "0", "assigntime": "1734513807", "accepttime": "1734513807", "preprocessstarttime": "1734513807", "preprocessendtime": "1734513807", "postprocessstarttime": "1734513813", "postprocessendtime": "1734513814", "totalcost": "0.003510000000", "chargedcost": "0.002808000000", "discountamount": "0.000702000000", "outputs": [ { "id": "6bc392c93856dfce3a7d1b4261e15af3", "name": "0.png", "contenttype": "image/png", "parentid": "6c1833f39da71e6175bf292b18779baf", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "size": "202472", "addedtime": "1734513812", "modifiedtime": "1734513812", "accesskey": "dFKlMApaSgMeHKsJyaDeKrefcHahUK", "url": "https://cdn1.wiro.ai/6a6af820-c5050aee-40bd7b83-a2e186c6-7f61f7da-3894e49c-fc0eeb66-9b500fe2/0.png" } ], "size": "202472" } ], "result": true } ``` totalcost is the list price. chargedcost is the amount actually billed after any discount (a store fee is included on store runs); discountamount is the discount. chargedcost is null until the charge is recorded (shortly after task_postprocess_end) and "0" for a failed or cancelled task. ## Kill Task - Make HTTP Post Request with Task ID ```bash curl -X POST "https://api.wiro.ai/v1/Task/Kill" \ -H "Content-Type: application/json" \ -H "x-api-key: ${YOUR_API_KEY}" \ -H "x-nonce: ${NONCE}" \ -H "x-signature: ${SIGNATURE}" \ -d '{ "taskid": "534574" }'; ``` ## Kill Task - Make HTTP Post Request with Socket Access Token ```bash curl -X POST "https://api.wiro.ai/v1/Task/Kill" \ -H "Content-Type: application/json" \ -H "x-api-key: ${YOUR_API_KEY}" \ -H "x-nonce: ${NONCE}" \ -H "x-signature: ${SIGNATURE}" \ -d '{ "socketaccesstoken": "ZpYote30on42O4jjHXNiKmrWAZqbRE" }'; ``` ## Kill Task - Response ```json { "errors": [], "tasklist": [ { "id": "534574", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "name": "", "socketaccesstoken": "ZpYote30on42O4jjHXNiKmrWAZqbRE", "parameters": { "inputImage": "https://api.wiro.ai/v1/File/mCmUXgZLG1FNjjjwmbtPFr2LVJA112/inputImage-6060136.png" }, "debugoutput": "", "debugerror": "", "starttime": "1734513809", "endtime": "1734513813", "elapsedseconds": "6.0000", "status": "task_cancel", "cps": "0.000585000000", "totalcost": "0.003510000000", "guestid": null, "projectid": "699", "modelid": "598", "description": "", "basemodelid": "0", "runtype": "model", "modelfolderid": "", "modelfileid": "", "callbackurl": "", "marketplaceid": null, "createtime": "1734513807", "canceltime": "0", "assigntime": "1734513807", "accepttime": "1734513807", "preprocessstarttime": "1734513807", "preprocessendtime": "1734513807", "postprocessstarttime": "1734513813", "postprocessendtime": "1734513814", "pexit": "0", "categories": "["tool","image-to-image","quick-showcase","compare-landscape"]", "outputs": [ { "id": "6bc392c93856dfce3a7d1b4261e15af3", "name": "0.png", "contenttype": "image/png", "parentid": "6c1833f39da71e6175bf292b18779baf", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "size": "202472", "addedtime": "1734513812", "modifiedtime": "1734513812", "accesskey": "dFKlMApaSgMeHKsJyaDeKrefcHahUK", "foldercount": "0", "filecount": "0", "ispublic": 0, "expiretime": null, "url": "https://cdn1.wiro.ai/6a6af820-c5050aee-40bd7b83-a2e186c6-7f61f7da-3894e49c-fc0eeb66-9b500fe2/0.png" } ], "size": "202472" } ], "result": true } ``` ## Cancel Task - Make HTTP Post Request (For tasks on queue) ```bash curl -X POST "https://api.wiro.ai/v1/Task/Cancel" \ -H "Content-Type: application/json" \ -H "x-api-key: ${YOUR_API_KEY}" \ -H "x-nonce: ${NONCE}" \ -H "x-signature: ${SIGNATURE}" \ -d '{ "taskid": "634574" }'; ``` ## Cancel Task - Response ```json { "errors": [], "tasklist": [ { "id": "634574", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "name": "", "socketaccesstoken": "ZpYote30on42O4jjHXNiKmrWAZqbRE", "parameters": { "inputImage": "https://api.wiro.ai/v1/File/mCmUXgZLG1FNjjjwmbtPFr2LVJA112/inputImage-6060136.png" }, "debugoutput": "", "debugerror": "", "starttime": "1734513809", "endtime": "1734513813", "elapsedseconds": "6.0000", "status": "task_cancel", "cps": "0.000585000000", "totalcost": "0.003510000000", "guestid": null, "projectid": "699", "modelid": "598", "description": "", "basemodelid": "0", "runtype": "model", "modelfolderid": "", "modelfileid": "", "callbackurl": "", "marketplaceid": null, "createtime": "1734513807", "canceltime": "0", "assigntime": "1734513807", "accepttime": "1734513807", "preprocessstarttime": "1734513807", "preprocessendtime": "1734513807", "postprocessstarttime": "1734513813", "postprocessendtime": "1734513814", "pexit": "0", "categories": "["tool","image-to-image","quick-showcase","compare-landscape"]", "outputs": [ { "id": "6bc392c93856dfce3a7d1b4261e15af3", "name": "0.png", "contenttype": "image/png", "parentid": "6c1833f39da71e6175bf292b18779baf", "uuid": "15bce51f-442f-4f44-a71d-13c6374a62bd", "size": "202472", "addedtime": "1734513812", "modifiedtime": "1734513812", "accesskey": "dFKlMApaSgMeHKsJyaDeKrefcHahUK", "foldercount": "0", "filecount": "0", "ispublic": 0, "expiretime": null, "url": "https://cdn1.wiro.ai/6a6af820-c5050aee-40bd7b83-a2e186c6-7f61f7da-3894e49c-fc0eeb66-9b500fe2/0.png" } ], "size": "202472" } ], "result": true } ``` ## Task Status Information This section defines the possible task status values returned by the API when polling for task completion. ### Completed Task Statuses (Polling can stop) These indicate that the task has reached a terminal state — either success or failure. Once any of these is received, polling should stop. - task_postprocess_end : Task completed successfully and post-processing is done. - task_cancel : Task was cancelled by the user or system. ### Running Task Statuses (Continue polling) These statuses indicate that the task is still in progress. Polling should continue if one of these is returned. - task_queue : Task is waiting in the queue. - task_accept : Task has been accepted for processing. - task_assign : Task is being assigned to a worker. - task_preprocess_start : Preprocessing is starting. - task_preprocess_end : Preprocessing is complete. - task_start : Task execution has started. - task_output : Output is being generated.