Skip to main content

Download a motion

Download generated motions in FBX or GLB format using the motion download endpoints.

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.

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).

# 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).

# 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

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 supported character ID)
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

Combining options

You can combine fps, no_mesh, in_place, and roblox_compatible parameters:

# 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 supported character ID)
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

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

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 or false)400
Invalid in_place (not true or false)400
Invalid roblox_compatible (not true or false)400
roblox_compatible=true with GLB format400
roblox_compatible=true with unsupported character (not cFB7NoFCUCvf, cg1RuTM77HXu, or c8EaC2nVbPS8)400
Invalid motion or character ID, or no access404
Permission denied (quota, etc.)403
Not logged in401