API Docs

Model conversion API

Converts a GLB model asynchronously to FBX, OBJ, or a VRChat SDK3 Unity package.

Start a conversion

POST /api/convert-model

Authentication: none.

Rate limit: no endpoint-specific limit. Deployment-level request and abuse protections may still apply.

Token or credit effects: none.

Multipart request

Content type: multipart/form-data

| Field | Type | Required | Description |

| --- | --- | --- | --- |

| file | File | Yes | Source GLB file. |

| format | String | Yes | fbx, obj, or vrchat. |

| embed_textures | String | No | true embeds textures in FBX. The default is false. |

| vrchat_target | String | Required for vrchat | pc or quest. The default is pc for compatibility. |

curl -X POST https://example.com/api/convert-model \
  -F "[email protected]" \
  -F "format=vrchat" \
  -F "vrchat_target=quest"

Raw request

Send the GLB as the request body and provide format as a query parameter. embed_textures=true and vrchat_target=pc|quest are optional.

curl -X POST "https://example.com/api/convert-model?format=fbx&embed_textures=true" \
  -H "Content-Type: model/gltf-binary" \
  --data-binary "@avatar.glb"

Response

Status: 200 OK

{
  "id": "a6e96149-46ce-4c67-8a45-bc79cba56ff2",
  "format": "vrchat",
  "inputSize": 4182048
}

| Field | Type | Description |

| --- | --- | --- |

| id | UUID string | Conversion identifier used by the progress and download routes. |

| format | String | Requested output format. |

| inputSize | Integer | Uploaded GLB size in bytes. |

VRChat output contract

format=vrchat requires a rigged humanoid GLB. Auto-rigger exports are supported directly, including their crateyardEyeLevel marker. Preflight rejects models without the required Humanoid skeleton. Quest preflight also rejects models above the measured 20,000-triangle hard limit.

vrchat_target=pc produces avatar-pc.unitypackage. vrchat_target=quest produces avatar-quest.unitypackage. Quest packages limit imported textures to 1024 pixels, apply an Android texture platform override at the same limit, and configure generated materials with VRChat/Mobile/Toon Lit when the package setup script runs in a current VCC Avatars project.

Each package contains:

  • avatar.fbx configured for Unity Humanoid with available body and finger bones mapped.
  • External materials and textures when present.
  • AvatarExport.json with platformTarget, androidVariant, compatibility checker version, static compatibility report, bone map, and viewpoint.
  • An editor setup tool that validates Unity's generated Humanoid Avatar.
  • Automatic creation of Avatar.prefab with an SDK3 VRCAvatarDescriptor, PipelineManager, default animation layers, lip sync defaults, and the configured viewpoint.
  • Automatic creation of AvatarScene.unity, ready for the VRChat SDK Builder.

Import the package into a VRChat Creator Companion Avatars project. The package does not bundle the VRChat SDK because VCC manages the supported SDK version.

Quest-only components can be removed from an existing avatar package with POST /api/vrchat/quest-package, which returns a Quest copy of a .unitypackage with lights, audio sources, cloth, rigidbodies not used by joints, and colliders removed from the avatar subtree. The editor-only helper com.crateyard.vrchat-helper (served at GET /api/vrchat/unity-helper.tgz) adds a Quest check and the remaining Unity-side steps. See VRChat Quest package.

Start errors

| Status | Error | Cause |

| --- | --- | --- |

| 400 | Missing 'file' or 'format' field | Multipart request omitted a required field. |

| 400 | Missing 'format' query param | Raw request omitted the format query parameter. |

| 400 | Unsupported format. Use 'fbx', 'obj', or 'vrchat' | Unknown output format. |

| 400 | File too large (max 300 MB) | Uploaded model exceeds the conversion limit. |

| 422 | VRChat export requires a Humanoid rig... | Required Humanoid bones are missing. The response includes code, missingBones, and the static report. |

| 422 | Quest export requires 20,000 triangles or fewer... | Quest hard-limit preflight failed. The response includes the static report. |

| 422 | VRChat target must be 'pc' or 'quest' | Unknown VRChat platform target. |

Blender and package-build failures after successful preflight are reported by the progress stream and download route.

Stream progress

GET /api/convert-model/{id}

Authentication: none.

Rate limit: no endpoint-specific limit.

Token or credit effects: none.

Response content type: text/event-stream.

Each Server-Sent Event contains JSON:

data: {"time":1785175200000,"message":"Validated 53 VRChat bones","percent":88}

data: {"done":true,"status":"done","error":null}

Progress event schema:

| Field | Type | Description |

| --- | --- | --- |

| time | Integer | Unix timestamp in milliseconds. |

| message | String | Current conversion step or error. |

| percent | Number or null | Completion percentage when known. |

Completion event schema:

| Field | Type | Description |

| --- | --- | --- |

| done | Boolean | Always true for the terminal event. |

| status | String | done or error. |

| error | String or null | Conversion error message. |

Errors:

| Status | Error | Cause |

| --- | --- | --- |

| 404 | Conversion not found | Unknown or expired conversion identifier. |

Conversion records expire after 10 minutes and are also removed after a successful download.

Download a conversion

GET /api/convert-model/{id}/file

Authentication: none.

Rate limit: no endpoint-specific limit.

Token or credit effects: none.

Successful response:

| Format | Filename | Content type |

| --- | --- | --- |

| fbx | model.fbx | application/octet-stream |

| obj | model.zip | application/zip |

| vrchat, PC | avatar-pc.unitypackage | application/octet-stream |

| vrchat, Quest | avatar-quest.unitypackage | application/octet-stream |

curl -o avatar.unitypackage \
  https://example.com/api/convert-model/a6e96149-46ce-4c67-8a45-bc79cba56ff2/file

Errors:

| Status | Error | Cause |

| --- | --- | --- |

| 404 | Conversion not found | Unknown, expired, or already downloaded conversion. |

| 409 | Conversion still in progress | Conversion has not completed. |

| 500 | Conversion-specific message | Blender conversion failed, the input was invalid, or a VRChat Humanoid requirement was not met. |