---
title: "Creates a brand, optionally already named and with its own image"
method: POST
path: "/v2/settings/brands"
tags: ["Brands Api Service"]
---

# Creates a brand, optionally already named and with its own image

`POST /v2/settings/brands`

## Request

- Base URL: `https://app.metricool.com/api`
- URL: `https://app.metricool.com/api/v2/settings/brands`
- Auth: none declared

The multipart sibling of POST /v2/settings/brands. The request is multipart/form-data with four optional parts: 'brandLabel', 'agencyId', 'organizationId' and a 'picture' file part - the same picture contract as POST /v2/media and the profile-picture endpoints. 'organizationId' (from GET /v2/organizations) creates the brand in that organization, under its owner's account and brand limit; it requires manageBrands there and cannot be combined with 'agencyId'. Every part may be omitted, and omitting all of them creates the same empty brand the JSON variant creates. The image is validated and normalised server-side to an 80x80 PNG, centre-cropped, before the brand is created, so an invalid image creates nothing. Accepted formats PNG, JPEG and WebP, decided from the actual bytes. Maximum upload size 1 MB, and neither side of the source image may exceed 2000 pixels - both are rejections, not automatic downscales. Once the brand exists the image is best-effort: if storing it fails the brand is still created and the response carries no image URL. Without a name the brand shows as an empty brand until its first account is connected; without an image it falls back to the image derived from that account.

## Response `200`

The created brand, with its image URL when the image was stored. Its brandRole is the caller's organization role when a team member creates it in another owner's organization, null when that role lacks editBrand (manageBrands alone creates the brand but gives no access to it), manager otherwise

- JsonOkResponseBrandLite
  - `metadata` object
  - `page` JsonPaging
    - `next` string
  - `data` BrandLite: Brands the user will lose after the downgrade
    - `id` integer
    - `userId` integer
    - `ownerUserId` integer
    - `label` string
    - `title` string
    - `description` string
    - `image` string
    - `ownerUsername` string
    - `hash` string
    - `joinDate` DateTimeInfo
      - `dateTime` string, required: Local Date-time represented with a certain timezone
      - `timezone` string: Timezone applied to the datetime
    - `firstConnectionDate` DateTimeInfo
      - `dateTime` string, required: Local Date-time represented with a certain timezone
      - `timezone` string: Timezone applied to the datetime
    - `timezone` string
    - `brandRole` BrandRole
      - `id` integer
      - `userId` integer, required
      - `name` string, required
      - `description` string
      - `color` string
      - `type` string
      - `assignable` boolean
      - `teamMemberOnly` boolean
      - `deletedDate` DateTimeInfo
        - `dateTime` string, required: Local Date-time represented with a certain timezone
        - `timezone` string: Timezone applied to the datetime
      - `deleted` boolean
      - `actions` BrandRoleActions, required
        - `viewAnalytics` boolean
        - `viewInbox` boolean
        - `viewPlanner` boolean
        - `viewAds` boolean
        - `viewSmartlinks` boolean
        - `fullAccessReports` boolean
        - `fullAccessInbox` boolean
        - `fullAccessPlanner` boolean
        - `fullAccessAds` boolean
        - `fullAccessSmartlinks` boolean
        - `fullAccessHashtagTracker` boolean
        - `editBrand` boolean
        - `schedulePosts` boolean
        - `publishPosts` boolean
        - `approvePosts` boolean
        - `viewCondensedAnalytics` boolean
        - `fullAccessDashboards` boolean
        - `viewDashboards` boolean
        - `editFlow` boolean
        - `viewFlow` boolean
        - `fullAccessStudio` boolean
      - `organizationActions` OrganizationRoleActionsDto, required: Organization-level permissions granted by a brand role, on top of the per-brand actions. Never null in a read response - a role that never had organization permissions set is reported with every field false.
        - `manageBrands` boolean: Whether the role can create and manage brands at the organization level.
        - `manageRoles` boolean: Whether the role can create and manage other brand roles at the organization level.
        - `manageTeamMembers` boolean: Whether the role can manage team members at the organization level.
        - `manageAgencyConfig` boolean: Whether the role can manage the agency configuration.
        - `manageAgencyClients` boolean: Whether the role can manage agency clients.
      - `assignedUsersCount` integer
      - `assignedEnabledCount` integer
      - `assignedDisabledCount` integer
    - `engagementRatio` integer
    - `networksData` NetworksData
      - `webData` string
      - `facebookData` string
      - `instagramData` string
      - `threadsData` string
      - `blueskyData` string
      - `twitterData` string
      - `linkedinData` string
      - `pinterestData` string
      - `tiktokData` string
      - `gbpData` string
      - `youtubeData` string
      - `twitchData` string
      - `facebookAdsData` string
      - `googleAdsData` string
      - `tiktokAdsData` string
    - `isShared` boolean

## Other responses

- `400`: Not an image, unsupported format, over 1 MB, a side over 2000 px, a non-numeric 'agencyId', a non-numeric or non-positive 'organizationId', both 'agencyId' and 'organizationId' at once, or a brand label over 500 characters
- `401`: Not authenticated
- `403`: The account that would own the brand has reached its brand limit, the caller is not a member of the requested agency, or the caller cannot manage the brands of the requested organization, which is also the answer when it does not exist

---

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