Post-process

Auto-rig & Animate

POST/v1/assets/{id}/animate

Auto-rig a humanoid or animal and, optionally, retarget a preset clip onto it — no manual weight painting.

Async returns an id — poll or webhookTypical ~2–4 minCost varies by engine

The {id} in the path is the source model. The result — a rigged and, for -rig-animate, animated mesh — is written to a new asset.

Parameters

ParameterDescription
engineOPTIONAL
string
Which rig engine — e.g. tripo-rig-animate, tripo-rig, meshy-rig-animate, meshy-rig. The -rig-animate engines rig and apply a preset clip; the -rig engines rig only. Omit for the default. List: GET /v1/models?category=animate.
presetOPTIONAL
string
Animation preset id for the -rig-animate engines (e.g. walk), up to 64 characters. Browse the catalog with GET /v1/animations. Omit to rig only.
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.
Source must be riggable Auto-rig needs a clear humanoid or animal form. Props, scenery and abstract shapes fail with 400 and error.code 13008.

Request

request
curl -X POST https://api.picoberry.ai/v1/assets/019…/animate \
  -H "Authorization: Bearer pb_live_xxx" -H "Content-Type: application/json" \
  -d '{"engine":"tripo-rig-animate","preset":"walk"}'
requests.post(f"{BASE}/v1/assets/{id}/animate", headers=headers,
    json={"engine": "tripo-rig-animate", "preset": "walk"})
await fetch(`${BASE}/v1/assets/${id}/animate`, { method: "POST",
  headers: { ...headers, "Content-Type": "application/json" },
  body: JSON.stringify({ engine: "tripo-rig-animate", preset: "walk" }) });

Animation presets

GET/v1/animations?engine=tripo|meshy

List the preset clips available for an engine. Presets are engine-specific — a Tripo preset won't run on a Meshy engine, so always pick from the same engine you animate with.

request
curl "https://api.picoberry.ai/v1/animations?engine=tripo" \
  -H "Authorization: Bearer pb_live_xxx"
requests.get("https://api.picoberry.ai/v1/animations", headers=headers,
    params={"engine": "tripo"})
await fetch(`${BASE}/v1/animations?engine=tripo`, { headers });
response · 200
{ "success": true, "data": [
  { "id": "walk", "name": "Walk", "category": "Movement" },
  { "id": "run", "name": "Run", "category": "Movement" },
  { "id": "slash", "name": "Slash", "category": "Combat" }
] }

Each preset carries an id (pass it as preset on /animate), a display name, and a category — Movement, Combat, Emotion, Dance, Sports, Daily, or Gesture.

Response

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

Poll GET /v1/assets/{id} until taskStatus is 2; the finished files.model carries the rig and any baked clip. See Async & polling.

Presets are engine-specific A Tripo preset will not run on a Meshy engine. Pick presets from the same engine you animate with.