WhatsApp · Schema
WhatsApp Webhook Payload
Schema for incoming WhatsApp Business Platform webhook payloads. All webhook notifications follow a common envelope structure with event-specific data in the changes array.
Properties
| Name | Type | Description |
|---|---|---|
| object | string | Always 'whatsapp_business_account' for WhatsApp webhooks |
| entry | array |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://developers.facebook.com/schemas/whatsapp/webhook-payload.json",
"title": "WhatsApp Webhook Payload",
"description": "Schema for incoming WhatsApp Business Platform webhook payloads. All webhook notifications follow a common envelope structure with event-specific data in the changes array.",
"type": "object",
"required": ["object", "entry"],
"properties": {
"object": {
"type": "string",
"const": "whatsapp_business_account",
"description": "Always 'whatsapp_business_account' for WhatsApp webhooks"
},
"entry": {
"type": "array",
"items": {
"$ref": "#/$defs/Entry"
}
}
},
"$defs": {
"Entry": {
"type": "object",
"required": ["id", "changes"],
"properties": {
"id": {
"type": "string",
"description": "WhatsApp Business Account ID"
},
"changes": {
"type": "array",
"items": {
"$ref": "#/$defs/Change"
}
}
}
},
"Change": {
"type": "object",
"required": ["value", "field"],
"properties": {
"value": {
"type": "object",
"description": "Event-specific payload data"
},
"field": {
"type": "string",
"enum": [
"messages",
"account_update",
"message_template_status_update",
"phone_number_quality_update",
"phone_number_name_update",
"business_capability_update",
"security",
"flows"
],
"description": "Webhook subscription field that triggered this event"
}
}
},
"MessagesValue": {
"type": "object",
"description": "Value object for field=messages webhooks",
"required": ["messaging_product", "metadata"],
"properties": {
"messaging_product": {
"type": "string",
"const": "whatsapp"
},
"metadata": {
"type": "object",
"required": ["display_phone_number", "phone_number_id"],
"properties": {
"display_phone_number": {
"type": "string",
"description": "Business phone number that received the event"
},
"phone_number_id": {
"type": "string",
"description": "Phone Number ID"
}
}
},
"contacts": {
"type": "array",
"description": "Sender contact information (present for incoming messages)",
"items": {
"type": "object",
"properties": {
"profile": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Sender's WhatsApp profile name"
}
}
},
"wa_id": {
"type": "string",
"description": "Sender's WhatsApp ID (phone number)"
}
}
}
},
"messages": {
"type": "array",
"description": "Incoming message objects",
"items": {
"$ref": "#/$defs/IncomingMessage"
}
},
"statuses": {
"type": "array",
"description": "Outbound message status updates",
"items": {
"$ref": "#/$defs/MessageStatus"
}
},
"errors": {
"type": "array",
"items": {
"$ref": "#/$defs/WebhookError"
}
}
}
},
"IncomingMessage": {
"type": "object",
"required": ["from", "id", "timestamp", "type"],
"properties": {
"from": {
"type": "string",
"description": "Sender phone number"
},
"id": {
"type": "string",
"description": "WhatsApp message ID (wamid prefix)"
},
"timestamp": {
"type": "string",
"description": "Unix timestamp of the message"
},
"type": {
"type": "string",
"enum": ["text", "image", "video", "audio", "document", "sticker", "location", "contacts", "interactive", "button", "reaction", "order"],
"description": "Type of incoming message"
},
"context": {
"type": "object",
"description": "Present when the message is a reply",
"properties": {
"from": {
"type": "string"
},
"id": {
"type": "string"
}
}
},
"text": {
"type": "object",
"properties": {
"body": { "type": "string" }
}
},
"image": {
"$ref": "#/$defs/IncomingMedia"
},
"video": {
"$ref": "#/$defs/IncomingMedia"
},
"audio": {
"type": "object",
"properties": {
"id": { "type": "string" },
"mime_type": { "type": "string" },
"sha256": { "type": "string" },
"voice": {
"type": "boolean",
"description": "True if recorded as a voice message"
}
}
},
"document": {
"type": "object",
"properties": {
"id": { "type": "string" },
"mime_type": { "type": "string" },
"sha256": { "type": "string" },
"filename": { "type": "string" },
"caption": { "type": "string" }
}
},
"sticker": {
"type": "object",
"properties": {
"id": { "type": "string" },
"mime_type": { "type": "string" },
"sha256": { "type": "string" },
"animated": { "type": "boolean" }
}
},
"location": {
"type": "object",
"properties": {
"latitude": { "type": "number" },
"longitude": { "type": "number" },
"name": { "type": "string" },
"address": { "type": "string" },
"url": { "type": "string" }
}
},
"interactive": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["button_reply", "list_reply"]
},
"button_reply": {
"type": "object",
"properties": {
"id": { "type": "string" },
"title": { "type": "string" }
}
},
"list_reply": {
"type": "object",
"properties": {
"id": { "type": "string" },
"title": { "type": "string" },
"description": { "type": "string" }
}
}
}
},
"button": {
"type": "object",
"properties": {
"text": { "type": "string" },
"payload": { "type": "string" }
}
},
"reaction": {
"type": "object",
"properties": {
"message_id": { "type": "string" },
"emoji": { "type": "string" }
}
},
"order": {
"type": "object",
"properties": {
"catalog_id": { "type": "string" },
"product_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"product_retailer_id": { "type": "string" },
"quantity": { "type": "integer" },
"item_price": { "type": "number" },
"currency": { "type": "string" }
}
}
},
"text": { "type": "string" }
}
}
}
},
"IncomingMedia": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Media ID for downloading via GET /{media-id}"
},
"mime_type": {
"type": "string"
},
"sha256": {
"type": "string"
},
"caption": {
"type": "string"
}
}
},
"MessageStatus": {
"type": "object",
"required": ["id", "status", "timestamp", "recipient_id"],
"properties": {
"id": {
"type": "string",
"description": "WhatsApp message ID"
},
"status": {
"type": "string",
"enum": ["sent", "delivered", "read", "failed"],
"description": "Message delivery status"
},
"timestamp": {
"type": "string"
},
"recipient_id": {
"type": "string"
},
"conversation": {
"type": "object",
"properties": {
"id": { "type": "string" },
"expiration_timestamp": { "type": "string" },
"origin": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": ["business_initiated", "user_initiated", "referral_conversion", "utility"]
}
}
}
}
},
"pricing": {
"type": "object",
"properties": {
"billable": { "type": "boolean" },
"pricing_model": { "type": "string" },
"category": {
"type": "string",
"enum": ["business_initiated", "user_initiated", "referral_conversion", "authentication", "authentication_international", "service", "utility", "marketing"]
}
}
},
"errors": {
"type": "array",
"items": {
"$ref": "#/$defs/WebhookError"
}
}
}
},
"WebhookError": {
"type": "object",
"properties": {
"code": {
"type": "integer",
"description": "Error code"
},
"title": {
"type": "string",
"description": "Error title"
},
"message": {
"type": "string",
"description": "Human-readable error message"
},
"error_data": {
"type": "object",
"properties": {
"details": {
"type": "string"
}
}
},
"href": {
"type": "string",
"format": "uri",
"description": "Link to error documentation"
}
}
}
}
}