Create (or upsert) a brand kit
Create or upsert a brand kit. Gated on the `brand_kits` boolean entitlement, which the FREE plan grants — brand-first authoring is deliberately never paywalled — so this is available to every account and costs no credits. A plan without it returns 402 billing_required (`details.featureId: "brand_kits"`). Discover the gate WITHOUT a failed round-trip via GET /v1/me — its `entitlements.brand_kits.included` tells you up front.
API key auth. Prefix cf_live_ for production orgs, cf_test_ for sandbox.
In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
POST /brand-kits body. Org/user are server-resolved; never accepted from the body.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/brand-kits" \ -H "Content-Type: application/json" \ -d '{ "kitId": "string", "name": "string", "colors": { "primary": "string", "secondary": "string", "accent": "string", "background": "string", "text": "string" }, "headingFont": { "fontFamily": "string", "fontWeight": 0 }, "bodyFont": { "fontFamily": "string", "fontWeight": 0 } }'{ "id": "string", "name": "string", "description": "string", "tagline": "string", "colors": { "property1": "string", "property2": "string" }, "extraColors": [ { "name": "string", "value": "string" } ], "fonts": { "heading": { "family": "string", "weight": 0 }, "body": { "family": "string", "weight": 0 } }, "voiceGuidelines": "string", "captions": { "sync": true, "profile": { "property1": null, "property2": null } }, "motion": { "duration": 0, "easing": "linear", "entrance": "none", "staggerMs": 0, "exitMs": 0 }, "logo": { "src": "string", "alt": "string", "placement": "tl", "sizePct": 0 }, "intro": { "kind": "card", "src": "string", "title": "string", "subtitle": "string", "durationMs": 0 }, "outro": { "kind": "card", "src": "string", "title": "string", "subtitle": "string", "durationMs": 0 }, "watermark": { "src": "string", "opacity": 0, "placement": "tl" }, "spacing": { "base": 0, "lg": 0, "sm": 0 }, "sizing": { "fontSizeHeading": 0, "fontSizeBody": 0, "fontSizeLabel": 0, "borderRadius": 0 }, "audio": { "sfxIntensity": "off", "musicEnabled": true, "musicMood": "string", "sonicLogo": { "ref": "string", "placement": "intro", "offsetMs": 0 }, "uiSoundSet": { "tick": "string", "pop": "string", "impact": "string", "confirm": "string", "error": "string", "whoosh": "string", "riser": "string" }, "bedStyle": { "bedId": "string", "genre": "string", "bpmRange": { "min": 0, "max": 0 } }, "ambiencePreference": { "ref": "string" } }, "exemplarKeys": [ "string" ], "contactSheetKey": "string", "motifs": [ { "id": "string", "observed": "string", "body": { "kind": "card", "html": "string", "tokens": { "property1": "string", "property2": "string" } }, "motion": { "preset": "fade-up", "enterMs": 0, "exitMs": 0, "staggerMs": 0, "confidence": "high" }, "role": "title-card", "zone": { "x": 0, "y": 0, "w": 0, "h": 0 }, "evidence": [ 0 ], "diffScore": 0, "coverage": "reproduced", "skipReason": "string" } ], "styleRubric": "string", "density": { "graphicsPerMin": 0, "maxSimultaneous": 1 }, "inspiration": { "sources": [ "string" ], "extractedAt": 0, "extractionVersion": "string" }, "createdAt": "string", "updatedAt": "string"}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}{ "error": { "code": "string", "message": "string", "details": { "property1": null, "property2": null } }}Update an authored component PUT
Required permission: projects:write
Reserve presigned PUT slots for inspiration exemplar frames POST
Returns presigned PUT URLs under this org's `brand-inspiration/…` prefix — the only namespace the brand-kit upsert accepts `exemplarKeys` from. PUT each curated reference frame (≤720px jpeg recommended — the frames become vision input downstream), then upsert the kit with the returned keys. This is the ingest door for agent-driven kit extraction (the `extracting-brand-kits` skill on GET /skills).