FaceNinja

Desenvolvedores · API REST

A API de cabeças MetaHuman, feita para lotes.

Envie fotos de uma pessoa, receba o aviso quando a cabeça ficar pronta e busque o formato de que precisa. A mesma chamada cria uma cabeça ou quinhentas. Toda cabeça vem pronta: pele 4K, recomendações de groom (cabelo do MetaHuman), pescoço ajustado e 52 blendshapes ARKit. Uma cabeça leva cerca de 4 minutos, então a API é assíncrona de propósito.

  • REST + JSON
  • Chaves Bearer
  • Webhooks assinados
  • Chaves de idempotência
  • OpenAPI 3.1
  • llms.txt

Não confunda com as APIs Python e C++ do MetaHuman da Epic, que rodam dentro do Unreal Engine. O FaceNinja é uma API web que cria a cabeça que você leva para dentro delas.

Envie. Receba o aviso. Busque.

  1. Envie.

    POST /v1/heads com 1 a 15 fotos de uma pessoa, como arquivos multipart ou ids que você enviou antes. Adicione um Idempotency-Key, e uma nova tentativa nunca cria nem cobra uma segunda cabeça.

  2. Receba o aviso.

    Escolha como: um webhook assinado para o seu servidor, um fluxo de server-sent events ou um long poll com ?wait=60 para scripts.

  3. Busque.

    Peça glb, fbx, obj, stl, ply ou metahuman_zip, com ou sem blendshapes ARKit. Você recebe um link assinado que não precisa de chave. Guarde o id da cabeça, não o link. O que cada formato contém

Os créditos de uma cabeça que falha voltam automaticamente, e error.code diz o motivo.

Um webhook é tudo o que o seu backend precisa.

Crie a cabeça, guarde o id e aja quando ligarmos para você. Esta é a integração inteira, em Python.

Código
# 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"])

Encurtado para leitura. A referência EN traz a requisição completa, a verificação da assinatura e todos os erros.

Um elenco a partir de uma pasta, seguro para rodar duas vezes.

Um lote são muitas criações individuais. Dê a cada uma uma chave de idempotência derivada dos seus próprios dados, como o nome da pasta, e você pode rodar o script inteiro de novo depois de uma falha sem criar nem pagar uma cabeça duas vezes. Depois, deixe os webhooks dizerem quais cabeças estão prontas.

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}"})
  • Ritmo: até 30 criações de cabeça por minuto, por conta. Em 429, espere Retry-After segundos e envie a mesma chave de novo.
  • Confira antes: ?dry_run verifica uma criação e devolve uma cotação sem criar uma cabeça. GET /v1/account mostra o saldo.
  • Acompanhe: GET /v1/heads lista as suas cabeças, página por página, com o status de cada uma.
  • Falhe uma, não todas: uma cabeça que falha informa o próprio error.code, e os créditos dela voltam. O resto do lote continua.

Ou deixe o seu agente escrever a integração.

A referência da API, o arquivo OpenAPI e o llms.txt são escritos para pessoas e para modelos de linguagem. Dê a skill ao seu agente e ele pode criar cabeças para você diretamente, ou escrever e testar o script de pipeline para a sua stack.

Prompt de pipeline
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.

Mantenha este prompt em inglês: seu agente precisa do endereço exatamente como está escrito. Depois, você pode conversar com ele no seu idioma.

Feita para novas tentativas, filas e fotos ruins.

Criações idempotentes

A mesma Idempotency-Key em 24 horas devolve a mesma cabeça, nunca uma segunda cobrança.

Webhooks assinados

head.completed e head.failed, com uma assinatura HMAC em FaceNinja-Signature.

Fila honesta

Enquanto espera, uma cabeça informa a posição na fila e uma estimativa.

Erros que você pode tratar

Valores estáveis de error.code (no_face, not_same_person, content_rejected, …) e uma hint.

Reembolsos sem chamados

Os créditos ficam retidos na criação, são cobrados na conclusão e liberados em caso de falha ou exclusão.

Exclusão sob demanda

Exclua uma cabeça e as fotos dela quando quiser. Os arquivos expiram 30 dias depois que a cabeça termina.

Os números para planejar o projeto.

Limites
Fotos por cabeça1 a 15, de uma pessoa; JPEG, PNG, WebP, HEIC/HEIF ou AVIF, até 25 MiB cada
Tempo por cabeçaCerca de 4 minutos, mais a fila, se houver
Long poll?wait até 60 s por chamada
Links de downloadComeçam em até 60 s; um download iniciado termina
Limites de taxa600 requisições por minuto, por conta; 30 criações de cabeça por minuto
RetençãoFotos e arquivos por 30 dias depois que a cabeça termina
Preço1.500 créditos (US$ 15) por cabeça, todos os formatos incluídos

A referência é a fonte da verdade. Se um número aqui divergir, vale a referência.

O rosto de um jogador desde o primeiro dia do save.

Deixe os jogadores trazerem o próprio rosto, ou monte um elenco de NPCs com atores que consentiram. Toda cabeça é a mesma malha com um rosto diferente, então um rig, um material e um conjunto de animações servem para todas. Os 52 blendshapes ARKit aceitam lip sync ou a câmera do jogador.

Planeje a espera. Uma cabeça leva cerca de 4 minutos, não milissegundos. Comece cedo, durante o onboarding ou um tutorial, mostre um substituto e troque a cabeça quando o webhook chegar.

GLB para Unity, Godot e a web; FBX e o MetaHuman ZIP para Unreal. A automação para Unreal está em acesso antecipado: peça acesso.

Nossos termos exigem a permissão da pessoa na foto e proíbem fotos de crianças. Incorpore a mesma regra ao seu fluxo.

Foto sintética de um homem idoso sob luz alaranjada duraFoto sintética de uma mulher rindo, de óculosFoto sintética de um homem barbudo com a cabeça viradaFoto sintética de uma mulher cujo cabelo comprido cobre as orelhas
Quatro pessoas de teste sintéticas, uma topologia.

Já usa outra API de foto para MetaHuman?

Se a sua integração já cria uma cabeça, espera por ela e baixa um arquivo, ela mantém o mesmo formato aqui. Os caminhos, os nomes de campo e a etapa do arquivo mudam, e o guia de migração os mapeia chamada por chamada.

Perguntas de desenvolvedores.

01Existe um sandbox?
Adicione ?dry_run a uma chamada de criação. Ele verifica a requisição e devolve uma cotação sem criar uma cabeça nem cobrar você.
02Posso chamar a API de um navegador ou de um app mobile?
Não. Mantenha a chave no seu servidor. Os links assinados de envio e de download não precisam de chave, então um cliente pode enviar ou baixar diretamente.
03Quais SDKs existem?
HTTP puro e um arquivo OpenAPI 3.1 a partir do qual você pode gerar um cliente. A referência traz exemplos em curl, Node e Python. A CLI da skill de agente também é um único arquivo Python que você pode ler e chamar de scripts.
04Quantas cabeças posso criar ao mesmo tempo?
Até 30 criações de cabeça por minuto, por conta, e cada uma roda na fila. Para mais de 1.000 cabeças, escreva para nós sobre faturamento e capacidade.
05Esta é a API MetaHuman da Epic?
Não. As APIs MetaHuman da Epic automatizam por script o MetaHuman Creator dentro do Unreal Engine. O FaceNinja cria a cabeça a partir de fotos, como um serviço web, e entrega os arquivos e o MetaHuman ZIP para você levar ao Unreal.
06Ele consegue criar uma cabeça a partir de um conjunto de fotos?
Sim, em beta: a reconstrução a partir de várias fotos de uma mesma sessão também devolve a posição da câmera e a distância focal de cada foto. Escreva para nós se quiser testar com o seu conjunto de captura.

Sua primeira cabeça está a uma chamada de API de distância.