Download a motion | Uthana API Docs
Downloading Motion Files
Download generated motions in FBX, GLB, or BVH using the motion download endpoints. (For integrating Uthana motions with a Unitree G1 robot, see Unitree G1).
Step 1: Identify your character and motion IDs
You need both the characterId and motionId to download files.
Note: The filename in the URL is customizable for /motion/file/ and /motion/animation/ endpoints. You can use any filename you want (e.g., motion.fbx, walking-animation.glb). The /motion/bundle/ endpoint requires the fixed filename character.glb or character.fbx.
Retargeting: When you download a motion with a specific character ID, retargeting happens automatically—the motion is adapted to work with that character's skeleton and proportions. This applies to FBX, GLB, and BVH character-animated exports (the Unitree G1 CSV format does not include model meshes, so retargeting is not applicable).
Step 2: Download the motion file
Shell
API_KEY="your-api-key"
CHARACTER_ID="cXi2eAP19XwQ"
MOTION_ID="your-motion-id"
# FBX (includes character mesh)
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx" \
-u $API_KEY: \
-o motion.fbx
# GLB (includes character mesh)
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/glb/motion.glb" \
-u $API_KEY: \
-o motion.glb
Python
import asyncio
from uthana import Uthana
client = Uthana("your-api-key")
CHARACTER_ID = "cXi2eAP19XwQ"
MOTION_ID = "your-motion-id"
async def main():
# GLB (includes character mesh)
glb_data = await client.motions.download(CHARACTER_ID, MOTION_ID, output_format="glb")
with open("motion.glb", "wb") as f:
f.write(glb_data)
# FBX
fbx_data = await client.motions.download(CHARACTER_ID, MOTION_ID, output_format="fbx")
with open("motion.fbx", "wb") as f:
f.write(fbx_data)
asyncio.run(main())
TypeScript
import { UthanaClient } from "@uthana/client";
const client = new UthanaClient(process.env.UTHANA_API_KEY!);
const CHARACTER_ID = "cXi2eAP19XwQ";
const MOTION_ID = "your-motion-id";
// GLB (includes character mesh)
const glbBuffer = await client.motions.download(CHARACTER_ID, MOTION_ID, { output_format: "glb" });
// FBX
const fbxBuffer = await client.motions.download(CHARACTER_ID, MOTION_ID, { output_format: "fbx" });
Download options
Frame rate (FPS)
You can specify the frame rate for downloaded motions using the fps query parameter. Supported values are 24, 30, and 60.
Download at 30 FPS
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?fps=30" \
-u $API_KEY: \
-o motion-30fps.fbx
Exclude character mesh
Use the no_mesh query parameter to download animation data without the character mesh. Set no_mesh=true to exclude the mesh, or no_mesh=false to include it (default). For .glb downloads only, there is an additional option no_mesh=minimal, which creates a skeleton-like mesh for easier viewing.
Download FBX without character mesh
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?no_mesh=true" \
-u $API_KEY: \
-o motion-no-mesh.fbx
In-place motion
Use the in_place query parameter to remove horizontal root motion from the animation. Set in_place=true to keep the character in place with no horizontal translation (default: false). This applies to FBX, GLB, and BVH retargeted exports.
Download motion with character in place
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?in_place=true" \
-u $API_KEY: \
-o motion-in-place.fbx
Speed multiplier
Use the speed_multiplier query parameter to scale the playback speed of the downloaded motion. Accepts a float value greater than 0 and at most 2.0. The default is 1.0 (no change).
Download at half speed
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?speed_multiplier=0.5" \
-u $API_KEY: \
-o motion-half-speed.fbx
Combining options
You can combine fps, no_mesh, in_place, torso_only, roblox_compatible, and speed_multiplier parameters (some parameters are not supported for certain formats).
Download at 30 FPS without character mesh
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?fps=30&no_mesh=true" \
-u $API_KEY: \
-o motion-30fps-no-mesh.fbx
Motion-only GLB
To download only animation data without the character mesh, you can use the motion-only endpoint or the no_mesh=true parameter:
Using the motion-only endpoint
curl -L "https://uthana.com/motion/animation/motion_viewer/$CHARACTER_ID/$MOTION_ID/glb/motion.glb" \
-u $API_KEY: \
-o motion-only.glb
Preview WebM
Download a short preview video (WebM) for a motion. Preview downloads do not count against your download quota.
Error handling
These endpoints return binary file data on success. On error, they return an HTTP error status. Check response.status (or response.status_code) in your code—the response body may contain error details, but for file downloads the status code is the primary signal.
| Condition | Status code |
|---|---|
Invalid fps (not 24, 30, or 60) |
400 |
Invalid no_mesh (not true, false, or minimal) |
400 |
Invalid in_place (not true or false) |
400 |
Invalid torso_only (not true or false) |
400 |
Invalid roblox_compatible (not true or false) |
400 |
| Invalid motion or character ID, or no access | 404 |
| Permission denied (quota, etc.) | 403 |
| Not logged in | 401 |