WaveSpeedAI Face Swapper
name: wavespeed-face-swapper
by chengzeyi · published 2026-03-22
$ claw add gh:chengzeyi/chengzeyi-wavespeed-face-swapper---
name: wavespeed-face-swapper
description: Swap faces in images and videos using WaveSpeed AI. Supports image face swap and video face swap with multi-face targeting. Produces watermark-free results with automatic lighting and skin tone adaptation. Use when the user wants to replace a face in an image or video with another face.
metadata:
author: wavespeedai
version: "1.0"
---
# WaveSpeedAI Face Swapper
Swap faces in images and videos using WaveSpeed AI. Produces watermark-free results with automatic lighting and skin tone adaptation. Supports targeting specific faces when multiple people are present.
Authentication
export WAVESPEED_API_KEY="your-api-key"Get your API key at [wavespeed.ai/accesskey](https://wavespeed.ai/accesskey).
Quick Start
Image Face Swap
import wavespeed from 'wavespeed';
// Upload local images to get URLs
const imageUrl = await wavespeed.upload("/path/to/target-photo.png");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
}
))["outputs"][0];Video Face Swap
import wavespeed from 'wavespeed';
// Upload local files to get URLs
const videoUrl = await wavespeed.upload("/path/to/video.mp4");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/video-face-swap",
{
video: videoUrl,
face_image: faceUrl
}
))["outputs"][0];You can also pass existing URLs directly:
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: "https://example.com/target-photo.jpg",
face_image: "https://example.com/reference-face.jpg"
}
))["outputs"][0];API Endpoints
Image Face Swap
**Model ID:** `wavespeed-ai/image-face-swap`
Replace a face in an image with a reference face.
#### Parameters
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `image` | string | Yes | -- | URL of the image containing the face to replace |
| `face_image` | string | Yes | -- | URL of the reference face image to swap in |
| `target_index` | integer | No | `0` | Which face to replace (0 = largest face, 1-10 for others) |
| `output_format` | string | No | `jpeg` | Output format. One of: `jpeg`, `png`, `webp` |
#### Example
import wavespeed from 'wavespeed';
const imageUrl = await wavespeed.upload("/path/to/group-photo.png");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl,
target_index: 0,
output_format: "png"
}
))["outputs"][0];#### Targeting a Specific Face
When multiple people are in the image, use `target_index` to select which face to replace:
// Replace the second-largest face in the image
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl,
target_index: 1
}
))["outputs"][0];Video Face Swap
**Model ID:** `wavespeed-ai/video-face-swap`
Replace a face in a video with a reference face. Supports videos up to 10 minutes.
#### Parameters
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `video` | string | Yes | -- | URL of the video containing the face to replace. Must be publicly accessible. Max 10 minutes. |
| `face_image` | string | Yes | -- | URL of the reference face image to swap in |
| `target_index` | integer | No | `0` | Which face to replace (0 = largest face, 1-10 for others) |
#### Example
import wavespeed from 'wavespeed';
const videoUrl = await wavespeed.upload("/path/to/video.mp4");
const faceUrl = await wavespeed.upload("/path/to/reference-face.png");
const output_url = (await wavespeed.run(
"wavespeed-ai/video-face-swap",
{
video: videoUrl,
face_image: faceUrl,
target_index: 0
}
))["outputs"][0];Advanced Usage
Sync Mode (Image Face Swap only)
const output_url = (await wavespeed.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
},
{ enableSyncMode: true }
))["outputs"][0];Custom Client with Retry Configuration
import { Client } from 'wavespeed';
const client = new Client("your-api-key", {
maxRetries: 2,
maxConnectionRetries: 5,
retryInterval: 1.0,
});
const output_url = (await client.run(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
}
))["outputs"][0];Error Handling with runNoThrow
import { Client, WavespeedTimeoutException, WavespeedPredictionException } from 'wavespeed';
const client = new Client();
const result = await client.runNoThrow(
"wavespeed-ai/image-face-swap",
{
image: imageUrl,
face_image: faceUrl
}
);
if (result.outputs) {
console.log("Output URL:", result.outputs[0]);
console.log("Task ID:", result.detail.taskId);
} else {
console.log("Failed:", result.detail.error.message);
if (result.detail.error instanceof WavespeedTimeoutException) {
console.log("Request timed out - try increasing timeout");
} else if (result.detail.error instanceof WavespeedPredictionException) {
console.log("Prediction failed");
}
}Pricing
| Operation | Cost |
|-----------|------|
| Image face swap | $0.01 per image |
| Video face swap | $0.01 per second (minimum $0.05 / 5 seconds) |
Video face swap supports videos up to 10 minutes.
Tips
Security Constraints
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...