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.

FieldTypeDescription
image_urlstringOne photo of the object: an https URL, or a base64 data URL (png, jpeg, webp) under 4 MB.
image_urlsstring[]1–4 https photos of the same object from different sides.
promptstringA 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:

statusMeaning
processingStill working. The stage field says where: preprocessing, queued, generating or finalizing. Keep polling.
completedDone. model_url is the GLB file; format is "glb".
failedCould 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.

StatusMeaning
400Invalid request; the code names the field.
401Missing or unknown key.
402Out of credits.
404Unknown id, or another account's.
429Over 8 generations a minute.
502 / 503Rendering 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.