Get API key

by PopNow

Face swap with automatic skin-tone matching

popnow/face-swap-v1-plus/editFrom 24 creditsper image · $0.24
  • Face Swap

About Face Swap Plus

Face Swap Plus is the tier that decides for you. It reconciles skin tone between the two photos by itself, judges per pair whether moving the face alone or the whole head reads more naturally, and is the only Face Swap endpoint that lets you choose the output file format. There is an optional instruction field, but our own testing found no visible effect from it — integrate as though it were not there.

Call it with the model name popnow/face-swap-v1-plus/edit on POST /jobs/createTask, from 24 credits per image ($0.24). New accounts get 30 free credits to try it in the Playground first.

Introduction

It moves a face from one image onto the person in another and reconciles skin tone between the two as part of the transfer. How much it moves is decided for you: the engine blends either the face alone or the whole head, whichever reads more naturally for that pair, so the hairline is not always left untouched. The target's pose, wardrobe, lighting and background stay as they were.

Face Swap Plus is the steerable tier of the Face Swap line. On top of the two images it takes a short written instruction, an output file format and a seed, and it is posted to popnow/face-swap-v1-plus/edit.

Key features

Skin tone is reconciled for you

The place a face transfer most often gives itself away is the boundary: a reference shot under warm light dropped into a cool-lit target leaves a ring around the jaw and a neck that no longer belongs to the head. This engine reconciles tone between the two photos as part of the transfer, so a pair that is close but not identical usually lands without a manual colour pass afterwards. It does not make lighting direction irrelevant — a face lit from the other side still reads as wrong — but it takes the most common mismatch off your plate.

The blend depth is decided per pair

This is a smart head swap: for each pair the engine judges whether blending the face alone or the whole head reads more naturally, and there is no setting to force one or the other. That is the practical difference from the rest of the line, where the hairline always stays with the target. It is also why a result can come back with a slightly different hairline than you expected — the engine decided the fuller blend was the more believable of the two options.

Request parameters

ParameterRequiredDescription
image_urlYesThe picture to start from.
output_formatNoFile type of the result. png · jpeg · webp · Default: jpeg
output_qualityNoRequested image quality for the result, from 10 to 100. ≥ 10 · ≤ 100 · Default: 95
promptNoOptional short note guiding one subtle attribute of the result, such as an accessory, an expression or a different hairstyle.
reference_image_urlYesReference face image. The facial identity from this image is transferred onto the target.
seedNoReuse the same number to get a repeatable result. ≥ 0 · ≤ 2147483647

Pricing

Prices are in credits, the same credits you use on the website (1 credit = $0.01). The hold is taken when the task is accepted and settled to the actual charge when it finishes; failed tasks are refunded.

OptionCredits per image≈ USD
Standard24$0.24

For an exact number before you run, send the same body to POST /jobs/quote.

Use cases

Bulk avatar and profile pipelines

A list of target-reference pairs goes through the endpoint programmatically, one call per pair. Pin a seed per pair when a retry has to stay comparable with the first run, and pick WebP when the results are headed straight for the web.

Consumer features behind an upload form

The interaction is one photo from the user and one frame you supply. There is nothing for the user to configure and no prompt for them to write, so the whole feature is a single form field and a background job.

Catalogue and template work

One reference face across a set of prepared frames gives a coherent series without regenerating any of them. The output format setting keeps the files in whatever shape your pipeline already expects; any accessory a template calls for has to be in the frame before the swap.

Prompt guide & pro tips

The instruction field does nothing here

prompt is accepted by the model and capped at 200 characters, but we have not been able to make it change anything.

What we sentWhat came back
add mirrored aviator sunglassesNo sunglasses; identical to sending nothing
wearing black sunglassesNo sunglasses; identical to sending nothing
restyle the hair into a sleek straight bobHair unchanged
soften the expression into a faint half smileExpression unchanged
a wide open-mouthed laughExpression unchanged

Five real calls on 2026-09-20, each compared against the same request with the field left empty. Nothing errors and nothing warns, so the response gives you no way to tell the value was ignored. Build without it — if you need an accessory or a different expression, put it into the target frame before the swap.

What the engine decides for you

Two runs through this endpoint came back with opposite decisions, which is the clearest way to see it:

TargetWhat travelled
A tight black ponytailThe whole head — the reference's red hair arrived with the features
Wet slicked-back hairThe face alone — the target's hair stayed exactly as shot

If you needed an accessory or a different expression

The instruction field cannot get you there, so the change has to exist before the swap runs:

What you wantedWhere to do it instead
Sunglasses, a hat, jewelleryPut it on the person in the target frame before you call this
A different expression or hairstyleShoot or generate the target frame that way; the swap keeps both

Choosing the output format and the seed

Pin a seed only when you intend to compare runs; it gives two runs over the same pair the same draw so a single changed variable is the only thing moving, and it is a comparison tool rather than a promise of a byte-identical image. In production a fresh draw each time is usually what you want.

When the result is not what you wanted

What you seeWhat to change first
A seam at the jaw despite tone matchingUse a reference lit from the same direction — tone is matched, direction is not
The hairline changed and you wanted it keptExpected here; use Face Swap or Face Swap Pro
The instruction had no visible effectExpected — the field has no effect here; change the target frame instead
The wrong person changedCrop the target down to one subject
Features look soft or approximateUse a reference where the face is larger and sharper

Picking the right endpoint for the job

What you needEndpoint
Tone matching and a choice of file formatThis endpoint
Landmark accuracy and the original texture, no knobsFace Swap Pro
The plain swap with a seed, hair always left aloneFace Swap
The whole head, hair included, every timeHead Swap
One face across a moving clipVideo Face Swap

Running it as a batch

Two required fields and three defaults make a batch a loop over pairs.

API quick start

Call the Face Swap Plus API in three steps

  1. Create an API key. Sign in to PopNow and create a key in the API console. Keys start with sk-popnow- and use the same credits as the website.
  2. Send the request. POST /jobs/createTask with model popnow/face-swap-v1-plus/edit and an input object that follows the parameter table. The response returns a task ID straight away.
  3. Get the result. Poll GET /jobs/recordInfo with the task ID, or pass a callBackUrl and we post the result to it. Download the output links when the task succeeds.
# 1. Create the task. Keep the Idempotency-Key if you retry after a network error.
export IDEMPOTENCY_KEY="$(uuidgen)"
curl -X POST https://api.popnow.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
  "model": "popnow/face-swap-v1-plus/edit",
  "input": {
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "reference_image_url": "https://media.popnow.ai/influencer/examples/ava.webp",
    "output_format": "jpeg"
  }
}'

# 2. Copy data.taskId from the response, then poll until state is succeeded, failed, canceled or expired.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

Replace the prompt and any links with your own. The API tab has the response, polling and callback reference.

Face Swap Plus API questions

How much does the Face Swap Plus API cost?

Face Swap Plus costs 24 credits ($0.24) per image. Credits are the same as on the website (1 credit = $0.01), new accounts get 30 free credits, and failed tasks are refunded.

What is the model name for Face Swap Plus in the API?

Put popnow/face-swap-v1-plus/edit for Face Swap in the model field of POST /jobs/createTask.

Which image should go in image_url?

The one being changed. reference_image_url supplies the face. The two are not interchangeable, and swapping them is still a valid request with a completely different outcome, so no error will catch the mistake.

There is a `prompt` field. Does it do anything?

In our own testing, no. On 2026-09-20 we ran five real calls through this endpoint — two asking for sunglasses, one for a different hairstyle, two for a changed expression — and every result was indistinguishable from the same request with the field left empty. The model accepts the value and returns no error and no warning, so a call that relies on it looks like it worked. Treat the field as inert and leave it out.

Does holding the seed guarantee an identical result?

No. It gives two runs over the same pair the same random draw, which makes them fair to compare when you change one thing. It is a comparison tool, not a promise of a byte-identical image.

What do the two images need to look like?

One clearly visible face each, reasonably frontal, in focus and large enough in frame that the features are legible, as JPEG, PNG or WebP. Crop a group shot down to a single subject before sending. Skin tone is reconciled for you, but lighting direction is not, so a reference lit from roughly the same side as the target still gives the cleanest jawline.

What are the limits of the Face Swap Plus API?

Prompt length (characters): 200. Requests outside these limits are rejected before anything is charged.

Can I try Face Swap Plus without writing code?

Yes. The Playground runs Face Swap Plus on your PopNow credits, needs no API key, and shows the matching code for every run.

All Face Swap Plus models

Face Swap Pro keeps the original skin texture with no smoothing; Face Swap moves only the facial features.

More about Face Swap Plus