Face Swap Plus · Image Editing
Skin tone is 90% of why swaps look fake
- image_url
- reference_image_url
- images
- task id
The version that thinks for you
Most face swaps that fail don't fail at identity - they fail at colour. The reference face comes from a different photo session under different light, the skin doesn't match the neck, and the whole thing reads as a sticker. Fixing that by hand is thirty minutes in Photoshop per image, which is nobody's idea of a pipeline.
Face Swap Plus exists to skip that step. It matches skin tone between the two photos automatically and decides for itself whether to blend the face alone or the whole head. $0.16 per image - same as Pro, and it's the "I don't want to fiddle" option of the three image swaps.
How it works
Two images in, one out, plus an optional short prompt. It calls spicyapi/face-swap-v1-plus/edit and returns the composite as a ComfyUI IMAGE with a task id alongside. Under the hood it's an ArcFace-family identity transfer with an added tonematching and blending stage - the same lineage as IP-Adapter FaceID, InstantID and ReActor locally (all of which share one recognition backbone, a monoculture the community keeps rediscovering), packaged so you never touch a weight file.
Inputs
image_url (IMAGE) - the target: the face that gets replaced.
reference_image_url (IMAGE) - the reference face. The facial identity from this image is transferred onto the target.
prompt (STRING) - the odd one out, and it's subtle by design. A short note guiding one attribute of the result: an accessory, an expression, a different hairstyle. One. If you write three clauses you're fighting the model. This is the field that makes Plus more than a Pro clone - you can nudge the expression of the person you're swapping in.
output_format - png, jpeg or webp, default jpeg.
output_quality - 10 to 100, default 95. Advanced. Only meaningful for the lossy formats; at 95 you will not see the difference on a normal photo.
seed - fixed by default. The tooltip's own framing is the useful one: reuse the seed to keep two runs over the same image pair comparable. That's exactly what you want in Plus, because the prompt gives you something to vary.
Outputs: images (IMAGE), task id (STRING).
Install
Manager → search SpicyAPI, or:
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi
Restart. Nothing to pip install, nothing to download - the pack declares zero dependencies, and every node runs on SpicyAPI's servers, so a laptop is enough. Python 3.10+ and a ComfyUI with the V3 node API. Add the key in Settings > SpicyAPI (or set SPICY_API_KEY on a server), restart once so the node list comes from your account, and set Max cost per run before you start batching - at $0.16 per image a 20-image sweep is real money.
Where it gets you
- It won't fix a bad reference. Tone matching doesn't invent features. One clear, frontal, evenly lit face is still the input that matters.
- The prompt is a nudge, not a generation. Ask for a different person and you'll get a worse swap rather than a new one.
jpegdefault is fine. Don't reach forpnghoping for more detail; the model's output is the ceiling, not the container.- Texture is the trade vs Pro. Plus is willing to blend; Pro refuses to retouch. If you're preserving grain and pores, Pro is the right $0.16.
- Multi-person images. No
face_mappinghere - one face per run. If you need to say which of four faces, use Face Swap v1. - Everything leaves your machine. Same structural caveat as every hosted node in this pack: your reference photos go to a third party.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| image_url | IMAGE | Target image. The face of the person in this image is the one that gets replaced. | |
| reference_image_url | IMAGE | Reference face image. The facial identity from this image is transferred onto the target. | |
| prompt | STRING | Optional short note guiding one subtle attribute of the result, such as an accessory, an expression or a different hairstyle. | |
| output_format | COMBO | JPEG | File format of the returned image. |
| output_quality | INT | 9510–100 | Requested image quality for the result, from 10 to 100. |
| seed | INT | 00–2147483647 | Same seed and settings, same result. Set 'control after generate' to randomize to get a new result on every run; every run is billed. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| task id | STRING | The SpicyAPI task id, for the console logs or support. |