Font Conversion API — Free Tier + Pay-As-You-Go
Convert TTF, OTF, WOFF, WOFF2 and EOT fonts via API. Container/flavour rewriting on fontTools, Brotli-compressed WOFF2.
What it does
The Font Conversion API rewrites a font into a different container using fontTools, the same library that underpins most of the web-font tooling ecosystem. The glyph outlines, metrics, hinting instructions and OpenType feature tables are carried across untouched — only the wrapper changes. TTF and OTF are the plain forms; WOFF wraps them with zlib and WOFF2 with Brotli, which is why WOFF2 is the format you actually ship to browsers.
EOT is produced through a two-stage chain: fontTools writes an intermediate TTF and the `ttf2eot` CLI prepends the Embedded OpenType header, which only matters for IE6-8 targets. TrueType and OpenType collections (`.ttc`, `.otc`) can be used as input; the pipeline loads font index 0 from the collection, which is the standard behaviour for converters and means a multi-font collection gives you its first face. What the API deliberately does not do is reshape the font itself: there is no glyph subsetting, no Unicode-range trimming, no variable-font instancing to a fixed weight, and no re-hinting pass.
A variable font converted to WOFF2 keeps every axis it started with. If you need a subsetted web font, run `pyftsubset` or `glyphhanger` in your build step and convert the result here.
Supported formats
Source formats (6)
- ttf
- otf
- woff
- woff2
- ttc
- otc
Target formats (5)
- ttf
- otf
- woff
- woff2
- eot
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.ttf" \
-F "targetFormat=woff2"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.ttf"),
"input.ttf",
"application/octet-stream",
{ targetFormat: "woff2" },
);
// 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.ttf", "rb") as f:
job = client.upload_direct(
f, "input.ttf", "application/octet-stream", "woff2"
)
# 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
- TTF, OTF, WOFF and WOFF2 in any direction, plus EOT output
- Brotli-compressed WOFF2 for the smallest web payload
- Glyphs, metrics, hinting and OpenType feature tables carried across untouched
- Variable-font axes survive the conversion intact
- `.ttc` / `.otc` collections accepted as input (font index 0 is used)
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
Can the API subset a font to just the characters I use?
No. There is no subsetting parameter — the conversion changes the container, not the glyph set, so a 400 KB TTF becomes a WOFF2 that is smaller only by however much Brotli buys you. Subsetting is genuinely the bigger win for web fonts, so run `pyftsubset` or `glyphhanger` in your build pipeline first and send the already-subsetted font here for the WOFF2 step.
Are variable fonts (CSS font-variation-settings) supported?
Yes, in the sense that they survive the trip: variable axes such as wght, wdth, ital, opsz and slnt pass through to WOFF2 unchanged and keep working in the browser. What you cannot do here is pin a static instance — there is no instancing parameter, so a variable font in is a variable font out.
Can the API generate EOT for IE6-8?
Yes. EOT is a two-stage conversion: fontTools writes an intermediate TTF and the `ttf2eot` CLI wraps it with the Embedded OpenType header, so any supported source can reach EOT. There are no EOT-specific options such as same-origin root strings — you get a plain unrestricted EOT.
What's the difference between TTF/OTF and WOFF/WOFF2?
TTF and OTF are uncompressed desktop formats; WOFF/WOFF2 are gzip/Brotli-compressed wrappers for web delivery. WOFF2 is the recommended web format — Brotli compresses 30% better than WOFF's gzip.
How are font licenses handled?
They are not checked at all. The API does not read the OS/2 `fsType` embedding bits, does not inspect the OFL or EULA, and will happily rewrite whatever you upload. Confirming that you are allowed to convert and redistribute a font is entirely your responsibility.
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 Font Conversion API in five minutes. Read the docs, grab a key, and ship your first conversion before the trial coffee cools.