Face Enhancer Video API Documentation

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 to 3 of 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

ParameterRequiredDescription
videoYesInput video containing the faces to enhance. Supports upload or public URL. Maximum duration: 10 minutes.

How to Use

  1. Upload a video — Provide the source footage by upload or public URL.
  2. Submit — Run the face-enhancement process.
  3. 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 LengthBilled DurationCost
3s3s$0.03
15s15s$0.15
90s90s$0.90
300s300s$3.00
600s600s$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

  • video is the only required parameter.
  • Maximum input duration is 10 minutes.
  • Up to 3 faces 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
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
videostringYes-The video containing the faces to enhance.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<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.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.