Half Moon Ai Video Face Swap Multi
Playground
Try it on WavespeedAI!Half-Moon AI Video Multi-Face Swap swaps multiple faces in a video based on gender matching. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Video Face Swap Multi
Video Face Swap Multi is an AI-powered face-swapping model that can transfer up to two faces onto a target video simultaneously. It uses gender-based matching to accurately assign each source face to the correct person, delivering smooth, temporally consistent multi-face swaps across every frame.
Why Choose This?
-
Multi-face video swap in one pass Swap up to two faces in a single video at once — no need to run separate jobs per face.
-
Gender-based face matching Specify the gender for each source face so the model accurately maps faces to the right people throughout the video.
-
Frame-by-frame consistency The swapped faces stay stable across all frames with minimal flicker or jitter, even during motion and camera changes.
-
Natural blending Skin tone, lighting, and shadows are dynamically matched per face and per frame for realistic results.
-
Built-in safety checker Optional safety filter to screen outputs for inappropriate content.
Parameters
| Parameter | Required | Description |
|---|---|---|
| source_face_1 | Yes | The first face image to transfer (upload or public URL). |
| source_gender_1 | Yes | Gender of the first source face (female / male). Used for matching. |
| source_face_2 | No | The second face image to transfer (upload or public URL). |
| source_gender_2 | No | Gender of the second source face (female / male). Used for matching. |
| target_video | Yes | The video that will receive the swapped faces (upload or public URL). |
| Enable Safety Checker | No | Toggle the built-in content safety filter (enabled by default). |
How to Use
- Upload source_face_1 and select the matching source_gender_1.
- (Optional) Upload source_face_2 and select source_gender_2 to swap a second face.
- Upload the target video — a video containing one or two people.
- Run — the model matches each source face by gender and processes the video frame by frame.
- Download the output video.
Pricing
$0.03 per second of the target video.
Billing Rules
- Billed by the duration of the target video in seconds
Examples
| Video Length | Cost |
|---|---|
| 5s | $0.15 |
| 10s | $0.30 |
| 30s | $0.90 |
| 60s | $1.80 |
Best Use Cases
- Group Video Edits — Swap multiple faces in couple or group videos in one step.
- Content Creation — Create fun multi-face-swap video content for social media and entertainment.
- Marketing & Advertising — Produce personalized video content featuring different face combinations.
- Pre-visualization — Test different face pairings in video projects before full production.
Pro Tips
- Use clear, well-lit source faces with minimal occlusion for the best results.
- Make sure the gender selection matches each source face — incorrect gender assignment may cause faces to swap onto the wrong person.
- For single-face video swaps, just provide source_face_1 and leave source_face_2 empty. Or use Video Face Swap for a simpler workflow.
- Shorter clips process faster and cost less — trim to key segments when possible.
Notes
- If you provide a URL instead of uploading locally, make sure the URL is publicly accessible. A successfully accessible image or video will display a preview in the interface.
- The Safety Checker is enabled by default. Disable it only if you are confident your inputs and outputs comply with platform policies.
- Please use this model responsibly and in compliance with applicable laws and platform policies.
Related Models
- Video Face Swap — Single-face video swap at $0.024/s.
- Image Face Swap Multi — Multi-face swap for still images at $0.012 per image.
- Image Face Swap — Single-face swap for still images at $0.009 per image.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
# Submit the task
curl --location --request POST "https://api.wavespeed.ai/api/v3/half-moon-ai/video-face-swap-multi" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}" \
--data-raw '{
"source_gender_1": "female",
"source_gender_2": "male"
}'
# Get the result
curl --location --request GET "https://api.wavespeed.ai/api/v3/predictions/${requestId}/result" \
--header "Authorization: Bearer ${WAVESPEED_API_KEY}"
Parameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| source_face_1 | string | Yes | - | - | First source face image (mapped to faces matching source_gender_1). |
| source_gender_1 | string | Yes | female | female, male | Gender of source 1 face — target faces matching this gender will be swapped. |
| source_face_2 | string | No | - | - | Second source face image (optional, mapped to faces matching source_gender_2). |
| source_gender_2 | string | No | male | female, male | Gender of source 2 face — required when source_face_2 is provided. |
| target_video | string | Yes | - | - | Target video to swap faces onto (max 25 min, 25 FPS cap; avi, m4v, mkv, mp4, mpeg, mov, mxf, webm, wmv). |
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 | Array of URLs to the generated content (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.has_nsfw_contents | array | Array of boolean values indicating NSFW detection for each output |
| 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, the ID of the prediction to get |
| data.model | string | Model ID used for the prediction |
| data.outputs | string | Array of URLs to the generated video. |
| 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 |