Generate

Image → 3D

POST/v1/models/from-image

Turn any image — including your own generations — into a textured mesh.

Async returns an id — poll or webhookTypical ~60–120sCost ≈60–80 credits

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

ParameterDescription
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, 1002,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.