> ## Documentation Index
> Fetch the complete documentation index at: https://docs.automate.ax/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Automate.ax automations are TypeScript programs.
> Use Bun for installation and command examples.
> Use Automate.ax for the product name and automate.ax for the package, CLI, and domain.
> Treat documented public APIs as current; do not invent transitional or deprecated names.

# Create custom fonts

> Creates upload credentials for up to 25 custom fonts.

`webflow.createCustomFonts` prepares a batch of custom fonts for upload.

## Example

```ts automations/webflow-create-custom-fonts.automation.ts theme={null}
import { automation, onDashboardRun } from "automate.ax"
import { webflow } from "automate.ax/webflow"

export default automation("Create custom fonts", () => {
  onDashboardRun({ title: "Create custom fonts" })
  webflow.createCustomFonts({
    siteId: "site-id",
    items: [
      {
        fileName: "AcmeSans-Regular.woff2",
        fileHash: "d41d8cd98f00b204e9800998ecf8427e",
        fontFamily: "Acme Sans",
        weight: 400,
        italic: false,
        fontDisplay: "swap",
      },
    ],
  })
})
```

## Inputs

Every input accepts a compatible signal. This action requires the `sites:write` OAuth scope.

| Field    | Type                             | Required | Description                         |
| -------- | -------------------------------- | -------- | ----------------------------------- |
| `siteId` | `string`                         | Yes      | Webflow site ID.                    |
| `items`  | `WebflowCustomFontCreateInput[]` | Yes      | From 1 through 25 font definitions. |

Each item requires `fileName`, `fileHash`, `fontFamily`, `weight`, `italic`, and `fontDisplay`; `axes` is optional. Filenames accept `.woff2`, `.woff`, `.ttf`, `.otf`, or `.eot` and have a 256-character limit. `fileHash` is a lowercase 32-character hexadecimal MD5. Family names have a 256-character limit, weights range from 1 through 1,000, and `fontDisplay` accepts `auto`, `block`, `swap`, `fallback`, or `optional`. Each font accepts up to 16 axes.

## Output

| Field     | Type                                                                   | Description                                |
| --------- | ---------------------------------------------------------------------- | ------------------------------------------ |
| `created` | `{ customFont: WebflowCustomFont; upload: WebflowCustomFontUpload }[]` | Registered fonts and their signed uploads. |
| `failed`  | `{ fileName: string; index: number; msg: string; name: string }[]`     | Per-item registration failures.            |
