FaceNinja

Desarrollo · API REST

La API de cabezas MetaHuman, pensada para lotes.

Envía fotos de una persona, recibe aviso cuando la cabeza esté lista y descarga el formato que necesites. La misma llamada crea una cabeza o quinientas. Cada cabeza viene terminada: piel 4K, recomendaciones de groom (pelo de MetaHuman), un cuello ajustado y 52 blendshapes ARKit. Una cabeza tarda unos 4 minutos, así que la API es asíncrona por diseño.

  • REST + JSON
  • Claves Bearer
  • Webhooks firmados
  • Claves de idempotencia
  • OpenAPI 3.1
  • llms.txt

No la confundas con las API de Python y C++ de MetaHuman de Epic, que se ejecutan dentro de Unreal Engine. FaceNinja es una API web que crea la cabeza que luego llevas a ellas.

Envía. Recibe aviso. Descarga.

  1. Envía.

    POST /v1/heads con 1 a 15 fotos de una misma persona, como archivos multipart o ids que subiste antes. Añade un Idempotency-Key y un reintento nunca crea ni cobra una segunda cabeza.

  2. Recibe aviso.

    Elige cómo: un webhook firmado a tu servidor, un flujo de eventos enviados por el servidor, o un long poll con ?wait=60 para scripts.

  3. Descarga.

    Pide glb, fbx, obj, stl, ply o metahuman_zip, con o sin blendshapes ARKit. Recibes un enlace firmado que no necesita clave. Guarda el id de la cabeza, no el enlace. Qué contiene cada formato

Los créditos de una cabeza fallida vuelven automáticamente, y error.code dice por qué.

Un webhook es todo lo que tu backend necesita.

Crea la cabeza, guarda su id y actúa cuando te llamemos. Esta es toda la integración, en 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"])

Acortado para leerlo mejor. La referencia EN tiene la solicitud completa, la comprobación de la firma y todos los errores.

Un reparto desde una carpeta, seguro de ejecutar dos veces.

Un lote son muchas creaciones sueltas. Dale a cada una una clave de idempotencia que derives de tus propios datos, como el nombre de la carpeta, y podrás volver a ejecutar todo el script tras un fallo sin crear ni pagar una cabeza dos veces. Después deja que los webhooks te digan qué cabezas están listas.

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: hasta 30 creaciones de cabezas por minuto, por cuenta. Con 429, espera los segundos de Retry-After y envía otra vez la misma clave.
  • Comprueba antes: ?dry_run comprueba una creación y devuelve un presupuesto sin crear una cabeza. GET /v1/account muestra el saldo.
  • Seguimiento: GET /v1/heads lista tus cabezas, página a página, con su estado.
  • Que falle una, no todas: una cabeza que falla informa de su propio error.code, y sus créditos vuelven. El resto del lote sigue.

O deja que tu agente escriba la integración.

La referencia de la API, el archivo OpenAPI y llms.txt están escritos para personas y para modelos de lenguaje. Dale la skill a tu agente y podrá crear cabezas por ti directamente, o escribir y probar el script de pipeline para tu 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.

Deja este prompt en inglés: tu agente necesita la dirección web tal cual está escrita. Después puedes hablarle en tu idioma.

Pensada para reintentos, colas y malas fotos.

Creaciones idempotentes

El mismo Idempotency-Key en 24 horas devuelve la misma cabeza, nunca un segundo cobro.

Webhooks firmados

head.completed y head.failed, con una firma HMAC en FaceNinja-Signature.

Una cola honesta

Mientras espera, una cabeza informa de su lugar en la fila y de una estimación.

Errores que tu código distingue

Valores estables de error.code (no_face, not_same_person, content_rejected, …) y un hint.

Reembolsos sin tickets

Los créditos se retienen al crear, se cobran al completarse y se liberan si falla o se elimina.

Eliminar cuando quieras

Elimina una cabeza y sus fotos cuando quieras. Los archivos caducan 30 días después de que la cabeza termine.

Los números que debes tener en cuenta al diseñar.

Límites
Fotos por cabezaDe 1 a 15, de una sola persona; JPEG, PNG, WebP, HEIC/HEIF o AVIF, hasta 25 MiB cada una
Tiempo por cabezaUnos 4 minutos, más la cola si la hay
Long poll?wait hasta 60 s por llamada
Enlaces de descargaHay que iniciarlos en 60 s; una descarga ya iniciada termina
Límites de frecuencia600 solicitudes por minuto, por cuenta; 30 creaciones de cabezas por minuto
RetenciónFotos y archivos, 30 días después de que la cabeza termine
Precio1500 créditos (15 US$) por cabeza, todos los formatos incluidos

La referencia es la fuente de verdad. Si un número de aquí difiere, manda la referencia.

La cara de un jugador desde el día uno de su partida guardada.

Deja que los jugadores traigan su propia cara, o crea un reparto de NPC a partir de actores que han dado su consentimiento. Cada cabeza es la misma malla con otra cara, así que un rig, un material y un conjunto de animaciones sirven para todas. Los 52 blendshapes ARKit admiten lip sync o la cámara del jugador.

Planifica la espera. Una cabeza tarda unos 4 minutos, no milisegundos. Empieza pronto, durante el onboarding o un tutorial, muestra una cabeza provisional y cámbiala cuando llegue el webhook.

GLB para Unity, Godot y la web; FBX y el MetaHuman ZIP para Unreal. La automatización de Unreal está en acceso anticipado: pídela.

Nuestros términos exigen el permiso de la persona de la foto y prohíben las fotos de niños. Incluye la misma regla en tu flujo.

Foto sintética de un hombre mayor bajo una luz naranja duraFoto sintética de una mujer que ríe y lleva gafasFoto sintética de un hombre con barba y la cabeza giradaFoto sintética de una mujer cuyo pelo largo le tapa las orejas
Cuatro sujetos de prueba sintéticos, una sola topología.

¿Ya usas otra API de foto a MetaHuman?

Si tu integración ya crea una cabeza, espera y descarga un archivo, aquí conserva su forma. Las rutas, los nombres de campo y el paso del archivo cambian, y la guía de migración los equipara llamada por llamada.

Preguntas de desarrolladores.

01¿Hay un sandbox?
Añade ?dry_run a una llamada de creación. Comprueba la solicitud y devuelve un presupuesto sin crear una cabeza ni cobrarte.
02¿Puedo llamarla desde un navegador o una app móvil?
No. Guarda la clave en tu servidor. Los enlaces firmados de subida y descarga no necesitan clave, así que un cliente puede subir o descargar directamente.
03¿Qué SDK hay?
HTTP puro y un archivo OpenAPI 3.1 a partir del cual puedes generar un cliente. La referencia tiene ejemplos con curl, Node y Python. La CLI de la skill para agentes también es un único archivo de Python que puedes leer y llamar desde scripts.
04¿Cuántas cabezas puedo crear a la vez?
Hasta 30 creaciones por minuto en cada cuenta, y cada cabeza se ejecuta en la cola. Para más de 1000 cabezas, escríbenos para hablar de facturación y capacidad.
05¿Es la API de MetaHuman de Epic?
No. Las API de MetaHuman de Epic automatizan MetaHuman Creator dentro de Unreal Engine. FaceNinja crea la cabeza a partir de fotos, como servicio web, y te entrega los archivos y el MetaHuman ZIP para llevar a Unreal.
06¿Puede crear una cabeza a partir de un conjunto de fotos?
Sí, en beta: la reconstrucción a partir de varias fotos de una sesión también devuelve la posición de cámara y la distancia focal de cada foto. Escríbenos si quieres probarlo con tu conjunto de capturas.

Tu primera cabeza está a una llamada a la API.