Pixverse Swap API Documentation
Playground
Try it on WaveSpeedAI!PixVerse Swap replaces backgrounds, people, and objects directly inside existing videos for quick scene changes and creative edits with natural-looking results. Ready-to-use REST inference API, best performance, no cold starts, affordable pricing.
Features
PixVerse Swap generates high-quality video clips by swapping the person, objects, or background of a source video using a reference image. It preserves the original motion, timing, and camera work while replacing the visual target with the new look from the image.
What it does
- Takes a source video (performance, camera motion, timing).
- Takes a reference image (new person, object, or background).
- Replaces the selected target in the video with the content from the image.
- Keeps motion, expressions, and framing consistent so the edit feels natural.
Ideal for:
- Turning talking-head videos into stylized or character performances
- Swapping outfits, props, or featured products
- Dropping your subject into new scenes without reshooting
Inputs and Controls
-
video (required) Source clip whose motion, expressions, and timing you want to keep.
-
image (required) Reference image that defines the new person, object, or background.
-
resolution
-
360p
-
540p
-
720p
-
mode
-
person – Replace the main person in the video with the person or character from the image.
-
object – Replace a key object (for example, smartphone, product, prop) with the object in the image.
-
background – Keep the subject but replace the scene behind them using the reference image.
Pricing
| Resolution | Swap price per second |
|---|---|
| 360p | $0.090 |
| 540p | $0.090 |
| 720p | $0.120 |
- P.S: $0.020 per request for mask selection (charged once per job).
How to Use
- Upload or paste the URL of your source video.
- Upload or paste the URL of the reference image that contains the new person, object, or background.
- Choose the resolution (360p, 540p, or 720p) according to your quality and cost needs.
- Select the mode:
- person for full character swap,
- object for prop/product replacement,
- background to move your subject into a different environment.
- Click Run and wait for the processed video to appear in the preview panel.
- Review the result and download if you are satisfied.
Notes
- An uploaded video in supported formats (mp4, mov)
- Max resolution: 1920
- Max file size: 50MB
- Max duration: 30 seconds
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"resolution": "720p",
"mode": "person"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/pixverse/swap" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi
# 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 type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | The model generates video with the picture passed in as the first frame.Base64 encoded strings in data:image/jpeg; base64,{data} format for incoming images, or URLs accessible via the public network. The uploaded image needs to meet the following conditions: Format is JPG/JPEG/PNG; The aspect ratio is greater than 2:5 and less than 5:2; Short side pixels greater than 300px; The image file size cannot exceed 20MB. | |
| video | string | Yes | - | The video to be swapped. | |
| resolution | string | No | 720p | 360p, 540p, 720p | Video quality (360p/540p/720p). |
| mode | string | No | person | person, object, background | The swap mode to use Default value: person |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to poll for the prediction result |
| data.status | string | Status: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |