Text → 3D
POST/v1/models/from-text
Describe an asset in plain text and get a textured mesh.
Parameters
| Parameter | Description |
|---|---|
| promptREQUIRED string | What to generate. Up to 1,024 characters (the Tripo engine limit). |
| engineOPTIONAL string | Which 3D engine to use — e.g. tripo, tripo-v3.1, hunyuan-3.1. Omit for the default. Authoritative list: GET /v1/models?category=3d. |
| polycountOPTIONAL integer | Target polygon count, 100–2,000,000. Out-of-range values are clamped to the model's range (e.g. tripo 500–20,000) — see each model's polygonConfig in GET /v1/models. |
| textureOPTIONALdefault true boolean | Generate PBR textures. Set false for a faster, untextured mesh. |
| licenseOPTIONAL string | Usage rights for the result. Defaults to private (all-rights-reserved). |
| callbackUrlOPTIONAL string | Push the finished asset to your server instead of polling — see Webhooks. |
Request
request
curl -X POST https://api.picoberry.ai/v1/models/from-text \
-H "Authorization: Bearer pb_live_xxx" -H "Content-Type: application/json" \
-d '{"prompt":"a stylized treasure chest","engine":"tripo","polycount":10000}'requests.post("https://api.picoberry.ai/v1/models/from-text", headers=headers,
json={"prompt": "a stylized treasure chest", "engine": "tripo", "polycount": 10000})await fetch(`${BASE}/v1/models/from-text`, { method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ prompt: "a stylized treasure chest", engine: "tripo", polycount: 10000 }) });Response
response · 200
{ "success": true, "data": { "id": "019…", "taskStatus": 0, "type": "model_3d" } }That's the create response — the job is now running. Poll GET /v1/assets/{id} until taskStatus is 2, then files.model is a signed GLB. See the Quickstart for the full create → poll → download loop.
Refine the same asset Feed the returned
id straight into remesh, re-texture, or auto-rig — no re-upload, no format juggling. That id-based pipeline is the whole reason to route through PicoBerry.