Введение
Модель переносит лицо с одного изображения на человека на другом и заодно выравнивает между ними тон кожи. Сколько переносить, решает движок: он вживляет либо только лицо, либо всю голову — что выглядит естественнее для этой пары, — поэтому линия роста волос не всегда остаётся нетронутой. Поза, одежда, свет и фон целевого кадра остаются прежними.
Face Swap Plus — настраиваемый уровень линейки Face Swap. Кроме двух изображений он принимает короткую письменную инструкцию, формат выходного файла и seed и отправляется на spicyapi/face-swap-v1-plus/edit. Вызов асинхронный: он возвращает id задачи, вы опрашиваете эту задачу, а каждый запрос возвращает одно изображение с оплатой за каждое выходное изображение независимо от выбранного формата.
Ключевые возможности и особенности
Тон кожи выравнивается автоматически
Чаще всего замену лица выдаёт граница: референс, снятый в тёплом свете, вставленный в холодно освещённый кадр, оставляет ореол вокруг челюсти и шею, которая больше не подходит к голове. Этот движок выравнивает тон двух фотографий прямо при переносе, поэтому близкая, но не идентичная пара обычно встаёт без ручной цветокоррекции. Направление света по-прежнему важно — лицо, освещённое с другой стороны, всё равно выглядит неправильно, — но самое частое расхождение движок берёт на себя.
Глубина вживления решается для каждой пары
Это умная замена головы: для каждой пары движок оценивает, что выглядит естественнее — вживить только лицо или всю голову, — и настройки, чтобы навязать тот или иной вариант, нет. В этом практическое отличие от остальной линейки, где линия роста волос всегда остаётся от целевого кадра. По той же причине результат может вернуться с чуть иной линией роста волос, чем вы ожидали: движок счёл полное вживление более правдоподобным.
Параметры запроса
| Параметр | Обязательно | Описание |
|---|---|---|
image_url | Да | Изображение, которое меняют. Не менее 1 символов |
reference_image_url | Да | Изображение, которое даёт черты лица. Не менее 1 символов |
prompt | Нет | Необязательное поле, но стройте так, будто его нет. Не более 200 символов |
output_format | Нет | Формат файла возвращаемого изображения. |
output_quality | Нет | Запрашиваемое качество изображения результата, от 10 до 100 (по умолчанию 95). На цену не влияет. |
seed | Нет | Повторно используйте зерно, чтобы сравнить два прогона по одной паре изображений при одинаковой выборке: тогда двигается только то единственное, что вы изменили. |
Стоимость
$0.16 / изображение
Сценарии использования
Массовые конвейеры аватаров и фото профиля
Список пар «целевой кадр — референс» проходит через эндпоинт программно, по одному вызову на пару. Фиксируйте seed для пары, когда повторная попытка должна быть сопоставима с первым запуском, и выбирайте WebP, если результаты сразу идут в веб.
Пользовательские функции за формой загрузки
Взаимодействие — одно фото от пользователя и одно изображение от вас. Пользователю нечего настраивать и не нужно писать промпт, так что вся функция — одно поле формы и одна фоновая задача.
Каталоги и шаблоны
Одно и то же лицо-референс на серии заранее подготовленных кадров даёт цельную серию, не генерируя ни один из них заново. Настройка формата отдаёт файлы в том виде, которого уже ждёт ваш конвейер; любой аксессуар, который требует шаблон, должен быть в кадре до замены.
Кадры без цензуры: граница — согласие, а не тема
SpicyAPI не добавляет собственного фильтра контента и не требует флага зрелости, поэтому в теле запроса те же поля, что бы ни было в кадре. Не смягчается другое — право на использование: нужно явное информированное согласие изображённого человека на использование именно этого лица в именно этом материале, а публичность фотографии никогда не означает согласия.
Руководство по промптам и практические советы
Поле инструкции здесь ничего не делает
Базовая модель принимает prompt длиной до 200 символов, но нам не удалось ничего им изменить.
| Что мы отправили | Что вернулось |
|---|---|
add mirrored aviator sunglasses | Солнечных очков нет; то же, что и без инструкции |
wearing black sunglasses | Солнечных очков нет; то же, что и без инструкции |
restyle the hair into a sleek straight bob | Волосы без изменений |
soften the expression into a faint half smile | Выражение без изменений |
a wide open-mouthed laugh | Выражение без изменений |
Пять реальных вызовов 20 сентября 2026 года, каждый сравнивался с тем же запросом с пустым полем. Ни ошибки, ни предупреждения, так что по ответу нельзя понять, что значение проигнорировано. Стройте интеграцию без этого поля: если нужен аксессуар или другое выражение лица, добавьте их в целевой кадр до замены.
Что движок решает за вас
Два прогона через этот эндпоинт вернулись с противоположными решениями — так это видно лучше всего:
| Целевой кадр | Что перенеслось |
|---|---|
| Тугой чёрный хвост | Голова целиком — рыжие волосы референса пришли вместе с чертами |
| Мокрые волосы, зачёсанные назад | Только лицо — волосы целевого кадра остались как на снимке |
Если нужен был аксессуар или другое выражение
Поле инструкции туда не доведёт, поэтому изменение должно существовать до замены:
| Чего вы хотели | Где сделать это вместо этого |
|---|---|
| Солнечные очки, шляпа, украшения | Наденьте их на человека в целевом кадре до вызова |
| Другое выражение лица или причёска | Снимите или сгенерируйте целевой кадр именно так; замена сохранит и то и другое |
Выбор выходного формата и seed
Задавайте output_format, когда тип файла важен дальше по конвейеру, потому что конвертация потом означает повторное кодирование: PNG — для файла без потерь, который вы будете дорабатывать, WebP — для результатов, которые сразу идут в веб, JPEG — если ничего не указано. Ни один из трёх не меняет цену, так что выбирайте тот, что нужен конвейеру, а не тот, что кажется дешевле. Фиксируйте seed, только если собираетесь сравнивать прогоны: два прогона на одной паре получают одинаковую генерацию, и меняется только одна изменённая переменная. Это инструмент сравнения, а не обещание побайтно идентичного изображения. В продакшне обычно нужна свежая генерация при каждом вызове.
Если результат не тот, что нужен
| Что вы видите | Что изменить в первую очередь |
|---|---|
| Шов на челюсти, несмотря на подбор тона | Взять референс, освещённый с той же стороны: тон выравнивается, направление — нет |
| Изменилась линия роста волос, а её нужно было сохранить | Здесь так и задумано; используйте Face Swap или Face Swap Pro |
| Инструкция не дала видимого эффекта | Так и задумано: поле здесь не работает; меняйте целевой кадр |
| Изменился не тот человек | Обрезать целевой кадр до одного человека |
| Черты мягкие или приблизительные | Взять референс, где лицо крупнее и резче |
Выбор подходящего эндпоинта
| Что вам нужно | Эндпоинт |
|---|---|
| Подбор тона кожи и выбор формата файла | Этот эндпоинт |
| Точность по ключевым точкам и исходная текстура, без настроек | Face Swap Pro |
| Простая замена с seed, волосы никогда не затрагиваются | Face Swap |
| Голова целиком, вместе с волосами, всегда | Head Swap |
| Одно лицо на протяжении всего движущегося клипа | Video Face Swap |
Пакетный запуск
Два обязательных поля и три значения по умолчанию превращают пакет в обычный цикл по парам. Отправляйте каждый вызов создания с Idempotency-Key и храните id задачи рядом с записью, которая её запустила; если соединение оборвётся, повтор запроса с тем же ключом вернёт исходную задачу, а не запустит вторую со второй оплатой. Опрашивайте каждые несколько секунд и копируйте каждый результат в собственное хранилище: сгенерированные файлы удаляются через 14 дней, а загруженные исходные изображения — через один.
Быстрый старт API
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "spicyapi/face-swap-v1-plus/edit",
"input": {
"image_url": "https://example.com/reference.png",
"output_format": "jpeg",
"reference_image_url": "https://example.com/reference.png"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
Аутентификация, полная схема, опрос статуса и обработка ошибок описаны в справочнике API.









