---
title: Create Brand
api: POST /brands
description: "Register a new brand for analysis. Returns the existing brand if the domain is already registered under your account."
---

> **For AI agents:** the complete documentation index is at [llms.txt](https://docs.boringmarketing.com/llms.txt). Append `.md` to any page URL for its markdown version.

Register a brand by its domain. If the domain is already registered under your account, the response returns the existing brand with `"existing": true`. The brand starts empty — identity, competitors, trust signals, and the keyword universe are populated by the pipeline endpoints (`/enrich/brand`, `/discover-competitors`, `/analyze`, etc).

## Request body

<ParamField body="domain" type="string" required>
  The brand's primary domain (e.g., `yourdomain.com`). No protocol.
</ParamField>

<ParamField body="name" type="string" required>
  Brand display name.
</ParamField>

## Response

Returns `201 Created` whether the brand is newly created or already existed — the route status code is fixed. Distinguish the two cases by checking the `existing` field:

### New brand (no `existing` field)

```json
{
  "id": "ea502f67-338b-47e4-a245-5c4eea8bd8d2",
  "domain": "yourdomain.com",
  "name": "Your Brand"
}
```

### Domain already registered under your account

```json
{
  "id": "ea502f67-338b-47e4-a245-5c4eea8bd8d2",
  "domain": "yourdomain.com",
  "name": "Your Brand",
  "existing": true
}
```

## Errors

| Status | Meaning |
|---|---|
| `403` | Creating this brand would exceed your tier's brand limit (1 for Builder, 3 for Pro, 10 for Agency). Body is a plain `{"detail": "<tier> tier allows <N> brand(s)."}` — there is **no** `actions[]` envelope on this endpoint. Upgrade via `POST /auth/billing-portal`. |
| `422` | Request body failed validation. |

## Example

<CodeGroup>
```bash cURL
curl -X POST \
  https://api.boringmarketing.com/brands \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $BM_API_KEY" \
  -d '{
    "domain": "yourdomain.com",
    "name": "Your Brand"
  }'
```

```python Python
resp = httpx.post(
    "https://api.boringmarketing.com/brands",
    headers={"X-API-Key": api_key},
    json={
        "domain": "yourdomain.com",
        "name": "Your Brand",
    },
)
brand = resp.json()
brand_id = brand["id"]
```

```javascript Node.js
const brand = await fetch(
  "https://api.boringmarketing.com/brands",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-API-Key": apiKey,
    },
    body: JSON.stringify({
      domain: "yourdomain.com",
      name: "Your Brand",
    }),
  }
).then(r => r.json());
```
</CodeGroup>

<Tip>
Brand identity (description, ICP, services, trust signals, voice) is extracted automatically by `POST /brands/{id}/enrich/brand` — no need to supply it at create time. Competitors can be discovered automatically via `POST /brands/{id}/discover-competitors` or set manually later with `PATCH /brands/{id}`.
</Tip>
