Developer API

One universal API for every file workflow

Converter App provides developers with a high-performance file processing interface. Replace separate tools with a single API for scalable document conversion, media processing, transcription, and OCR.

Converter App API Overview

The Converter App API provides developers with a frictionless, universal interface for all file processing needs. Instead of integrating a fragmented collection of separate tools, your application can call a single, high-performance service. You can integrate our full converter suite directly into backend workflows to handle everything from standard file changes to demanding media jobs.

The public base URL is https://api.converter.app/. Paths in this document use this externally served API root.

Universal Coverage

Access a complete library of conversion tools through one streamlined integration.

Two Processing Modes

Choose synchronous requests for immediate responses or asynchronous jobs for large files and long-running tasks.

Tailored to Your Needs

Get in touch and we can offer a plan tailored to your needs at an unbeatable rate.

Documents Images Audio Video Text Archives

Discover Supported Conversions (No key needed)

Use the public pairs endpoint as the simplest connectivity test. It does not require an API key and returns the full list of supported conversion pairs available on the platform.

GET /public/pairs

This endpoint is open so developers can inspect the universal conversion catalog before requesting or configuring an API key.

curl "https://api.converter.app/public/pairs"

JavaScript

const response = await fetch('https://api.converter.app/public/pairs');
const pairs = await response.json();
console.log(pairs.supported_pairs);

Python

import requests

response = requests.get('https://api.converter.app/public/pairs')
response.raise_for_status()
pairs = response.json()
print(pairs['supported_pairs'])

Example Response

{
  "supported_pairs": [
    { "from": "mp3", "to": "text" },
    { "from": "mp4", "to": "mp3" },
    { "from": "mov", "to": "mp4" },
    { "from": "wav", "to": "mp3" },
    { "from": "mkv", "to": "mp4" }
  ]
}

Authentication & Access Control

Developers authenticate by passing their API key in the HTTP header X-API-Key. The public /public/pairs endpoint is the only endpoint on this page that does not require a key.

Control How It Works Developer Impact
X-API-KeySend the key as an HTTP request header. Required for /pairs, /convert/sync, /convert, /progress/{jobid}, and /download/{jobid}.
Usage Quotas Each key has a numerical conversion quota. The quota decreases when conversion tasks are created. A quota of -1 grants unlimited conversions. Other values represent the remaining allowed conversions.
Allowed Pairs Keys can be restricted to specific conversion types such as mp42mp3, or granted access to all supported pairs. /pairs returns only the pairs your key is authorized to use, and conversion requests outside that list are rejected.
curl "https://api.converter.app/pairs" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const response = await fetch('https://api.converter.app/pairs', {
  headers: {
    'X-API-Key': apiKey
  }
});

const pairs = await response.json();
console.log(pairs);

Python

import requests

headers = {'X-API-Key': 'YOUR_API_KEY'}
response = requests.get('https://api.converter.app/pairs', headers=headers)
response.raise_for_status()
print(response.json())

2. Synchronous Conversion

POST /convert/sync

Use synchronous conversion when you want an immediate result in the same HTTP response. The request remains open while the API starts the conversion job and waits for completion, up to 30 minutes.

Form Field Type Description
target_formatstring The requested output extension, such as pdf, docx, mp3, or jpg.
filesfile[] One or more uploaded source files. The API determines the source format from the uploaded file name.
curl -X POST "https://api.converter.app/convert/sync" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "target_format=pdf" \
  -F "files=@/path/to/document.docx" \
  -o converted.pdf

JavaScript

const form = new FormData();
form.append('target_format', 'pdf');
form.append('files', fileInput.files[0]);

const response = await fetch('https://api.converter.app/convert/sync', {
  method: 'POST',
  headers: {
    'X-API-Key': apiKey
  },
  body: form
});

const convertedFile = await response.blob();

Python

import requests

headers = {'X-API-Key': 'YOUR_API_KEY'}
data = {'target_format': 'pdf'}

with open('/path/to/document.docx', 'rb') as document:
    files = {'files': document}
    response = requests.post(
        'https://api.converter.app/convert/sync',
        headers=headers,
        data=data,
        files=files
    )

response.raise_for_status()
with open('converted.pdf', 'wb') as output:
    output.write(response.content)

The response directly streams the converted file. If the conversion produces multiple files, the API returns a .zip archive.

3. Asynchronous Conversion

POST /convert

Use asynchronous conversion for heavy files, batch processing, long-running audio or video tasks, or production applications that should not keep upload requests open while work is running.

Form Field Type Description
target_formatstring The desired output format. The source and target form the conversion pair, for example mp42mp3.
filesfile[] One or more files to convert.

cURL

curl -X POST "https://api.converter.app/convert" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "target_format=mp3" \
  -F "files=@/path/to/video.mp4"

JavaScript

const form = new FormData();
form.append('target_format', 'mp3');
form.append('files', fileInput.files[0]);

const response = await fetch('https://api.converter.app/convert', {
  method: 'POST',
  headers: {
    'X-API-Key': apiKey
  },
  body: form
});

const job = await response.json();
console.log(job.jobid, job.remaining_quota);

Python

import requests

headers = {'X-API-Key': 'YOUR_API_KEY'}
data = {'target_format': 'mp3'}

with open('/path/to/video.mp4', 'rb') as video:
    files = {'files': video}
    response = requests.post(
        'https://api.converter.app/convert',
        headers=headers,
        data=data,
        files=files
    )

response.raise_for_status()
job = response.json()
print(job['jobid'], job['remaining_quota'])

Success Response

{
  "status": "success",
  "jobid": "b3f6b2e8f5c34c4ab01c93c4d1b2f9e8",
  "pair": "mp42mp3",
  "remaining_quota": 42
}

4. Status Tracking

GET /progress/{jobid}

Poll this endpoint after creating an asynchronous job. It returns the job status, a numeric progress value from 0.0 to 1.0, and error details if the conversion failed.

Header Description
X-API-KeyYour developer API key.
curl "https://api.converter.app/progress/b3f6b2e8f5c34c4ab01c93c4d1b2f9e8" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const response = await fetch('https://api.converter.app/progress/b3f6b2e8f5c34c4ab01c93c4d1b2f9e8', {
  headers: {
    'X-API-Key': apiKey
  }
});

const progress = await response.json();
console.log(progress.status, progress.progress);

Python

import requests

headers = {'X-API-Key': 'YOUR_API_KEY'}
response = requests.get(
    'https://api.converter.app/progress/b3f6b2e8f5c34c4ab01c93c4d1b2f9e8',
    headers=headers
)
response.raise_for_status()
progress = response.json()
print(progress['status'], progress['progress'])
{
  "jobid": "b3f6b2e8f5c34c4ab01c93c4d1b2f9e8",
  "progress": 1.0,
  "status": "completed",
  "error": null
}

Possible statuses are processing, completed, and failed. Progress is a number between 0.0 and 1.0.

5. File Retrieval

GET /download/{jobid}

Once an asynchronous job reaches completed, retrieve the converted output with the same API key used to create the job.

Result Type Behavior
Single output file The API streams the converted file directly.
resultfile manifest If the job provides a result manifest, the API returns the file specified by that manifest.
Multiple output files The API packages generated files into a .zip archive on the fly.
curl -L "https://api.converter.app/download/b3f6b2e8f5c34c4ab01c93c4d1b2f9e8" \
  -H "X-API-Key: YOUR_API_KEY" \
  -o converted-output.zip

JavaScript

const response = await fetch('https://api.converter.app/download/b3f6b2e8f5c34c4ab01c93c4d1b2f9e8', {
  headers: {
    'X-API-Key': apiKey
  }
});

const file = await response.blob();

Python

import requests

headers = {'X-API-Key': 'YOUR_API_KEY'}
response = requests.get(
    'https://api.converter.app/download/b3f6b2e8f5c34c4ab01c93c4d1b2f9e8',
    headers=headers
)
response.raise_for_status()

with open('converted-output.zip', 'wb') as output:
    output.write(response.content)

Summary of the Developer Workflow

The API supports two integration patterns so developers can choose the right behavior for each use case.

Flow Request Pattern Best For
Quick Sync Flow POST /convert/sync returns the converted file in the same response. Small files, command-line scripts, prototypes, and simple server-side automations.
Robust Async Flow POST /convert, then poll GET /progress/{jobid}, then call GET /download/{jobid}. Large video or audio files, batch conversion, web application backends, and retry-friendly production systems.

Async Flow Example

# 1. Start the job
curl -X POST "https://api.converter.app/convert" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "target_format=mp3" \
  -F "files=@/path/to/video.mp4"

# 2. Poll until completed
curl "https://api.converter.app/progress/JOBID" \
  -H "X-API-Key: YOUR_API_KEY"

# 3. Download the finished output
curl -L "https://api.converter.app/download/JOBID" \
  -H "X-API-Key: YOUR_API_KEY" \
  -o result.mp3

JavaScript

const form = new FormData();
form.append('target_format', 'mp3');
form.append('files', fileInput.files[0]);

const createResponse = await fetch('https://api.converter.app/convert', {
  method: 'POST',
  headers: {
    'X-API-Key': apiKey
  },
  body: form
});
const job = await createResponse.json();

const progressResponse = await fetch(`https://api.converter.app/progress/${job.jobid}`, {
  headers: {
    'X-API-Key': apiKey
  }
});
const progress = await progressResponse.json();

if (progress.status === 'completed') {
  const downloadResponse = await fetch(`https://api.converter.app/download/${job.jobid}`, {
    headers: {
      'X-API-Key': apiKey
    }
  });
  const result = await downloadResponse.blob();
}

Python

import requests

headers = {'X-API-Key': 'YOUR_API_KEY'}
data = {'target_format': 'mp3'}

with open('/path/to/video.mp4', 'rb') as video:
    files = {'files': video}
    create_response = requests.post(
        'https://api.converter.app/convert',
        headers=headers,
        data=data,
        files=files
    )

create_response.raise_for_status()
job = create_response.json()

progress_response = requests.get(
    f"https://api.converter.app/progress/{job['jobid']}",
    headers=headers
)
progress_response.raise_for_status()
progress = progress_response.json()

if progress['status'] == 'completed':
    download_response = requests.get(
        f"https://api.converter.app/download/{job['jobid']}",
        headers=headers
    )
    download_response.raise_for_status()
    with open('result.mp3', 'wb') as output:
        output.write(download_response.content)

Error Responses

Errors are returned as JSON with a detail field, using standard HTTP status codes.

Status Common Cause
400Missing files, missing target_format, unsupported job ID format, or invalid request input.
401Missing or invalid X-API-Key.
403The API key is not allowed to use the requested conversion pair.
404The requested job or generated result file is not available.
409The conversion is still processing when a download is requested.
429The API key has no remaining quota.
500The conversion could not be prepared or completed because of a server-side processing error.
{
  "detail": "This API key is not authorized for mp42mp3 conversions."
}