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}/colorsaccepts{ "color": "#ff7a1a" }.DELETE /v1/brand-kits/{id}/colors/ff7a1aremoves that color and any matching palette roles.POST /v1/brand-kits/{id}/assetsaccepts{ "asset_ids": ["asset_..."] }.DELETE /v1/brand-kits/{id}/assets/{asset_id}unlinks media. The original remains in the asset library.
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
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 withPOST /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
Useget_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.
