Saltar al contenido

Business-scoped user IDs (BSUID)

WhatsApp comenzará a adoptar usernames gradualmente en 2026. Para soportarlos, Meta introdujo un identificador de usuario de backend llamado Business-scoped user ID (BSUID), que identifica de forma única a un usuario de WhatsApp y está ligado a un negocio específico. Este documento describe cómo estos cambios afectan las requests, responses y webhooks de la API.

El canal ISV soporta los identificadores y capacidades introducidas por WhatsApp Business Platform para 2026: BSUID, Parent BSUID, usernames, Contact Book, solicitudes de contacto y nuevos campos de webhooks, sin romper la compatibilidad con integraciones que siguen usando número telefónico.

Referencia oficial de Meta: Business-scoped user IDs.

Resumen rápido

ÁreaCambio
IdentificadoresSe soportan user_id como BSUID, parent_user_id como Parent BSUID y username.
Envío de mensajes/messages y /marketing_messages aceptan recipient para BSUID o Parent BSUID.
CompatibilidadEl campo to se mantiene. Si se envían to y recipient, el número telefónico en to tiene prioridad.
Plantillas e interactivosSe soportan mensajes interactivos y plantillas con REQUEST_CONTACT_INFO.
LlamadasSe preservan campos como to_user_id, to_parent_user_id, from_user_id y from_parent_user_id.
WebhooksSe exponen los nuevos campos recibidos desde Meta, incluso cuando no viene número telefónico.
Business UsernameSe agregan endpoints para consultar, adoptar/cambiar y eliminar el username de empresa.
Contact BookSe agrega endpoint para eliminar contactos por BSUID.

Identificadores soportados

CampoDescripción
toNúmero telefónico del usuario. Se mantiene por compatibilidad.
recipientBSUID o Parent BSUID usado como destinatario en mensajes salientes.
user_idBusiness Scoped User ID (BSUID) del usuario.
parent_user_idParent BSUID del usuario cuando el cliente está enrolado.
usernameUsername del usuario o de la empresa, según el contexto del payload.
from_user_idBSUID del emisor en mensajes/webhooks entrantes.
from_parent_user_idParent BSUID del emisor en mensajes/webhooks entrantes.
recipient_user_idBSUID del destinatario en webhooks de estado.
recipient_parent_user_idParent BSUID del destinatario en webhooks de estado.

Formato del BSUID

Los BSUIDs se generan automáticamente, están prefijados con el código de país ISO 3166 alpha-2 del usuario y un punto, seguidos de hasta 128 caracteres alfanuméricos. Por ejemplo: US.13491208655302741918.

Los Parent BSUIDs siguen el mismo formato pero incluyen ENT entre el código de país y el identificador. Por ejemplo: US.ENT.11815799212886844830.

Envío de mensajes con recipient

Los endpoints existentes de mensajes preservan el contrato anterior y agregan soporte para BSUID/Parent BSUID mediante recipient.

EndpointCambio
POST /{v}/{did}/messagesPermite enviar mensajes usando to, recipient o ambos.
POST /{v}/{did}/marketing_messagesPermite enviar mensajes de marketing usando recipient.

Mensaje usando 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": "Hola, este mensaje se envía usando BSUID."
    }
  }'

Mensaje usando número telefónico y BSUID

Cuando se informan ambos campos, to mantiene prioridad para preservar el comportamiento histórico.

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": "Hola, este mensaje mantiene compatibilidad con to."
    }
  }'

Mensaje interactivo para solicitar información de contacto

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": "Comparte tu número para continuar."
      },
      "action": {
        "name": "request_contact_info"
      }
    }
  }'

Plantillas con REQUEST_CONTACT_INFO

El endpoint de plantillas permite crear plantillas que solicitan información de contacto al usuario mediante un botón REQUEST_CONTACT_INFO (disponible en categorías utility y marketing).

EndpointCambio
POST /message_templates/{v}/{did}Permite botones de tipo REQUEST_CONTACT_INFO.

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"
          }
        ]
      }
    ]
  }'
Los botones REQUEST_CONTACT_INFO no son personalizables: el label se renderiza automáticamente en el idioma del destinatario, por lo que no es necesario enviar parámetros al enviar la plantilla.

Endpoints de Business Username y Contact Book

Estos endpoints se exponen bajo /business_identifiers/{version}/{did}. Requieren la misma autenticación y validación de canal que los endpoints ISV protegidos.

OperaciónEndpointDescripción
Obtener usernameGET /business_identifiers/{v}/{did}/usernameConsulta el username asociado al número de negocio.
Adoptar o cambiar usernamePOST /business_identifiers/{v}/{did}/usernameEnvía el payload requerido por Meta para adoptar o cambiar el username.
Eliminar usernameDELETE /business_identifiers/{v}/{did}/usernameElimina el username asociado al número de negocio.
Sugerencias de usernameGET /business_identifiers/{v}/{did}/username_suggestionsObtiene sugerencias de username disponibles.
Parent BSUID AccountsGET /business_identifiers/{v}/{did}/parent-bsuid-accounts?business_id={business_id}Consulta las cuentas Parent BSUID asociadas al negocio.
Eliminar Contact BookDELETE /business_identifiers/{v}/{did}/contact_book?bsuid={BSUID}Elimina un contacto de la libreta usando su BSUID.

Adoptar o cambiar 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": "mi.negocio"
  }'

Response

Success (200)

{
  "status": "approved"
}

status puede ser approved (aprobado y visible) o reserved (reservado, aún no visible hasta que la feature esté disponible).

Errores de username

CódigoDescripción
147001Username no disponible (ya reclamado o no pasa los checks internos).
147002La cuenta no es elegible para solicitar un username (requiere un messaging limit mayor).
147003Cuenta de Facebook no vinculada al número.
147004Cuenta de Instagram no vinculada al número.
147005Se requiere transferencia de username (en uso por otro número del mismo portfolio).

Eliminar contacto por 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 si el request se procesó correctamente.
  • deletedtrue si la entrada existía y fue eliminada; false si no se encontró ninguna entrada para ese BSUID.

Campos nuevos en webhooks

Los webhooks preservan los campos nuevos que envía Meta. Esto permite recibir eventos aunque el número telefónico no venga informado en el payload.

WebhookCampos relevantes
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.
systemCambios de número que pueden implicar cambio de BSUID.
business_username_updatesCambios de estado del username de empresa.
user_preferencesPreferencias del usuario, incluyendo identificadores BSUID/Parent BSUID cuando Meta los informa.

Webhook de estado (statuses)

Los webhooks de estado de mensaje (sent, delivered, read, failed) incluyen los identificadores del destinatario:

CampoDescripción
contacts[].user_idBSUID del usuario (siempre presente).
contacts[].parent_user_idParent BSUID, si está habilitado.
contacts[].usernameUsername, si el usuario lo adoptó (en delivered/read).
statuses[].recipient_user_idBSUID del destinatario.
statuses[].recipient_parent_user_idParent BSUID del destinatario, si está habilitado.
El campo recipient_user_id se omite en webhooks failed cuando el mensaje se envió al número telefónico. El bloque contacts se omite completamente en los failed.

Webhook de contactos (contacts)

Cuando un usuario comparte su información de contacto (tocando un botón REQUEST_CONTACT_INFO o compartiendo un contacto directo en el chat), se dispara un webhook de contacto con los campos nuevos:

CampoDescripción
from_user_idBSUID del usuario.
originCómo se compartió la información: contact_request (botón REQUEST_CONTACT_INFO) u other (contacto directo).
vcardTarjeta de contacto virtual en formato vCard. Solo si origin es other.

Webhook de sistema (system)

Los webhooks de sistema notifican cuando un usuario cambia su número de teléfono, lo que regenera su BSUID:

CampoDescripción
system.user_idNuevo BSUID del usuario.
system.parent_user_idNuevo parent BSUID, si está habilitado.
system.wa_idNuevo número de teléfono, si está disponible.
system.bodyDescripción del cambio (User <nombre> changed from <OLD_BSUID> to <NEW_BSUID>).
system.typeuser_changed_user_id cuando el usuario cambió su número.
El ISV reenvía los eventos system sin mutar registros locales: la actualización de registros BSUID es responsabilidad del consumidor del webhook.

Ejemplo de mensaje recibido con 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?"
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

Ejemplo de actualización de username de empresa

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

Llamadas

Los endpoints de llamadas preservan los campos de usuario nuevos cuando Meta los requiere o los entrega en el payload. Consulta API Oficial (CALLING) para el detalle.

EndpointCampos relevantes
POST /calls/{v}/{did}/signalingto_user_id, to_parent_user_id, from_user_id, from_parent_user_id.
GET /calls/{v}/{did}/call_permissionsPermite consultar por user_wa_id y también preservar user_id cuando se envía como query param.

Errores nuevos o relevantes

CódigoMensajeCuándo ocurre
131062BSUID recipients are not supported for this messageMeta rechaza un mensaje enviado con BSUID para un tipo de mensaje que no lo soporta.
147001 a 147005Errores de Username APIMeta rechaza operaciones de username por formato, disponibilidad, elegibilidad o reglas de negocio.

Groups API y Block Users API

El ISV también da soporte a las APIs de Groups y Block Users de Meta (grupos, solicitudes de unión, participantes y bloqueo/desbloqueo de usuarios). Consulta la documentación de Meta para conocer el comportamiento de estas capacidades.

Compatibilidad

El microservicio mantiene compatibilidad con integraciones existentes porque los payloads se preservan hacia Meta y hacia los webhooks configurados por el ISV. Las integraciones que todavía operan con número telefónico pueden seguir usando to; las integraciones que adopten BSUID o Parent BSUID pueden usar recipient y los nuevos campos de webhooks.