---
title: "Create a new brand"
method: POST
path: "/api/company"
tags: ["Brand"]
---

# Create a new brand

`POST /api/company`

## Request

- Base URL: `https://api.sponsorunited.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.sponsorunited.com/api/company`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/sponsorunited/apis/sponsorunited-api/docs/api/company/post.ts> (a function with typed inputs; its response is checked against the schema)

Creates a new brand with the provided data. The logo URL is downloaded and stored first: when it cannot be downloaded or is not a usable image, the brand is not saved and the request fails with 422. The brand is approved when the user has the create-companies-auto-approve permission, unless the request sends approved=false. Sending approved=true never approves a brand for a user without that permission.

## Headers

- `X-Agent-Name` string

## Request body

- object
  - `name` string, required: Brand name
  - `logo` string, required: Logo image URL. A URL already on the upload bucket is kept as it is; any other URL is downloaded and stored, and the brand is not created when that fails.
  - `category_id` integer, required: Category ID
  - `subcategory_id` integer, required: Subcategory ID
  - `corporate_phone` string, nullable
  - `website` string, required: Brand website URL
  - `linkedin` string, nullable: LinkedIn URL
  - `locations` object[], required
  - `youtube` string, nullable
  - `twitter` string, nullable
  - `facebook` string, nullable
  - `instagram` string, nullable
  - `twitch` string, nullable
  - `tiktok` string, nullable
  - `synopsis` string, nullable
  - `competitor_details` object[], nullable: Competitors from the synopsis scrape. Sent to the competitor matcher once the brand is saved, which matches on name and falls back to parent_brand. Leaving it out, or sending an empty list, changes no competitor links
    - `name` string, required
    - `parent_brand` string, nullable: The brand that owns the product named in name (Apple Watch -> Apple); null when name is a brand
  - `markets` object[], nullable
  - `organizations` integer[], nullable
  - `agencies` object[], nullable: The brand's agencies. Each one is saved with its services and markets, which the brand profile shows
    - `id` integer
    - `is_aor` integer, nullable: 1 when the agency is the agency of record; left out means 0
    - `services` string, nullable: Free-text services, kept for older clients
    - `service_ids` integer[], nullable
    - `markets` union[], nullable: Market ids, or market objects with an id
      - union
        - integer
        - object
          - `id` integer
  - `brands` object[], nullable
  - `parent_company_id` integer, nullable
  - `approved` boolean, nullable: Send false to save the brand unapproved even when the user may auto-approve brands. It can only lower the approval: true, null or leaving it out keeps the default, which follows the create-companies-auto-approve permission

## Response `200`

Brand created successfully

- object
  - `created_by_agent` string, nullable: Name of the agent that created the brand, from the X-Agent-Name header sent with an agent token. Null when a person created it.

## Other responses

- `401`: Unauthenticated
- `403`: Forbidden
- `422`: Validation error, a social URL already used by another brand, or a logo that could not be downloaded or processed (the brand is not saved). For a duplicate social URL the body names the field, the value and, when it could be found, the brand that already holds it (soft-deleted brands included)

---

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