Skip to main content

Download a motion

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

API_KEY="{{apiKey}}"
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

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

# Download at 60 FPS
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?fps=60" \
  -u $API_KEY: \
  -o motion-60fps.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 additonal 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, not to Unitree G1 CSV.

# 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

Torso-isolated motion

Use the torso_only query parameter to isolate motion to the torso. Set torso_only=true to keep the character lower body immobile (default: false). The same retargeting pipeline applies to FBX, GLB, and BVH; it is not used for Unitree G1 CSV exports.

# Download torso-isolated motion
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?torso_only=true" \
  -u $API_KEY: \
  -o motion-torso-only.fbx

Roblox-compatible FBX

Experimental

Use the roblox_compatible query parameter to export FBX optimized for Roblox Studio. Set roblox_compatible=true to enable Roblox-compatible export.

Caveats:

  • Only applies to FBX format (not GLB); using with GLB returns an error
  • Only supported for character IDs: cFB7NoFCUCvf, cg1RuTM77HXu, c8EaC2nVbPS8; using with any other character ID returns an error
# Download Roblox-compatible FBX (use a character with engine "roblox" in metadata)
CHARACTER_ID="cFB7NoFCUCvf"
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?roblox_compatible=true" \
  -u $API_KEY: \
  -o motion-roblox.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). Not supported for Unitree G1 CSV exports.

# 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

# Download at double speed
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?speed_multiplier=2.0" \
  -u $API_KEY: \
  -o motion-double-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, e.g. Unitree G1).

# 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

# Download at 30 FPS, in-place, with Roblox-compatible FBX (use a character with engine "roblox" in metadata)
CHARACTER_ID="cFB7NoFCUCvf"
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?fps=30&no_mesh=false&in_place=true&roblox_compatible=true" \
  -u $API_KEY: \
  -o motion-30fps-roblox.fbx

# Download at 30 FPS, half speed
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/fbx/motion.fbx?fps=30&speed_multiplier=0.5" \
  -u $API_KEY: \
  -o motion-30fps-half-speed.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

# Or using no_mesh parameter
curl -L "https://uthana.com/motion/file/motion_viewer/$CHARACTER_ID/$MOTION_ID/glb/motion.glb?no_mesh=true" \
  -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.

# Preview WebM is available via the API reference — see /graphql for the preview query

Check download quota

Check whether a motion download is allowed before consuming quota.

# Check download quota via GraphQL — see the API reference for the motionDownloads query

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.

ConditionStatus code
Invalid fps (not 24, 30, or 60)400
Invalid no_mesh (not true, false, or minimal)400
no_mesh=minimal with non-GLB format400
Invalid in_place (not true or false)400
Invalid torso_only (not true or false)400
Invalid roblox_compatible (not true or false)400
roblox_compatible=true with GLB format400
roblox_compatible=true with a non-FBX format (including BVH, CSV)400
roblox_compatible=true with a character that does not have "engine": "roblox" in bundle metadata400
speed_multiplier is not a valid number400
speed_multiplier out of range (must be > 0 and ≤ 2)400
Invalid motion or character ID, or no access404
Permission denied (quota, etc.)403
Not logged in401