FaceNinja

Developers · REST-API

De API voor MetaHuman-hoofden, gebouwd voor batches.

Stuur foto's van een persoon, krijg bericht als het hoofd klaar is, haal het formaat op dat je nodig hebt. Dezelfde call maakt één hoofd of vijfhonderd. Elk hoofd is afgewerkt: 4K-huid, aanbevelingen voor grooms (MetaHuman-haar), een passende nek en 52 ARKit-blendshapes. Een hoofd duurt ongeveer 4 minuten, dus de API is bewust asynchroon.

  • REST + JSON
  • Bearer-keys
  • Ondertekende webhooks
  • Idempotency-keys
  • OpenAPI 3.1
  • llms.txt

Niet te verwarren met de MetaHuman-API's voor Python en C++ van Epic, die binnen Unreal Engine draaien. FaceNinja is een web-API die het hoofd maakt dat je erin brengt.

Sturen. Bericht krijgen. Ophalen.

  1. Sturen.

    POST /v1/heads met 1 tot 15 foto's van één persoon, als multipart-bestanden of als id's die je eerder uploadde. Voeg een Idempotency-Key toe, en een nieuwe poging maakt of factureert nooit een tweede hoofd.

  2. Bericht krijgen.

    Kies hoe: een ondertekende webhook naar je server, een server-sent-eventstream, of een long poll met ?wait=60 voor scripts.

  3. Ophalen.

    Vraag om glb, fbx, obj, stl, ply of metahuman_zip, met of zonder ARKit-blendshapes. Je krijgt een ondertekende link waar geen key voor nodig is. Bewaar de id van het hoofd, niet de link. Wat elk formaat bevat

De credits van een mislukt hoofd komen automatisch terug, en error.code zegt waarom.

Een webhook is alles wat je backend nodig heeft.

Maak het hoofd aan, bewaar de id en handel als wij je aanroepen. Dit is de hele integratie, in Python.

Code
# 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"])

Ingekort om het leesbaar te houden. De referentie EN bevat het volledige request, de handtekeningcontrole en elke fout.

Een cast uit een map, veilig twee keer te draaien.

Een batch bestaat uit veel losse creates. Geef elk een idempotency-key die je afleidt uit je eigen data, zoals de mapnaam, en je kunt het hele script na een crash opnieuw draaien zonder een hoofd twee keer te maken of ervoor te betalen. Laat de webhooks je daarna vertellen welke hoofden klaar zijn.

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}"})
  • Tempo: maximaal 30 hoofden aanmaken per minuut per account. Bij 429 wacht je Retry-After seconden en stuur je dezelfde key opnieuw.
  • Eerst controleren: ?dry_run controleert een create en geeft een prijsopgave terug zonder een hoofd te maken. GET /v1/account toont het saldo.
  • Volgen: GET /v1/heads somt je hoofden op, pagina voor pagina, met hun status.
  • Eén mislukt, niet allemaal: een hoofd dat mislukt meldt zijn eigen error.code, en de credits komen terug. De rest van de batch gaat door.

Of laat je agent de integratie schrijven.

De API-referentie, het OpenAPI-bestand en llms.txt zijn geschreven voor mensen en voor taalmodellen. Geef je agent de skill en hij kan rechtstreeks hoofden voor je maken, of het pipelinescript voor jouw stack schrijven en testen.

Pipelineprompt
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.

Laat deze prompt in het Engels: je agent heeft het webadres precies zo nodig als het er staat. Daarna kun je er in je eigen taal mee praten.

Gebouwd voor retries, wachtrijen en slechte foto's.

Idempotente creates

Dezelfde Idempotency-Key binnen 24 uur geeft hetzelfde hoofd terug, nooit een tweede afschrijving.

Ondertekende webhooks

head.completed en head.failed, met een HMAC-handtekening in FaceNinja-Signature.

Eerlijke wachtrij

Tijdens het wachten meldt een hoofd zijn plek in de rij en een schatting.

Fouten waar je code op kan vertakken

Stabiele error.code-waarden (no_face, not_same_person, content_rejected, …) en een hint.

Terugbetalingen zonder tickets

Credits worden vastgehouden bij het aanmaken, afgeschreven bij voltooiing en vrijgegeven bij een mislukking of verwijdering.

Verwijderen op verzoek

Verwijder een hoofd en de bijbehorende foto's wanneer je wilt. Bestanden verlopen 30 dagen nadat het hoofd klaar is.

De getallen om omheen te ontwerpen.

Limieten
Foto's per hoofd1 tot 15, één persoon; JPEG, PNG, WebP, HEIC/HEIF of AVIF, tot 25 MiB per stuk
Tijd per hoofdOngeveer 4 minuten, plus eventuele wachtrij
Long poll?wait tot 60 s per call
DownloadlinksMoet binnen 60 s starten; een gestarte download wordt afgemaakt
Rate limits600 requests per minuut per account; 30 hoofden aanmaken per minuut
BewaartermijnFoto's en bestanden 30 dagen nadat het hoofd klaar is
Prijs1.500 credits (US$ 15) per hoofd, elk formaat inbegrepen

De referentie is leidend. Wijkt een getal hier af, dan geldt de referentie.

Het gezicht van een speler, vanaf dag één van de savegame.

Laat spelers hun eigen gezicht meebrengen, of bouw een NPC-cast van acteurs die hebben ingestemd. Elk hoofd is dezelfde mesh met een ander gezicht, dus één rig, één materiaal en één animatieset passen op allemaal. De 52 ARKit-blendshapes kun je aansturen met lipsync of met de camera van de speler.

Houd rekening met de wachttijd. Een hoofd duurt ongeveer 4 minuten, geen milliseconden. Start het vroeg, tijdens onboarding of een tutorial, toon intussen een stand-in en wissel het hoofd in zodra de webhook binnenkomt.

GLB voor Unity, Godot en het web; FBX en de MetaHuman ZIP voor Unreal. Unreal-automatisering is beschikbaar in vroege toegang: vraag ernaar.

Onze voorwaarden vereisen toestemming van de persoon op de foto en verbieden foto's van kinderen. Bouw dezelfde regel in je eigen flow in.

Synthetische foto van een oudere man in fel oranje lichtSynthetische foto van een lachende vrouw met brilSynthetische foto van een man met baard en gedraaid hoofdSynthetische foto van een vrouw met lang haar dat haar oren bedekt
Vier synthetische testpersonen, één topologie.

Gebruik je al een andere API van foto naar MetaHuman?

Maakt je integratie al een hoofd aan, wacht die erop en downloadt die een bestand, dan behoudt die hier zijn vorm. Paden, veldnamen en de bestandsstap verschillen, en de migratiegids zet ze call voor call naast elkaar.

Vragen van developers.

01Is er een sandbox?
Voeg ?dry_run toe aan een create-call. Die controleert het verzoek en geeft een prijsopgave terug, zonder een hoofd te maken of kosten in rekening te brengen.
02Kan ik het aanroepen vanuit een browser of mobiele app?
Nee. Houd de key op je server. Ondertekende upload- en downloadlinks hebben geen key nodig, dus een client kan rechtstreeks uploaden of downloaden.
03Welke SDK's zijn er?
Gewoon HTTP en een OpenAPI 3.1-bestand waaruit je een client kunt genereren. De referentie heeft voorbeelden in curl, Node en Python. De CLI van de skill voor agents is ook één Python-bestand dat je kunt lezen en vanuit scripts kunt aanroepen.
04Hoeveel hoofden kan ik tegelijk maken?
Tot 30 hoofden aanmaken per minuut per account, en elk daarvan loopt via de wachtrij. Voor meer dan 1.000 hoofden: schrijf ons over facturering en capaciteit.
05Is dit de MetaHuman-API van Epic?
Nee. De MetaHuman-API's van Epic besturen MetaHuman Creator via scripts binnen Unreal Engine. FaceNinja maakt het hoofd uit foto's, als webservice, en geeft je de bestanden en de MetaHuman ZIP om in Unreal te importeren.
06Kan er een hoofd worden gemaakt uit een set foto's?
Ja, in beta: reconstructie uit meerdere foto's van één sessie geeft ook de camerapositie en brandpuntsafstand van elke foto terug. Schrijf ons als je het wilt proberen met je eigen opnameset.

Nog één API-call tot je eerste hoofd.