Get started

Quickstart

Get a free API key and run your first conversion in under five minutes.

1. Get a free API key #

The free tier includes 1,000 conversions/month, a 25 MB file cap, and 10 requests/minute — no credit card required.

curl -X POST https://changethisfile.com/v1/keys/free \
     -H "Content-Type: application/json" \
     -d '{"email":"you@example.com"}'
import httpx
r = httpx.post(
    "https://changethisfile.com/v1/keys/free",
    json={"email": "you@example.com"},
)
print(r.json()["api_key"])
const r = await fetch('https://changethisfile.com/v1/keys/free', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ email: 'you@example.com' }),
});
console.log((await r.json()).api_key);

The response includes the full key (shown once — store it now):

{
  "api_key": "ctf_sk_...your_key_here...",
  "plan": "free",
  "monthly_limit": 1000,
  "message": "Save this key — it will not be shown again."
}

2. Convert your first file #

One POST. The source format is auto-detected from the filename, so target is the only field most callers ever need.

curl -X POST https://changethisfile.com/v1/convert \
     -H "Authorization: Bearer ctf_sk_...your_key_here..." \
     -F "file=@photo.png" \
     -F "target=jpg" \
     --output photo.jpg
import requests

with open("photo.png", "rb") as f:
    r = requests.post(
        "https://changethisfile.com/v1/convert",
        headers={"Authorization": "Bearer ctf_sk_...your_key_here..."},
        files={"file": f},
        data={"target": "jpg"},
    )

with open("photo.jpg", "wb") as out:
    out.write(r.content)
import { readFileSync, writeFileSync } from 'node:fs';

const form = new FormData();
form.append('file', new Blob([readFileSync('photo.png')]), 'photo.png');
form.append('target', 'jpg');

const r = await fetch('https://changethisfile.com/v1/convert', {
  method: 'POST',
  headers: { Authorization: 'Bearer ctf_sk_...your_key_here...' },
  body: form,
});

writeFileSync('photo.jpg', Buffer.from(await r.arrayBuffer()));

3. Inspect rate limits & quota #

Every response includes the standard rate-limit headers and your remaining monthly quota is one GET /v1/usage away.

curl https://changethisfile.com/v1/usage \
     -H "Authorization: Bearer ctf_sk_..."

What's next? #

Async jobs + webhooks

Queue large conversions and get a signed POST when they finish.

Idempotency keys

Make conversions safe to retry without duplicating charges.

Error handling

Every error code, what triggers it, and how to recover.

Format catalogue

Every supported source→target combination, all 690 of them.