Hyper3DHyper3D Docs
API Specification

Rigging

Rig a Rodin asset or an uploaded model with a skeleton template, a custom hierarchy, and optional animations.

POST
/api/v2/rigging

Authorization

bearer
headerAuthorizationBearer <token>

Request Body

multipart/form-data
  1. body
bone_template?string
Default"auto"
Value in"human""quadruped""human_UE""human_Unity""human_ActorCore""bird""dragon""kaiju""custom""auto"
rigging_mode?string
Default"generate"
Value in"generate""modify"
asset_id?string
Formatuuid
model?file
Formatbinary
image?file
Formatbinary
skinning_method?string
Default"shell"
Value in"shell""core"
hierarchy?array<>
Items1 <= items <= 256
skeleton_description?string
Match\S
animation_preset?array<>
Itemsitems <= 10
animation_files?array<>
Itemsitems <= 10
material?string
Value in"PBR""Shaded""All""Hybrid""None"
geometry_file_format?string

Optional. File format for the rigged model. Select one format.

Default"glb"
Value in"glb""fbx""usdz"

Response Body

application/json
  1. response
error?string
Value in"NO_SUCH_TASK""ASSET_NOT_AVAILABLE""IMAGE_LABEL_LENGTH_TOO_LONG""INVALID_REQUEST""API_NO_ACTIVE_SUBSCRIPTION""API_SUBSCRIPTION_PLAN_TOO_LOW""API_PARALLELISM_LIMIT_REACHED""API_INSUFFICIENT_FUNDS""API_OBJECT_NOT_FOUND_ON_IMAGE""IMAGE_CONTENT_VIOLATION""PERMISSION_DENIED""API_UNKNOWN"
message?string

Success message or detailed error information.

uuid?string
Formatuuid
submit_time?string

Server time when the task was submitted.

Formatdate-time
jobs?
consumed?number
Example Request
curl -X POST 'https://api.hyper3d.com/api/v2/rigging'
Example Response
{  "error": "NO_SUCH_TASK",  "message": "Submitted.",  "uuid": "123e4567-e89b-12d3-a456-426614174000",  "submit_time": "2019-08-24T14:15:22Z",  "jobs": {    "uuids": [      "52faea01-729e-4195-85e8-6050a65315e3"    ],    "subscription_key": "string"  },  "consumed": 0}

Rigging accepts exactly one of two input modes. Sending both asset_id and model, or neither, is rejected.

Generate with a preset skeleton

Set bone_template to a preset — human, quadruped, human_UE, human_Unity, or human_Actorcore — and do not provide hierarchy or skeleton_description. Presets accept either input mode.

Rodin asset input

Use the top-level uuid returned by a completed Rodin generation as asset_id. The asset must have a confirmed model from ModelRefine, TextureGenerate, or TextureRefine; assets created by rodin_texture_only are not supported. Confirmed geometry and textures are reused without modifying the source, and the source input image is reused automatically when available.

  • Required: asset_id, bone_template.
  • Mutually exclusive: model, image must be omitted.
curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/rigging' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'asset_id=123e4567-e89b-12d3-a456-426614174000' \
  --form 'bone_template=human' \
  --form 'animation_preset=human/Walking' \
  --form 'geometry_file_format=fbx'

Custom model input

Upload one model. A reference image is required unless material is None, because texture generation samples from it; the same image also helps interpret the body structure.

  • Required: model, bone_template, and image unless material=None.
  • Mutually exclusive: asset_id must be omitted.
  • Supported model formats: obj, glb, stl, fbx, usd, usda, usdz, and usdc. Embedded materials and textures are not preserved.
curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/rigging' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'model=@./model.glb' \
  --form 'image=@./reference.png' \
  --form 'bone_template=human' \
  --form 'material=PBR' \
  --form 'animation_preset=human/Walking' \
  --form 'geometry_file_format=glb'

Showcase

A full preset-template rigging flow, from a single uploaded model to an animated rigged output.

API request — send a humanoid mesh to the preset human bone template and receive a rigged asset with an animation.

curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/rigging' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'model=@./model.fbx' \
  --form 'bone_template=human' \
  --form 'skinning_method=core' \
  --form 'material=None' \
  --form 'animation_preset=human/Flair' \
  --form 'geometry_file_format=fbx'

Animated output — the rigged mesh driving an animation. Play / pause / reset below the viewer, or download the FBX to inspect the skeleton and animation in your DCC.

API request — send a quadruped mesh to the preset quadruped bone template and receive a rigged asset with an animation.

curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/rigging' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'model=@./model.fbx' \
  --form 'bone_template=quadruped' \
  --form 'skinning_method=shell' \
  --form 'material=None' \
  --form 'animation_preset=canine/Default_Canine_Run_Anim' \
  --form 'geometry_file_format=fbx'

Animated output — the rigged mesh driving an animation. Play / pause / reset below the viewer, or download the FBX to inspect the skeleton and animation in your DCC.

Generate with a custom skeleton

Set bone_template=custom and provide exactly one of hierarchy or skeleton_description. Either input mode (asset_id or model) works; the examples below upload a model.

hierarchy

hierarchy describes the skeleton as a flat node list encoded as a JSON array string. Each node carries name, parent (the index of the parent node), and optional transform and length.

Send it as a JSON array string in the request:

curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/rigging' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'model=@./model.glb' \
  --form 'image=@./reference.png' \
  --form 'bone_template=custom' \
  --form 'hierarchy=[{"name":"root","parent":-1},{"name":"spine","parent":0},{"name":"head","parent":1}]' \
  --form 'material=PBR' \
  --form 'geometry_file_format=glb'

skeleton_description

skeleton_description is a non-blank, natural-language description of the body structure and limbs. An image — uploaded as image or reused from the source asset — is sent alongside the description when available; without one, processing remains text-only.

curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/rigging' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'model=@./model.glb' \
  --form 'image=@./reference.png' \
  --form 'bone_template=custom' \
  --form 'skeleton_description=A quadruped with four legs, a long neck, and a tail.' \
  --form 'material=PBR' \
  --form 'geometry_file_format=glb'

Showcase

A full custom rigging flow, from a single uploaded model, custom skeleton hierarchy and animation file to an animated rigged output.

API request — send a custom mesh, custom skeleton hierarchy and animation file to the custom bone template and receive a rigged asset with an animation.

curl --fail-with-body --request POST 'https://api.hyper3d.com/api/v2/rigging' \
  --header "Authorization: Bearer ${RODIN_API_KEY}" \
  --form 'model=@./model.fbx' \
  --form 'bone_template=custom' \
  --form 'skinning_method=shell' \
  --form 'material=None' \
  --form 'animation_files=@./animation.fbx' \
  --form 'geometry_file_format=fbx' \
  --form 'hierarchy=@./hierarchy.json' 

Animated output — the rigged mesh driving an animation. Play / pause / reset below the viewer, or download the FBX to inspect the skeleton and animation in your DCC.

Modify an existing skeleton

Set rigging_mode=modify and provide skeleton_description containing the complete baseline skeleton and the requested changes; omit hierarchy. The skeleton is resolved from the description instead of loading the selected template.

Animations

Animations are optional. Up to 10 inputs in total from animation_preset (stock animation IDs) or animation_files (uploaded FBX clips, up to 25 MiB each, exactly one clip per file). Omit both fields to export without animations.

Pricing

Base Rigging generation: 0.5 credits

Response and errors

{
  "message": "Submitted.",
  "uuid": "123e4567-e89b-12d3-a456-426614174000",
  "jobs": {
    "uuids": ["223e4567-e89b-12d3-a456-426614174000"],
    "subscription_key": "subscription-key-from-generation-response"
  },
  "consumed": 0.5
}

Rigging uses the same application error codes as the other generation endpoints. HTTP 201 means the endpoint handled the request, but the task is accepted only when error is absent or empty and the top-level uuid is non-empty. HTTP 400 covers invalid fields, unsupported files, or conflicting input modes; 401 indicates invalid authentication; 429 indicates throttling. Poll and download using the same identifier rules as other generation endpoints.