lowpoly retires Oct 30, 2026. Please switch models before these dates to avoid request errors. See all deprecations

Animation API

Apply animations to rigged characters, and list the animations you can apply.


POST/openapi/v1/animations

Create an Animation task

Creates an Animation task, which applies an animation to a character you rigged earlier. The animation can be one of the following:

  • A preset action from the animation library (action_id)
  • Several preset actions merged into one file (action_ids)
  • A motion clip you generated with the Text to Motion API (motion_task_id)

You can also post-process the output. The task runs in the background. For how long a task usually takes, see Processing times.

Request

POST
/openapi/v1/animations
# Animate a rigged model with required params only
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "action_id": 92
  }'

# Apply several preset actions and get one file with one clip per action
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "action_ids": [10, 25, 92]
  }'

# Apply a generated Text to Motion clip instead of a preset action
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "motion_task_id": "018c425b-b2c6-727e-d333-3c1887i9h791"
  }'

# With post-processing to change FPS
curl https://api.meshy.ai/openapi/v1/animations \
  -X POST \
  -H "Authorization: Bearer ${YOUR_API_KEY}" \
  -H 'Content-Type: application/json' \
  -d '{
    "rig_task_id": "018b314a-a1b5-716d-c222-2f1776f7f579",
    "action_id": 92,
    "post_process": {
      "operation_type": "change_fps",
      "fps": 24
    }
  }'

Response

{
  "result": "018c425b-b2c6-727e-d333-3c1887i9h791"
}

Parameters

  • Name
    rig_task_id
    Type
    string
    Required
    Description

    The ID of the Rigging task whose character to animate, from POST /openapi/v1/rigging. The task must have the status SUCCEEDED.

Send exactly one of action_id, action_ids, and motion_task_id.

  • Name
    action_id
    Type
    integer
    Required
    Description

    Required unless you send action_ids or motion_task_id. The ID of the preset animation to apply. For the full list of animations, see the Animation Library reference or List animations.

  • Name
    action_ids
    Type
    array of integers
    Required
    Description

    Required unless you send action_id or motion_task_id. The IDs of 1 to 10 preset animations to apply at once, with no repeats. More than 10 IDs, or a repeated ID, returns 400. For the IDs, see the Animation Library reference.

    Meshy returns one file with one animation clip per action, which suits a state machine in a game engine. Meshy charges for each action in the list. See Pricing.

    A list with one ID works the same as sending that ID as action_id.

  • Name
    motion_task_id
    Type
    string
    Required
    Description

    Required unless you send action_id or action_ids. The ID of a Text to Motion task whose clip to apply instead of a preset action. The task must have the status SUCCEEDED, and the rig must be a biped.

    Meshy retargets the clip onto the rigged character. It copies the clip when you create this task, so this task isn't affected if the Text to Motion task later expires or you delete it. Meshy keeps the Text to Motion task's files for 3 days, so apply the clip before then.

  • Name
    post_process
    Type
    object
    Description

    Post-processing for the animation output. Leave it out to get the standard animation files.

    With motion_task_id, the retarget can produce a GLB-only animation. If you send post_process and no FBX file is available, the task fails with a task_error, and Meshy refunds your credits. Without post_process, the task succeeds, and animation_fbx_url is empty.

Applies only when post_process is set
  • Name
    operation_type
    Type
    string
    Description

    The operation to run. Without it, Meshy makes no extra file. A value not in the following list returns 400.

    Available values:

    • change_fps: changes the frame rate to fps
    • fbx2usdz: converts the animation to USDZ
    • extract_armature: extracts the armature as an FBX file
  • Name
    fps
    Type
    integer
    default 30
    Description

    The frame rate to change to, one of 24, 25, 30, or 60. Applies only when operation_type is change_fps. Any other value returns 400.

Returns

The result field of the response holds the ID of the new Animation task.

Failure modes

  • Name
    400 - Bad Request
    Description

    The request can't run. The error message says which problem it found. For example:

    • Missing parameter: rig_task_id is missing, or none of action_id, action_ids, and motion_task_id was sent.
    • Conflicting parameters: The request has more than one of action_id, action_ids, and motion_task_id. Send only one.
    • Invalid rig task: rig_task_id isn't a valid task ID, isn't a Rigging task, or points to a task that hasn't succeeded.
    • Invalid action ID: An action_id, or an entry in action_ids, isn't a valid animation.
    • Too many actions: action_ids has more than 10 IDs.
    • Duplicate actions: action_ids has the same ID more than once.
    • Motion task not ready: The motion_task_id task hasn't reached SUCCEEDED yet.
    • Unsupported rig: motion_task_id needs a biped rig, and Meshy rejects a quadruped rig.

    Fix the request, then send it again. See Errors.

  • Name
    401 - Unauthorized
    Description

    The API key is missing or invalid. Check the Authorization header.

  • Name
    402 - Payment Required
    Description

    For example:

    • Insufficient credits: The account doesn't have enough credits for this task, or the account reached a credit limit. Check your credit balance, then retry.
    • Free plan: Creating a task requires a paid plan. Upgrade your plan in your subscription settings, then retry.
  • Name
    403 - Forbidden
    Description

    The rig_task_id task is a bas-relief model, which this endpoint can't animate. The message is This model type does not support this operation. Rig a different model.

  • Name
    404 - Not Found
    Description

    Meshy can't find a task or file the request needs. One of these applies:

    • Meshy can't find the rig_task_id task among your tasks. Check the ID.
    • Meshy deleted the rig_task_id task's files after its expires_at. Rig the character again.
    • Meshy can't find the motion_task_id task. Check the ID.
    • The motion clip expired, because Meshy keeps a Text to Motion task's files for 3 days. Create another Text to Motion task.
  • Name
    429 - Too Many Requests
    Description

    You exceeded your rate limit. Wait, then retry. See Rate limits.


GET/openapi/v1/animations/:id

Get an Animation task

Returns an Animation task by its ID.

Request

GET
/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791
curl https://api.meshy.ai/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

{
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "type": "animate",
  "status": "SUCCEEDED",
  "created_at": 1747032440896,
  "progress": 100,
  "started_at": 1747032441210,
  "finished_at": 1747032457530,
  "expires_at": 1747291657530,
  "task_error": {

    "message": ""

  },

  "consumed_credits": 3,
  "result": {
    "animation_glb_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/Animation_Reaping_Swing_withSkin.glb?Expires=...",
    "animation_fbx_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/Animation_Reaping_Swing_withSkin.fbx?Expires=...",
    "processed_usdz_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/processed.usdz?Expires=...",
    "processed_armature_fbx_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/processed_armature.fbx?Expires=...",
    "processed_animation_fps_fbx_url": "https://assets.meshy.ai/0630d47c-84b8-4d37-bc02-69e45d9272c1/tasks/018c425b-b2c6-727e-d333-3c1887i9h791/output/processed_60fps.fbx?Expires=..."
  },
  "preceding_tasks": 0
}

Parameters

  • Name
    id
    Type
    path
    Description

    The task ID from the create response.

Returns

The Animation task object.


DELETE/openapi/v1/animations/:id

Delete an Animation task

Permanently deletes an Animation task, including its models and data. You can't undo a delete.

Request

DELETE
/openapi/v1/animations/018b314a-a1b5-716d-c222-2f1776f7f579
curl --request DELETE \
  --url https://api.meshy.ai/openapi/v1/animations/018b314a-a1b5-716d-c222-2f1776f7f579 \
  -H "Authorization: Bearer ${YOUR_API_KEY}"

Response

// 200 OK on success, with an empty body.
//
// 409 Conflict when the task is IN_PROGRESS. The task keeps running:
{
  "message": "Task is IN_PROGRESS and cannot be deleted. Credits for a task the worker has already started are not refundable; wait for it to reach SUCCEEDED, FAILED or CANCELED, then delete it."
}

Path parameters

  • Name
    id
    Type
    path
    Description

    The ID of the task to delete.

Task status

Deleting a PENDING task refunds the credits it used when you created it.

An IN_PROGRESS task can't be deleted. The request returns 409 Conflict, and the task keeps running. Meshy doesn't refund a task that has started, so deleting it would cost you both the credits and the result. Wait for it to reach SUCCEEDED, FAILED, or CANCELED, then delete it.

Deleting a task in a final status (SUCCEEDED, FAILED, or CANCELED) doesn't refund its credits.

Returns

200 OK when the task is deleted, or 409 Conflict when the task is IN_PROGRESS.


GET/openapi/v1/animations

List Animation tasks

Returns a paginated list of your Animation tasks, newest first. To page through the list, use page_num and page_size.

Tasks you create through the API don't appear in My Assets in the web app, so you manage them through the API. To find a task whose ID you no longer have, use this endpoint.

Request

GET
/openapi/v1/animations
curl "https://api.meshy.ai/openapi/v1/animations?page_num=1&page_size=20" \
-H "Authorization: Bearer ${YOUR_API_KEY}"

GET/openapi/v1/animations/:id/stream

Stream an Animation task

Streams an Animation task's updates as Server-Sent Events (SSE).

Request

GET
/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791/stream
curl -N https://api.meshy.ai/openapi/v1/animations/018c425b-b2c6-727e-d333-3c1887i9h791/stream \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response Stream

// Error event example
event: error
data: {
  "status_code": 404,
  "message": "Task not found"
}

// Message event examples illustrate task progress.
// These examples are shortened. Each event holds the full task object.
event: message
data: {
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "progress": 0,
  "status": "PENDING"
}

event: message
data: {
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "progress": 50,
  "status": "IN_PROGRESS"
}

event: message
data: { // Example of a SUCCEEDED task stream item, with the same structure as the Animation task object
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "type": "animate",
  "status": "SUCCEEDED",
  "created_at": 1747032440896,
  "progress": 100,
  "started_at": 1747032441210,
  "finished_at": 1747032457530,
  "expires_at": 1747291657530,
  "task_error": {

    "message": ""

  },

  "consumed_credits": 3,
  "result": {
    "animation_glb_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.glb?...",
    "animation_fbx_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.fbx?...",
    "processed_usdz_url": "https://assets.meshy.ai/.../processed.usdz?...",
    "processed_armature_fbx_url": "https://assets.meshy.ai/.../processed_armature.fbx?...",
    "processed_animation_fps_fbx_url": "https://assets.meshy.ai/.../processed_60fps.fbx?..."
  },
  "preceding_tasks": 0
}

Parameters

  • Name
    id
    Type
    path
    Description

    The task ID from the create response.

Returns

A stream of Animation task objects as Server-Sent Events.

Each event holds the full task object, in the same shape the Get endpoint returns. While the task is PENDING or IN_PROGRESS, its result fields don't have values yet.


The Animation task object

An Animation task object describes one animation applied to a rigged character. It holds the status, the progress, and the animation files when the task succeeds.

Properties

Example Animation Task Object

{
  "id": "018c425b-b2c6-727e-d333-3c1887i9h791",
  "type": "animate",
  "status": "SUCCEEDED",
  "created_at": 1747032440896,
  "progress": 100,
  "started_at": 1747032441210,
  "finished_at": 1747032457530,
  "expires_at": 1747291657530,
  "task_error": {

    "message": ""

  },

  "consumed_credits": 3,
  "result": {
    "animation_glb_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.glb?...",
    "animation_fbx_url": "https://assets.meshy.ai/.../Animation_Reaping_Swing_withSkin.fbx?...",
    "processed_usdz_url": "https://assets.meshy.ai/.../processed.usdz?...",
    "processed_armature_fbx_url": "https://assets.meshy.ai/.../processed_armature.fbx?...",
    "processed_animation_fps_fbx_url": "https://assets.meshy.ai/.../processed_60fps.fbx?..."
  },
  "preceding_tasks": 0
}
  • Name
    id
    Type
    string
    Description

    The task ID. Treat it as an opaque string, and don't rely on its format.

  • Name
    type
    Type
    string
    Description

    The task type, always animate.

  • Name
    status
    Type
    string
    Description

    The task status, one of PENDING, IN_PROGRESS, SUCCEEDED, FAILED, or CANCELED.

  • Name
    progress
    Type
    integer
    Description

    How much of the task is done, as a percentage. It's 0 until the task starts and 100 when it succeeds.

  • Name
    created_at
    Type
    timestamp
    Description

    Time the task was created, in Unix milliseconds.

  • Name
    started_at
    Type
    timestamp
    Description

    Time the task started, in Unix milliseconds. It's 0 until the task starts.

  • Name
    finished_at
    Type
    timestamp
    Description

    Time the task finished, in Unix milliseconds. It's 0 until the task finishes.

  • Name
    expires_at
    Type
    timestamp
    Description

    Time the task's result files expire, in Unix milliseconds.

  • Name
    task_error
    Type
    object
    Description

    The error details when the task fails. See Errors.

  • Name
    consumed_credits
    Type
    integer
    Description

    The number of credits the task used. Present when the status is PENDING, IN_PROGRESS, or SUCCEEDED. It's 0 for a FAILED task, because Meshy refunds the credits when a task fails.

  • Name
    result
    Type
    object
    Description

    Download URLs for the animation files, when the task has the status SUCCEEDED.

    • Name
      animation_glb_url
      Type
      string
      Description
      The animation as a GLB file. For a task created with action_ids, this one file holds every requested action as a separate clip.
    • Name
      animation_fbx_url
      Type
      string
      Description
      The animation as an FBX file. For a task created with action_ids, this one file holds every requested action as a separate clip.
    • Name
      processed_usdz_url
      Type
      string
      Description
      The processed animation as a USDZ file.
    • Name
      processed_armature_fbx_url
      Type
      string
      Description
      The processed armature as an FBX file.
    • Name
      processed_animation_fps_fbx_url
      Type
      string
      Description
      The animation at the changed frame rate, as an FBX file, for example when you used the change_fps operation.
  • Name
    preceding_tasks
    Type
    integer
    Description

    The number of tasks ahead of this one in the queue. The value is meaningful only while the task is PENDING.


GET/openapi/v1/animations/library

List animations

Returns every animation in the library, ordered by action_id. The response is the complete list, with no pages, so one call can fill an action picker. Filters narrow the result. To get every animation, leave them all out.

To browse the same list with an animated preview of each action, see the Animation Library reference.

This request costs no credits.

Request

GET
/openapi/v1/animations/library
curl "https://api.meshy.ai/openapi/v1/animations/library?category=Fighting" \
-H "Authorization: Bearer ${YOUR_API_KEY}"

Response

[
  {
    "action_id": 4,
    "name": "Attack",
    "key": "Attack",
    "category": "Fighting",
    "sub_category": "AttackingwithWeapon",
    "preview_url": "https://cdn.meshy.ai/webapp-assets/feature-demo/animation/preview/biped/Attack.gif"
  },
  {
    "action_id": 92,
    "name": "Double Combo Attack",
    "key": "Double_Combo_Attack",
    "category": "Fighting",
    "sub_category": "AttackingwithWeapon",
    "preview_url": "https://cdn.meshy.ai/webapp-assets/feature-demo/animation/preview/biped/Double_Combo_Attack.gif"
  }
]

Parameters

  • Name
    search
    Type
    string
    Description

    Text to search for. Meshy returns the animations whose name or key contains this text, ignoring case. Meshy matches the text literally, so % and _ aren't wildcards.

  • Name
    category
    Type
    string
    Description

    The category to list, as an exact match. An unknown category returns an empty list.

    Available values:

    • WalkAndRun
    • BodyMovements
    • DailyActions
    • Fighting
    • Dancing
  • Name
    sub_category
    Type
    string
    Description

    The subcategory to list, as an exact match. You can send it without category. Subcategory names aren't unique across categories. For example, Transitioning is under both Fighting and DailyActions. So without category, the filter matches the subcategory in every category.

  • Name
    action_ids
    Type
    string
    Description

    The animations to return, as up to 200 comma-separated action_id values. Use it to look up specific IDs instead of browsing. More than 200 IDs returns 400.

    The response leaves out an ID that no animation has. So you can also use this filter to check whether IDs you stored are still available.

Combining filters

Meshy applies the filters together. Each one narrows the result, so Meshy returns an animation only if it matches all of them. Within one filter, any of its values can match. For example, search matches name or key, and action_ids matches any ID in the list.

So a combination with no overlap returns an empty array, not an error. Action 92 is "Double Combo Attack", a Fighting animation. For example:

  • ?action_ids=92&category=Fighting returns action 92.
  • ?action_ids=92&category=Dancing returns [], because it isn't a Dancing animation.
  • ?action_ids=92&search=walk returns [], because its name doesn't match walk.

To get specific animations in any category, send action_ids on its own.

Returns

A list of animation objects.


The animation object

An animation object describes one animation in the library.

Example Animation Object

{
  "action_id": 92,
  "name": "Double Combo Attack",
  "key": "Double_Combo_Attack",
  "category": "Fighting",
  "sub_category": "AttackingwithWeapon",
  "preview_url": "https://cdn.meshy.ai/webapp-assets/feature-demo/animation/preview/biped/Double_Combo_Attack.gif"
}
  • Name
    action_id
    Type
    integer
    Description

    The value to send as action_id when you create an Animation task. It's unique and stable, but not contiguous. Retired animations leave gaps in the numbering, so don't assume that every ID in a range is valid.

  • Name
    name
    Type
    string
    Description

    The animation's display name. It isn't unique, because some animations share a name with another variant. To identify an animation, use action_id or key.

  • Name
    key
    Type
    string
    Description

    A unique, stable slug for the animation. Use it when you need a non-numeric ID to key your own storage on.

  • Name
    category
    Type
    string
    Description

    The top-level group, for example Fighting.

  • Name
    sub_category
    Type
    string
    Description

    The group within the category, for example AttackingwithWeapon.

  • Name
    preview_url
    Type
    string
    Description

    URL of an animated GIF preview of the action. You can show it directly in your own picker.