Image Conversion API — Free Tier + Pay-As-You-Go
Convert between JPG, PNG, WebP, AVIF, HEIC, TIFF, GIF, BMP, and 41 more image formats. Sharp-backed, EXIF-aware, ICC-preserving.
What it does
The Image Conversion API supports 49 image formats with primary processing via libvips (through Sharp) and ImageMagick fallback for niche legacy formats such as PSD, EXR, XCF, and PCX. Conversion preserves ICC color profiles by default, can flatten or retain alpha channels, and exposes Sharp's full parameter surface: quality, compression level, chroma subsampling, progressive/interlaced encoding, lossless mode, effort level (for AVIF), JPEG XL distance, and per-format codec choice (mozjpeg vs libjpeg, libwebp lossless vs lossy, libaom vs libavif). HEIC, HEIF, and HEIF-sequence inputs from iOS devices decode natively via libheif, including images with multiple sub-images such as Live Photos, Depth Maps, and Burst Mode captures.
Camera RAW (CR2, CR3, NEF, ARW, DNG, ORF, RAF, RW2) decodes via libraw with optional Adobe DNG-camera-profile application before piping into the standard Sharp pipeline for white balance, exposure, and color matrix correction. The endpoint runs in well under a second for typical phone-camera JPEGs. It takes one file per job — there is no batch mode that groups inputs into a ZIP, so send a request per image and run them concurrently within your rate limit.
EXIF rotation is auto-corrected by default so portrait iOS photos stop arriving sideways downstream; `autoOrient` is the field that governs it. Metadata is not carried through the re-encode, which is the behaviour you want for privacy-sensitive delivery where camera make, lens and GPS coordinates should not leave your pipeline, and a problem if you needed to keep it — extract what you need before converting.
Supported formats
Source formats (32)
- jpg
- jpeg
- png
- webp
- avif
- heic
- heif
- tiff
- tif
- gif
- bmp
- ico
- svg
- psd
- raw
- cr2
- cr3
- nef
- arw
- dng
- orf
- raf
- rw2
- tga
- pbm
- pgm
- ppm
- exr
- hdr
- jp2
- jxr
- jxl
Target formats (11)
- jpg
- png
- webp
- avif
- tiff
- gif
- bmp
- ico
- svg
- jp2
- heif
Quick start
Every sample posts the job, then polls /v1/status/{jobId} until it finishes, with your API key in the X-Api-Key header. The parameter names below are the ones the endpoint actually accepts — anything else is dropped rather than rejected.
curl -X POST https://api.convertintomp4.com/v1/convert \
-H "X-Api-Key: ck_your_api_key" \
-F "file=@input.heic" \
-F "targetFormat=jpg"
-F "quality=90"import { readFileSync } from "node:fs";
import { ConvertIntoMP4Client } from "convertintomp4";
const apiKey = process.env.CIM4_API_KEY;
const client = new ConvertIntoMP4Client({ apiKey });
// Presigned direct-to-R2 upload, then queue the conversion.
const { jobId } = await client.uploadDirect(
readFileSync("input.heic"),
"input.heic",
"application/octet-stream",
{ targetFormat: "jpg" },
);
// Poll until the job reaches a terminal state.
let job;
do {
await new Promise((r) => setTimeout(r, 2000));
job = await fetch(`https://api.convertintomp4.com/v1/status/${jobId}`, {
headers: { "X-Api-Key": apiKey },
}).then((r) => r.json());
} while (job.status !== "completed" && job.status !== "failed");
console.log("Download URL:", job.result?.downloadUrl);import time, requests
from convertintomp4 import Client
api_key = "ck_your_api_key"
client = Client(api_key=api_key)
# Presigned direct-to-R2 upload, then queue the conversion.
with open("input.heic", "rb") as f:
job = client.upload_direct(
f, "input.heic", "application/octet-stream", "jpg"
)
# Poll until the job reaches a terminal state.
while True:
status = requests.get(
f"https://api.convertintomp4.com/v1/status/{job['jobId']}",
headers={"X-Api-Key": api_key},
).json()
if status["status"] in ("completed", "failed"):
break
time.sleep(2)
print("Download URL:", status.get("result", {}).get("downloadUrl"))Features
- 49 image formats including iOS HEIC/HEIF and Camera RAW
- Sharp + ImageMagick + libraw pipeline
- EXIF auto-rotation, ICC profile preservation
- Per-job quality, progressive, chroma subsampling, alpha handling
- Lossless and lossy AVIF, WebP, JPEG XL output
- Batch jobs — up to 200 images → single ZIP
- Sub-500 ms typical latency for phone-camera JPEGs
Pricing
From $9.99/mo (Pro) or $24.99/mo (Business) — or pay-as-you-go on the API plan.
Free tier: 5 conversions/day, 100 MB file size, no API key required (IP-gated). Pro $9.99/mo: 100/day (2,000/month), 2 GB files. Business $24.99/mo: 1,000/day (20,000/month), 10 GB files, GPU encoding, dedicated support.
See full pricing breakdown →Built for production
99.9% uptime SLA
Multi-region failover, transparent status page, 60-second response-time guarantee on Business.
Encryption + auto-delete
TLS 1.2+ in transit, AES-256 at rest. Files deleted after 1h / 24h / 7d depending on plan, or instantly via DELETE endpoint. See the security page.
~7s median latency
Most sub-100 MB jobs complete in 6-9 seconds. Webhook-driven async for heavier workloads; waitForJob for synchronous flows.
Frequently Asked Questions
Does the API decode iPhone HEIC photos?
Yes — HEIC and HEIF inputs decode natively via libheif before they hit the image pipeline. For a Live Photo you get the primary still frame, and that is the only frame you get: there is no `livePhotoFrame` parameter and no way to reach the before/after frames of the sequence.
Are EXIF and ICC profiles preserved?
EXIF orientation is applied to the pixel data so images come out the right way up, and the metadata block itself does not survive the re-encode. The controls that exist are `autoOrient` for the rotation behaviour and `stripMetadata` / `preserveMetadata` on the conversion request — there is no `keepExif` or `respectExifOrientation` field. Treat metadata as lost unless you have verified otherwise for your exact pair.
What's the difference between AVIF lossless and lossy via the API?
Pass `lossless=true` for AVIF — typically ~30% smaller than PNG with bit-exact fidelity. Lossy AVIF accepts `quality` (1-100) and `effort` (1-9, higher = slower + smaller). Default effort 4 balances speed and size.
Can I convert RAW camera files?
Yes. Canon CR2/CR3, Nikon NEF, Sony ARW, Adobe DNG, Olympus ORF, Fuji RAF, and Panasonic RW2 all decode via libraw. The image API outputs JPEG, PNG, TIFF, or WebP after demosaicing.
How do I batch-convert a folder of images?
Not in one job. `POST /v1/convert` takes a single `file` and returns a single output — extra `file` parts do not fan out, and there is no `batch` flag or ZIP-with-manifest response. Send one request per image and run them concurrently up to your plan's rate limit. For URL sources, `POST /v1/import/batch` queues up to 10 separate jobs in one call, still one output each.
Related APIs
- File Conversion APIOne unified file conversion API for video, audio, image, document, ebook, archive, and font formats — 255 formats, 2,290+ conversion pairs.
- Convert APIProduction-grade file conversion API with 9 language SDKs, async webhooks, and cloud-to-cloud workflows. Free tier available.
- Media Conversion APIVideo and audio conversion API in one endpoint. 27 video + 21 audio formats, FFmpeg-backed, GPU-accelerated.
Or browse the full catalogue of 23 API products →
Get an API key
Start integrating the Image Conversion API in five minutes. Read the docs, grab a key, and ship your first conversion before the trial coffee cools.