---
title: "List the font faces the renderer can actually draw"
method: GET
path: "/v1/fonts"
tags: ["fonts"]
---

# List the font faces the renderer can actually draw

`GET /v1/fonts`

## Request

- Base URL: `https://api.cueframe.ai`
- URL: `https://api.cueframe.ai/v1/fonts`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.cueframe.ai/api/auth/mcp/authorize`, token URL `https://api.cueframe.ai/api/auth/mcp/token`, scopes: `media:read`)
  - API key in header `PAYMENT-SIGNATURE`

The renderer's admitted font set: per family the exact name authoring accepts, the weight ranges a shipped file declares, the styles bytes exist for, the caption default weights, and whether the bytes are bundled or an aliased metric-compatible stand-in. Choose from here and validate_composition will not refuse the face. Unlike POST /fonts/search (which searches the GOOGLE catalog) this is what the render page can rasterize. `manifestVersion` identifies the exact table and moves only when the admitted set does. Covers the BUNDLED set only — a brand kit's sealed faces are per-org and per-render.

## Response `200`

The renderer's admitted font faces.

- RenderFontsResponse: GET /fonts response — the renderer's admitted font set. Derived from the same table the font gate refuses by, so any family/weight/style here passes validation by construction. Covers the BUNDLED set only: a brand kit's sealed faces are per-org and per-render.
  - `manifestVersion` string, required: Identifies this exact face table. Derived from the table's own content, so it moves when and only when the admitted set moves. Record it beside a composition to state which face table a font choice was validated against.
  - `families` object[], required
    - `family` string, required: The family name authoring accepts VERBATIM — card, caption and scene text alike.
    - `weights` object[], required: The weights a shipped file declares. A static face has min === max; a variable face gives its declared wght axis range. Any weight inside a range renders; anything outside every range is REFUSED, never synthesised.
      - `min` number, required
      - `max` number, required
    - `styles` string[], required: The styles bytes exist for in this family. Request italic only when this list includes 'italic'; the renderer refuses synthetic slant.
    - `captionDefaults` object, required: The weights a caption is drawn at when the style names none.
      - `base` number, required
      - `emphasis` number, required
    - `origin` 'bundled' | 'aliased', required: 'bundled' = bytes ship in the render bundle. 'aliased' = a metric-compatible binary stands in for the named family.

## Other responses

- `401`: Missing or invalid Authorization header.
- `402`: Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).
- `403`: Forbidden — permission insufficient.
- `429`: Rate limited. Retry-After header present.
- `500`: Internal error.

---

[API](https://skmtc.dev/cueframe/apis/cueframe-api.md) · [All operations](https://skmtc.dev/cueframe/apis/cueframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cueframe/apis/cueframe-api/revisions/8f9bfe362b4a?raw)
