ডেভেলপার · REST API
ব্যাচের জন্য তৈরি MetaHuman হেড API।
একজন ব্যক্তির ছবি পাঠান, হেড তৈরি হলে খবর পান, প্রয়োজনীয় ফরম্যাটটি তুলে আনুন। একই কলে একটি হেড বা পাঁচশো হেড, দুটোই হয়। প্রতিটি হেড তৈরি অবস্থায় আসে: 4K ত্বক, groom (MetaHuman চুল) সুপারিশ, মানানসই ঘাড় ও 52টি ARKit শেপ। একটি হেডে প্রায় 4 মিনিট লাগে, তাই API ডিজাইনেই অ্যাসিনক্রোনাস।
- REST + JSON
- Bearer কী
- সাইন করা webhook
- Idempotency কী
- OpenAPI 3.1
- llms.txt
Epic-এর MetaHuman Python ও C++ API-র সঙ্গে গুলিয়ে ফেলবেন না, সেগুলো Unreal Engine-এর ভেতরে চলে। FaceNinja একটি ওয়েব API, যা সেই হেড বানায় যেটি আপনি ওগুলোর ভেতরে আনেন।
POST /v1/headsএকজন ব্যক্তির ছবি- হেডের id
head.completedশেষ হলে সাইন করা webhookPOST /v1/heads/{id}/filesফরম্যাট- অল্প সময়ের সাইন করা লিংক
পাঠান। খবর পান। তুলে আনুন।
পাঠান।
একজন ব্যক্তির 1 থেকে 15টি ছবি সহ
POST /v1/heads, multipart ফাইল হিসেবে অথবা আগে আপলোড করা id হিসেবে। একটিIdempotency-Keyদিন, তাহলে পুনরায় চেষ্টা করলে দ্বিতীয় হেড তৈরি বা বিল হয় না।খবর পান।
পদ্ধতি বেছে নিন: আপনার সার্ভারে সাইন করা webhook, server-sent event স্ট্রিম, অথবা স্ক্রিপ্টের জন্য
?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);
});পড়ার সুবিধার জন্য সংক্ষিপ্ত। পূর্ণ রিকোয়েস্ট, সিগনেচার যাচাই ও প্রতিটি এরর পাবেন রেফারেন্সে EN।
ফোল্ডার থেকে একটি কাস্ট, দুবার চালালেও নিরাপদ।
ব্যাচ মানে হেড তৈরির অনেকগুলো আলাদা অনুরোধ। প্রতিটিকে আপনার নিজের ডেটা থেকে বানানো একটি idempotency কী দিন, যেমন ফোল্ডারের নাম, তাহলে ক্র্যাশের পর পুরো স্ক্রিপ্ট আবার চালালেও কোনো হেড দুবার তৈরি হবে না, দামও দুবার দিতে হবে না। তারপর 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.এই প্রম্পটটি ইংরেজিতেই রাখুন: আপনার এজেন্টের ওয়েব ঠিকানাটি ঠিক যেমন লেখা আছে তেমনই দরকার। এরপর আপনি নিজের ভাষায় তার সঙ্গে কথা বলতে পারবেন।
রিট্রাই, সারি আর খারাপ ছবির জন্য তৈরি।
Idempotent হেড তৈরি
24 ঘণ্টার মধ্যে একই Idempotency-Key একই হেড ফেরত দেয়, দ্বিতীয়বার চার্জ হয় না।
সাইন করা webhook
FaceNinja-Signature হেডারে HMAC সিগনেচারসহ head.completed ও head.failed।
স্বচ্ছ সারি
অপেক্ষার সময় হেড সারিতে তার অবস্থান ও একটি আনুমানিক সময় জানায়।
কোডে ধরা যায় এমন এরর
স্থির 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 US$), সব ফরম্যাট সহ |
রেফারেন্সই চূড়ান্ত সূত্র। এখানকার কোনো সংখ্যা আলাদা হলে রেফারেন্সের সংখ্যাই ঠিক।
সেভ ফাইলের প্রথম দিনেই প্লেয়ারের মুখ।
প্লেয়ারদের নিজের মুখ আনতে দিন, অথবা সম্মতি দেওয়া অভিনেতাদের নিয়ে NPC কাস্ট বানান। প্রতিটি হেড একই মেশ, শুধু মুখ আলাদা, তাই একটি রিগ, একটি ম্যাটেরিয়াল ও একটি অ্যানিমেশন সেট সবগুলোর সঙ্গে মেলে। 52টি ARKit শেপ লিপ সিংক বা প্লেয়ারের ক্যামেরা নিতে পারে।
অপেক্ষার পরিকল্পনা করুন। একটি হেডে প্রায় 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টির বেশি হেডের জন্য ইনভয়েসিং ও ক্ষমতা নিয়ে আমাদের লিখুন।
- 05এটি কি Epic-এর MetaHuman API?
- না। Epic-এর MetaHuman API Unreal Engine-এর ভেতরে MetaHuman Creator স্ক্রিপ্ট করে। FaceNinja ছবি থেকে ওয়েব সার্ভিস হিসেবে হেড বানায়, এবং আপনাকে ফাইল ও MetaHuman ZIP দেয়, যা আপনি Unreal-এ নিয়ে যান।
- 06একসেট ছবি থেকে কি হেড বানানো যায়?
- হ্যাঁ, Beta-তে: একই সেশনের কয়েকটি ছবি থেকে রিকনস্ট্রাকশন প্রতিটি ছবির ক্যামেরা পজিশন ও ফোকাল লেংথও ফেরত দেয়। আপনার ক্যাপচার সেট দিয়ে চেষ্টা করতে চাইলে আমাদের লিখুন।