File Conversion API for Developers
Integrate powerful file conversion capabilities into your applications with our simple REST API. Convert documents, images, ebooks, and more with just a few lines of code.
Everything You Need to Build & Scale
SDKs & white-label solutions
Official SDKs
Install our official PHP and JavaScript SDKs for quick integration
S3 & R2 Integration
Connect your AWS S3 or Cloudflare R2 bucket. Converted files are automatically pushed to your storage.
White Label Starter Kit
Clone our complete frontend + backend and launch your own file conversion service
Lightning Fast
Sub-second processing
99.9% Uptime
Enterprise SLA
100+ Formats
All major formats
Secure
Files auto-deleted
Quick Start with our SDKs
Get up and running in minutes with our official SDKs
PHP SDK
Install via Composer:
composer require converthub/php-sdk
Quick example:
<?php
use ConvertHub\ConvertHubClient;
$client = new ConvertHubClient('YOUR_API_KEY');
// Convert a file
$conversion = $client->conversions()->convert(
'path/to/document.pdf',
'docx'
);
// Wait for completion
$job = $client->jobs()->waitForCompletion($conversion->getJobId());
// Download the converted file
if ($job->isCompleted()) {
$client->jobs()->getDownloadUrl($conversion->getJobId())->downloadTo('output.docx');
}
JavaScript SDK
Install via npm:
npm install @converthub/sdk
Quick example:
import { ConvertHubClient } from '@converthub/sdk';
const client = new ConvertHubClient({
apiKey: 'YOUR_API_KEY'
});
// Convert a file
const conversion = await client.convertFile({
file: 'path/to/document.pdf',
targetFormat: 'docx'
});
// Wait for completion
const job = await conversion.waitForCompletion();
// Download the converted file
if (job.status === 'completed') {
await conversion.download('output.docx');
}
Simple Integration
Get started with just a few lines of code
1. Upload & Convert
# Upload and convert a file
curl -X POST https://api.converthub.com/v2/convert \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]" \
-F "target_format=docx"
2. Check Status & Download
# Check conversion status
curl https://api.converthub.com/v2/jobs/job_123e4567 \
-H "Authorization: Bearer YOUR_API_KEY"
# Download the converted file when ready
curl https://api.converthub.com/v2/jobs/job_123e4567/download \
-H "Authorization: Bearer YOUR_API_KEY"
# Step 1: Submit file for conversion
curl -X POST https://api.converthub.com/v2/convert \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]" \
-F "target_format=jpg"
# Response:
# {"job_id": "job_123e4567", "status": "processing"}
# Step 2: Check conversion status
curl https://api.converthub.com/v2/jobs/job_123e4567 \
-H "Authorization: Bearer YOUR_API_KEY"
# Step 3: Download converted file
curl https://api.converthub.com/v2/jobs/job_123e4567/download \
-H "Authorization: Bearer YOUR_API_KEY"
<?php
// Step 1: Submit file for conversion
$file = new CURLFile('image.png', 'image/png', 'image.png');
$postData = [
'file' => $file,
'target_format' => 'jpg',
'options[quality]' => '90'
];
$ch = curl_init('https://api.converthub.com/v2/convert');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer YOUR_API_KEY'
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
$jobId = $result['job_id'];
// Step 2: Check status (with polling)
do {
sleep(2);
$ch = curl_init("https://api.converthub.com/v2/jobs/{$jobId}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer YOUR_API_KEY'
]);
$response = curl_exec($ch);
$status = json_decode($response, true);
} while ($status['status'] === 'processing');
// Step 3: Download file
if ($status['status'] === 'completed') {
$downloadUrl = $status['result']['download_url'];
file_put_contents('converted_image.jpg', file_get_contents($downloadUrl));
}
// Node.js example using fetch
const FormData = require('form-data');
const fs = require('fs');
async function convertImage() {
// Step 1: Submit file for conversion
const form = new FormData();
form.append('file', fs.createReadStream('image.png'));
form.append('target_format', 'jpg');
form.append('options[quality]', '90');
const submitResponse = await fetch('https://api.converthub.com/v2/convert', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
...form.getHeaders()
},
body: form
});
const { job_id } = await submitResponse.json();
// Step 2: Poll for completion
let status;
do {
await new Promise(resolve => setTimeout(resolve, 2000));
const statusResponse = await fetch(
`https://api.converthub.com/v2/jobs/${job_id}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
status = await statusResponse.json();
} while (status.status === 'processing');
// Step 3: Download the converted file
if (status.status === 'completed') {
const downloadResponse = await fetch(status.result.download_url);
const buffer = await downloadResponse.buffer();
fs.writeFileSync('converted_image.jpg', buffer);
console.log('Conversion completed!');
}
}
convertImage();
require 'net/http'
require 'uri'
require 'json'
def convert_image
api_key = 'YOUR_API_KEY'
api_url = 'https://api.converthub.com/v2'
# Step 1: Submit file for conversion
uri = URI("#{api_url}/convert")
request = Net::HTTP::Post.new(uri)
request['Authorization'] = "Bearer #{api_key}"
form_data = [
['target_format', 'jpg'],
['options[quality]', '90'],
['file', File.open('image.png')]
]
request.set_form form_data, 'multipart/form-data'
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
result = JSON.parse(response.body)
job_id = result['job_id']
# Step 2: Poll for completion
status = nil
loop do
sleep 2
uri = URI("#{api_url}/jobs/#{job_id}")
request = Net::HTTP::Get.new(uri)
request['Authorization'] = "Bearer #{api_key}"
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
status = JSON.parse(response.body)
break unless status['status'] == 'processing'
end
# Step 3: Download the converted file
if status['status'] == 'completed'
download_url = status['result']['download_url']
uri = URI(download_url)
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
response = http.get(uri.path)
File.open('converted_image.jpg', 'wb') do |file|
file.write(response.body)
end
end
puts 'Conversion completed!'
end
end
convert_image
import requests
import time
def convert_image():
api_key = 'YOUR_API_KEY'
api_url = 'https://api.converthub.com/v2'
# Step 1: Submit file for conversion
with open('image.png', 'rb') as f:
files = {'file': f}
data = {
'target_format': 'jpg',
'options[quality]': '90'
}
headers = {
'Authorization': f'Bearer {api_key}'
}
response = requests.post(
f'{api_url}/convert',
files=files,
data=data,
headers=headers
)
result = response.json()
job_id = result['job_id']
# Step 2: Poll for completion
while True:
time.sleep(2)
response = requests.get(
f'{api_url}/jobs/{job_id}',
headers={'Authorization': f'Bearer {api_key}'}
)
status = response.json()
if status['status'] != 'processing':
break
# Step 3: Download the converted file
if status['status'] == 'completed':
download_url = status['result']['download_url']
response = requests.get(download_url)
with open('converted_image.jpg', 'wb') as f:
f.write(response.content)
print('Conversion completed!')
else:
print(f"Conversion failed: {status['message']}")
if __name__ == '__main__':
convert_image()
Launch Your Own File Conversion Service
Get a complete, production-ready file conversion website powered by ConvertHub API. Clone our starter kit and have your branded service running in minutes.
Full Frontend + Backend
Complete Laravel application with Livewire components
800+ Format Conversions
Images, documents, videos, audio, and more
Drag & Drop Interface
User-friendly design with real-time progress
Responsive & Modern
Built with Tailwind CSS, works on all devices
ConvertHub Starter Kit
Built for Developers
Everything you need to integrate file conversion into your applications
RESTful API
Clean, intuitive REST endpoints that follow industry standards
API Keys
Secure authentication with easy-to-manage API keys
Rate Limits
Generous rate limits that scale with your needs
Webhooks
Get notified when conversions complete with webhook callbacks
Chunked Uploads
Upload large files in chunks for better reliability
Error Handling
Clear error messages and status codes for easy debugging
Simple, Transparent Pricing
Pay only for what you use. No hidden fees.
1 Conversion = 1 Credit • Credits roll over monthly for paid plans
Flexible Credits
No monthly commitment – buy only what you need
- No recurring fees
- Lower rates for higher volumes
- Credits never expire
- Upload files up to 500MB
- S3/R2 Bucket Integrations
- Webhook support
- Priority support
Starter
For solo devs and small projects
- 300 credits/month
- $0.030 per conversion
- Credits roll over
- Upload files up to 500MB
- S3/R2 Bucket Integrations
- Webhook support
- Priority support
Pro
For growing applications
- 2000 Monthly Credits
- $0.0145 per conversion
- Credits roll over
- Upload files up to 2GB
- S3/R2 Bucket Integrations
- Webhook support
- Premium support
Need more? Get an Enterprise quote.
Unlimited conversions, no file size limits, 99.9% SLA, and dedicated support.
Pricing FAQ
Simple Credit System
1 Credit = 1 Conversion for every format, always. No hidden fees, no surprises. Whether you're converting a tiny icon or a large document, it's always just 1 credit.
Credits Roll Over
Unused credits automatically roll over to the next month as long as you maintain an active subscription. Never lose what you've paid for!
No Lock-in, Cancel Anytime
No long-term commitments or contracts. Cancel anytime. Your API keys remain active until the end of your billing period.
Have more questions? Contact our team
Ready to Get Started?
50 free API calls. No credit card required.