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

# Update Business Profile

> Updates the WhatsApp business profile. **Partial semantics** — only the fields you send are changed; everything else is preserved as it is on Meta. The change is written straight to Meta, with no caching.

## Changing the profile picture

The picture is the one field that is not sent inline. It is a two-step flow:

1. Upload the image with `POST /wa/{app_id}/media/upload` (`image/jpeg` or `image/png`, up to 5 MB) and keep the returned `handle`.
2. Send that handle as `profilePictureReference` on this call.

The handle is **single-use** — Meta consumes it the moment the update succeeds, and replaying the same value fails with `META_033`. To change the picture again, upload the file again for a fresh handle.

`profilePictureReference` is write-only: it never appears in a response. Reads return the resulting image as `profilePictureUrl`.

## Response shape

With `Prefer: return=representation` (default) the full profile is re-fetched from Meta and returned. With `return=minimal` the `data` key is omitted entirely — the response is exactly `{ "isSuccess": true }`, still HTTP `200`. The applied preference is reported in `Preference-Applied`.



## OpenAPI

````yaml /public-openapi.json patch /wa/{app_id}/profile
openapi: 3.0.3
info:
  title: Connexease Public API
  version: 1.0.0
  description: >-
    Panel-independent API for managing WhatsApp Business operations from your
    own servers.


    Every endpoint is scoped to the organization resolved from your secret key.
    Read endpoints are uncached and proxy straight to the source.


    **On-premises installations** are served from your own domain with an extra
    `/public` segment: `https://{your_domain}/public/api/v1/...`.
    Authentication, bodies, responses, and error codes are identical.
servers:
  - url: https://public-api.gateway.connexease.com/api/v1
    description: Production
security:
  - secretKey: []
tags:
  - name: Analytics
    description: Organization-wide message volume.
  - name: Application
    description: The WhatsApp business profile linked to an application.
  - name: Template
    description: >-
      The full template lifecycle: create, list, inspect, update, delete, and
      measure.
  - name: Media
    description: >-
      Uploads that produce the single-use handle for template headers and the
      profile picture.
  - name: Developers
    description: Webhook configuration and API keys.
paths:
  /wa/{app_id}/profile:
    patch:
      tags:
        - Application
      summary: Update Business Profile
      description: >-
        Updates the WhatsApp business profile. **Partial semantics** — only the
        fields you send are changed; everything else is preserved as it is on
        Meta. The change is written straight to Meta, with no caching.


        ## Changing the profile picture


        The picture is the one field that is not sent inline. It is a two-step
        flow:


        1. Upload the image with `POST /wa/{app_id}/media/upload` (`image/jpeg`
        or `image/png`, up to 5 MB) and keep the returned `handle`.

        2. Send that handle as `profilePictureReference` on this call.


        The handle is **single-use** — Meta consumes it the moment the update
        succeeds, and replaying the same value fails with `META_033`. To change
        the picture again, upload the file again for a fresh handle.


        `profilePictureReference` is write-only: it never appears in a response.
        Reads return the resulting image as `profilePictureUrl`.


        ## Response shape


        With `Prefer: return=representation` (default) the full profile is
        re-fetched from Meta and returned. With `return=minimal` the `data` key
        is omitted entirely — the response is exactly `{ "isSuccess": true }`,
        still HTTP `200`. The applied preference is reported in
        `Preference-Applied`.
      operationId: updateBusinessProfile
      parameters:
        - $ref: '#/components/parameters/AppId'
        - $ref: '#/components/parameters/PreferHeader'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: >-
                All fields optional. Fields you do not send remain as they are
                on Meta.
              properties:
                about:
                  type: string
                  maxLength: 139
                  description: '"About" text.'
                address:
                  type: string
                  maxLength: 256
                  description: Business address.
                description:
                  type: string
                  maxLength: 512
                  description: Business description.
                email:
                  type: string
                  format: email
                  description: Contact email.
                profilePictureReference:
                  type: string
                  writeOnly: true
                  description: >-
                    Single-use media handle from Upload Media — not a URL and
                    not raw bytes. Consumed by a successful update.
                category:
                  $ref: '#/components/schemas/BusinessProfileCategory'
                websites:
                  type: array
                  maxItems: 2
                  items:
                    type: string
                    format: uri
                  description: >-
                    Business websites, `http(s)://`. More than two returns `422`
                    with `WA_VAL_001` without reaching Meta.
            example:
              about: Open 09:00-18:00
              email: hello@acme.com
              websites:
                - https://acme.com
      responses:
        '200':
          description: >-
            The updated profile, or `{ "isSuccess": true }` alone when `Prefer:
            return=minimal` was sent.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/BusinessProfile'
                  isSuccess:
                    type: boolean
                    enum:
                      - true
        '400':
          description: >-
            Meta rejected a parameter (`META_033`) — including a
            `profilePictureReference` handle that is expired, already consumed,
            or was not produced by Upload Media.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '401':
          description: >-
            Secret key missing or invalid (`ORGANIZATION_SECRET_010` / `011`),
            or Meta access token invalid or expired (`META_030`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '403':
          description: Meta permission denied (`META_031`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '404':
          $ref: '#/components/responses/AppNotFound'
        '422':
          description: >-
            More than two `websites` (`WA_VAL_001`), or field validation:
            `about` over 139, `address` over 256, `description` over 512,
            invalid email or URL, invalid `category` value.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                errors:
                  code: WA_VAL_001
                  group: VALIDATION
                  description: Maximum 2 websites allowed.
                isSuccess: false
        '429':
          description: Meta rate limit (`META_032`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
        '502':
          description: Meta did not confirm the update (`META_002`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
components:
  parameters:
    AppId:
      name: app_id
      in: path
      required: true
      description: >-
        Application ID. Must belong to the organization resolved from your
        secret key, otherwise the request returns `404` with `APPLICATION_004`.
      schema:
        type: string
        example: app_7poyXj8GXuv76e
    PreferHeader:
      name: Prefer
      in: header
      required: false
      description: >-
        `return=representation` (default) returns the current record;
        `return=minimal` returns no body. The response echoes the choice in
        `Preference-Applied`.
      schema:
        type: string
        enum:
          - return=representation
          - return=minimal
        default: return=representation
  schemas:
    BusinessProfileCategory:
      type: string
      description: Business category. On Meta's side this is the `vertical` field.
      enum:
        - UNDEFINED
        - OTHER
        - ALCOHOL
        - AUTO
        - BEAUTY
        - APPAREL
        - EDU
        - ENTERTAIN
        - EVENT_PLAN
        - FINANCE
        - GROCERY
        - GOVT
        - HOTEL
        - HEALTH
        - NONPROFIT
        - ONLINE_GAMBLING
        - OTC_DRUGS
        - PHYSICAL_GAMBLING
        - PROF_SERVICES
        - RETAIL
        - TRAVEL
        - RESTAURANT
        - NOT_A_BIZ
    BusinessProfile:
      type: object
      description: >-
        Every field is optional. Fields not set on the profile are dropped from
        the response.
      properties:
        about:
          type: string
          maxLength: 139
        address:
          type: string
        description:
          type: string
        email:
          type: string
          format: email
        profilePictureUrl:
          type: string
          format: uri
          readOnly: true
          description: >-
            Read-only. Set the picture through `profilePictureReference` on the
            update call.
        websites:
          type: array
          maxItems: 2
          items:
            type: string
            format: uri
        category:
          $ref: '#/components/schemas/BusinessProfileCategory'
    ErrorEnvelope:
      type: object
      description: >-
        Every failure shares this shape. `description` already has any `params`
        interpolated into it.
      properties:
        isSuccess:
          type: boolean
          enum:
            - false
        errors:
          type: object
          properties:
            code:
              type: string
              description: >-
                `VAL_*`, `WA_*`, `META_*`, `APPLICATION_*`,
                `ORGANIZATION_SECRET_*`, `REQ_001`, or `SYS_001`.
              example: META_075
            group:
              type: string
              enum:
                - VALIDATION
                - NOT_FOUND
                - CONFLICT
                - AUTHENTICATION
                - NOT_ALLOWED
                - LIMIT_EXCEEDED
                - SERVICE_UNAVAILABLE
                - SYSTEM
            description:
              type: string
              example: Template with 0000000000 not found in Meta.
            params:
              type: object
              additionalProperties: true
              description: >-
                Raw values interpolated into `description`. Present only on
                parametric messages.
            fields:
              type: object
              description: >-
                Field-level validation errors only. Field name (dot-joined for
                nested fields, list indices omitted) to its own `code` /
                `description` / `params`.
              additionalProperties:
                type: object
                properties:
                  code:
                    type: string
                  description:
                    type: string
                  params:
                    type: object
                    additionalProperties: true
          required:
            - code
            - group
            - description
      required:
        - isSuccess
        - errors
  responses:
    AppNotFound:
      description: '`app_id` does not belong to the organization (`APPLICATION_004`).'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    secretKey:
      type: http
      scheme: bearer
      description: >-
        Secret key in `Bearer sk_...` format. Server-to-server only — never
        embed it in a browser or mobile client. The organization is resolved
        from the key, so `organization_id` is never passed explicitly.

````