> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flowpayroll.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload your profile photo

> Answers a short-lived upload form for a new profile photo: POST `fields` and then the file (as `file`) to `url` as multipart/form-data. Then poll the status route with `uploadId` until it is `Ready` (read the photo) or `Rejected` (show its `message`). PNG (animated too), JPEG, GIF (animated too), WebP (animated too) or SVG, up to 2 MB and 4,096 pixels each way, animations up to 300 frames. The type is decided from the file's bytes, never its name; location and camera data, comments and anything hidden after the image are removed, and SVGs are cleaned of scripts and links. Replacing the photo deletes the previous one. A person can be given 50 forms a day, counted by UTC day (429 `profile_photo_upload_limit_reached`). API tokens are refused (403 `profile_photo_needs_a_person`).



## OpenAPI

````yaml /api-reference/specs/administration.json post /users/me/photo/uploads
openapi: 3.0.1
info:
  title: Administration API
  description: >-
    Manage your Flow Payroll account: the organisations it owns, the people who
    can sign in to it, the API tokens it holds, its brand, and a feed of recent
    administration activity. Every resource is scoped to the account your
    credentials belong to, so no request ever names a customer and the
    `X-Org-Id` header is not used.
  version: v1
servers:
  - url: https://api.sandbox.flowpayroll.ai/v1/administration
security:
  - X-Auth-Token: []
tags:
  - name: Customer
    description: >-
      Your account: the customer every other resource on this API belongs to.
      Read it and rename it.
  - name: Organisations
    description: >-
      The organisations your account owns: list them with headcounts and your
      access to each, get one in full, and add one or several at a time.
  - name: Users
    description: >-
      The people who can sign in to your account: list, invite (one or many),
      resend invitations, and manage each person's direct grants and
      account-wide access.
  - name: API tokens
    description: >-
      The client credentials your integrations authenticate with: create (the
      secret is shown once), rename, rotate, revoke, and manage which
      organisations each token reaches.
  - name: Activity
    description: Recent administration actions in your account, newest first.
paths:
  /users/me/photo/uploads:
    post:
      tags:
        - Users
      summary: Upload your profile photo
      description: >-
        Answers a short-lived upload form for a new profile photo: POST `fields`
        and then the file (as `file`) to `url` as multipart/form-data. Then poll
        the status route with `uploadId` until it is `Ready` (read the photo) or
        `Rejected` (show its `message`). PNG (animated too), JPEG, GIF (animated
        too), WebP (animated too) or SVG, up to 2 MB and 4,096 pixels each way,
        animations up to 300 frames. The type is decided from the file's bytes,
        never its name; location and camera data, comments and anything hidden
        after the image are removed, and SVGs are cleaned of scripts and links.
        Replacing the photo deletes the previous one. A person can be given 50
        forms a day, counted by UTC day (429
        `profile_photo_upload_limit_reached`). API tokens are refused (403
        `profile_photo_needs_a_person`).
      operationId: CreateProfilePhotoUpload
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateProfilePhotoUploadRequest'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfilePhotoUploadResponseResponseBody'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '503':
          description: Service Unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
components:
  schemas:
    CreateProfilePhotoUploadRequest:
      type: object
      properties:
        contentType:
          type: string
          description: >-
            `image/png`, `image/jpeg`, `image/gif`, `image/webp` or
            `image/svg+xml`. Only an early
                        check: the stored type is decided from the file's bytes.
          nullable: true
        sizeBytes:
          type: integer
          description: The file's size, so an oversized file is refused before it is sent.
          format: int64
          nullable: true
      additionalProperties: false
      description: >-
        Asks for somewhere to upload a new profile photo for the signed-in
        person.
    ProfilePhotoUploadResponseResponseBody:
      type: object
      properties:
        message:
          $ref: '#/components/schemas/MessageWithTokenResponse'
        content:
          $ref: '#/components/schemas/ProfilePhotoUploadResponseContentResponse'
        validationIssues:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssue'
          nullable: true
      additionalProperties: false
    ObjectResponseBody:
      type: object
      properties:
        message:
          $ref: '#/components/schemas/MessageWithTokenResponse'
        content:
          $ref: '#/components/schemas/ObjectContentResponse'
        validationIssues:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssue'
          nullable: true
      additionalProperties: false
    MessageWithTokenResponse:
      type: object
      properties:
        text:
          type: string
        token:
          type: string
        tokenArguments:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssueArgument'
          nullable: true
      additionalProperties: false
    ProfilePhotoUploadResponseContentResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/ProfilePhotoUploadResponse'
        metadata:
          $ref: '#/components/schemas/ContentMetadataResponse'
      additionalProperties: false
    ValidationIssue:
      type: object
      properties:
        field:
          type: string
        reason:
          type: string
        reasonToken:
          type: string
        reasonTokenArguments:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssueArgument'
          nullable: true
      additionalProperties: false
    ObjectContentResponse:
      type: object
      properties:
        data:
          nullable: true
        metadata:
          $ref: '#/components/schemas/ContentMetadataResponse'
      additionalProperties: false
    ValidationIssueArgument:
      type: object
      properties:
        name:
          type: string
        value:
          nullable: true
      additionalProperties: false
    ProfilePhotoUploadResponse:
      type: object
      properties:
        uploadId:
          type: string
          description: >-
            Ask `GET /users/me/photo/uploads/{uploadId}` for the outcome after
            posting the file.
        url:
          type: string
          description: The storage endpoint to POST the file to as `multipart/form-data`.
        fields:
          type: object
          additionalProperties:
            type: string
          description: Form fields to send unchanged, before the `file` field.
        maxSizeBytes:
          type: integer
          description: The largest file the storage will accept.
          format: int64
        expiresDate:
          type: string
      additionalProperties: false
      description: >-
        Where to send a profile photo. The server chose the key; the browser
        only posts the file.
    ContentMetadataResponse:
      type: object
      properties:
        dateFormat:
          type: string
        dateTimeFormat:
          type: string
        paginationToken:
          type: string
          nullable: true
      additionalProperties: false
  securitySchemes:
    X-Auth-Token:
      type: apiKey
      description: FlowPayroll JWT (raw token, no Bearer prefix)
      name: X-Auth-Token
      in: header

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.