{"command":{"effect":"write","timeoutSeconds":30,"inputSchema":{"type":"object","description":"Register 1–25 custom fonts in a single request and get a presigned S3 URL for each one.\nThis collapses the registration step for a whole font family (for example, Regular, Bold,\nItalic, and Bold Italic) into one rate-limited request.\n\nRegistration is batched, but the binary uploads are not: the response contains one `upload`\nobject per registered font, and you must POST each font binary to its own presigned S3 URL\nexactly as you would for [Create custom font](#operation/create-custom-font). The Webflow API\nserver never receives the raw font bytes.\n\nThe response is `200 OK` for a valid request body. Per-font results are reported in the\n`created` and `failed` arrays. If the site's font limit is reached partway through the batch,\nthe fonts that still fit are registered and returned in `created`, while the rest appear in\n`failed` with `name: \"FontLimitReached\"` — valid fonts are never discarded because a later\nfont in the same batch could not be registered. Each presigned URL expires approximately\n15 minutes after issuance, so upload the binaries promptly.\n\nRequired scope | `sites:write`\n","properties":{"path":{"type":"object","properties":{"site_id":{"type":"string","examples":["580e63e98c9a982ac9b8b741"],"description":"Unique identifier for a Site"}},"required":["site_id"],"additionalProperties":false},"body":{"type":"object","description":"Request body for bulk-registering custom fonts","additionalProperties":false,"required":["items"],"properties":{"items":{"type":"array","minItems":1,"maxItems":25,"description":"The custom fonts to register. Each item uses the same shape as the single-font create request.","items":{"type":"object","additionalProperties":false,"required":["fileName","fileHash","fontFamily","weight","italic","fontDisplay"],"properties":{"fileName":{"type":"string","description":"File name including extension. Accepted extensions are `.woff2`, `.woff`, `.ttf`, `.otf`, and `.eot`. Maximum 256 characters.","examples":["AcmeSans-Regular.woff2"]},"fileHash":{"type":"string","description":"Lowercase hex MD5 hash of the font binary (exactly 32 characters)","examples":["3c7d87c9575702bc3b1e991f4d3c638e"]},"fontFamily":{"type":"string","description":"The CSS font-family name (1-256 characters). Commas are stripped server-side.","examples":["Acme Sans"]},"weight":{"type":"integer","minimum":1,"maximum":1000,"description":"CSS font-weight value (1-1000)","examples":[400]},"italic":{"type":"boolean","description":"Whether the font is italic","examples":[false]},"fontDisplay":{"type":"string","enum":["auto","block","swap","fallback","optional"],"description":"CSS font-display value","examples":["swap"]},"axes":{"type":"array","maxItems":16,"items":{"description":"A variable font axis definition","required":["tag","min","max","defaultValue"],"properties":{"tag":{"type":"string","minLength":4,"maxLength":4,"pattern":"^[\\x20-\\x7E]{4}$","description":"The four-character OpenType axis tag, consisting of exactly 4 printable ASCII characters (for example, `wght`, `opsz`, `slnt`, `wdth`)","examples":["wght"]},"name":{"type":"string","maxLength":64,"description":"Optional human-readable label for the axis","examples":["Weight"]},"min":{"type":"number","description":"Minimum value for the axis","examples":[100]},"max":{"type":"number","description":"Maximum value for the axis","examples":[900]},"defaultValue":{"type":"number","description":"Default value for the axis. Must be between `min` and `max` (inclusive). Violating this constraint returns `400 BadArgument` with an error prefixed `fontMetadata.axes`.","examples":[400]}}},"description":"Variable font axes. Omit or pass an empty array for static fonts."}}}}}}},"required":["path","body"],"additionalProperties":false},"name":"Batch create custom fonts","id":"webflow.batch-create-custom-fonts","example":{"path":{"site_id":"580e63e98c9a982ac9b8b741"},"body":{"items":[{"fileName":"AcmeSans-Regular.woff2","fileHash":"3c7d87c9575702bc3b1e991f4d3c638e","fontFamily":"Acme Sans","weight":400,"italic":false,"fontDisplay":"swap"}]}},"maxRequests":1,"summary":false}}