Convert 3D

Company

BlogAbout

Tools & API

ConvertCompressRenderViewDesktop AppDeveloper API

Community

Discord
© Otasha 2026
PrivacyTerms
    Convert 3D
    Convert
    3D

    Quick Start

    1. Get Your API Token

    Sign up for a Convert3D API account and get your API.

    2. Try the Interactive Example

    See the API in action with our interactive model viewer example.

    API Endpoints

    Simple REST API

    For quick conversions, use our simple REST endpoint that returns the converted file directly.

    Request

    Parameters

    file
    file
    The 3D model file you want to convert.
    from_format
    string
    The format of the file you are converting from.
    Supported input formats
    3d 3dm 3ds 3mf ac ac3d acc amf amj ase ask b3d blend brep bvh cob csm dae dwg dxf enff fbx gcode glb gltf hmb ifc iges igs iqm irr irrmesh lwo lws lxo m3d max md2 md3 md5 mdc mdl mot ms3d nc ndo nff obj off ogex ply pmx prj q3o q3s raw rbxl rbxm scn sib sldasm slddrw sldprt smd step stl stp ter uc usd usda usdc usdz vox vta x x3d xgl xml zgl
    to_format
    string
    The format of the file you are converting to.
    Supported output formats
    3dm 3ds 3mf dae fbx glb gltf obj ply rbxl rbxm stl stp usdz x
    Authorization
    string
    Your API token. You can get it from https://convert3d.org/convert3dapi

    Response

    Success: The converted file, form-encoded

    Job-based API (Recommended)

    For production applications, use our async job-based API that handles large files and provides progress updates.

    Job Status Values

    queued - Job is waiting to start
    in_progress - Job is currently processing
    success - Job completed successfully
    failed - Job failed with error

    1. Start Conversion Job

    Response Examples:
    Success:
    Error (400):
    Unauthorized (401):

    2. Check Job Status

    Response Examples:
    Success:
    In Progress:
    Failed:

    3. Download Converted File

    Response Examples:
    Success:
    Not Ready (409):
    Not Found (404):

    Code Examples

    JavaScript (Vanilla)

    React/Next.js

    HTML with Model Viewer

    API Reference

    Endpoints

    POST/api/convert

    Simple REST endpoint for quick conversions

    POST/api/convert/jobs

    Start a conversion job (async)

    GET/api/convert/jobs/{id}

    Check job status

    GET/api/convert/jobs/{id}/download

    Download converted file

    Authentication

    Header

    Authorization: Bearer YOUR_API_TOKEN

    Get Your Token

    Sign up for Convert3D API and get your API token from https://convert3d.org/convert3dapi.

    Supported Formats

    View all supported input and output formats for conversion.

    Best Practices

    File Optimization

    • • Compress large models before upload
    • • Use GLB format for web display (smaller file size)
    • • Validate file types and sizes before upload

    Error Handling

    • • Always check API response status
    • • Implement retry logic for failed requests
    • • Show user-friendly error messages
    • • Handle network timeouts gracefully

    Troubleshooting

    "Invalid API Token" Error

    Verify your API token is correct and hasn't expired. Ensure you're including the "Bearer " prefix.

    "File Too Large" Error

    Compress your model file or use a more efficient format. Consider splitting large models.

    "Unsupported Format" Error

    Check the supported formats list and verify the file extension matches the actual format.

    Convert 3D

    Company

    BlogAbout

    Tools & API

    ConvertCompressRenderViewDesktop AppDeveloper API

    Community

    Discord
    © Otasha 2026
    PrivacyTerms
    Get your API key here. Download damaged-helmet.glb to test.
    curl https://convert3d.org/api/convert \
    -F file=@damaged-helmet.glb \
    -F from_format=glb \
    -F to_format=usdz \
    -H "Authorization: Token %your token here%" \
    -o damaged-helmet.usdz
    {
      "id": "abc123def456",
      "status": "queued",
      "progress": 0
    }
    {
      "url": "https://storage.convert3d.org/converted/1234567890-model.glb?signature=..."
    }
    {
      "error": "Missing 'file' field"
    }
    curl https://convert3d.org/api/convert \
    -F file=@damaged-helmet.glb \
    -F from_format=glb \
    -F to_format=usdz \
    -H "Authorization: Token %your token here%" \
    -o damaged-helmet.usdz
    POST /api/convert/jobs
    Authorization: Bearer YOUR_API_TOKEN
    Content-Type: multipart/form-data
    
    {
      "file": [your-3d-model-file],
      "from": "obj",
      "to": "glb"
    }
    <!DOCTYPE html>
    <html>
    <head>
      <script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>
    </head>
    <body>
      <model-viewer
        src="YOUR_CONVERTED_MODEL_URL"
        alt="3D Model"
        auto-rotate
        camera-controls
        shadow-intensity="1"
        environment-image="neutral"
        style="width: 100%; height: 400px;">
      </model-viewer>
    </body>
    </html>
    Not found
    Not ready
    GET /api/convert/jobs/{job-id}
    Authorization: Bearer YOUR_API_TOKEN
    // Install: npm install @google/model-viewer
    import { useEffect, useState } from 'react';
    
    export default function ModelViewerComponent({ modelUrl }) {
      const [isLoading, setIsLoading] = useState(false);
    
      useEffect(() => {
        // Load model-viewer script
        const script = document.createElement('script');
        script.type = 'module';
        script.src = 'https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js';
        document.head.appendChild(script);
    
        return () => {
          document.head.removeChild(script);
        };
      }, []);
    
      return (
        <div>
          {isLoading && <div>Converting model...</div>}
          <model-viewer
            src={modelUrl}
            alt="3D Model"
            auto-rotate
            camera-controls
            shadow-intensity="1"
            environment-image="neutral"
            style={{ width: '100%', height: '400px' }}
          />
        </div>
      );
    }
    {
      "id": "abc123def456",
      "status": "success",
      "progress": 100,
      "message": "Conversion completed",
      "signedUrl": "https://storage.convert3d.org/converted/1234567890-model.glb?signature=..."
    }
    GET /api/convert/jobs/{job-id}/download
    Authorization: Bearer YOUR_API_TOKEN
    {
      "id": "abc123def456",
      "status": "failed",
      "progress": 0,
      "message": "Unsupported file format"
    }
    {
        "success":false,
        "error":"Conversion failed"
    }
    {
      "error": "Missing 'api_token'"
    }
    // Convert 3D model using Convert3D API
    async function convertModel(file, apiToken) {
      const formData = new FormData();
      formData.append('file', file);
      formData.append('from', file.name.split('.').pop().toLowerCase());
      formData.append('to', 'glb');
    
      // Start conversion job
      const jobResponse = await fetch('/api/convert/jobs', {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${apiToken}`,
        },
        body: formData,
      });
    
      const job = await jobResponse.json();
      
      // Poll for completion
      const pollStatus = async () => {
        const statusResponse = await fetch(`/api/convert/jobs/${job.id}`, {
          headers: {
            'Authorization': `Bearer ${apiToken}`,
          },
        });
        
        const status = await statusResponse.json();
        
        if (status.status === 'success' && status.signedUrl) {
          // Update model-viewer src
          const modelViewer = document.querySelector('model-viewer');
          modelViewer.src = status.signedUrl;
        } else if (status.status === 'queued' || status.status === 'in_progress') {
          setTimeout(pollStatus, 2000); // Poll every 2 seconds
        }
      };
      
      pollStatus();
    }
    
    // Usage
    const fileInput = document.getElementById('file-input');
    const apiToken = 'YOUR_API_TOKEN';
    
    fileInput.addEventListener('change', (e) => {
      const file = e.target.files[0];
      if (file) {
        convertModel(file, apiToken);
      }
    });
    {
      "id": "abc123def456",
      "status": "in_progress",
      "progress": 45,
      "message": "Converting model..."
    }