---
title: "Sets or replaces the brand's custom image"
method: PUT
path: "/v2/settings/brands/{brand-id}/profile-picture"
tags: ["Brands Api Service"]
---

# Sets or replaces the brand's custom image

`PUT /v2/settings/brands/{brand-id}/profile-picture`

## Request

- Base URL: `https://app.metricool.com/api`
- URL: `https://app.metricool.com/api/v2/settings/brands/{brand-id}/profile-picture`
- Auth: none declared

The request is multipart/form-data with a single file part named 'picture' — the same contract as POST /v2/media and the profile-picture endpoints. The image is validated and normalised server-side to an 80x80 PNG, centre-cropped; there is no manual crop. The change is applied immediately and the previous image is deleted from the serving bucket, so it is no longer retrievable through the API. 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. A custom image takes precedence over the image derived from the brand's connected networks.

## Path parameters

- `brand-id` integer, required

## Response `200`

The updated brand, including the new image URL

- JsonOkResponseBrand
  - `metadata` object
  - `page` JsonPaging
    - `next` string
  - `data` Brand
    - `id` integer
    - `userId` integer
    - `ownerUserId` integer
    - `label` string
    - `title` string
    - `description` string
    - `image` string
    - `imageSource` 'CUSTOM' | 'NETWORK' | 'DEFAULT': Where the image the brand renders comes from. Always present on a brand response.
    - `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
    - `ownerUsername` string
    - `whiteLabelData` WhiteLabelData
      - `whiteLabelLink` string
      - `analyticModeWhitelabelLink` string
      - `whiteLabelAlias` string
      - `isWhiteLabel` boolean
      - `isWhiteLabelOnlyRead` boolean
    - `hash` string
    - `version` integer
    - `deleteDate` DateTimeInfo
      - `dateTime` string, required: Local Date-time represented with a certain timezone
      - `timezone` string: Timezone applied to the datetime
    - `deleted` boolean
    - `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
    - `lastResolvedInboxMessageTimestamp` integer
    - `lastReadInboxMessageTimestamp` integer
    - `timezone` string
    - `availableConnectors` 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
    - `isDemo` boolean
    - `properties` BrandProperties
      - `customEmail` string
      - `additionalNotificationAddresses` string[]
      - `colors` Colors
        - `blue` string
        - `teal` string
        - `pink` string
        - `yellow` string
        - `purple` string
        - `cyan` string
        - `red` string
        - `green` string
        - `slate` string
        - `charcoal` string
        - `lightYellow` string
        - `darkYellow` string
        - `cobalt` string
      - `trialExcluded` string
      - `engagementRatio` integer

## Other responses

- `400`: Missing 'picture' file part, not an image, unsupported format, over 1 MB, a side over 2000 px, or brand-id does not match the request's brand
- `401`: Not authenticated
- `403`: Caller lacks EDIT_BRAND on this brand
- `409`: Another image change for this brand is in progress
- `415`: Declared content type is not multipart/form-data

---

[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)
