Custom fonts
Custom fonts API endpoints let you upload and manage custom fonts on a Webflow site.
It uses eight OAuth v2 endpoints under /v2/sites/{site_id}/custom_fonts.
The upload flow uses the same presigned-S3 handshake as the Assets API: Webflow returns signed S3 fields, and you POST the font binary directly to S3. The Webflow API server never receives the raw font bytes.
Supported formats
The API accepts the following font formats:
- WOFF2 (
.woff2) - WOFF (
.woff) - TrueType (
.ttf) - OpenType (
.otf) - Embedded OpenType (
.eot)
For security reasons, SVG fonts are not supported.
Sites that have pre-existing SVG fonts continue to return format: "svg" in read responses, but you cannot upload new SVG fonts through the API.
Upload handshake
Uploading a font is a two-step process.
Register the font with Webflow
Send a POST request to /v2/sites/{site_id}/custom_fonts with the font metadata and the MD5 hash of the binary, as in this example:
The API returns 202 Accepted with a customFont object and an upload object.
The upload object contains a presigned url and a fields map to use in the next step.
Upload the binary to S3
Send a POST request that includes the font binary as multipart/form-data to upload.url.
Include every key from upload.fields as a form field, then append the binary in a field named file.
The file field must be the last field in the multipart form.
Any fields after file are ignored.
The API returns 201 Created on success.
The font is immediately available in the site’s typography picker and in published-site rendering.
Batch registration
When you need to register a whole font family at once (for example, Regular, Bold, Italic, and Bold Italic),
send a POST request to /v2/sites/{site_id}/custom_fonts/batchCreate with up to 25 fonts in a single items array.
This collapses the registration step into one rate-limited request instead of one request per style.
Registration is batched, but the binary uploads are not: the response returns one upload object per font, and you
still POST each font binary to its own presigned S3 URL exactly as in the upload handshake above.
The API returns 200 OK with a per-item manifest. Successfully registered fonts appear in created, each with its own
customFont and upload. If the site’s font limit is reached partway through the batch, the fonts that still fit are
registered and the rest appear in failed with name: "FontLimitReached" — valid fonts are never discarded because a
later font in the batch could not be registered. Each presigned URL expires roughly 15 minutes after issuance, so upload
the binaries promptly.
Examples
Foundry or font-platform integration
This example shows how a foundry or font-platform app provisions a licensed font into a user’s Webflow site.
Multi-site brand font sync
This example shows how an agency dashboard keeps the same brand fonts in sync across every site it manages.
AI or MCP agent typography setup
This example shows how an AI agent uploads a brand font and verifies it is accessible before proceeding to dependent steps.
Limitations
- Supported formats: WOFF2, WOFF, TTF, OTF, EOT. SVG fonts are not accepted.
- File size: Uploads exceeding 4 MB are rejected by S3 with an
EntityTooLargeerror. - Per-site limit: Each site has an internal cap on total custom fonts. Exceeding the cap returns
409 Conflict. - Variable font axes: Each font supports a maximum of 16 variable axes.
- Batch create: A single batch create request supports 1–25 fonts. Binary uploads remain per-font.
- Batch delete: A single batch delete request supports 1–100 font IDs.