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.fbxconfigured for Unity Humanoid with available body and finger bones mapped.- External materials and textures when present.
AvatarExport.jsonwithplatformTarget,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.prefabwith an SDK3VRCAvatarDescriptor,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/fileErrors:
| 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. |