> ## 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.

# Change your brand draft

> A JSON Merge Patch (RFC 7396): leave a field out to keep it, send `null` to clear it, send a value to change it. `If-Match` is required and must be the draft's `ETag` as you last read it; if somebody else saved since, the answer is 412 `concurrent_change` and nothing is written; without it, 428 `precondition_required`. Every field is checked: colours are `#RRGGBB`, links `https` only, the product name 2 to 40 characters, the legal footer up to 300, and text on the main colour must reach WCAG AA (4.5:1). `fontLicenceConfirmed: true` records you and the time as the licence confirmation an uploaded font needs. Flow-controlled settings (white label, Powered by Flow, allowances, domains) cannot be sent here. Changing the brand needs access to every organisation in the account, or being its owner (403 `whole_customer_access_denied`); `canChange` on the draft says whether you can.



## OpenAPI

````yaml /api-reference/specs/administration.json patch /customer/branding/draft
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:
  /customer/branding/draft:
    patch:
      tags:
        - Branding
      summary: Change your brand draft
      description: >-
        A JSON Merge Patch (RFC 7396): leave a field out to keep it, send `null`
        to clear it, send a value to change it. `If-Match` is required and must
        be the draft's `ETag` as you last read it; if somebody else saved since,
        the answer is 412 `concurrent_change` and nothing is written; without
        it, 428 `precondition_required`. Every field is checked: colours are
        `#RRGGBB`, links `https` only, the product name 2 to 40 characters, the
        legal footer up to 300, and text on the main colour must reach WCAG AA
        (4.5:1). `fontLicenceConfirmed: true` records you and the time as the
        licence confirmation an uploaded font needs. Flow-controlled settings
        (white label, Powered by Flow, allowances, domains) cannot be sent here.
        Changing the brand needs access to every organisation in the account, or
        being its owner (403 `whole_customer_access_denied`); `canChange` on the
        draft says whether you can.
      operationId: UpdateBrandingDraft
      parameters:
        - name: If-Match
          in: header
          description: >-
            The draft's `ETag` as you last read it, such as `"4"` (the same as
            `version` in quotes). 412 `concurrent_change` when somebody saved
            since; 428 `precondition_required` without it.
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/merge-patch+json:
            schema:
              $ref: '#/components/schemas/UpdateBrandingDraftRequest'
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateBrandingDraftRequest'
      responses:
        '200':
          description: OK
          headers:
            ETag:
              description: >-
                The draft's current version as a strong entity tag, such as
                `"5"`. Send it as `If-Match` to change it.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrandingDraftResponseResponseBody'
        '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'
        '412':
          description: Precondition Failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
        '428':
          description: Precondition Required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ObjectResponseBody'
components:
  schemas:
    UpdateBrandingDraftRequest:
      type: object
      properties:
        productName:
          type: string
          description: Required to publish. 2 to 40 characters.
        primaryColour:
          type: string
          description: Required to publish. Hex colour, `#RRGGBB`.
        primaryForegroundColour:
          type: string
          description: '`null` derives it from the primary colour.'
          nullable: true
        accentColour:
          type: string
          nullable: true
        fontSource:
          enum:
            - Curated
            - Uploaded
          type: string
        fontCuratedKey:
          type: string
          nullable: true
        fontFamily:
          type: string
          nullable: true
        fontRegularAssetId:
          type: string
          nullable: true
        fontMediumAssetId:
          type: string
          nullable: true
        fontBoldAssetId:
          type: string
          nullable: true
        fontLicenceConfirmed:
          type: boolean
          description: >-
            `true` records the caller and the time as the licence confirmation.
            Required before an uploaded font can be published.
          nullable: true
        logoAssetId:
          type: string
          nullable: true
        iconAssetId:
          type: string
          nullable: true
        logoDarkAssetId:
          type: string
          description: >-
            The logo on a dark background (an asset id from a `Logo` upload).
            Null uses the light one.
          nullable: true
        iconDarkAssetId:
          type: string
          description: >-
            The icon on a dark background (an asset id from an `IconMark`
            upload). Null uses the light one.
          nullable: true
        loadingStyle:
          enum:
            - Spinner
            - Icon
            - Animation
          type: string
        loadingAnimationAssetId:
          type: string
          description: From a `LoadingAnimation` upload.
          nullable: true
        loadingAnimationDarkAssetId:
          type: string
          description: From a `LoadingAnimation` upload. Null uses the light one.
          nullable: true
        emailButtonShape:
          enum:
            - Rounded
            - Square
            - Pill
          type: string
          description: The corners of the buttons in emails.
        emailHeaderStyle:
          enum:
            - Plain
            - BrandBar
          type: string
          description: How the top of each email looks.
        supportEmail:
          type: string
          nullable: true
        supportUrl:
          type: string
          description: '`https` only.'
          nullable: true
        privacyUrl:
          type: string
          description: '`https` only.'
          nullable: true
        termsUrl:
          type: string
          description: '`https` only.'
          nullable: true
        helpLinksFallback:
          enum:
            - Hide
            - FlowGuides
          type: string
        emailFromName:
          type: string
          nullable: true
        emailFromAddress:
          type: string
          description: >-
            The address every email comes from, such as `payroll@acme.example`,
            on one of the account's email domains

            (`GET /customer/branding/sender-options`). Used while that domain is
            verified; removed, emails come from

            `noreply@` the account's first verified domain, or Flow's standard
            address when it has none.
          nullable: true
        emailSenderOverrides:
          type: object
          additionalProperties:
            allOf:
              - $ref: '#/components/schemas/EmailSenderPatch'
            nullable: true
          description: >-
            Per kind of email, keyed by email type (`PayslipGeneratedEvent`,
            `P60GeneratedEvent`, ...), the name,

            address or reply-to it uses instead of the default. Merged key by
            key: an object changes the fields it names,

            `null` puts that email back on the default, and keys left out are
            unchanged, so one request edits any number

            of emails. `null` for the whole field puts every email back on the
            default.
          nullable: true
        emailReplyTo:
          type: string
          nullable: true
        emailFooterText:
          type: string
          nullable: true
        legalFooter:
          type: string
          description: Up to 300 characters.
          nullable: true
        documentsShowLogo:
          type: boolean
        documentsUseBrandColour:
          type: boolean
        appShowsProductName:
          type: boolean
          description: >-
            Show the product name beside the logo in the app. With no logo the
            name always shows.
        signInShowsProductName:
          type: boolean
          description: >-
            Show the product name beside the logo on the sign-in page. With no
            logo the name always shows.
        emailsShowProductName:
          type: boolean
          description: >-
            Show the product name beside the logo in emails. With no logo the
            name always shows.
        documentsShowProductName:
          type: boolean
          description: >-
            Show the product name beside the logo on payslips and letters. With
            no logo the name always shows.
      additionalProperties: false
      description: >-
        A JSON Merge Patch (RFC 7396) of the branding draft: a field left out
        stays as it is, a field sent as

        `null` is removed, anything else replaces it. Field names match
        `settings` on the draft.

        Flow-controlled fields (white label on, Powered by Flow, allowances) are
        not here and cannot be sent.

        Which version it changes is the request's `If-Match`, never a body
        field.
    BrandingDraftResponseResponseBody:
      type: object
      properties:
        message:
          $ref: '#/components/schemas/MessageWithTokenResponse'
        content:
          $ref: '#/components/schemas/BrandingDraftResponseContentResponse'
        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
    EmailSenderPatch:
      type: object
      properties:
        fromName:
          type: string
          nullable: true
        fromAddress:
          type: string
          description: A full address on one of the account's email domains.
          nullable: true
        replyTo:
          type: string
          nullable: true
      additionalProperties: false
      description: >-
        One email's sender, merged field by field: a value overrides the
        default, `null` (or blank) goes back to the

        default, and a field left out is unchanged.
    MessageWithTokenResponse:
      type: object
      properties:
        text:
          type: string
        token:
          type: string
        tokenArguments:
          type: array
          items:
            $ref: '#/components/schemas/ValidationIssueArgument'
          nullable: true
      additionalProperties: false
    BrandingDraftResponseContentResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/BrandingDraftResponse'
        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
    BrandingDraftResponse:
      type: object
      properties:
        settings:
          $ref: '#/components/schemas/BrandingSettingsResponse'
        previews:
          $ref: '#/components/schemas/BrandingAssetPreviewsResponse'
        entitlement:
          $ref: '#/components/schemas/BrandingEntitlementResponse'
        version:
          type: integer
          description: Send it back unchanged; it detects two people editing at once.
          format: int64
        updatedDate:
          type: string
        updatedBy:
          type: string
        canChange:
          type: boolean
          description: >-
            Whether you can change the brand. One-organisation administrators
            can view only.
      additionalProperties: false
      description: The editable copy. Nothing anyone sees changes until it is published.
    ContentMetadataResponse:
      type: object
      properties:
        dateFormat:
          type: string
        dateTimeFormat:
          type: string
        paginationToken:
          type: string
          nullable: true
      additionalProperties: false
    BrandingSettingsResponse:
      type: object
      properties:
        productName:
          type: string
          description: 2 to 40 characters. Shown in titles, emails and documents.
          nullable: true
        primaryColour:
          type: string
          description: Hex colour, `#RRGGBB`.
          nullable: true
        primaryForegroundColour:
          type: string
          description: >-
            Optional; derived when null. Must reach WCAG AA 4.5:1 on the primary
            colour.
          nullable: true
        accentColour:
          type: string
          nullable: true
        fontSource:
          enum:
            - Curated
            - Uploaded
          type: string
          description: Where the app font comes from.
        fontCuratedKey:
          type: string
          description: >-
            One of FlowPayroll.Administration.Api.Enums.CuratedFontKeys when
            FontSource is `Curated`.
          nullable: true
        fontFamily:
          type: string
          description: Display family name of an uploaded font.
          nullable: true
        fontRegularAssetId:
          type: string
          nullable: true
        fontMediumAssetId:
          type: string
          nullable: true
        fontBoldAssetId:
          type: string
          nullable: true
        fontLicenceConfirmedBy:
          type: string
          description: Who confirmed the account holds a web licence for the uploaded font.
          nullable: true
        fontLicenceConfirmedDate:
          type: string
          nullable: true
        logoAssetId:
          type: string
          description: The account logo (SVG), from `POST /customer/branding/assets`.
          nullable: true
        iconAssetId:
          type: string
          description: The square icon (SVG) the favicon set is derived from.
          nullable: true
        supportEmail:
          type: string
          nullable: true
        supportUrl:
          type: string
          nullable: true
        privacyUrl:
          type: string
          nullable: true
        termsUrl:
          type: string
          nullable: true
        helpLinksFallback:
          enum:
            - Hide
            - FlowGuides
          type: string
          description: What a help link does when the account has no support website.
        emailFromName:
          type: string
          nullable: true
        emailFromAddress:
          type: string
          nullable: true
        emailSenderOverrides:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/EmailSenderResponse'
        emailReplyTo:
          type: string
          nullable: true
        emailFooterText:
          type: string
          nullable: true
        legalFooter:
          type: string
          description: Registered name, number and office. Up to 300 characters.
          nullable: true
        documentsShowLogo:
          type: boolean
        documentsUseBrandColour:
          type: boolean
        appShowsProductName:
          type: boolean
        signInShowsProductName:
          type: boolean
        emailsShowProductName:
          type: boolean
        documentsShowProductName:
          type: boolean
        logoDarkAssetId:
          type: string
          description: The logo on a dark background; the light one is used when null.
          nullable: true
        iconDarkAssetId:
          type: string
          description: The icon on a dark background; the light one is used when null.
          nullable: true
        loadingStyle:
          enum:
            - Spinner
            - Icon
            - Animation
          type: string
          description: What the app shows while it waits.
        loadingAnimationAssetId:
          type: string
          description: The animated SVG for `Animation`.
          nullable: true
        loadingAnimationDarkAssetId:
          type: string
          description: The animation on a dark background; the light one is used when null.
          nullable: true
        emailButtonShape:
          enum:
            - Rounded
            - Square
            - Pill
          type: string
          description: The corners of the buttons in emails.
        emailHeaderStyle:
          enum:
            - Plain
            - BrandBar
          type: string
          description: How the top of each email looks.
      additionalProperties: false
      description: >-
        The fields an account sets for its brand. Flat on purpose: the draft
        PATCH is a JSON Merge Patch of

        exactly this shape, so a field reads and writes under the same name.
    BrandingAssetPreviewsResponse:
      type: object
      properties:
        logoSvgUrl:
          type: string
          nullable: true
        iconSvgUrl:
          type: string
          nullable: true
        logoDarkSvgUrl:
          type: string
          nullable: true
        iconDarkSvgUrl:
          type: string
          nullable: true
        loadingAnimationSvgUrl:
          type: string
          nullable: true
        loadingAnimationDarkSvgUrl:
          type: string
          nullable: true
      additionalProperties: false
      description: >-
        Short-lived links to the draft's own files, for the editor's preview.
        Each is null when its file is not set.
    BrandingEntitlementResponse:
      type: object
      properties:
        whiteLabelEnabled:
          type: boolean
        poweredByFlow:
          type: boolean
        domainAllowance:
          type: integer
          description: How many partner domains the account may have.
          format: int32
        sendingDomainAllowance:
          type: integer
          description: How many sending domains the account may have.
          format: int32
      additionalProperties: false
      description: >-
        What Flow has switched on for the account. Read-only here; Flow
        operators set it.
    EmailSenderResponse:
      type: object
      properties:
        fromName:
          type: string
          nullable: true
        fromAddress:
          type: string
          nullable: true
        replyTo:
          type: string
          nullable: true
      additionalProperties: false
      description: 'One email''s own sender: a null field uses the account''s default.'
  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.