Face Enhancer Image API Documentation

Face Enhancer Image API Documentation

Playground

Try it on WaveSpeedAI!

WaveSpeedAI Image Face Enhancer restores and sharpens faces in photos, recovering natural facial detail from blurry, compressed, or low-quality portraits for photo restoration, portrait enhancement, and production workflows. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

Features

Image Face Enhancer restores and sharpens faces in photos while preserving the surrounding image. It automatically detects the most prominent faces, recovers details in areas such as eyes, skin, hair, and teeth, and blends the enhanced regions back into the original image.

The model is designed for portraits, group photos, compressed images, old photographs, and AI-generated images where facial detail needs improvement without applying a full-image restoration pass.


Why Choose This?

  • Automatic face detection
    Detect and enhance up to 3 of the largest faces in the image without masks or manual face selection.

  • Natural face restoration
    Recover facial detail lost to blur, compression, or low resolution while preserving the person’s overall appearance and expression.

  • Occlusion-aware enhancement
    Preserve foreground elements such as hands, hair strands, and glasses when they overlap the face.

  • Localized processing
    Focus restoration on detected faces while keeping the surrounding background, clothing, and composition unchanged.

  • Original-resolution output
    Return the enhanced image at the same resolution as the source.

  • Multiple output formats
    Export the result as jpeg, png, or webp.


Parameters

ParameterRequiredDescription
imageYesInput image containing the faces to enhance. Supports upload or public URL.
output_formatNoOutput image format: jpeg, png, or webp. Default: jpeg.

How to Use

  1. Upload an image — Provide a portrait, group photo, or other image containing visible faces.
  2. Choose output format optional — Select jpeg, png, or webp.
  3. Submit — Run the face-enhancement process.
  4. Retrieve the result — Download the enhanced image at the original resolution.

Pricing

Pricing is fixed at $0.01 per image.

OutputCost
One enhanced image$0.01

output_format does not add a separate charge.


Best Use Cases

  • Old and low-quality photos — Restore facial detail in scanned, compressed, soft, or blurry portraits.
  • AI-generated images — Improve soft or distorted faces in generated artwork and photography.
  • Portrait enhancement — Sharpen facial details while preserving the surrounding image.
  • Social media and profile images — Improve face clarity for avatars, posts, and promotional imagery.
  • Group photos — Enhance up to three prominent faces in a single image.
  • E-commerce and marketing images — Improve facial detail in people-focused campaign and product imagery.

Pro Tips

  • Use images where the important faces are reasonably visible and large enough for restoration.
  • The model prioritizes the largest detected faces when more than three faces are present.
  • Very small, heavily blurred, or strongly occluded faces may show less improvement.
  • Choose png when you want to avoid additional lossy compression.
  • For group photos, make sure the faces you care about are among the most prominent in the frame.
  • Image Face Enhancer works best when facial structure is still recognizable in the source image.

Notes

  • image is required.
  • output_format defaults to jpeg.
  • Supported output formats are jpeg, png, and webp.
  • Up to 3 faces are enhanced per image, prioritizing the largest detected faces.
  • Output resolution matches the input image resolution.
  • The model primarily targets real human faces; illustrated or anime-style faces may show limited improvement.
  • Make sure you have permission to use uploaded images 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'
{
  "image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
  "output_format": "jpeg"
}
JSON
)

# 1. Submit the prediction once. Never retry this request automatically:
# a retry after an unclear failure can create a second, billed task.
CHECK='The task may already exist. Check History or the predictions list before submitting again.'
if ! SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  --connect-timeout 10 --max-time 60 \
  -X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/face-enhancer/image" \
  -H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
  -H "Content-Type: application/json" \
  -d "${REQUEST_BODY}"); then
  printf 'Submit failed. %s\n' "${CHECK}" >&2
  exit 1
fi

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. %s\n' "${CHECK}" >&2
  exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"

# 2. Poll until the prediction reaches a final status.
BODY_FILE=$(mktemp)
trap 'rm -f "${BODY_FILE}"' EXIT
while true; do
  # Transient errors (429, 5xx) are retried, honoring Retry-After.
  HTTP_CODE=$(curl --silent --show-error --fail-with-body \
    --connect-timeout 10 --max-time 60 --retry 5 --retry-delay 2 \
    --output "${BODY_FILE}" --write-out '%{http_code}' \
    "${RESULT_URL}" \
    -H "Authorization: Bearer ${WAVESPEED_API_KEY}" || true)
  case "${HTTP_CODE}" in
    2??) ;;
    000|429|5??)  # dropped connection or temporary error: keep polling
      printf 'Task %s: HTTP %s, polling again in 10s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      sleep 10; continue ;;
    *) printf 'Task %s: HTTP %s\n' "${PREDICTION_ID}" "${HTTP_CODE}" >&2
      cat "${BODY_FILE}" >&2; exit 1 ;;
  esac
  RESULT=$(jq 'if type == "object" and has("data") then .data else . end' "${BODY_FILE}")
  STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')

  case "${STATUS}" in
    completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
    failed|cancelled|timeout|deleted)
      printf 'Task %s ended with status %s\n' "${PREDICTION_ID}" "${STATUS}" >&2
      printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
    *) sleep 2 ;;
  esac
done

Retry temporary errors only while polling, never the submit request. Errors, retries and timeouts

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
imagestringYes-The image containing the faces to enhance.
output_formatstringNojpegjpeg, png, webpThe format of the output image.

Every model also accepts the global request options enable_sync_mode and enable_base64_output; see their pages for details.

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.