---
title: "Sets or replaces the user's profile picture"
method: PUT
path: "/v2/settings/users/{id}/profile-picture"
tags: ["Users Api Service"]
---

# Sets or replaces the user's profile picture

`PUT /v2/settings/users/{id}/profile-picture`

## Request

- Base URL: `https://app.metricool.com/api`
- URL: `https://app.metricool.com/api/v2/settings/users/{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. The image is validated and normalised server-side to a 400x400 PNG, centre-cropped; there is no manual crop. The change is applied immediately and the previous picture is deleted, so it cannot be recovered. 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.

## Path parameters

- `id` integer, required

## Response `200`

The updated user, including the new profile picture URL

- JsonOkResponseUser
  - `metadata` object
  - `page` JsonPaging
    - `next` string
  - `data` User
    - `id` integer
    - `userName` string
    - `role` string
    - `enabled` boolean
    - `name` string
    - `lastName` string
    - `mail` string
    - `phone` string
    - `language` string
    - `timezone` string
    - `accountLogo` string
    - `headerLogo` string
    - `profilePicture` string: Public URL of the user's 400x400 profile picture. Absent when they have none, in which case the frontend renders its initials fallback.
    - `btCustomerId` string
    - `stripeCustomerId` string
    - `taxData` TaxData
      - `vatRate` number, double
      - `company` string
      - `country` string
      - `state` string
      - `address` string
      - `vatNumber` string
      - `addOn` string
    - `affiliated` boolean
    - `whiteLabel` boolean
    - `academic` boolean
    - `beta` boolean
    - `sendToAlternativeEmail` boolean
    - `alternativeEmail` string
    - `billEmails` string[]
    - `marketingNotifications` boolean
    - `token` string
    - `created` DateTimeInfo
      - `dateTime` string, required: Local Date-time represented with a certain timezone
      - `timezone` string: Timezone applied to the datetime
    - `deleted` DateTimeInfo
      - `dateTime` string, required: Local Date-time represented with a certain timezone
      - `timezone` string: Timezone applied to the datetime
    - `isDeleted` boolean
    - `locked` boolean
    - `changePasswordRequired` boolean
    - `onboarding` OnboardingData
      - `required` boolean
      - `finished` boolean
      - `buyerPersona` string
      - `size` string
      - `goal` string[]
      - `networks` string[]
      - `phone` string
      - `partnersOnboardings` object[]
    - `activeBrands` integer
    - `registeredFromTkAppCenter` boolean
    - `firstDayOfTheWeek` integer
    - `whiteLabelIntegrator` boolean
    - `requiresEmailAddress` boolean
    - `vendastaSettings` VendastaData
      - `accountId` string
      - `productNavBarDataUrl` string
    - `crispWorkspaceId` string
    - `crispTokenId` string: Opaque token identifying this user to Crisp for chat history preservation across login.
    - `agencyCKId` integer
    - `integratedIn` string
    - `accountManagerMail` string
    - `passwordExpirationDate` DateTimeInfo
      - `dateTime` string, required: Local Date-time represented with a certain timezone
      - `timezone` string: Timezone applied to the datetime
    - `blogId` integer
    - `customBrandMail` string
    - `brandLabel` string
    - `userAgencyData` UserAgencyData
      - `agencyId` integer: Unique identifier of the agency
      - `isOwner` boolean: Indicates if the user is the owner of the agency
      - `teamMemberRoleId` integer: Unique identifier of the team member role assigned to the user
      - `agencyOwnerUserId` integer: Unique identifier of the agency owner user
    - `featureSegmentAssigned` FeatureSegmentAssigned[]
      - `name` string, required: Feature name
      - `segmentAssigned` integer, required: Segment assigned to the user
    - `internalTag` string
    - `newsletters` boolean: True when the user accepts commercial communications. Absent when the flag does not apply to the requesting surface; for an account's own info it is always present, and an account with no stored choice reads as true.

## Other responses

- `400`: Missing 'picture' file part, not an image, unsupported format, over 1 MB, a side over 2000 px, or the target user is not the caller's own (NotAllowedOperationException, which this resource maps to 400 rather than 403 — same as GET /v2/settings/users/{id})
- `401`: Not authenticated
- `403`: Agency user
- `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/cd0ca612fa01?raw)
