Supported formats

Converters accept a broad set of input formats and export to a smaller set of output formats.

Input formats

FormatExtensionsEngine
Wavefront OBJ.objthree.js
FBX.fbxthree.js
glTF / GLB.gltf, .glbthree.js
STL.stlthree.js
Collada.daethree.js
PLY.plythree.js
STEP.step, .stpCAD (OpenCascade)
IGES.iges, .igsCAD (OpenCascade)
3DS.3dsAssimp
USD / USDZ.usd, .usdzUSD engine
Blender.blendBlender engine

Output formats

FormatExtensions
Wavefront OBJ.obj
STL.stl
glTF.gltf
GLB (binary glTF).glb
Collada.dae
FBX.fbx
PLY.ply
Not every combination is supported

Input formats are routed through the appropriate engine before export. If a requested output format is not supported for an input, the job fails with a descriptive errorMessage.

How conversion works

Conversion is asynchronous and uses three steps:

  1. Start: POST /api/converter/convert uploads the file and returns 202 Accepted with a job id.
  2. Poll: GET /api/converter/status/:id returns the job status: pending, processing, completed, or failed.
  3. Download: once completed, GET /api/converter/download/:id returns a signed download URL.

Converted files are stored temporarily and cleaned up after roughly one hour, so download results promptly.

Start a conversion

POST /api/converter/convert Optional auth

Uploads a file and starts a conversion job. Guests are allowed with a strict daily limit.

FieldTypeDescription
filefile *The model to convert (multipart form field).
inputFormatstring *Source format, e.g. obj, fbx, glb, step.
outputFormatstring *Target format, e.g. glb, stl, fbx.
sessionIdstringOptional client session identifier.

Response 202:

json
{
  "id": "60d21b4667d0d8992e610c85",
  "status": "pending",
  "message": "Conversion job received"
}

Example:

bash
curl -X POST https://api.geometry-labs.com/api/converter/convert \
  -H "Authorization: Bearer $GL_TOKEN" \
  -F "file=@model.obj" \
  -F "inputFormat=obj" \
  -F "outputFormat=glb"

Get job status

GET /api/converter/status/:id Public

Returns the current status of a conversion job.

json
{
  "id": "60d21b4667d0d8992e610c85",
  "status": "completed",
  "inputFormat": "obj",
  "outputFormat": "glb",
  "originalName": "model.obj",
  "outputName": "model.glb",
  "downloadUrl": "/api/converter/download/60d21b4667d0d8992e610c85"
}

When status is failed, an error field contains the reason.

Download the result

GET /api/converter/download/:id Public

Returns a signed, short-lived download URL. Add ?redirect=true to redirect directly to the file instead of receiving JSON.

json
{
  "downloadUrl": "https://...signed-url...",
  "fileName": "model.glb"
}