Inbound Messaging Apps message
Inbound Messages are messages sent to you by users, on one of the channels you linked with your 8x8 account. Once this happens, 8x8 sends you this message to your webhook.
Requirementsโ
To use 8x8 inbound Messaging Apps capabilities, you need:
- An account configured to use Messaging Apps product.
- A webhook to indicate to us which URL 8x8 platform should forward the inbound messages addressed to you.
๐
You can configure your callback using Webhook Configuration API
Inbound message flow exampleโ
- A user sends a message to your WhatsApp or Viber number
- 8x8 Platform receives the message on your behalf
- 8x8 Platform programmatically transmits the message to the callback URL configured for your webhook including all the information linked to the message.
Retry logicโ
In case of connection error/timeout or HTTP response code 4XX or 5XX, there will be multiple retry attempts with progressive intervals: 1, 10, 30, 90 sec.
Webhook formatโ
๐
If you are still receiving webhooks in an older format, see the Webhook migration guide for help migrating your configuration.
- v3 (latest)
- v2
Request body description
| Parameter name | Parameter type | Description |
|---|---|---|
| version | integer | New in v3. Version of the webhook payload format. Equals to 3 for this format. |
| namespace | string | A generic namespace for incoming webhook. Equal to ChatApps for inbound Messaging Apps message. |
| eventType | string | Webhook type. Equals to inbound_message_received for inbound Messaging Apps message. |
| description | string | Human-readable description of the incoming event |
| payload | object | Inbound message information, see below. |
Payload object description
| Parameter name | Parameter type | Description |
|---|---|---|
| umid | uuid | Unique message ID for the inbound message |
| subAccountId | string | Id of the sub-account which owns the virtual number. |
| timestamp | string | UTC date and time when the message was received expressed in ISO 8601 format. |
| user | object | Information about the user the message is associated with, see below. |
| recipient | object | Recipient information, see below |
| type | string | Inbound message type. Possible values: - None- Text- Audio- Video- Image- Location- File- Carousel- List- Buttons- Template- Interactive |
| content | object | Message content |
| replyToUmid | uuid | Optional context data, if this inbound message is referring to a previous inbound message (ex, quoted messages on WhatsApp). |
User information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| msisdn | string | Changed in v3. The user phone number expressed in E.164 international format. Left out for channels where users have no phone number (e.g. LINE). |
| channelUserId | string | Changed in v3. The user's id on the channel: the BSUID (business-scoped user id) for WhatsApp, or the Line user id for Line. Only included when the channel provides a real user id. |
| name | string | The WhatsApp user profile name |
| username | string | New in v3. The WhatsApp username |
When a user field has no value, it is simply left out of the JSON.
Common object definitionsโ
Recipient information object description
| Parameter name | Parameter Type | Description |
|---|---|---|
| channel | string | Channel type, please see List of supported Messaging Apps channels for details. |
| channelId | string | Channel user identifier. |
Content information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| text | string | Message text (for payload with type = Text) |
| url | string | The URL of the media attachment (rich content) if any |
| payload | string | Content payload (for interactive messages) |
| location | object | Location object (for payload with type = Location) |
| interactive | object | Interactive object (for payload with type = Interactive) |
Location information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| latitude | decimal | Latitude |
| longitude | decimal | Longitude |
Interactive information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| type | string | Type of the message. Possible values: - button_reply- list_reply- nfmReply- callPermissionReply |
| button_reply | object | Button reply object. Sent when a customer clicks a button. |
| list_reply | object | List reply object. Sent when a customer selects an item from a list. |
| nfmReply | object | Flow reply object. Sent when a customer completes or submits a WhatsApp Flow. Contains flow response data in responseJson. |
| callPermissionReply | object | Call permission reply object. Sent when a customer responds to a call permission request on WhatsApp. Contains the user's permission decision and related metadata. |
Button reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| id | string | Unique ID of a button. |
| title | string | Title of a button. |
List reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| id | string | Unique ID of the selected list item |
| title | string | Title of the selected list item. |
| description | string | Description of the selected row. |
NFM reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| responseJson | string | The raw JSON string returned from the completed Flow, containing the user's submitted data (e.g., flow token, field values). |
Call permission reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| response | string | The user's response to the call permission request. Possible values: - accept - User granted call permission- reject - User denied call permission |
| isPermanent | boolean | Indicates whether the permission is permanent. false for temporary permissions (7 days), true for permanent permissions. |
| expirationTimestamp | string | UTC date and time when the temporary call permission expires, expressed in ISO 8601 format. Only present when isPermanent is false. |
| responseSource | string | The source of the permission. Always user_action - indicates the user explicitly approved or rejected the permission. Note: Automatic permissions (e.g., when a WhatsApp user initiates the call) do not trigger this webhook. |
โ๏ธ
If the request you receive has a different structure from described in this document, please contact our support to activate the latest format for your account.
Sample payloadsโ
Inbound message โ WhatsAppโ
A WhatsApp text message showing all the v3 user fields: the BSUID in channelUserId, the profile name, and the new username.
{
"version": 3,
"namespace": "ChatApps",
"eventType": "inbound_message_received",
"description": "ChatApps inbound message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-06-09T10:13:20.00Z",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>,
"name": <WHATSAPP_USER_PROFILE_NAME>,
"username": <WHATSAPP_USERNAME>
},
"recipient": {
"channel": "whatsapp",
"channelId": <CHANNEL_ID>
},
"type": "Text",
"content": {
"text": "WhatsApp inbound message"
}
}
}
Inbound message โ Viber, msisdn-onlyโ
For msisdn-based channels (Viber, RCS, SMS) the user object contains only msisdn: v3 no longer fabricates a channelUserId from the phone number the way v2 did.
{
"version": 3,
"namespace": "ChatApps",
"eventType": "inbound_message_received",
"description": "ChatApps inbound message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-07-03T01:14:03.00Z",
"user": {
"msisdn": <USER_PHONE_NUMBER>
},
"recipient": {
"channel": "viber",
"channelId": <CHANNEL_ID>
},
"type": "Text",
"content": {
"text": "Viber inbound message"
}
}
}
WhatsApp Flow responseโ
Sent when a customer completes or submits a WhatsApp Flow. The message arrives as an Interactive type with an nfmReply object carrying the user's submitted data in responseJson.
{
"version": 3,
"namespace": "ChatApps",
"eventType": "inbound_message_received",
"description": "ChatApps inbound message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-03-19T22:51:55.00Z",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>
},
"recipient": {
"channel": "whatsapp",
"channelId": <CHANNEL_ID>
},
"type": "Interactive",
"content": {
"interactive": {
"type": "nfmReply",
"nfmReply": {
"responseJson": "{\"flow_token\": \"<FLOW_TOKEN>\", \"optional_param1\": \"<value1>\", \"optional_param2\": \"<value2>\"}"
}
}
}
}
}
Call permission replyโ
Sent when a customer responds to a call permission request on WhatsApp. The message arrives as an Interactive type with a callPermissionReply object containing the user's decision and, for temporary permissions, the expiration time.
{
"version": 3,
"namespace": "ChatApps",
"eventType": "inbound_message_received",
"description": "ChatApps inbound message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-01-22T22:51:55.00Z",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <WHATSAPP_BSUID>
},
"recipient": {
"channel": "whatsapp",
"channelId": <CHANNEL_ID>
},
"type": "Interactive",
"content": {
"interactive": {
"type": "callPermissionReply",
"callPermissionReply": {
"response": "accept",
"isPermanent": false,
"expirationTimestamp": "2026-01-23T06:51:55.00Z",
"responseSource": "user_action"
}
}
}
}
}
Request body description
| Parameter name | Parameter type | Description |
|---|---|---|
| namespace | string | A generic namespace for incoming webhook. Equal to ChatApps for inbound Messaging Apps message. |
| eventType | string | Webhook type. Equals to inbound_message_received for inbound Messaging Apps message. |
| description | string | Human-readable description of the incoming event |
| payload | object | Inbound message information, see below. |
Payload object description
| Parameter name | Parameter type | Description |
|---|---|---|
| umid | uuid | Unique message ID for the inbound message |
| subAccountId | string | Id of the sub-account which owns the virtual number. |
| timestamp | string | UTC date and time when the message was received expressed in ISO 8601 format. |
| user | object | Information about the user the message is associated with. |
| recipient | object | Recipient information, see below |
| type | string | Inbound message type. Possible values: - None- Text- Audio- Video- Image- Location- File- Carousel- List- Buttons- Template- Interactive |
| content | object | Message content |
| replyToUmid | uuid | Optional context data, if this inbound message is referring to a previous inbound message (ex, quoted messages on WhatsApp). |
User information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| msisdn | string | Phone number expressed in E.164 international format. |
| channelUserId | string | Id of the user in the channel. Always the phone number digits (same value as msisdn). |
| name | string | User's name in the channel. For example, username of the WhatsApp user |
Common object definitionsโ
Recipient information object description
| Parameter name | Parameter Type | Description |
|---|---|---|
| channel | string | Channel type, please see List of supported Messaging Apps channels for details. |
| channelId | string | Channel user identifier. |
Content information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| text | string | Message text (for payload with type = Text) |
| url | string | The URL of the media attachment (rich content) if any |
| payload | string | Content payload (for interactive messages) |
| location | object | Location object (for payload with type = Location) |
| interactive | object | Interactive object (for payload with type = Interactive) |
Location information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| latitude | decimal | Latitude |
| longitude | decimal | Longitude |
Interactive information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| type | string | Type of the message. Possible values: - button_reply- list_reply- nfmReply- callPermissionReply |
| button_reply | object | Button reply object. Sent when a customer clicks a button. |
| list_reply | object | List reply object. Sent when a customer selects an item from a list. |
| nfmReply | object | Flow reply object. Sent when a customer completes or submits a WhatsApp Flow. Contains flow response data in responseJson. |
| callPermissionReply | object | Call permission reply object. Sent when a customer responds to a call permission request on WhatsApp. Contains the user's permission decision and related metadata. |
Button reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| id | string | Unique ID of a button. |
| title | string | Title of a button. |
List reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| id | string | Unique ID of the selected list item |
| title | string | Title of the selected list item. |
| description | string | Description of the selected row. |
NFM reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| responseJson | string | The raw JSON string returned from the completed Flow, containing the user's submitted data (e.g., flow token, field values). |
Call permission reply information object description
| Parameter name | Parameter type | Description |
|---|---|---|
| response | string | The user's response to the call permission request. Possible values: - accept - User granted call permission- reject - User denied call permission |
| isPermanent | boolean | Indicates whether the permission is permanent. false for temporary permissions (7 days), true for permanent permissions. |
| expirationTimestamp | string | UTC date and time when the temporary call permission expires, expressed in ISO 8601 format. Only present when isPermanent is false. |
| responseSource | string | The source of the permission. Always user_action - indicates the user explicitly approved or rejected the permission. Note: Automatic permissions (e.g., when a WhatsApp user initiates the call) do not trigger this webhook. |
โ๏ธ
If the request you receive has a different structure from described in this document, please contact our support to activate the latest format for your account.
Sample payloadsโ
Inbound message โ WhatsAppโ
A WhatsApp text message in the v2 format: no version field, and channelUserId repeats the phone number.
{
"namespace": "ChatApps",
"eventType": "inbound_message_received",
"description": "ChatApps inbound message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-01-01T14:34:56.017Z",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <USER_PHONE_NUMBER>
},
"recipient": {
"channel": "whatsapp",
"channelId": <CHANNEL_ID>
},
"type": "Text",
"content": {
"text": "Test message"
},
"replyToUmid": <REPLIED_MESSAGE_UMID>
}
}
WhatsApp Flow responseโ
Sent when a customer completes or submits a WhatsApp Flow. The message arrives as an Interactive type with an nfmReply object carrying the user's submitted data in responseJson.
{
"namespace": "ChatApps",
"eventType": "inbound_message_received",
"description": "ChatApps inbound message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-03-19T22:51:55.00Z",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <USER_PHONE_NUMBER>
},
"recipient": {
"channel": "whatsapp",
"channelId": <CHANNEL_ID>
},
"type": "Interactive",
"content": {
"interactive": {
"type": "nfmReply",
"nfmReply": {
"responseJson": "{\"flow_token\": \"<FLOW_TOKEN>\", \"optional_param1\": \"<value1>\", \"optional_param2\": \"<value2>\"}"
}
}
}
}
}
Call permission replyโ
Sent when a customer responds to a call permission request on WhatsApp. The message arrives as an Interactive type with a callPermissionReply object containing the user's decision and, for temporary permissions, the expiration time.
{
"namespace": "ChatApps",
"eventType": "inbound_message_received",
"description": "ChatApps inbound message",
"payload": {
"umid": <UNIQUE_MESSAGE_ID>,
"subAccountId": <SUBACCOUNT_ID>,
"timestamp": "2026-01-22T22:51:55.00Z",
"user": {
"msisdn": <USER_PHONE_NUMBER>,
"channelUserId": <USER_PHONE_NUMBER>
},
"recipient": {
"channel": "whatsapp",
"channelId": <CHANNEL_ID>
},
"type": "Interactive",
"content": {
"interactive": {
"type": "callPermissionReply",
"callPermissionReply": {
"response": "accept",
"isPermanent": false,
"expirationTimestamp": "2026-01-23T06:51:55.00Z",
"responseSource": "user_action"
}
}
}
}
}