SaaS file ingestion
Accept any upload your users throw at you and normalize it to a canonical format before it touches your storage. Presigned multipart uploads, virus scanning, format probing and engine routing are handled for you in a single POST.
A single REST endpoint that converts between 268 video, audio, image, document, ebook, archive and font formats. Backed by 13 production engines (FFmpeg, Sharp, ImageMagick, LibreOffice, Pandoc, Calibre, Ghostscript, pdf-lib, vtracer, potrace, Puppeteer, fonttools, and p7zip), with sub-second p50 latency on images, all jobs processed in EU regions, and 9 official SDKs covering Node.js, Python, Ruby, PHP, Go, Java, .NET, Swift and Kotlin.
Drag-and-drop your pipeline in the interactive Job Builder, then copy the generated code in 9 languages — or save it as a Scheduled Workflow that runs itself. Same job shape across REST, SDKs and cron.
One POST /v1/convert turns any source file into MP4 (or any of 267 other formats). Same shape across all three languages — pick yours and ship.
import { ConvertIntoMP4Client } from "convertintomp4";
import { readFileSync } from "node:fs";
const client = new ConvertIntoMP4Client({ apiKey: process.env.CIM4_API_KEY });
// Quick convert: upload a file and wait for the MP4
const file = new Blob([readFileSync("clip.mov")]);
const job = await client.convert(file, "mp4", {
quality: "high",
resolution: "1080p",
});
console.log("Job:", job.jobId);
const completed = await client.waitForJob(job.jobId, { interval: 2000, timeout: 120_000 });
console.log("Download:", completed.tasks["export"].result.url);from convertintomp4 import Client
import os
client = Client(api_key=os.environ["CIM4_API_KEY"])
# Quick convert: upload a file and wait for the MP4
with open("clip.mov", "rb") as f:
job = client.convert(f, "mp4", quality="high", resolution="1080p")
print("Job:", job["jobId"])
completed = client.wait_for_job(job["jobId"], interval=2.0, timeout=120.0)
print("Download:", completed.tasks["export"].result["url"])curl -X POST "https://api.convertintomp4.com/v1/convert" \
-H "X-Api-Key: $CIM4_API_KEY" \
-F "file=@clip.mov" \
-F "output_format=mp4" \
-F "quality=high" \
-F "resolution=1080p"
# Then poll status, or use a webhook for async completion
curl "https://api.convertintomp4.com/v1/jobs/job_abc123" \
-H "X-Api-Key: $CIM4_API_KEY"Need a different language? Skip to the SDK list — 9 are available officially, or call the REST API directly with any HTTP client.
Four of the most common integration patterns we see across teams shipping production workloads on top of ConvertIntoMP4.
Accept any upload your users throw at you and normalize it to a canonical format before it touches your storage. Presigned multipart uploads, virus scanning, format probing and engine routing are handled for you in a single POST.
Convert MOV, AVI, MKV, WebM and 40+ other video formats into MP4 H.264/H.265 or AV1 at any resolution from 240p to 4K. Two-pass encoding, device presets for iPhone / Android / Xbox, and async webhooks for jobs that run longer than a few seconds.
DOCX → PDF, XLSX → PDF, PPTX → PDF, RTF → DOCX, MD → HTML and 70+ document pairs. Backed by LibreOffice + Pandoc + Calibre. Useful for invoice generators, contract platforms and any product that emails customers a PDF of something they typed into a form.
Generate WebP, AVIF, JPG and PNG thumbnails from video frames, PDF pages or source images in a single batched call. Sub-second p50 latency on images via Sharp; ImageMagick fallback for exotic formats like HEIC, RAW, CR2, ARW and NEF.
REST + OAuth2, batch + async, webhooks + WebSockets, presigned uploads + cloud storage. The features below are live today on api.convertintomp4.com.
REST API
Plain JSON over HTTPS. No vendor SDK required — every endpoint is documented and callable with curl, fetch, requests, or any HTTP client.
9 official SDKs
Node.js / TypeScript, Python, Ruby, PHP, Go, Java, .NET (C#), Swift, and Kotlin. All open-source, all share the same job/task shape.
OAuth2 client_credentials
Long-lived API keys (`ck_*` / `sk_*`) for server-to-server auth, or short-lived bearer tokens via the standard OAuth2 client-credentials grant.
Webhooks
HMAC-signed POST callbacks on 16 events (job.created, job.completed, file.uploaded, quota.exceeded, subscription.updated, and more). Slack and Discord payload formats built-in.
Async polling
Jobs return immediately with a `jobId`; poll `GET /v1/jobs/:id` or subscribe to the `/ws/user/jobs` WebSocket for real-time progress.
Batch + multipart
Convert up to 100 files in a single job. Resumable S3-multipart uploads for files >50MB via presigned URLs — direct browser-to-R2, no proxy through your server.
Presigned uploads
Generate scoped, time-limited PUT URLs for direct uploads from the browser to our R2 bucket. Cuts your egress costs and keeps the file off your servers entirely.
Engine pinning
Force a specific conversion engine (ffmpeg, sharp, imagemagick, libreoffice, pandoc, calibre, ghostscript, vtracer, potrace, puppeteer, fonttools, 7z) via the `engine` field.
EU-region processing
All jobs run in Helsinki (EU) by default. US and Auto regions are on the roadmap for customers with data-residency requirements.
Sandbox environment
Free, no-key, IP-gated sandbox at `sandbox.convertintomp4.com` for testing requests without burning credits or auth headaches.
Hand-written wrappers in every major language. Identical job/task shape, identical webhook payloads, identical error codes — pick a language, copy the install command, and start converting.
Node.js
npm install convertintomp4convertintomp4
Python
pip install convertintomp4convertintomp4
Ruby
gem install convertintomp4convertintomp4
PHP
composer require convertintomp4/sdkconvertintomp4/sdk
Go
go get github.com/convertintomp4/sdk-gogithub.com/convertintomp4/sdk-go
Java
implementation 'com.convertintomp4:sdk:1.0.0'com.convertintomp4:sdk
.NET (C#)
dotnet add package ConvertIntoMP4.SdkConvertIntoMP4.Sdk
Swift
.package(url: "https://github.com/convertintomp4/sdk-swift", from: "1.0.0")convertintomp4/sdk-swift
Kotlin
implementation("com.convertintomp4:sdk-kotlin:1.0.0")com.convertintomp4:sdk-kotlin
Dedicated plan for teams building on the API: 5,000 conversion credits per month, all 9 SDKs, webhooks, presigned uploads, and OAuth2 included. Larger volumes available on Business ($24.99/mo) or pay-as-you-go.
Subscribe — $19/mo→Engineered to handle real workloads — from one-off prototypes to high-throughput ingestion pipelines.
TLS 1.2+ in transit. AES-256 at rest. Auto-delete after 1h/24h/7d, or call DELETE /v1/jobs/:id to wipe immediately. GDPR + DPA available. See the security page for the full pipeline diagram.
HMAC-signed webhooks across 16 events. Real-time progress on the /ws/user/jobs WebSocket. Per-API-key rate-limit headers on every response so you can throttle gracefully.
Import from S3, Azure Blob, GCS, SFTP, Google Drive, Dropbox or OneDrive. Export back to any of the same. Never touches your servers — saves you the egress bill and the storage round-trip.
Everything teams ask before shipping the first API call.
Create a free ConvertIntoMP4 account, head to /account/api in the dashboard, and click "Generate key". Keys are prefixed `ck_` for public/client-side use and `sk_` for server-side use; both are SHA-256 hashed at rest. You can scope keys to read-only, convert-only, or full access and rotate them at any time with a 24-hour grace period.
50 conversions per day, 200 MB max file size, no API key required. Rate-limited to 5 requests per minute and 30 per hour by IP. This is enough to integrate, prototype, and ship a side project; the Pro and Business tiers add daily quotas of 2,000 and 20,000 conversions respectively, plus larger file caps and faster engines.
255 formats across 6 categories: 44 video, 45 audio, 49 image, 70 document, 22 archive, and 9 font. Routing is automatic — POST /v1/convert with `output_format=mp4` and we pick the right engine (FFmpeg, Sharp, LibreOffice, Pandoc, Calibre, etc). The full registry is queryable at GET /v1/formats.
Both. Short jobs (images, small audio) typically complete in under a second and you can block on `client.waitForJob(id)`. Longer jobs (4K video transcode, large documents) return immediately with a job ID; you can poll GET /v1/jobs/:id, subscribe to the /ws/user/jobs WebSocket, or register an HMAC-signed webhook for job.completed events.
All conversions run in our Hetzner Helsinki (EU) datacentre. Source and output files are stored in Cloudflare R2 (eu-east) and auto-deleted after 1 hour (free), 24 hours (Pro), or 7 days (Business). You can also call DELETE /v1/jobs/:id at any time to wipe everything immediately. TLS 1.2+ in transit, AES-256 at rest.
Yes — 16 event types covering job lifecycle (created, queued, started, progress, completed, failed, cancelled, expired), file events (uploaded, downloaded, deleted), subscription changes, and quota warnings. Payloads are signed with HMAC-SHA256. Slack Block Kit and Discord embed formats are built-in alongside the default JSON format.
Yes. We support Amazon S3, Azure Blob Storage, Google Cloud Storage, SFTP, Google Drive, Dropbox and OneDrive as both import sources and export targets. Configure once with scoped credentials and reference the bucket/container/folder in your convert request.
A free IP-gated test environment is reachable at sandbox.convertintomp4.com. No API key needed for prototyping, and requests there don't count against your production quota. Once you're ready for production, point at api.convertintomp4.com and add your `ck_` key.
Create an account, generate an API key in the dashboard, and copy any of the code samples above. The free tier gives you 50 conversions per day — enough to prototype, integrate and ship a side project without paying a cent.