Post-process

Texture

POST/v1/assets/{id}/texture

Repaint PBR materials on an existing 3D asset — from a text prompt or a reference image — into a new asset.

Async returns an id — poll or webhookTypical ~60–120sCost varies by engine

The {id} in the path is the source model. Texturing writes fresh maps to a new asset and leaves the original untouched.

Parameters

ParameterDescription
promptOPTIONAL
string
Text describing the new surface, up to 1,000 characters. Omit to re-texture from the model itself.
engineOPTIONAL
string
Which texturing engine — e.g. tripo-texture, meshy-texture, hunyuan-texture. Omit for the default. Authoritative list: GET /v1/models?category=texture.
imageOPTIONAL
file
A multipart reference image (≤20 MB) to texture from instead of, or alongside, a prompt. See Image-guided below.
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/assets/019…/texture \
  -H "Authorization: Bearer pb_live_xxx" -H "Content-Type: application/json" \
  -d '{"engine":"tripo-texture","prompt":"weathered bronze with green patina"}'
requests.post(f"{BASE}/v1/assets/{id}/texture", headers=headers,
    json={"engine": "tripo-texture", "prompt": "weathered bronze"})
await fetch(`${BASE}/v1/assets/${id}/texture`, { method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({ engine: "tripo-texture", prompt: "weathered bronze" }) });

Image-guided

Omit prompt and send multipart/form-data with an image part (≤20 MB) to texture from a reference image instead of text — no image hosting needed.

multipart
curl -X POST https://api.picoberry.ai/v1/assets/019…/texture \
  -H "Authorization: Bearer pb_live_xxx" \
  -F "engine=tripo-texture" -F "image=@./ref.png"

Response

response · 200
{ "success": true, "data": { "id": "019…", "taskStatus": 0 } }

Poll GET /v1/assets/{id} until taskStatus is 2; the finished files.model is the re-textured mesh and files.textures holds the new maps. See Async & polling.

Cost varies by engine Each texturing engine is priced differently — the exact cost is on GET /v1/models.