API reference · v1
Photo or text in, 3D model out
Send a photo of an object, or describe it in a few words, and get back a textured 3D model as a GLB file. The same models the MakeIt3D app makes, from your own server.
Try it
Run the real API on your own photo or a short description. You'll see the exact request, each response, and the model it made.
Try it on your own photo
The sandbox calls the real API and shows every request and response, then the model it made. Sign in to run it: new accounts get 3 free models.
Quickstart
API access is by request: email us what you're building and you'll get a key. Then start a generation:
curl -X POST https://makeit3d.app/api/v1/generations \
-H "Authorization: Bearer $MAKEIT3D_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "red office chair"}'It returns at once with an id:
{
"id": "abd48644-1588-4f25-963b-0fb87ecee86d",
"status": "processing",
"source_image_url": "https://…/reference.jpg"
}Poll that id every few seconds until it's done, usually 1–3 minutes:
curl https://makeit3d.app/api/v1/generations/abd48644-1588-4f25-963b-0fb87ecee86d \
-H "Authorization: Bearer $MAKEIT3D_API_KEY"{
"id": "abd48644-1588-4f25-963b-0fb87ecee86d",
"status": "completed",
"model_url": "https://models.makeit3d.app/…/model.glb",
"format": "glb"
}Authentication and billing
Send your key as a bearer token on every request: Authorization: Bearer <key>. Keep it on your server. The API sends no CORS headers, so it cannot be called from a browser, and anyone holding the key can spend its credits.
A key belongs to a MakeIt3D account and spends that account's credits: quick costs 1 credit, precise costs 3. A generation that fails is refunded automatically. Top up by buying a plan or credit pack on the account.
Create a generation
POST/api/v1/generations
JSON body. Give an image or a prompt; with both, the image is what gets modelled.
| Field | Type | Description |
|---|---|---|
| image_url | string | One photo of the object: an https URL, or a base64 data URL (png, jpeg, webp) under 4 MB. |
| image_urls | string[] | 1–4 https photos of the same object from different sides. |
| prompt | string | A text description, up to 300 characters. Used when no image is given: it is rendered to a reference photo first, then turned into a model. With an image, it only names the model. |
| quality | "quick" | "precise" | Default "quick" (1 credit). "precise" costs 3 credits and takes longer. |
Returns 202 with the generation's id, and source_image_url: your photo, or the reference photo rendered from your prompt.
Poll a generation
GET/api/v1/generations/{id}
Poll every 3–5 seconds. The response always has id and status:
| status | Meaning |
|---|---|
| processing | Still working. The stage field says where: preprocessing, queued, generating or finalizing. Keep polling. |
| completed | Done. model_url is the GLB file; format is "glb". |
| failed | Could not be built; the error field says why. The credit was refunded. |
The first poll after the model is built also stores the final file, so that one call can take a few seconds. The first completed response may carry a temporary provider URL; within a minute the generation switches to its permanent models.makeit3d.app address. Fetch the generation again before you store the URL long-term.
Example, search, errors
The whole flow in JavaScript:
// Node 18+, server-side: never ship the key to a browser
const api = "https://makeit3d.app/api/v1";
const headers = { Authorization: `Bearer ${process.env.MAKEIT3D_API_KEY}`, "Content-Type": "application/json" };
const { id } = await (await fetch(`${api}/generations`, {
method: "POST", headers, body: JSON.stringify({ prompt: "red office chair" }),
})).json();
let g;
do {
await new Promise((r) => setTimeout(r, 4000));
g = await (await fetch(`${api}/generations/${id}`, { headers })).json();
} while (g.status === "processing");
console.log(g.status === "completed" ? g.model_url : g.error);Search before you generate. GET /api/models/search?q=… is free and returns the closest published community model. match is phrase or head_noun when it's safe to use, broad when it's a guess, and the call returns 404 when nothing matches.
curl "https://makeit3d.app/api/models/search?q=coffee+table" -H "Authorization: Bearer $MAKEIT3D_API_KEY"
# → { "url": "https://models.makeit3d.app/…/model.glb", "match": "phrase" }Errors are { "error": { "code", "message" } }. Failed generations are refunded.
| Status | Meaning |
|---|---|
| 400 | Invalid request; the code names the field. |
| 401 | Missing or unknown key. |
| 402 | Out of credits. |
| 404 | Unknown id, or another account's. |
| 429 | Over 8 generations a minute. |
| 502 / 503 | Rendering the prompt failed, or generation is paused. Retry. |
Limits. 8 generations a minute per key, up to 4 images each. Output is GLB with textures. API generations are private; commercial use follows the account's plan, as in the terms. One object on a plain background works best; realistic faces and flat logos are the weakest inputs.