WhatsApp Business Platform > Cloud API
The following is an example of a text message you received from a customer:
{ "object": "whatsapp_business_account", "entry": [ { "id": "<WHATSAPP_BUSINESS_ACCOUNT_ID>", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "<BUSINESS_DISPLAY_PHONE_NUMBER>", "phone_number_id": "<BUSINESS_PHONE_NUMBER_ID>" }, "contacts": [ { "profile": { "name": "<WHATSAPP_USER_NAME>" }, "wa_id": "<WHATSAPP_USER_ID>" } ], "messages": [ { "from": "<WHATSAPP_USER_PHONE_NUMBER>", "id": "<WHATSAPP_MESSAGE_ID>", "timestamp": "<WEBHOOK_SENT_TIMESTAMP>", "text": { "body": "<MESSAGE_BODY_TEXT>" }, "type": "text" } ] }, "field": "messages" } ] } ] }
The following is an example of a reaction message you received from a customer. You will not receive this webbook if the message the customer is reacting to is more than 30 days old.
{ "object": "whatsapp_business_account", "entry": [{ "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": PHONE_NUMBER, "phone_number_id": PHONE_NUMBER_ID }, "contacts": [{ "profile": { "name": "NAME" }, "wa_id": PHONE_NUMBER }], "messages": [{ "from": PHONE_NUMBER, "id": "wamid.ID", "timestamp": TIMESTAMP, "reaction": { "message_id": "MESSAGE_ID", "emoji": "EMOJI" }, "type": "reaction" }] }, "field": "messages" }] }] }
Note that for reactions, the timestamp
value indicates when the customer sent the reaction, not when the webhook was generated.
When a message with media is received, the WhatsApp Business Platform downloads the media. A notification is sent to your Webhook once the media is downloaded.
The Webhook notification contains information that identifies the media object and enables you to find and retrieve the object. Use the media endpoints to retrieve the media.
{ "object": "whatsapp_business_account", "entry": [{ "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": PHONE_NUMBER, "phone_number_id": PHONE_NUMBER_ID }, "contacts": [{ "profile": { "name": "NAME" }, "wa_id": "WHATSAPP_ID" }], "messages": [{ "from": PHONE_NUMBER, "id": "wamid.ID", "timestamp": TIMESTAMP, "type": "image", "image": { "caption": "CAPTION", "mime_type": "image/jpeg", "sha256": "IMAGE_HASH", "id": "ID" } }] }, "field": "messages" }] }] }
When you receive a sticker, you will get the following notification:
{ "object": "whatsapp_business_account", "entry": [ { "id": "ID", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "PHONE_NUMBER", "phone_number_id": "PHONE_NUMBER_ID" }, "contacts": [ { "profile": { "name": "NAME" }, "wa_id": "ID" } ], "messages": [ { "from": "SENDER_PHONE_NUMBER", "id": "wamid.ID", "timestamp": "TIMESTAMP", "type": "sticker", "sticker": { "mime_type": "image/webp", "sha256": "HASH", "id": "ID" } } ] }, "field": "messages" } ] } ] }
It's possible to receive an unknown message callback notification. For example, a customer could send you a message that's not supported, such as a disappearing message (in which case we'd notify the customer that the message type is not supported).
The following is an example of a message you received from a customer that is not supported.
{ "object": "whatsapp_business_account", "entry": [{ "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "PHONE_NUMBER", "phone_number_id": "PHONE_NUMBER_ID" }, "contacts": [{ "profile": { "name": "NAME" }, "wa_id": "WHATSAPP_ID" }], "messages": [{ "from": "PHONE_NUMBER", "id": "wamid.ID", "timestamp": "TIMESTAMP", "errors": [ { "code": 131051, "details": "Message type is not currently supported", "title": "Unsupported message type" }], "type": "unknown" }] } "field": "messages" }], }] }
The following is an example of a location message you received from a customer:
{ "object": "whatsapp_business_account", "entry": [{ "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "PHONE_NUMBER", "phone_number_id": "PHONE_NUMBER_ID" }, "contacts": [{ "profile": { "name": "NAME" }, "wa_id": "WHATSAPP_ID" }], "messages": [{ "from": "PHONE_NUMBER", "id": "wamid.ID", "timestamp": "TIMESTAMP", "location": { "latitude": LOCATION_LATITUDE, "longitude": LOCATION_LONGITUDE, "name": LOCATION_NAME, "address": LOCATION_ADDRESS, } }] }, "field": "messages" }] }] }
The following is an example of a contact message you received from a customer:
{ "object":"whatsapp_business_account", "entry":[{ "id":"WHATSAPP_BUSINESS_ACCOUNT_ID", "changes":[{ "value":{ "messaging_product":"whatsapp", "metadata": { "display_phone_number":"PHONE_NUMBER", "phone_number_id":"PHONE_NUMBER_ID" }, "contacts": [{ "profile":{ "name":"NAME" }, "wa_id":"WHATSAPP_ID" }], "messages":[{ "from":"PHONE_NUMBER", "id":"wamid.ID", "timestamp":"TIMESTAMP", "contacts":[{ "addresses":[{ "city":"CONTACT_CITY", "country":"CONTACT_COUNTRY", "country_code":"CONTACT_COUNTRY_CODE", "state":"CONTACT_STATE", "street":"CONTACT_STREET", "type":"HOME or WORK", "zip":"CONTACT_ZIP" }], "birthday":"CONTACT_BIRTHDAY", "emails":[{ "email":"CONTACT_EMAIL", "type":"WORK or HOME" }], "name":{ "formatted_name":"CONTACT_FORMATTED_NAME", "first_name":"CONTACT_FIRST_NAME", "last_name":"CONTACT_LAST_NAME", "middle_name":"CONTACT_MIDDLE_NAME", "suffix":"CONTACT_SUFFIX", "prefix":"CONTACT_PREFIX" }, "org":{ "company":"CONTACT_ORG_COMPANY", "department":"CONTACT_ORG_DEPARTMENT", "title":"CONTACT_ORG_TITLE" }, "phones":[{ "phone":"CONTACT_PHONE", "wa_id":"CONTACT_WA_ID", "type":"HOME or WORK>" }], "urls":[{ "url":"CONTACT_URL", "type":"HOME or WORK" }] }] }] }, "field":"messages" }] }] }
When your customer clicks on a quick reply button in an interactive message template, a response is sent. Below is an example of the callback format.
{ "object": "whatsapp_business_account", "entry": [{ "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": PHONE_NUMBER, "phone_number_id": PHONE_NUMBER_ID }, "contacts": [{ "profile": { "name": "NAME" }, "wa_id": "WHATSAPP_ID" }], "messages": [{ "context": { "from": PHONE_NUMBER, "id": "wamid.ID" }, "from": "16315551234", "id": "wamid.ID", "timestamp": TIMESTAMP, "type": "button", "button": { "text": "No", "payload": "No-Button-Payload" } }] }, "field": "messages" }] }] }
The following webhook notification is received when a user clicks on an item from a list message you sent:
{ "object": "whatsapp_business_account", "entry": [ { "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "PHONE_NUMBER", "phone_number_id": "PHONE_NUMBER_ID", }, "contacts": [ { "profile": { "name": "NAME" }, "wa_id": "PHONE_NUMBER_ID" } ], "messages": [ { "from": PHONE_NUMBER_ID, "id": "wamid.ID", "timestamp": TIMESTAMP, "interactive": { "list_reply": { "id": "list_reply_id", "title": "list_reply_title", "description": "list_reply_description" }, "type": "list_reply" }, "type": "interactive" } ] }, "field": "messages" } ] } ] }
The following webhook notification is received when a user clicks on a reply button you sent:
{ "object": "whatsapp_business_account", "entry": [ { "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "PHONE_NUMBER", "phone_number_id": PHONE_NUMBER_ID, }, "contacts": [ { "profile": { "name": "NAME" }, "wa_id": "PHONE_NUMBER_ID" } ], "messages": [ { "from": PHONE_NUMBER_ID, "id": "wamid.ID", "timestamp": TIMESTAMP, "interactive": { "button_reply": { "id": "unique-button-identifier-here", "title": "button-text", }, "type": "button_reply" }, "type": "interactive" } ] }, "field": "messages" } ] } ] }
You get the following webhook when a conversation is started after a user clicks an ad with a Click to WhatsApp’s call-to-action:
{ "object": "whatsapp_business_account", "entry": [ { "id": "ID", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "PHONE_NUMBER", "phone_number_id": "PHONE_NUMBER_ID" }, "contacts": [ { "profile": { "name": "NAME" }, "wa_id": "ID" } ], "messages": [ { "referral": { "source_url": "AD_OR_POST_FB_URL", "source_id": "ADID", "source_type": "ad or post", "headline": "AD_TITLE", "body": "AD_DESCRIPTION", "media_type": "image or video", "image_url": "RAW_IMAGE_URL", "video_url": "RAW_VIDEO_URL", "thumbnail_url": "RAW_THUMBNAIL_URL", "ctwa_clid": "CTWA_CLID" }, "from": "SENDER_PHONE_NUMBERID", "id": "wamid.ID", "timestamp": "TIMESTAMP", "type": "text", "text": { "body": "BODY" } } ] }, "field": "messages" } ] } ] }
A Product Inquiry Message is received when a customer asks for more information about a product. These can happen when:
A webhooks notification for a Product Inquiry Message looks like this:
{ "object": "whatsapp_business_account", "entry": [ { "id": "ID", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "PHONE_NUMBER", "phone_number_id": "PHONE_NUMBER_ID", }, "contacts": [ { "profile": { "name": "NAME" }, "wa_id": "PHONE_NUMBER_ID" } ], "messages": [ { "from": "PHONE_NUMBER", "id": "wamid.ID", "text": { "body": "MESSAGE_TEXT" }, "context": { "from": "PHONE_NUMBER", "id": "wamid.ID", "referred_product": { "catalog_id": "CATALOG_ID", "product_retailer_id": "PRODUCT_ID" } }, "timestamp": "TIMESTAMP", "type": "text" } ] }, "field": "messages" } ] } ] }
A webhooks notification for when a customer places an order looks like this:
{ "object": "whatsapp_business_account", "entry": [ { "id": "8856996819413533", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "16505553333", "phone_number_id": "phone-number-id", }, "contacts": [ { "profile": { "name": "Kerry Fisher" }, "wa_id": "16315551234" } ], "messages": [ { "from": "16315551234", "id": "wamid.ABGGFlCGg0cvAgo6cHbBhfK5760V", "order": { "catalog_id": "the-catalog_id", "product_items": [ { "product_retailer_id":"the-product-SKU-identifier", "quantity":"number-of-item", "item_price":"unitary-price-of-item", "currency":"price-currency" }, ... ], "text":"text-message-sent-along-with-the-order" }, "context": { "from": "16315551234", "id": "wamid.gBGGFlaCGg0xcvAdgmZ9plHrf2Mh-o" }, "timestamp": "1603069091", "type": "order" } ] }, "field": "messages" } ] } ] }
When a user changes their phone number on WhatsApp, you receive a system message notification:
{ "object": "whatsapp_business_account", "entry": [{ "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": PHONE_NUMBER, "phone_number_id": PHONE_NUMBER_ID }, "messages": [{ "from": PHONE_NUMBER, "id": "wamid.ID", "system": { "body": "NAME changed from PHONE_NUMBER to PHONE_NUMBER", "new_wa_id": NEW_PHONE_NUMBER, "type": "user_changed_number" }, "timestamp": TIMESTAMP, "type": "system" }] }, "field": "messages" }] }] }
The WhatsApp Business Platform sends notifications to inform you of the status of the messages between you and users. When a message is sent successfully, you receive a notification when the message is sent, delivered, and read. The order of these notifications in your app may not reflect the actual timing of the message status. View the timestamp to determine the timing, if necessary.
{ "object": "whatsapp_business_account", "entry": [ { "id": "<WHATSAPP_BUSINESS_ACCOUNT_ID>", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "<BUSINESS_DISPLAY_PHONE_NUMBER>", "phone_number_id": "<BUSINESS_PHONE_NUMBER_ID>" }, "statuses": [ { "id": "<WHATSAPP_MESSAGE_ID>", "status": "sent", "timestamp": "<WEBHOOK_SENT_TIMESTAMP>", "recipient_id": "<WHATSAPP_USER_ID>", "conversation": { "id": "<CONVERSATION_ID>", "expiration_timestamp": "<CONVERSATION_EXPIRATION_TIMESTAMP>", "origin": { "type": "<CONVERSATION_CATEGORY>" } }, "pricing": { "billable": <IS_BILLABLE?>, "pricing_model": "CBP", "category": "<CONVERSATION_CATEGORY>" } } ] }, "field": "messages" } ] } ] }
For free entry point conversations, origin.type
and pricing.category
are both set to referral_conversion
, and pricing.billable
is set to false
.
The following notification is received when a business’ message is delivered and that message is part of a user-initiated conversation (if that conversation did not originate in a free entry point):
{ "object": "whatsapp_business_account", "entry": [ { "id": "<WHATSAPP_BUSINESS_ACCOUNT_ID>", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "<BUSINESS_DISPLAY_PHONE_NUMBER>", "phone_number_id": "<BUSINESS_PHONE_NUMBER_ID>" }, "statuses": [ { "id": "<WHATSAPP_MESSAGE_ID>", "status": "sent", "timestamp": "<WEBHOOK_SENT_TIMESTAMP>", "recipient_id": "<WHATSAPP_USER_ID>", "conversation": { "id": "<CONVERSATION_ID>", "origin": { "type": "<CONVERSATION_CATEGORY>" } }, "pricing": { "billable": <IS_BILLABLE?>, "pricing_model": "CBP", "category": "<CONVERSATION_CATEGORY>" } } ] }, "field": "messages" } ] } ] }
For free entry point conversations, origin.type
and pricing.category
are both set to referral_conversion
, and pricing.billable
is set to false
.
{ "object": "whatsapp_business_account", "entry": [ { "id": "<WHATSAPP_BUSINESS_ACCOUNT_ID>", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "<BUSINESS_DISPLAY_PHONE_NUMBER>", "phone_number_id": "<BUSINESS_PHONE_NUMBER_ID>" }, "statuses": [ { "id": "<WHATSAPP_MESSAGE_ID>", "status": "read", "timestamp": "<WEBHOOK_SENT_TIMESTAMP>", "recipient_id": "<WHATSAPP_USER_ID>" } ] }, "field": "messages" } ] } ] }
Currently, the Cloud API does not support webhook status updates for deleted messages. If a user deletes a message, you will receive a webhook with an error code for an unsupported message type:
{ "object": "whatsapp_business_account", "entry": [{ "id": "WHATSAPP_BUSINESS_ACCOUNT_ID", "changes": [{ "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": PHONE_NUMBER, "phone_number_id": PHONE_NUMBER }, "contacts": [{ "profile": { "name": "NAME" }, "wa_id": PHONE_NUMBER }], "messages": [{ "from": PHONE_NUMBER, "id": "wamid.ID", "timestamp": TIMESTAMP, "errors": [{ "code": 131051, "details": "Message type is not currently supported", "title": "Unsupported message type" }], "type": "unsupported" }] }, "field": "messages" }] }] }
Note that there are other user behaviors that can trigger this same error message.
{ "object": "whatsapp_business_account", "entry": [ { "id": "<WHATSAPP_BUSINESS_ACCOUNT_ID>", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "<BUSINESS_DISPLAY_PHONE_NUMBER>", "phone_number_id": "<BUSINESS_PHONE_NUMBER_ID>" }, "statuses": [ { "id": "<WHATSAPP_MESSAGE_ID>", "status": "failed", "timestamp": "<WEBHOOK_SENT_TIMESTAMP>", "recipient_id": "<WHATSAPP_USER_ID>", "errors": [ { "code": <ERROR_CODE>, "title": "<ERROR_TITLE>", "message": "<ERROR_MESSAGE>", "error_data": { "details": "<ERROR_DETAILS>" }, "href": "https://developers.facebook.com/docs/whatsapp/cloud-api/support/error-codes/" } ] } ] }, "field": "messages" } ] } ] }
Syntax for a webhook indicating that the message was not sent (status
of failed
) because the WhatsApp user has stopped marketing template messages from the business: (error) code
of 131050
.
{ "object": "whatsapp_business_account", "entry": [ { "id": "<WHATSAPP_BUSINESS_ACCOUNT_ID>", "changes": [ { "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "<BUSINESS_PHONE_NUMBER>", "phone_number_id": "<BUSINESS_PHONE_NUMBER_ID>" }, "statuses": [ { "id": "<WHATSAPP_MESSAGE_ID>", "status": "failed", "timestamp": <WEBHOOK_SENT_TIMESTAMP>, "recipient_id": "<WHATSAPP_USER_PHONE_NUMBER>", "errors": [ { "code": 131050, "title": "Unable to deliver the message. This recipient has chosen to stop receiving marketing messages on WhatsApp from your business" } ] } ] }, "field": "messages" } ] } ] }