FaceNinja

Розробникам · REST API

API голів MetaHuman, створений для партій.

Надішліть фото людини, дочекайтеся повідомлення, що голова готова, і заберіть потрібний формат. Той самий виклик створює одну голову чи п'ятсот. Кожна голова готова: шкіра 4K, рекомендації щодо groom (волосся MetaHuman), підігнана шия та 52 форми ARKit. Голова робиться приблизно 4 хвилини, тому API за задумом асинхронний.

  • REST + JSON
  • Ключі Bearer
  • Підписані webhooks
  • Ключі ідемпотентності
  • OpenAPI 3.1
  • llms.txt

Не плутайте з API MetaHuman для Python і C++ від Epic, які працюють усередині Unreal Engine. FaceNinja — веб-API, що створює голову, яку ви переносите в них.

Надіслати. Дочекатися. Забрати.

  1. Надіслати.

    POST /v1/heads із 1–15 фото однієї людини, як multipart-файли або id, які ви завантажили раніше. Додайте Idempotency-Key, і повторний запит ніколи не створить і не оплатить другу голову.

  2. Дочекатися.

    Оберіть спосіб: підписаний webhook на ваш сервер, потік server-sent events або довге опитування ?wait=60 для скриптів.

  3. Забрати.

    Запитайте glb, fbx, obj, stl, ply або metahuman_zip, з формами ARKit або без них. Ви отримаєте підписане посилання, якому ключ не потрібен. Зберігайте id голови, а не посилання. Що містить кожен формат

Кредити за невдалу голову повертаються автоматично, а error.code пояснює причину.

Вашому бекенду потрібен лише webhook.

Створіть голову, збережіть її id і дійте, коли ми зателефонуємо вам. Це вся інтеграція, на Python.

Код
# when the user confirms their photos
head = api.post("/v1/heads", files=photos,
                data={"webhook_url": "https://you.example/hooks/faceninja"},
                headers={"Idempotency-Key": str(uuid4())}).json()
save(user, head["id"])

# later, FaceNinja calls you
@app.post("/hooks/faceninja")
def on_head(event = verified(request)):        # check FaceNinja-Signature first
    if event["type"] == "head.completed":
        link = api.post(f"/v1/heads/{event['data']['id']}/files",
                        json={"format": "glb", "arkit": True}).json()
        store_on_your_cdn(link["url"])

Скорочено для читання. У довіднику EN є повний запит, перевірка підпису й усі помилки.

Акторський склад із папки, який безпечно запускати двічі.

Партія — це багато окремих створень. Дайте кожному ключ ідемпотентності, виведений зі своїх даних, наприклад з назви папки, і ви зможете перезапустити весь скрипт після збою, не створюючи й не оплачуючи голову двічі. А далі нехай webhooks повідомляють, які голови готові.

Python
for person in sorted(Path("cast").iterdir()):            # one folder per person
    photos = [("photos", open(p, "rb")) for p in sorted(person.glob("*.jpg"))]
    api.post("/v1/heads", files=photos,
             data={"name": person.name, "webhook_url": HOOK},
             headers={"Idempotency-Key": f"cast-2026-10/{person.name}"})
  • Темп: до 30 створень голів на хвилину на акаунт. Якщо 429, зачекайте Retry-After секунд і надішліть той самий ключ знову.
  • Спершу перевірте: ?dry_run перевіряє створення й повертає кошторис без створення голови. GET /v1/account показує баланс.
  • Стежте: GET /v1/heads перелічує ваші голови по сторінках разом зі статусом.
  • Одна невдача — не всі: голова, що не вдалася, повідомляє власний error.code, а її кредити повертаються. Решта партії триває.

Або доручіть інтеграцію агентові.

Довідник API, файл OpenAPI і llms.txt написано для людей і для мовних моделей. Дайте агентові навичку, і він зможе створювати голови для вас напряму або написати й протестувати скрипт конвеєра для вашого стеку.

Промпт для конвеєра
Read https://faceninja.net/llms.txt and https://faceninja.net/skill/SKILL.md. Write a Python script for our pipeline: for each new folder in ./incoming, create one FaceNinja head from its photos with an Idempotency-Key derived from the folder name and a webhook_url I give you. Add a small web handler that checks the FaceNinja-Signature header, and on head.completed downloads the FBX to ./heads/<folder name>; on head.failed it logs error.code. Read the API key from FACENINJA_API_KEY. Don't run anything against my account until I say so.

Залиште цей промпт англійською: агентові потрібна вебадреса саме в такому вигляді. Потім можна спілкуватися з ним своєю мовою.

Створено для повторів, черг і поганих фото.

Ідемпотентні створення

Той самий Idempotency-Key протягом 24 годин повертає ту саму голову, а не друге списання.

Підписані webhooks

head.completed і head.failed з підписом HMAC у FaceNinja-Signature.

Чесна черга

Поки голова чекає, вона повідомляє своє місце в черзі та оцінку часу.

Помилки, за якими можна розгалужувати логіку

Стабільні значення error.code (no_face, not_same_person, content_rejected, …) і hint.

Повернення без звернень у підтримку

Кредити резервуються під час створення, списуються по завершенні й звільняються у разі невдачі або видалення.

Видалення за запитом

Видаляйте голову та її фото, коли захочете. Термін зберігання файлів спливає через 30 днів після завершення голови.

Цифри, під які варто проєктувати.

Обмеження
Фото на головуВід 1 до 15, одна людина; JPEG, PNG, WebP, HEIC/HEIF або AVIF, до 25 MiB кожне
Час на головуПриблизно 4 хвилини плюс черга, якщо є
Довге опитування?wait до 60 s за виклик
Посилання для завантаженняПочати завантаження можна протягом 60 s; розпочате завантаження завершується
Ліміти запитів600 запитів на хвилину на акаунт; 30 створень голів на хвилину
ЗберіганняФото й файли — 30 днів після завершення голови
Ціна1 500 кредитів (15 USD) за голову, усі формати включено

Довідник — джерело істини. Якщо число тут відрізняється, чинним є довідник.

Обличчя гравця вже в першому збереженні.

Дозвольте гравцям використати власне обличчя або зберіть склад NPC з акторів, які погодилися. Кожна голова — той самий меш з іншим обличчям, тож один риг, один матеріал і один набір анімацій підходять усім. 52 форми ARKit приймають синхронізацію губ або камеру гравця.

Враховуйте очікування. Голова створюється приблизно 4 хвилини, а не мілісекунди. Запускайте її заздалегідь, під час вступу чи навчання, показуйте тимчасову заміну й підміняйте голову, коли надійде webhook.

GLB для Unity, Godot і вебу; FBX і MetaHuman ZIP для Unreal. Автоматизація Unreal перебуває на етапі раннього доступу: запитайте доступ.

Наші умови вимагають дозволу людини на фото й забороняють фото дітей. Закладіть те саме правило у свій потік.

Синтетичне фото літнього чоловіка під жорстким помаранчевим світломСинтетичне фото жінки, яка сміється, в окулярахСинтетичне фото чоловіка з бородою та повернутою головоюСинтетичне фото жінки, чиє довге волосся закриває вуха
Чотири синтетичні тестові особи, одна топологія.

Уже користуєтеся іншим API, що перетворює фото на MetaHuman?

Якщо ваша інтеграція вже створює голову, чекає на неї й завантажує файл, вона зберігає свою форму й тут. Шляхи, назви полів і крок із файлом відрізняються, а посібник із переходу зіставляє їх виклик за викликом.

Запитання розробників.

01Чи є пісочниця?
Додайте ?dry_run до виклику створення. Він перевіряє запит і повертає кошторис, не створюючи голову й не списуючи кошти.
02Чи можна викликати його з браузера або мобільного застосунку?
Ні. Тримайте ключ на своєму сервері. Підписані посилання для завантаження на сервер і з нього не потребують ключа, тож клієнт може завантажувати файли напряму.
03Які є SDK?
Звичайний HTTP і файл OpenAPI 3.1, з якого можна згенерувати клієнта. У довіднику є приклади для curl, Node і Python. CLI навички для агентів — теж один файл Python, який можна прочитати й викликати зі скриптів.
04Скільки голів можна створювати одночасно?
До 30 створень голів на хвилину на акаунт, і кожне йде в чергу. Якщо голів понад 1 000, напишіть нам про виставлення рахунків і потужності.
05Чи це API MetaHuman від Epic?
Ні. API MetaHuman від Epic керують MetaHuman Creator скриптами всередині Unreal Engine. FaceNinja створює голову з фото як вебсервіс і віддає вам файли та MetaHuman ZIP, щоб ви перенесли їх в Unreal.
06Чи можна створити голову з набору фото?
Так, у бета-версії: реконструкція з кількох фото однієї сесії також повертає положення камери та фокусну відстань кожного фото. Напишіть нам, якщо хочете спробувати на своєму наборі знімків.

До вашої першої голови — один виклик API.