Convertio is a well-known file conversion service with a clean web interface and an API. Its credit system worked fine when conversions were occasional — but once you integrate the API into a production pipeline, you quickly discover that credits expire, credit bundles don't align with your actual usage patterns, and the async API adds unnecessary round-trips to simple conversions.
ChangeThisFile is built for developers who need a predictable, simple API: one endpoint, synchronous response, no credit expiry, no polling loop. This guide covers the full migration path from Convertio's API to ChangeThisFile.
Why people migrate from Convertio
Credit expiry surprises. Convertio's API credits expire. Teams that run bursty conversion workloads (high volume one month, low the next) regularly lose unused credits. ChangeThisFile's monthly plans roll over at the billing cycle — unused conversions don't expire mid-month.
No free API tier. Convertio's free plan is web-only. Any API access requires a paid subscription. ChangeThisFile's free tier gives 1,000 API conversions/month with no credit card.
Async API for simple use cases. Convertio's API is poll-based: you submit a job, get a job ID, poll for status, then download. For a one-file-in, one-file-out conversion, this is unnecessary complexity. ChangeThisFile returns the converted file synchronously.
SDK dependency. Convertio ships official SDKs for PHP, Python, Ruby, Java, and Node. Using them means adding a dependency that needs maintenance. ChangeThisFile works with any HTTP client — no package to install, no version to pin.
Who should stay on Convertio: If you rely on their OCR capabilities, or if you're converting formats that fall outside ChangeThisFile's 690-route catalog, Convertio may have better coverage for your specific needs.
Cost comparison: concrete monthly savings
| Volume/month | Convertio (est.) | ChangeThisFile | Monthly savings |
|---|---|---|---|
| 500 conversions | ~$10–20 (entry API plan) | $0 (free tier) | $10–20 |
| 2,000 conversions | ~$25–40 | $0 (free tier covers 1K, Hobby $29) | $0–11 |
| 10,000 conversions | ~$60–90 | $29 (Hobby) | $31–61 |
| 50,000 conversions | ~$150–250 | $99 (Startup) | $51–151 |
Convertio pricing varies by plan type (monthly subscription vs. one-time credit packages). Credit packages often look cheaper per-conversion but expire, inflating effective cost. Subscription plans don't expire but are priced at a premium. ChangeThisFile's flat per-conversion monthly plans are predictable and don't expire.
API endpoint mapping
| Convertio action | ChangeThisFile equivalent |
|---|---|
| POST /convert (start conversion) | POST /v1/convert (complete conversion) |
| GET /convert/{id}/status (poll) | Not needed — synchronous response |
| GET /convert/{id}/download (get result) | Not needed — file in response body |
| X-Convertio-API-Key header | Authorization: Bearer ctf_sk_{key} |
| outputformat: "pdf" | data.target: "pdf" |
| input: "upload" | files["file"]: open("doc.docx", "rb") |
| apikey in request body | Bearer token in Authorization header |
Code migration: BEFORE and AFTER
# BEFORE: Convertio (poll-based async)
import requests
import time
CONVERTIO_KEY = 'your_convertio_api_key'
# Step 1: Submit conversion
with open('document.docx', 'rb') as f:
resp = requests.post(
'https://api.convertio.co/convert',
json={
'apikey': CONVERTIO_KEY,
'input': 'upload',
'outputformat': 'pdf'
}
)
job_id = resp.json()['data']['id']
# Step 2: Upload file
with open('document.docx', 'rb') as f:
requests.put(
f'https://api.convertio.co/convert/{job_id}/{"document.docx"}',
headers={'X-Convertio-API-Key': CONVERTIO_KEY},
data=f
)
# Step 3: Poll for completion
while True:
status = requests.get(
f'https://api.convertio.co/convert/{job_id}/status',
headers={'X-Convertio-API-Key': CONVERTIO_KEY}
).json()
if status['data']['step'] == 'finish':
break
if status['data']['step'] == 'error':
raise Exception(status['data']['step_percent'])
time.sleep(2)
# Step 4: Download result
result = requests.get(
f'https://api.convertio.co/convert/{job_id}/download',
headers={'X-Convertio-API-Key': CONVERTIO_KEY}
)
with open('document.pdf', 'wb') as f:
f.write(result.content)
# AFTER: ChangeThisFile (one call, synchronous)
import requests
response = requests.post(
'https://changethisfile.com/v1/convert',
headers={'Authorization': 'Bearer ctf_sk_your_key'},
files={'file': open('document.docx', 'rb')},
data={'target': 'pdf'}
)
with open('document.pdf', 'wb') as f:
f.write(response.content)
The before version is ~40 lines across 4 HTTP calls. The after version is 8 lines and one HTTP call.
Auth and token migration
- Get your free API key: Visit changethisfile.com/v1/keys/free. No credit card required. Your key starts with
ctf_sk_. - Update authentication: Convertio puts the API key in the request body as
apikey. ChangeThisFile uses a standard Bearer token in the Authorization header:Authorization: Bearer ctf_sk_your_key. - Remove the Convertio SDK: If you installed
convertio-python,convertio-php, or another official SDK, uninstall it. ChangeThisFile needs no package. - Update environment variables: Rename
CONVERTIO_API_KEYtoCTF_API_KEYin your.envfile. - Cancel your Convertio plan: After confirming your integration works, cancel before the next billing cycle. Check whether you have remaining credits to use up first.
Rollback plan
Keep your Convertio API key active until you've run ChangeThisFile in production for at least one billing cycle.
- Use an environment variable to switch between APIs:
CONVERTER_BACKEND=changethisfileorCONVERTER_BACKEND=convertio. A one-line change redeploys to either. - Convertio's async API returns detailed error codes. ChangeThisFile returns HTTP 4xx/5xx with a JSON error body. Log both during the parallel-run period so you can compare error rates.
- If you see ChangeThisFile returning HTTP 400 (unsupported format) for routes in your pipeline, those specific pairs may need to stay on Convertio until coverage is added.
- After 30 days of clean operation, cancel your Convertio subscription.
Common migration questions
Convertio claims 300+ formats. Does ChangeThisFile match this?
ChangeThisFile has 690 source→target route pairs across 82 formats — a different counting method. For mainstream formats (images, documents, video, audio, archives, ebooks, fonts), coverage is comparable. Run an audit of your specific format pairs against the ChangeThisFile format list before migrating.
Does ChangeThisFile do OCR?
No. If you use Convertio's OCR feature (image/scan to searchable PDF), that's a reason to stay or to supplement with a dedicated OCR service. ChangeThisFile does not perform text recognition.
What happens if a conversion fails?
ChangeThisFile returns HTTP 4xx or 5xx with a JSON body containing an error message. Unlike Convertio's polling model, there's no partial-progress state to clean up — either the response is 200 with your file, or it's an error you handle in your catch block.
Can I still use the Convertio web interface for occasional manual conversions?
Yes. Migrating your API integration doesn't affect your ability to use Convertio's web UI. Many teams keep the web version for occasional manual use while switching the API calls to ChangeThisFile.
The migration from Convertio is mostly removing code — the job submission, status polling, and download steps all collapse into a single HTTP call. Get your free API key and test your most common conversion pair before committing to the switch.