Endpoints

POST /convert/jobs

Async conversion job creation

Use POST /convert/jobs to start an async conversion job.

POST /convert/jobs

This is the recommended endpoint for production integrations. You get a job ID, poll status, then download the result.

Request: multipart upload

Send multipart/form-data when you want to upload the file and create the job in one request.

Examples

curl

curl https://api.convert3d.org/convert/jobs \
  -F file=@model.obj \
  -F from=obj \
  -F to=glb \
  -H "Authorization: Bearer YOUR_API_TOKEN"

JavaScript

import { openAsBlob } from "node:fs";

const token = process.env.CONVERT3D_API_TOKEN;
const file = await openAsBlob("model.obj");

const form = new FormData();
form.append("file", file, "model.obj");
form.append("from", "obj");
form.append("to", "glb");

const response = await fetch("https://api.convert3d.org/convert/jobs", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${token}`,
  },
  body: form,
});

if (!response.ok) {
  throw new Error(await response.text());
}

const job = await response.json();
console.log(job.id);

Python

import os
import requests

with open("model.obj", "rb") as file:
    response = requests.post(
        "https://api.convert3d.org/convert/jobs",
        headers={"Authorization": f"Bearer {os.environ['CONVERT3D_API_TOKEN']}"},
        files={"file": ("model.obj", file)},
        data={"from": "obj", "to": "glb"},
        timeout=300,
    )

response.raise_for_status()
job = response.json()
print(job["id"])

Request: upload-first JSON

Use JSON after creating an upload URL and uploading the source file.

{
  "bucket": "uploads",
  "key": "uploads/abc123/large-model.glb",
  "fileName": "large-model.glb",
  "from": "glb",
  "to": "usdz"
}

See GET /upload-url for the full upload-first flow.

Response

{
  "id": "job_123",
  "status": "queued",
  "progress": 0
}

Next step

Poll GET /convert/jobs/:id every 2-5 seconds until the job is success or failed.