3D generation
Text-to-3d, image-to-3d, and multi-image-to-3d mesh generation across 4 labs (Tripo3D, Meshy, Hyper3D/Rodin, Hunyuan3D), all resold through fal.ai. See the 3D generation guide for the full model list, pricing, and a worked example.
POST/v1/meshes
Which fields apply depends entirely on model — every model is either text-to-3d (prompt), image-to-3d (image_url), multi-image-to-3d (image_urls), or, for fal/rodin only, either one — a request that sends the wrong input for its model, or both/neither on fal/rodin, is rejected with a 400 before any pricing or upstream call happens. The option fields below are similarly gated per model — sending an option a model doesn't support 400s rather than silently no-op'ing.
Parameters
promptstringRequired for text-to-3d models (and one of two valid inputs on fal/rodin). Rejected on every image-only model.image_urlstringRequired for single-image-to-3d models. Rejected on text-only and multi-image models.image_urlsstring[]Required for multi-image-to-3d models — 1–4 images on Meshy's multi-image row, 1–5 on fal/rodin-v2.5 (different real upstream caps). Same object from different angles.texture_qualitystringfal/tripo-p2-* only. One of none/fast/standard/detailed/extreme — mutually exclusive tiers, not stackable. Defaults to standard (Tripo's own real default).texturedbooleanfal/meshy-v7.1-* only. Defaults true.rigging / animationbooleanfal/meshy-v7.1-* only. Auto-rig as humanoid (+ basic animations). Both default false.highpackbooleanfal/rodin* only. 4K textures + high-poly mesh, 3× the base price. Defaults false.pbrbooleanfal/hunyuan3d-* only. Generate PBR (metallic/roughness) material maps. Defaults false.face_countintegerfal/hunyuan3d-* only. 40,000–1,500,000. Omit for the model's own default (500,000) at no extra cost — any explicit value bills a small add-on.extra_view_urlsstring[]fal/hunyuan3d-*-image-to-3d only. Up to 6 additional reference-angle image URLs (back/left/right/top/bottom/left-front/right-front, in that order).Example response (200, job just created)
{
"id": "fal:...",
"status": "queued",
"data": null,
"error": null
}
Billed once, in full, at creation time from your model + option choice — polling is free. A model/option combination we don't have a verified price for is refused outright (502 pricing_unavailable) rather than guessed.
GET/v1/meshes/{id}
Unbilled — the full cost was already charged at creation time. Ownership-checked: polling a job you didn't create returns 404, not the job's data.
Parameters
idstring (path)The id returned by POST /v1/meshes.Example response (status: "completed")
{
"id": "fal:...",
"status": "completed",
"data": [
{ "url": "https://...model.glb", "format": "glb", "kind": "mesh" },
{ "url": "https://...model.obj", "format": "obj", "kind": "mesh" },
{ "url": "https://...material.mtl", "format": "mtl", "kind": "mesh" },
{ "url": "https://...texture.png", "format": "png", "kind": "texture" },
{ "url": "https://...preview.png", "format": "png", "kind": "thumbnail" }
],
"error": null
}
status is one of queued → in_progress → completed/failed. On failure, error carries the provider's message and data is null. Every item in data is mirrored to our own storage — never a link back to fal.ai — and which files appear depends on the model (every model returns at least a GLB; FBX/OBJ/USDZ/MTL/textures/thumbnail vary by lab).