Skip to content

Business-scoped user IDs (BSUID)

WhatsApp will gradually roll out usernames in 2026. To support them, Meta introduced a backend user identifier called Business-scoped user ID (BSUID), which uniquely identifies a WhatsApp user and is tied to a specific business. This document describes how these changes affect API requests, responses and webhook payloads.

The ISV channel supports the identifiers and capabilities introduced by the WhatsApp Business Platform for 2026: BSUID, Parent BSUID, usernames, Contact Book, contact requests and new webhook fields, without breaking compatibility with integrations that still use phone numbers.

Official Meta reference: Business-scoped user IDs.

Quick summary

AreaChange
Identifiersuser_id as BSUID, parent_user_id as Parent BSUID and username are supported.
Message sending/messages and /marketing_messages accept recipient for BSUID or Parent BSUID.
CompatibilityThe to field is preserved. If both to and recipient are sent, the phone number in to takes priority.
Templates and interactiveInteractive messages and templates with REQUEST_CONTACT_INFO are supported.
CallsFields such as to_user_id, to_parent_user_id, from_user_id and from_parent_user_id are preserved.
WebhooksNew fields received from Meta are exposed, even when no phone number is present.
Business UsernameEndpoints to query, adopt/change and delete the business username were added.
Contact BookAn endpoint to delete contacts by BSUID was added.

Supported identifiers

FieldDescription
toUser phone number. Preserved for compatibility.
recipientBSUID or Parent BSUID used as destination in outbound messages.
user_idBusiness Scoped User ID (BSUID) of the user.
parent_user_idParent BSUID of the user when the client is enrolled.
usernameUsername of the user or business, depending on the payload context.
from_user_idBSUID of the sender in inbound messages/webhooks.
from_parent_user_idParent BSUID of the sender in inbound messages/webhooks.
recipient_user_idBSUID of the destination in status webhooks.
recipient_parent_user_idParent BSUID of the destination in status webhooks.

BSUID format

BSUIDs are generated automatically, prefixed with the user’s ISO 3166 alpha-2 country code and a period, followed by up to 128 alphanumeric characters. For example: US.13491208655302741918.

Parent BSUIDs follow the same format but include ENT between the country code and the identifier. For example: US.ENT.11815799212886844830.

Sending messages with recipient

The existing message endpoints preserve the previous contract and add BSUID/Parent BSUID support through recipient.

EndpointChange
POST /{v}/{did}/messagesAllows sending messages using to, recipient or both.
POST /{v}/{did}/marketing_messagesAllows sending marketing messages using recipient.

Message using BSUID

Request

POST /{v}/{did}/messages

curl --request POST \
  --url 'https://channels.chattigo.com/bsp-cloud-chattigo-isv/v21.0/{did}/messages' \
  --header 'Authorization: <JWT>' \
  --header 'Content-Type: application/json' \
  --data '{
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "recipient": "CL.13491208655302741918",
    "type": "text",
    "text": {
      "body": "Hello, this message is sent using BSUID."
    }
  }'

Message using phone number and BSUID

When both fields are provided, to keeps priority to preserve historical behavior.

Request

curl --request POST \
  --url 'https://channels.chattigo.com/bsp-cloud-chattigo-isv/v21.0/{did}/messages' \
  --header 'Authorization: <JWT>' \
  --header 'Content-Type: application/json' \
  --data '{
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "+56912345678",
    "recipient": "CL.13491208655302741918",
    "type": "text",
    "text": {
      "body": "Hello, this message keeps compatibility with to."
    }
  }'

Interactive message to request contact information

Request

POST /{v}/{did}/messages

curl --request POST \
  --url 'https://channels.chattigo.com/bsp-cloud-chattigo-isv/v21.0/{did}/messages' \
  --header 'Authorization: <JWT>' \
  --header 'Content-Type: application/json' \
  --data '{
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "recipient": "US.13491208655302741918",
    "type": "interactive",
    "interactive": {
      "type": "request_contact_info",
      "body": {
        "text": "Share your number to continue."
      },
      "action": {
        "name": "request_contact_info"
      }
    }
  }'

Templates with REQUEST_CONTACT_INFO

The templates endpoint allows creating templates that request contact information from the user through a REQUEST_CONTACT_INFO button (available in utility and marketing categories).

EndpointChange
POST /message_templates/{v}/{did}Allows REQUEST_CONTACT_INFO button types.

Request

curl --request POST \
  --url 'https://channels.chattigo.com/bsp-cloud-chattigo-isv/message_templates/v21.0/{did}' \
  --header 'Authorization: <JWT>' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "request_contact_info_template",
    "language": "en_US",
    "category": "UTILITY",
    "components": [
      {
        "type": "BODY",
        "text": "Share your phone number to continue."
      },
      {
        "type": "BUTTONS",
        "buttons": [
          {
            "type": "REQUEST_CONTACT_INFO"
          }
        ]
      }
    ]
  }'
REQUEST_CONTACT_INFO buttons cannot be customized: the label is rendered automatically in the recipient’s language, so no parameters need to be sent when sending the template.

Business Username and Contact Book endpoints

These endpoints are exposed under /business_identifiers/{version}/{did}. They require the same authentication and channel validation as protected ISV endpoints.

OperationEndpointDescription
Get usernameGET /business_identifiers/{v}/{did}/usernameQueries the username associated with the business number.
Adopt or change usernamePOST /business_identifiers/{v}/{did}/usernameSends the payload required by Meta to adopt or change the username.
Delete usernameDELETE /business_identifiers/{v}/{did}/usernameDeletes the username associated with the business number.
Username suggestionsGET /business_identifiers/{v}/{did}/username_suggestionsGets available username suggestions.
Parent BSUID AccountsGET /business_identifiers/{v}/{did}/parent-bsuid-accounts?business_id={business_id}Queries the Parent BSUID accounts associated with the business.
Delete Contact BookDELETE /business_identifiers/{v}/{did}/contact_book?bsuid={BSUID}Deletes a contact from the book using its BSUID.

Adopt or change username

Request

POST /business_identifiers/{v}/{did}/username

curl --request POST \
  --url 'https://channels.chattigo.com/bsp-cloud-chattigo-isv/business_identifiers/v21.0/{did}/username' \
  --header 'Authorization: <JWT>' \
  --header 'Content-Type: application/json' \
  --data '{
    "username": "my.business"
  }'

Response

Success (200)

{
  "status": "approved"
}

status can be approved (approved and visible) or reserved (reserved, not yet visible until the feature is available).

Username errors

CodeDescription
147001Username not available (already claimed or fails internal checks).
147002Account not eligible to request a username (requires a higher messaging limit).
147003Facebook account not linked to the number.
147004Instagram account not linked to the number.
147005Username transfer required (in use by another number in the same portfolio).

Delete contact by BSUID

Request

DELETE /business_identifiers/{v}/{did}/contact_book?bsuid={BSUID}

curl --request DELETE \
  --url 'https://channels.chattigo.com/bsp-cloud-chattigo-isv/business_identifiers/v21.0/{did}/contact_book?bsuid=US.13491208655302741918' \
  --header 'Authorization: <JWT>'

Response

Success (200)

{
  "messaging_product": "whatsapp",
  "success": true,
  "deleted": true
}
  • successtrue if the request was processed successfully.
  • deletedtrue if the entry existed and was deleted; false if no entry was found for that BSUID.

New fields in webhooks

Webhooks preserve the new fields sent by Meta. This allows receiving events even when the phone number is not present in the payload.

WebhookRelevant fields
messagesuser_id, parent_user_id, username, from_user_id, from_parent_user_id.
statusesrecipient_user_id, recipient_parent_user_id, username.
contactsorigin, vcard, from_user_id, from_parent_user_id.
systemNumber changes that may imply a BSUID change.
business_username_updatesBusiness username status changes.
user_preferencesUser preferences, including BSUID/Parent BSUID identifiers when Meta reports them.

Example of a message received with BSUID

{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "102290129340398",
      "changes": [
        {
          "field": "messages",
          "value": {
            "messaging_product": "whatsapp",
            "metadata": {
              "phone_number_id": "106540352242922"
            },
            "contacts": [
              {
                "profile": {
                  "name": "Sheena Nelson",
                  "username": "realsheenanelson"
                },
                "user_id": "US.13491208655302741918",
                "parent_user_id": "US.ENT.11815799212886844830"
              }
            ],
            "messages": [
              {
                "from_user_id": "US.13491208655302741918",
                "from_parent_user_id": "US.ENT.11815799212886844830",
                "id": "wamid.HBgLMTY1MDM4Nzk0MzkVAgASGBQzQTRBNjU5OUFFRTAzODEwMTQ0RgA=",
                "timestamp": "1749416383",
                "type": "text",
                "text": {
                  "body": "Does it come in another color?"
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

Example of a business username update

{
  "object": "whatsapp_business_account",
  "entry": [
    {
      "id": "102290129340398",
      "changes": [
        {
          "field": "business_username_updates",
          "value": {
            "display_phone_number": "15550783881",
            "username": "mybusiness",
            "status": "approved"
          }
        }
      ]
    }
  ]
}

Calls

The call endpoints preserve the new user fields when Meta requires or delivers them in the payload. See Official API (CALLING) for details.

EndpointRelevant fields
POST /calls/{v}/{did}/signalingto_user_id, to_parent_user_id, from_user_id, from_parent_user_id.
GET /calls/{v}/{did}/call_permissionsAllows querying by user_wa_id and also preserving user_id when sent as a query param.

New or relevant errors

CodeMessageWhen it occurs
131062BSUID recipients are not supported for this messageMeta rejects a message sent with BSUID for a message type that does not support it.
147001 to 147005Username API errorsMeta rejects username operations due to format, availability, eligibility or business rules.

Groups API and Block Users API

The ISV also supports Meta’s Groups and Block Users APIs (groups, join requests, participants, and blocking/unblocking users). See Meta’s documentation for the behavior of these capabilities.

Compatibility

The microservice keeps compatibility with existing integrations because payloads are preserved towards Meta and towards the webhooks configured by the ISV. Integrations that still operate with phone numbers can continue using to; integrations that adopt BSUID or Parent BSUID can use recipient and the new webhook fields.