Face Enhancer Video API Documentation
Playground
Try it on WaveSpeedAI!WaveSpeedAI Video Face Enhancer restores and sharpens faces throughout videos with stable, flicker-free results while preserving the original audio, making it suitable for face restoration, video enhancement, archival footage, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
Video Face Enhancer restores and sharpens faces throughout a video while preserving the original motion, framing, and audio. It tracks faces across frames, enhances details such as eyes, skin, hair, and teeth, and blends the restored regions back into the footage with improved temporal consistency.
The model is designed for low-resolution, compressed, soft, or AI-generated footage where facial detail needs to be recovered without changing the rest of the scene.
Why Choose This?
-
Temporally stable face enhancement
Face landmarks are tracked and smoothed across frames to reduce shimmer and frame-to-frame instability. -
Natural facial restoration
Recover detail lost to blur, compression, or low resolution while preserving the subject’s identity and expression. -
Occlusion-aware processing
Preserve foreground elements such as hands, hair strands, and glasses when they overlap the face. -
Multi-face support
Enhance up to3of the largest detected faces in each frame. -
Original audio preserved
Keep the source video’s audio track in the final output. -
Simple workflow
Upload a video and generate the enhanced result without additional tuning parameters.
Parameters
| Parameter | Required | Description |
|---|---|---|
| video | Yes | Input video containing the faces to enhance. Supports upload or public URL. Maximum duration: 10 minutes. |
How to Use
- Upload a video — Provide the source footage by upload or public URL.
- Submit — Run the face-enhancement process.
- Retrieve the result — Preview and download the enhanced video.
Pricing
Pricing is based on the input video duration.
The rate is $0.01 per billed second, equivalent to $0.05 per 5 seconds.
Input duration is rounded up to the next whole second, with a minimum billed duration of 3 seconds.
| Video Length | Billed Duration | Cost |
|---|---|---|
| 3s | 3s | $0.03 |
| 15s | 15s | $0.15 |
| 90s | 90s | $0.90 |
| 300s | 300s | $3.00 |
| 600s | 600s | $6.00 |
The minimum charge is $0.03.
Best Use Cases
- Old and compressed footage — Restore facial detail in archival, low-resolution, or heavily compressed videos.
- AI-generated video — Improve soft or unstable-looking faces in generated footage.
- Interviews and vlogs — Enhance facial clarity in talking-head and creator content.
- Social media video — Improve face detail before publishing short-form or promotional content.
- Portrait-focused footage — Restore facial detail while keeping the surrounding scene intact.
Pro Tips
- Use footage where faces are reasonably visible for stronger restoration results.
- The model prioritizes the largest detected faces when more than three faces appear in a frame.
- Enhancement works best when the source still contains enough facial structure for the model to recover.
- Very small, heavily obscured, or extremely blurred faces may show less improvement.
- Review glasses, hair, hands, and other overlapping elements when the face is heavily occluded.
- For AI-generated footage, use the enhancer after video generation when facial softness or detail loss is the main issue.
Notes
videois the only required parameter.- Maximum input duration is
10minutes. - Up to
3faces are enhanced per frame, prioritizing the largest detected faces. - The original audio track is preserved in the output.
- The model is primarily designed for real human faces; illustrated or anime-style faces may show limited improvement.
- Make sure you have permission to use the uploaded footage and likenesses.
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'
{
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/face-enhancer/video" \
-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="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 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|deleted) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| video | string | Yes | - | The video containing the faces to enhance. |
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.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| 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.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| 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 |