Insider One processes the messages you have sent by queuing them and prioritizing them according to the number of messages that can be sent per second. Therefore, when you send the message to Insider One, you will get a return with a tracking key. This tracking key will be included in all webhook events of the message you sent.
To define your webhook address and token, refer to the Save Webhook URL step.
Your queued messages are processed and forwarded to WhatsApp. If your message is successfully accepted by WhatsApp, a message like the one below will be sent to your webhook address:
Parameter | Description | Data Type | Required |
|---|---|---|---|
messaging_product | String | Yes | |
contacts | Contact information | Array | Yes |
input | User's phone number | String | Yes |
wa_id | The customer's WhatsApp ID. A business can respond to a message using this ID. | String | Yes |
messages | Array | Yes | |
id | The ID for the message that was received by the business. You could use messages endpoint to mark this specific message as read. | String | Yes |
Key | Message tracking key, created by Insider One. | String | Yes |
{
"messaging_product": "whatsapp",
"contacts": [
{
"input": "{{USER_PHONE_NUMBER}}",
"wa_id": "{{WHATSAPP_ID}}"
}
],
"messages": [
{
"id": "{{MESSAGE_ID}}"
}
],
"key": "whatsapp-***********"
}If any error is received from WhatsApp related to your message, a message like the one below will be sent to your webhook by Insider One.
Parameter | Description | Data Type | Required |
|---|---|---|---|
error | The object that contains information about the error | Object | Yes |
message | Error code message, such as Rate limit hit. Note that the message property in API error response payloads pre-pends this value with a # symbol and the error code in parentheses, such as (#130429) Rate limit hit | String | Yes |
type | Error type | String | Yes |
code | Error code | Integer | Yes |
fbtrace_id | Trace ID you can include when contacting Direct Support. The ID might be useful to debug the error | String | Yes |
Key | Message tracking key, created by Insider One | String | Yes |
{
"error": {
"message": "{{ERROR_MESSAGE}}",
"type": "{{ERROR_TYPE}}",
"code": {{ERROR_CODE}},
"fbtrace_id": "{{FBTRACE_ID}}"
},
"key": "whatsapp-***********"
}Sample Error Codes
When you send WhatsApp messages via Insider One, any errors returned from WhatsApp (Cloud API or On-Premise) are forwarded to your webhook. Below are sample error responses you may encounter, grouped by category.
Important Note on
error_dataThe
error_datafield is optional. Meta may include it for some errors to provide additional context (for example, message throughput details) and omit it for others. Always rely on thecodeandmessagefields as the primary source of information, and treaterror_dataas supplementary metadata when available.Below you can see a sample error response with the
error_datafield included:{ "error": { "message": "(#130429) Rate limit hit", "type": "OAuthException", "code": 130429, "error_data": { "messaging_product": "whatsapp", "details": "Cloud API message throughput reached." } } }
Cloud API Error Codes
The following are sample error responses you might receive when using the WhatsApp Cloud API via Insider One.
Authorization Errors
{
"error": {
"message": "We were unable to authenticate the app user",
"type": "OAuthException",
"code": 0
}
}
{
"error": {
"message": "Your access token has expired",
"type": "OAuthException",
"code": 190
}
}
Rate Limiting Errors
{
"error": {
"message": "(#130429) Rate limit hit",
"type": "OAuthException",
"code": 130429,
"error_data": {
"messaging_product": "whatsapp",
"details": "Cloud API message throughput reached."
}
}
}
{
"error": {
"message": "Spam rate limit hit",
"code": 131048,
"error_data": {
"messaging_product": "whatsapp",
"details": "Too many messages sent from this phone number in a short period of time."
}
}
}
Account and Permission Errors
{
"error": {
"message": "Access denied",
"code": 131005
}
}
{
"error": {
"message": "Account has been blocked for policy violations",
"code": 368
}
}
On-Premise API Error Codes
The following are sample error responses you might receive when using the WhatsApp On-Premise API via Insider One.
Client Errors (400-499)
{
"errors": [{
"code": 402,
"title": "Business eligibility issue",
"details": "Payment issue preventing message delivery"
}]
}
{
"errors": [{
"code": 408,
"title": "Message not valid",
"details": "Message has been pending validation too long"
}]
}
{
"errors": [{
"code": 429,
"title": "Rate limit exceeded",
"details": "Too many requests in a given amount of time"
}]
}
Template Errors
{
"errors": [{
"code": 2000,
"title": "Template parameter mismatch",
"details": "Number of parameters provided does not match expected parameter count"
}]
}
{
"errors": [{
"code": 2060,
"title": "Template rejected",
"details": "Template has been rejected and cannot be used"
}]
}
Server Error (500)
{
"errors": [{
"code": 500,
"title": "Internal server error",
"details": "Temporary server issue, please retry"
}]
}
Refer to Failed Event for the webhook payload structure where these errors are returned.
Refer to Meta’s Error Codes guide for further information.
Save Webhook URL
You can define your webhook address and token.
Headers
Header | Sample Value | Description |
|---|---|---|
X-INS-AUTH-KEY | 1a2b3c4d5e6f | This key is required to authorize your request. Refer to API Authentication Tokens to generate your token. |
Content-Type | application/json | This header specifies the media type of the resource. |
The Body Parameters
Parameter | Description | Data Type | Required |
|---|---|---|---|
isActive | Option to turn on transactional message sending. | Boolean | Yes |
url | Your webhook url | String | Yes |
apiKey | Your webhook Bearer token | String | Yes |
Example Request
curl --location 'https://whatsapp.useinsider.com/v1/settings/update' \
--header 'Content-Type: application/json' \
--header 'x-ins-auth-key: INS.1a2b3c4d5e6f' \
--data '{
"isActive": true,
"webhookUrl": "{{YOUR_WEBHOOK_URL}}",
"apiKey": "{{YOUR_WEBHOOK_BEARER_TOKEN_KEY}}"
}'Sent/Read/Delivered Events
Parameter | Description | Data Type | Required |
|---|---|---|---|
entry[0].changes[0].value.metadata.display_phone_number | The phone number that is displayed for a business | String | Yes |
entry[0].changes[0].value.metadata.display_phone_number_id | ID for the phone number. A business can respond to a message using this ID | String | Yes |
entry[0].changes[0].value.statuses[0].id | The ID for the message that was received by the business. You could use messages endpoint to mark this specific message as read. | String | Yes |
entry[0].changes[0].value.statuses[0].recipient_id | The WhatsApp ID for the customer of the business, which is subscribed to the webhooks, sent to the customer. | String | Yes |
entry[0].changes[0].value.statuses[0].status | read/sent/delivered | String | Yes |
key | Message tracking key, created by Insider One | String | Yes |
{
"entry": [
{
"changes": [
{
"field": "messages",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{SENDER_PHONE_NUMBER}}",
"phone_number_id": "{{SENDER_PHONE_NUMBER_ID}}"
},
"statuses": [
{
"id": "{{MESSAGE_ID}}",
"recipient_id": "{{PHONE_NUMBER}}",
"status": "{{STATUS}}",
"timestamp": "1111111111"
}
]
}
}
],
"id": "111111111"
},
],
"key": "whatsapp-***********",
"object": "whatsapp_business_account"
}Failed Event
Parameter | Description | Data Type | Required |
|---|---|---|---|
entry[0].changes[0].value.metadata.display_phone_number | The phone number that is displayed for a business | String | Yes |
entry[0].changes[0].value.metadata.display_phone_number_id | ID for the phone number. A business can respond to a message using this ID. | String | Yes |
entry[0].changes[0].value.statuses[0].id | The ID for the message that was received by the business. You could use the messages endpoint to mark this specific message as read. | String | Yes |
entry[0].changes[0].value.statuses[0].recipient_id | The WhatsApp ID for the customer that the business, which is subscribed to the webhooks, sent to the customer | String | Yes |
entry[0].changes[0].value.statuses[0].status | failed | String | Yes |
entry[0].changes[0].value.statuses[0].errors | Array | Yes | |
code | Error code. Integer. Example: 130429 | Integer | Yes |
title | Error code title. Example: Rate limit hit | String | Yes |
href | Document link with a description of the error. | String | Yes |
key | Message tracking key, created by Insider One | String | Yes |
{
"key": "whatsapp-**************",
"object": "whatsapp_business_account",
"entry": [
{
"id": "1231313123",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{SENDER_PHONE_NUMBER}}",
"phone_number_id": "{{SENDER_PHONE_NUMBER_ID}}"
},
"statuses": [
{
"id": "{{MESSAGE_ID}}",
"status": "failed",
"timestamp": "1671526301",
"recipient_id": "RECIPIENT_ID",
"errors": [
{
"code": {{ERROR_CODE}},
"title": "{{ERROR_MESSAGE}}",
"href": "https:\/\/developers.facebook.com\/docs\/whatsapp\/cloud-api\/support\/error-codes\/"
}
]
}
]
},
"field": "messages"
}
]
}
]
}Delivery Report Missing refers to messages for which no delivery report is received from Meta. Since Meta does not send any events for these error messages, they are not delivered to you through either the Transactional API or the Conversational API.
User Reply with Text Event
Transactional API messages are one-way by default. In contrast, the Conversational API supports two-way interactions and bot flows.
For the Transactional API, reply events are generated only for button interactions and reply-to-message (quoted reply) events, where the user replies by quoting a previously sent transactional message.
This event does not represent free-text replies. Free-text replies are delivered via the Conversational webhook.
Parameter | Description | Data Type | Required |
|---|---|---|---|
entry[0].changes[0].value.metadata.display_phone_number | The phone number that is displayed for a business | String | Yes |
entry[0].changes[0].value.metadata.display_phone_number_id | ID for the phone number. A business can respond to a message using this ID. | String | Yes |
entry[0].changes[0].value.messages[0].from | The WhatsApp ID for the customer who replied to an inbound message. | String | Yes |
entry[0].changes[0].value.messages[0].id | The message ID for the sent message for an inbound reply | String | Yes |
entry[0].changes[0].value.messages[0].text.body | User’s reply | String | Yes |
key | Message tracking key, created by Insider One | String | Yes |
{
"key": "whatsapp-******************", //be empty
"object": "whatsapp_business_account",
"entry": [
{
"id": "1231313123",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{PHONE_NUMBER}}",
"phone_number_id": "{{PHONE_NUMBER_ID}}"
},
"contacts": [
{
"profile": {
"name": "Insider"
},
"wa_id": "{{PHONE_NUMBER}}"
}
],
"messages": [
{
"from": "{{PHONE_NUMBER}}",
"id": "{{MESSAGE_ID}}",
"timestamp": "111111111",
"text": {
"body": "{{MESSAGE_BODY}}"
},
"type": "text"
}
]
},
"field": "messages"
}
]
}
]
}User Reply with Sticker Example
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "105710252456442",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{PHONE_NUMBER}}",
"phone_number_id": "{{PHONE_NUMBER_ID}}"
},
"contacts": [
{
"profile": {
"name": "Insider"
},
"wa_id": "{{PHONE_NUMBER}}"
}
],
"messages": [
{
"from": "393336188770",
"id": "{{MESSAGE_ID}}",
"timestamp": "1678889298",
"type": "sticker",
"sticker": {
"mime_type": "image/webp",
"sha256": "{{ENCODED_STICKER}}",
"id": "{{STICKER_ID}}",
"animated": true
}
}
]
},
"field": "messages"
}
]
}
]
}User Reply with Video Example
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "105710252456442",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{PHONE_NUMBER}}",
"phone_number_id": "{{PHONE_NUMBER_ID}}"
},
"contacts": [
{
"profile": {
"name": "Insider"
},
"wa_id": "{{PHONE_NUMBER}}"
}
],
"messages": [
{
"from": "393336188770",
"id": "{{MESSAGE_ID}}",
"timestamp": "1678889564",
"type": "video",
"video": {
"mime_type": "video/mp4",
"sha256": "{{ENCODED_VIDEO}}",
"id": "{{VIDEO_ID}}"
}
}
]
},
"field": "messages"
}
]
}
]
}User Reply with Image Example
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "105710252456442",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{PHONE_NUMBER}}",
"phone_number_id": "{{PHONE_NUMBER_ID}}"
},
"contacts": [
{
"profile": {
"name": "Insider"
},
"wa_id": "{{PHONE_NUMBER}}"
}
],
"messages": [
{
"from": "393336188770",
"id": "{{MESSAGE_ID}}",
"timestamp": "1678889571",
"type": "image",
"image": {
"mime_type": "image/jpeg",
"sha256": "{{ENCODED_IMAGE}}",
"id": "{{IMAGE_ID}}"
}
}
]
},
"field": "messages"
}
]
}
]
}User Reply with Document Example
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "105710252456442",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{PHONE_NUMBER}}",
"phone_number_id": "{{PHONE_NUMBER_ID}}"
},
"contacts": [
{
"profile": {
"name": "Insider"
},
"wa_id": "{{PHONE_NUMBER}}"
}
],
"messages": [
{
"from": "393336188770",
"id": "{{MESSAGE_ID}}",
"timestamp": "1678889577",
"type": "document",
"document": {
"filename": "doc.pdf",
"mime_type": "application/pdf",
"sha256": "{{ENCODED_DOCUMENT}}",
"id": "{{DOCUMENT_ID}}"
}
}
]
},
"field": "messages"
}
]
}
]
}User Reply with Button Event
Parameter | Description | Data Type | Required |
|---|---|---|---|
entry[0].changes[0].value.metadata.display_phone_number | The phone number that is displayed for a business | String | Yes |
entry[0].changes[0].value.metadata.display_phone_number_id | ID for the phone number. A business can respond to a message using this ID. | String | Yes |
entry[0].changes[0].value.messages[0].from | The WhatsApp ID for the customer who replied to an inbound message | String | Yes |
entry[0].changes[0].value.messages[0].id | The message ID for the sent message for an inbound reply | String | Yes |
entry[0].changes[0].value.messages[0].button.body | Button text that is returned when the button is clicked, in addition to the display text on the button | String | Yes |
entry[0].changes[0].value.messages[0].button.payload | Developer-defined payload that is returned when the button is clicked in addition to the display text on the button | String | Yes |
key | Message tracking key, created by Insider One | String | Yes |
{
"key": "whatsapp-**************",
"object": "whatsapp_business_account",
"entry": [
{
"id": "1231313123",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "{{PHONE_NUMBER}}",
"phone_number_id": "{{PHONE_NUMBER_ID}}"
},
"contacts": [
{
"profile": {
"name": "Insider"
},
"wa_id": "{{PHONE_NUMBER}}"
}
],
"messages": [
{
"context": {
"from": "{{PHONE_NUMBER}}",
"id": "MESSAGE_ID"
},
"from": "{{PHONE_NUMBER}}",
"id": "{{MESSAGE_ID}}",
"timestamp": "1111111",
"type": "button",
"button": {
"payload": "{{BUTTON_PAYLOAD}}",
"text": "{{BUTTON_TEXT}}"
}
}
]
},
"field": "messages"
}
]
}
]
}