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 onlycurlhttps://api.meshy.ai/openapi/v1/animations \-XPOST \-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 actioncurlhttps://api.meshy.ai/openapi/v1/animations \-XPOST \-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 actioncurlhttps://api.meshy.ai/openapi/v1/animations \-XPOST \-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 FPScurlhttps://api.meshy.ai/openapi/v1/animations \-XPOST \-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.
With action_ids, the task returns one merged file instead of one file per action. animation_glb_url and animation_fbx_url each point at one file that holds every requested action as a separate clip. In that file:
Clip order: the order of the action_ids array, not the numeric order of the IDs.
Clip names: the animation's name in the library. These match the names you get when you export all of a character's animations as one file from the Meshy web app. If two requested IDs have the same clip name, Meshy adds the action_id to the later one to keep names unique.
Post-processing: Meshy applies it to the merged file, not to each clip.
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.
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.
// 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.
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.
// Error event exampleevent: errordata: {"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: messagedata: {"id": "018c425b-b2c6-727e-d333-3c1887i9h791","progress": 0,"status": "PENDING"}event: messagedata: {"id": "018c425b-b2c6-727e-d333-3c1887i9h791","progress": 50,"status": "IN_PROGRESS"}event: messagedata: { // 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}
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.
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.
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.
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.
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:
Create an Animation task accepts every action_id this endpoint returns, and this endpoint returns every ID that create accepts. Neither includes retired animations. If you cache the library, refresh it from time to time, so a retired ID doesn't stay in your picker.
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.