Image → 3D
POST/v1/models/from-image
Turn any image — including your own generations — into a textured mesh.
Pass an imageUrl (JSON) or upload the file (multipart image). Exactly one is required. For higher-fidelity geometry, send 2–4 views of the same subject as imageUrls (or the multipart images part) — see Multi-view.
Parameters
| Parameter | Description |
|---|---|
| imageUrlCONDITIONAL string | Source image URL (http/https). Required unless you send a multipart image file. A PicoBerry-generated image's files.image URL works here too. |
| imageUrlsCONDITIONAL string[] | Multi-view — 2–4 views of one subject, ordered [front, left, back, right]. Local files go in the multipart images part. Multi-view is supported only by tripo*, meshy6, and hunyuan-3.x — see below. |
| engineOPTIONAL string | Which 3D engine — e.g. tripo, hunyuan-3.1. Omit for the default. List: GET /v1/models?category=3d. |
| polycountOPTIONAL integer | Target polygon count, 100–2,000,000, clamped to the model's range. |
| textureOPTIONALdefault true boolean | Generate PBR textures. Set false for a faster, untextured mesh. |
Exactly one image source Send one of
imageUrl, imageUrls, a multipart image, or a multipart images part. A multipart file takes precedence over a URL field.Request
multipart upload
curl -X POST https://api.picoberry.ai/v1/models/from-image \
-H "Authorization: Bearer pb_live_xxx" \
-F "engine=tripo" -F "image=@./ref.png"requests.post("https://api.picoberry.ai/v1/models/from-image", headers=headers,
data={"engine": "tripo"}, files={"image": open("ref.png", "rb")})const fd = new FormData();
fd.append("engine", "tripo"); fd.append("image", fileBlob, "ref.png");
await fetch(`${BASE}/v1/models/from-image`, { method: "POST", headers, body: fd });Image inputs Single-frame
png, jpeg, webp, or gif, up to 20 MB. URLs are fetched server-side and must be publicly reachable.Response
response · 200
{ "success": true, "data": { "id": "019…", "taskStatus": 0, "type": "model_3d" } }The call returns immediately. Poll GET /v1/assets/{id} until taskStatus is 2; on success files.model is a signed GLB. Then refine the same id with remesh, texture, or auto-rig.
Multi-view
Send 2–4 views of the same subject to produce a single, higher-fidelity mesh. Order them [front, left, back, right] (front first) — use imageUrls for hosted URLs, or the multipart images part for local files. Credits match a single-image generation (no per-view multiplier).
2–4 views
curl -X POST https://api.picoberry.ai/v1/models/from-image \
-H "Content-Type: application/json" \
-d '{"engine":"meshy6","imageUrls":["https://…/front.png","https://…/left.png"]}'requests.post("https://api.picoberry.ai/v1/models/from-image", headers=headers,
json={"engine": "meshy6", "imageUrls": ["https://…/front.png", "https://…/left.png"]})await fetch(`${BASE}/v1/models/from-image`, { method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ engine: "meshy6", imageUrls: [front, left] }) });Supported engines
tripo, tripo-v3.0, tripo-v3.1, tripo-v3.1-ultra, tripo-game-ready, meshy6, hunyuan-3.0, hunyuan-3.1, hunyuan-3.1-lite. Other engines return 400.