---
title: "Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64) and a `preset_id` from the animation presets list (see the spritesheet animation-presets endpoint) — only presets that expose a `clip_url` can be applied to a 3D model. The model must have a humanoid-template rig (rig it with rig_type humanoid_template or humanoid_template_hands). Synchronous: returns one retargeted animation — a standalone animation-only GLB in `glb_url` plus an mp4 `preview_url` — in the same `animations` envelope as the animate endpoint. crop_loop trims the clip to its seamlessly-looping span (omit to follow the preset's own loop flag); in_place removes net travel so the character moves on the spot, as game-engine locomotion expects (omit to follow crop_loop). Credits are charged only on success. Requires an API key (user scope)."
method: POST
path: "/assets/3d-model/animate-preset"
tags: ["3D Models"]
---

# Apply a curated animation preset to an already-rigged 3D model (retargeting). Pass the rigged GLB in `model` (URL or base64) and a `preset_id` from the animation presets list (see the spritesheet animation-presets endpoint) — only presets that expose a `clip_url` can be applied to a 3D model. The model must have a humanoid-template rig (rig it with rig_type humanoid_template or humanoid_template_hands). Synchronous: returns one retargeted animation — a standalone animation-only GLB in `glb_url` plus an mp4 `preview_url` — in the same `animations` envelope as the animate endpoint. crop_loop trims the clip to its seamlessly-looping span (omit to follow the preset's own loop flag); in_place removes net travel so the character moves on the spot, as game-engine locomotion expects (omit to follow crop_loop). Credits are charged only on success. Requires an API key (user scope).

`POST /assets/3d-model/animate-preset`

## Request body

- Animate3DPresetModelPayload
  - `model` string, required — URL or base64-encoded already-rigged GLB (rig it with a humanoid_template rig_type first).
  - `preset_id` string, required — id of an animation preset from the presets list. Only presets that expose a clip_url can be applied to a 3D model.
  - `crop_loop` boolean — Trim the animation to the span that loops seamlessly. Omit to follow the preset's own loop flag. Ignored when no clean loop exists.
  - `in_place` boolean — Remove the animation's net travel so the character moves on the spot (engine-driven locomotion). Omit to follow crop_loop.
  - `request_id` string — Optional client-provided id to retrieve the result later.

## Response `200`

Success

- AnimationCandidates
  - `animations` AnimationClip[]
    - `clip_name` string
    - `prompt` string
    - `preset_id` string — Set when the clip came from the preset library (retargeting) rather than a text prompt.
    - `mode` 'rot_trans' | 'rot_only'
    - `seed` integer
    - `glb_url` string
    - `preview_url` string
    - `motion` number, float
    - `fit_rmse` number, float

## Other responses

- `400` — Error

---

[API](https://skmtc.net/ludo/apis/ludo-ai-api.md) · [All operations](https://skmtc.net/ludo/apis/ludo-ai-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/ludo/ludo-ai-api/revisions/3af866d68651/schema)
