개발자 · REST API
배치를 위해 만든 MetaHuman 헤드 API.
인물 사진을 보내고, 헤드가 완성되면 알림을 받고, 필요한 포맷을 가져옵니다. 헤드 하나든 오백 개든 호출은 같습니다. 모든 헤드는 완성본입니다. 4K 피부, 그룸 추천, 인물에 맞춘 목, ARKit 블렌드셰이프 52개. 헤드 하나에 약 4분이 걸리므로 API는 처음부터 비동기로 설계했습니다.
- REST + JSON
- Bearer 키
- 서명된 webhook
- 멱등성 키
- OpenAPI 3.1
- llms.txt
Unreal Engine 안에서 실행되는 Epic의 MetaHuman Python 및 C++ API와는 다릅니다. FaceNinja는 그 API로 가져갈 헤드를 만드는 웹 API입니다.
POST /v1/heads한 사람의 사진- 헤드 id
head.completed완료 시 서명된 webhookPOST /v1/heads/{id}/files포맷- 수명이 짧은 서명된 링크
보내기. 알림 받기. 가져오기.
보내기.
한 사람의 사진 1~15장을 멀티파트 파일이나 미리 업로드한 id로
POST /v1/heads에 보냅니다.Idempotency-Key를 붙이면 재시도해도 두 번째 헤드를 만들거나 청구하지 않습니다.알림 받기.
방식을 고르십시오. 서버로 오는 서명된 webhook, 서버 전송 이벤트(SSE) 스트림, 또는 스크립트용
?wait=60롱 폴링.가져오기.
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"])// when the user confirms their photos
const form = new FormData();
for (const p of photos) form.append("photos", p);
form.append("webhook_url", "https://you.example/hooks/faceninja");
const head = await api.post("/v1/heads", form,
{ headers: { "Idempotency-Key": crypto.randomUUID() } });
await save(user, head.id);
// later, FaceNinja calls you
app.post("/hooks/faceninja", async (req, res) => {
const event = verified(req); // check FaceNinja-Signature first
if (event.type === "head.completed") {
const link = await api.post(`/v1/heads/${event.data.id}/files`,
{ format: "glb", arkit: true });
await storeOnYourCdn(link.url);
}
res.sendStatus(204);
});읽기 쉽게 줄였습니다. 전체 요청, 서명 검증, 모든 오류는 레퍼런스에 있습니다: API 레퍼런스 EN
폴더 단위 캐스트, 두 번 돌려도 안전합니다.
배치는 단일 생성을 여러 번 하는 것입니다. 폴더 이름처럼 자체 데이터에서 만든 멱등성 키를 생성마다 붙이면, 도중에 멈춘 뒤 스크립트 전체를 다시 돌려도 헤드를 두 번 만들거나 두 번 결제하지 않습니다. 어떤 헤드가 끝났는지는 webhook이 알려 줍니다.
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.이 프롬프트는 영어 그대로 사용하십시오. 에이전트가 웹 주소를 쓰인 그대로 읽어야 합니다. 그다음부터는 한국어로 대화하셔도 됩니다.
재시도, 대기열, 나쁜 사진에 대비했습니다.
멱등 생성
24시간 안에 같은 Idempotency-Key를 보내면 같은 헤드가 반환되고, 두 번 청구되지 않습니다.
서명된 webhook
head.completed와 head.failed, FaceNinja-Signature에 HMAC 서명.
정직한 대기열
대기 중인 헤드는 대기 순번과 예상 시간을 알려 줍니다.
분기할 수 있는 오류
고정된 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 크레딧(US$15), 모든 포맷 포함 |
기준은 레퍼런스입니다. 여기 숫자가 다르면 레퍼런스를 따르십시오.
세이브 파일 첫날부터 플레이어의 얼굴.
플레이어가 자기 얼굴을 가져오게 하거나, 동의한 배우들로 NPC 캐스트를 만드십시오. 모든 헤드는 얼굴만 다른 같은 메시이므로 리그 하나, 머티리얼 하나, 애니메이션 세트 하나가 모두에 맞습니다. ARKit 블렌드셰이프 52개로 립싱크나 플레이어 카메라 입력을 받을 수 있습니다.
대기 시간을 계획하십시오. 헤드 하나는 밀리초가 아니라 약 4분이 걸립니다. 온보딩이나 튜토리얼 중에 일찍 시작해 임시 헤드를 보여 주고, webhook이 도착하면 헤드를 교체하십시오.
Unity, Godot, 웹에는 GLB, Unreal에는 FBX와 MetaHuman ZIP. Unreal 자동화는 얼리 액세스입니다. 요청하기.
약관상 사진 속 인물의 허락이 필요하며 아동 사진은 금지됩니다. 같은 규칙을 플로우에 넣으십시오.




이미 다른 사진→MetaHuman API를 쓰고 있습니까?
연동 코드가 이미 헤드를 만들고, 기다리고, 파일을 다운로드한다면 그 구조는 여기서도 그대로입니다. 경로, 필드 이름, 파일 단계가 다르며, 마이그레이션 가이드가 호출 하나하나를 대응시켜 줍니다.
개발자 질문.
- 01샌드박스가 있습니까?
- 생성 호출에
?dry_run을 붙이십시오. 요청을 검사하고, 헤드를 만들거나 청구하지 않은 채 견적을 반환합니다. - 02브라우저나 모바일 앱에서 호출할 수 있습니까?
- 아닙니다. 키는 서버에 두십시오. 서명된 업로드·다운로드 링크는 키가 필요 없으므로 클라이언트가 직접 업로드하거나 다운로드할 수 있습니다.
- 03어떤 SDK가 있습니까?
- 일반 HTTP와, 클라이언트를 생성할 수 있는 OpenAPI 3.1 파일이 있습니다. 레퍼런스에는 curl, Node, Python 예제가 있습니다. 에이전트 스킬의 CLI도 Python 파일 하나라서 읽어 보고 스크립트에서 호출할 수 있습니다.
- 04한 번에 헤드를 몇 개 만들 수 있습니까?
- 계정당 분당 헤드 생성 최대 30건이며, 각각 대기열에서 처리됩니다. 헤드가 1,000개를 넘는다면 청구서 발행과 처리 용량에 대해 문의해 주십시오.
- 05Epic의 MetaHuman API입니까?
- 아닙니다. Epic의 MetaHuman API는 Unreal Engine 안에서 MetaHuman Creator를 스크립트로 다룹니다. FaceNinja는 웹 서비스로 사진에서 헤드를 만들고, Unreal로 가져갈 파일과 MetaHuman ZIP을 건네 드립니다.
- 06사진 세트로 헤드를 만들 수 있습니까?
- 네, 베타입니다. 한 세션에서 찍은 여러 장의 사진으로 재구성하며, 사진마다 카메라 위치와 초점 거리도 함께 돌려줍니다. 보유한 촬영 세트로 시험해 보고 싶다면 문의해 주십시오.