> This page is for Home.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.webflow.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.webflow.com/_mcp/server.

# Custom Fonts API

> Seven new endpoints let apps upload, list, update, replace, and delete custom fonts on a Webflow site.

The Custom Fonts API adds seven new OAuth v2 endpoints under `/v2/sites/{site_id}/custom_fonts`.
Apps can now manage a site's custom fonts programmatically — uploading, listing, updating, replacing, and deleting fonts without any manual steps in the Webflow Designer.

For information on using custom fonts in sites, see [Custom fonts](/data/reference/custom-fonts).

## What's new

* **Upload a font** to a site, with full variable font axis metadata
* **List a site's custom fonts** with pagination
* **Get a single custom font** by ID
* **Update font metadata** (family name, weight, italic, font-display) without re-uploading the binary
* **Replace a font's binary** while preserving the font's ID and references
* **Delete a custom font** by ID
* **Batch delete custom fonts** in one request, with a per-font success and failure manifest

## What you can build

**Foundry and font-platform apps.** Apps that license fonts can provision the licensed binaries straight into a customer's Webflow site.
Your user browses your library, selects a face, and the font appears in the site's typography picker.

**Brand-system and multi-site management apps.** Agencies managing many sites under one workspace can keep the same brand fonts in sync across every site.
Push a new corporate typeface to all client sites in one batch, or remove a deprecated weight from all of them just as easily.

**AI and MCP agents.** An AI assistant can now complete a site's typography setup end-to-end — upload the brand's custom font and it is immediately available across the site's surfaces, with no manual handoff.

## Authentication and scopes

The API reuses the existing `sites:read` and `sites:write` OAuth scopes.
No new scopes are required, and existing app installations don't need to re-authorize.

## Upload handshake

Font uploads use the same presigned-S3 handshake as the Assets API.

1. POST to Webflow with the font metadata and the MD5 hash of the binary.
   Webflow returns `202 Accepted` with a `customFont` object and a presigned `upload` object.
2. POST the binary directly to `upload.url` as `multipart/form-data`, including every key from `upload.fields`.
   The binary goes in a field named `file`, which must be the last field in the form.
   S3 returns `201 Created` on success.

The font is immediately available in the site's typography picker after the S3 upload completes.

## Limitations

* **Supported formats:** WOFF2, WOFF, TTF, OTF, EOT. SVG fonts are not supported.
* **File size:** Uploads exceeding 4 MB are rejected by S3.
* **Per-site limit:** Each site has an internal cap on total custom fonts. Exceeding the cap returns `409 Conflict`.
* **Batch delete:** Accepts 1-100 font IDs per request.

## New endpoints

| Endpoint                                              | Operation                                                                           |
| ----------------------------------------------------- | ----------------------------------------------------------------------------------- |
| `GET /v2/sites/{site_id}/custom_fonts`                | [List custom fonts](/data/reference/custom-fonts/custom-fonts/list)                 |
| `POST /v2/sites/{site_id}/custom_fonts`               | [Create custom font](/data/reference/custom-fonts/custom-fonts/create)              |
| `GET /v2/sites/{site_id}/custom_fonts/{font_id}`      | [Get custom font](/data/reference/custom-fonts/custom-fonts/get)                    |
| `PATCH /v2/sites/{site_id}/custom_fonts/{font_id}`    | [Update custom font](/data/reference/custom-fonts/custom-fonts/update)              |
| `DELETE /v2/sites/{site_id}/custom_fonts/{font_id}`   | [Delete custom font](/data/reference/custom-fonts/custom-fonts/delete)              |
| `PUT /v2/sites/{site_id}/custom_fonts/{font_id}/file` | [Replace custom font file](/data/reference/custom-fonts/custom-fonts/replace-file)  |
| `POST /v2/sites/{site_id}/custom_fonts/batchDelete`   | [Batch delete custom fonts](/data/reference/custom-fonts/custom-fonts/batch-delete) |