---
title: "Create a Brand"
method: POST
path: "/context/brands"
tags: ["Brands"]
---

# Create a Brand

`POST /context/brands`

## Request

- Base URL: `https://api.adcrunch.dev`
- URL: `https://api.adcrunch.dev/context/brands`
- Auth: HTTP bearer

Creates a Brand in your organization. Every narrative section is optional, because you write a Brand one part at a time. AdCrunch makes the slug from the name. To set a different slug, send one. The answer is `409` if the slug already exists in your organization.

## Request body

- object
  - `description` string, required: One-line summary — what agents read to pick this Brand.
  - `guidelines` string: Do's and don'ts, guardrails, claims to avoid (markdown).
  - `identity` string: Who the brand is: positioning, mission, offering (markdown).
  - `messaging` string: Key messages, value propositions, proof points (markdown).
  - `name` string, required: Display name.
  - `slug` string: Optional explicit slug handle; normalized to kebab-case. Defaults to one derived from the name.
  - `voice` string: Tone of voice and personality (markdown).
  - `website_url` string, uri: The Brand's public site — a locator like the slug, not a section. Setting it does nothing on its own; reading it is a separate, explicit call.

## Response `201`

The Brand as created, at `revision` 1. Every unwritten section comes back `null`, which is a normal state rather than an error.

- object
  - `createdAt` number, required: Milliseconds since the Unix epoch, UTC.
  - `createdBy` string, required
  - `description` string, required
  - `guidelines` string, nullable, required: Do’s and don’ts, claims to avoid.
  - `id` string, required
  - `identity` string, nullable, required: Positioning, mission, what is on offer.
  - `logoDocumentId` string, nullable, required: The Document this Brand nominates as its logo.
  - `messaging` string, nullable, required: Key messages, value propositions, proof points.
  - `name` string, required
  - `revision` number, required: Increments on every write. Send it back as `base_revision` to edit; a stale one answers 409.
  - `slug` string, required
  - `updatedAt` number, nullable, required: Milliseconds since the Unix epoch, UTC.
  - `voice` string, nullable, required: Tone and personality.
  - `websiteUrl` string, nullable, required: The brand’s public site. A locator only — its contents are not stored.

## Other responses

- `400`: The request does not match the schema of this operation: a field is missing or has the wrong type, or the body is not valid JSON. `error` is `invalid_request`, and `issues` names each field. Nothing was changed.
- `401`: No API key, or one that does not resolve. See the security scheme. `error` is `unauthorized`.
- `402`: The organization has no active subscription. An owner subscribes at `paywallUrl`. `error` is `organization_unentitled`.
- `403`: The caller does not hold `brand:write`. `error` is `forbidden`.
- `409`: Another Brand in this organization already holds that slug. `error` is `slug_conflict`. A Skill may share it — each aggregate is addressed through its own surface.
- `422`: The name and slug together contain no letter or digit. `error` is `invalid_slug`.

---

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