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

# Workspace brand kits

> Reuse approved colors, media, and custom fonts in the console, editor and API.

`GET /v1/brand-kits/workspace` returns the workspace's permanent kit, creating it on first read. Extracted kits stay separate. The response keeps `fonts` as heading/body token names; `brand_fonts` contains uploaded font faces and their processing status.

## Colors and media

`PATCH /v1/brand-kits/{id}` changes the name, palette roles, font role names, or `logo_asset_id`. A logo must be an image owned by the workspace. Palette and font-role objects merge by key. Manual fields survive later extraction.

* `POST /v1/brand-kits/{id}/colors` accepts `{ "color": "#ff7a1a" }`.
* `DELETE /v1/brand-kits/{id}/colors/ff7a1a` removes that color and any matching palette roles.
* `POST /v1/brand-kits/{id}/assets` accepts `{ "asset_ids": ["asset_..."] }`.
* `DELETE /v1/brand-kits/{id}/assets/{asset_id}` unlinks media. The original remains in the asset library.

Adds and removes are idempotent. Colors are lowercase six- or eight-digit hex values; opaque alpha is omitted. Each kit holds up to 64 colors. Add `brand_kit_id` to an upload request to link new media immediately. Deleting an extracted kit removes memberships; deleting the workspace kit returns `409 conflict`.

## Upload a custom font

```json theme={null}
{
  "content_type": "font/ttf",
  "filename": "AcmeSans.ttf",
  "brand_kit_id": "workspace",
  "family": "Acme Sans"
}
```

Send this body to `POST /v1/uploads`, then PUT the bytes to its `upload_url`. The result includes `brand_font_id`. TTF and OTF are accepted up to 10 MB; WOFF and WOFF2 are not accepted for a brand kit. If `family` is omitted, the file's name table supplies it once the bytes arrive. Inline uploads use the existing 256 KB cap.

Poll the workspace kit or `GET /v1/workspace/fonts` until the face is `ready`. Then use its family name as `font_family` in a render. Names match after Unicode normalization, whitespace collapse, surrounding quote removal and case folding. A live duplicate family returns `409`; uploading again after a failure replaces the failed entry.

Each uploaded family is one upright face. Processing fonts return `422 asset_not_ready` when rendered, and failed fonts return `422 invalid_source`, with the affected font field's path. The preview reads the uploaded file; the production renderer uses processed chunks from the same face.

`DELETE /v1/workspace/fonts/{font_id}` hides a font from the library while retaining its source and processed data for existing projects and queued renders. A new live face with the same family takes precedence. `GET /v1/projects/{id}/brand-fonts` returns the ready faces referenced by an owned project, including retained fonts, so a saved project can still preview them without putting them back in the font picker. Workspace deletion removes retained font data.

Upload only fonts your licence lets you use in video and on the web. Processed font chunks are public by URL; the source file keeps the upload CDN's access rules.

## Extract from a website

Create an extracted kit with `POST /v1/brand-kits` and `{ "url": "https://example.com" }`, or fill an existing kit with `POST /v1/brand-kits/{id}/extract` and the same body. The default heuristic returns a filled kit. When asynchronous extraction is enabled, the response contains `extraction.status: "extracting"` and a task id; wait for that task and read the kit again.

Extraction keeps manually edited fields. Logo suggestions are fetched through the authenticated suggestion endpoint; choose a candidate and save it into the kit as an uploaded image. A repeated request for the same URL within 24 hours can reuse a successful provider result. Monthly extraction quota exhaustion returns `402 quota_exceeded` with `limit` and `used`.

## Agents and access

Use `get_brand_kit("workspace")` first. `edit_brand_kit` shares the API's color, palette and asset mutations. `extract_brand_kit` accepts `brand_kit_id`; asynchronous results provide a `task_id` for `wait_for_task`. `create_upload` accepts `brand_kit_id` and `family` for fonts.

The optional `BRAND_KIT_MIN_PLAN` setting gates mutations with `402 plan_required`; reads remain available and configured admin workspaces are exempt. The setting is unset by default. TasteLabs extraction remains disabled in production until the embedding licence and operational checks are complete.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.