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
View JSON Schema on GitHub

JSON Schema

whatsapp-webhook-payload-schema.json Raw ↑
{
  "$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"
        }
      }
    }
  }
}