{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://developers.facebook.com/schemas/whatsapp/message.json", "title": "WhatsApp Message", "description": "Schema for outbound WhatsApp messages sent via the Cloud API POST /{phone-number-id}/messages endpoint. Covers all message types including text, media, location, contacts, interactive, template, and reaction messages.", "type": "object", "required": ["messaging_product", "to", "type"], "properties": { "messaging_product": { "type": "string", "const": "whatsapp", "description": "Must be 'whatsapp'" }, "recipient_type": { "type": "string", "default": "individual", "description": "Recipient type, currently only 'individual' is supported" }, "to": { "type": "string", "description": "Recipient phone number in E.164 format without the leading +", "pattern": "^[1-9]\\d{1,14}$" }, "type": { "type": "string", "enum": ["text", "image", "video", "audio", "document", "sticker", "location", "contacts", "interactive", "template", "reaction"], "description": "Message type" }, "context": { "$ref": "#/$defs/Context" }, "biz_opaque_callback_data": { "type": "string", "description": "Arbitrary string for tracking, included in webhook delivery" }, "text": { "$ref": "#/$defs/TextMessage" }, "image": { "$ref": "#/$defs/MediaMessage" }, "video": { "$ref": "#/$defs/MediaMessage" }, "audio": { "$ref": "#/$defs/AudioMessage" }, "document": { "$ref": "#/$defs/DocumentMessage" }, "sticker": { "$ref": "#/$defs/StickerMessage" }, "location": { "$ref": "#/$defs/LocationMessage" }, "contacts": { "type": "array", "items": { "$ref": "#/$defs/Contact" }, "description": "Array of contact cards to send" }, "interactive": { "$ref": "#/$defs/InteractiveMessage" }, "template": { "$ref": "#/$defs/TemplateMessage" }, "reaction": { "$ref": "#/$defs/ReactionMessage" } }, "$defs": { "Context": { "type": "object", "description": "Context for reply messages", "required": ["message_id"], "properties": { "message_id": { "type": "string", "description": "ID of the message being replied to" } } }, "TextMessage": { "type": "object", "required": ["body"], "properties": { "body": { "type": "string", "maxLength": 4096, "description": "Message text content" }, "preview_url": { "type": "boolean", "default": false, "description": "Set true to render URL previews" } } }, "MediaMessage": { "type": "object", "description": "Image or video message. Provide either id (for uploaded media) or link (for URL-hosted media), not both.", "properties": { "id": { "type": "string", "description": "Media ID from a previous upload" }, "link": { "type": "string", "format": "uri", "description": "HTTPS URL of the media file" }, "caption": { "type": "string", "maxLength": 1024, "description": "Caption text" } } }, "AudioMessage": { "type": "object", "description": "Audio message. Supported formats: AAC, MP4, MPEG, AMR, OGG (OPUS). Max 16 MB.", "properties": { "id": { "type": "string", "description": "Media ID from a previous upload" }, "link": { "type": "string", "format": "uri", "description": "HTTPS URL of the audio file" } } }, "DocumentMessage": { "type": "object", "description": "Document message. Max 100 MB.", "properties": { "id": { "type": "string", "description": "Media ID from a previous upload" }, "link": { "type": "string", "format": "uri", "description": "HTTPS URL of the document" }, "caption": { "type": "string", "description": "Caption text" }, "filename": { "type": "string", "description": "Filename to display to recipient" } } }, "StickerMessage": { "type": "object", "description": "Sticker message. WebP format only. Max 100 KB (static), 500 KB (animated).", "properties": { "id": { "type": "string" }, "link": { "type": "string", "format": "uri" } } }, "LocationMessage": { "type": "object", "required": ["latitude", "longitude"], "properties": { "latitude": { "type": "number", "minimum": -90, "maximum": 90 }, "longitude": { "type": "number", "minimum": -180, "maximum": 180 }, "name": { "type": "string", "description": "Location name" }, "address": { "type": "string", "description": "Location address" } } }, "Contact": { "type": "object", "required": ["name"], "properties": { "name": { "type": "object", "required": ["formatted_name"], "properties": { "formatted_name": { "type": "string" }, "first_name": { "type": "string" }, "last_name": { "type": "string" }, "middle_name": { "type": "string" }, "prefix": { "type": "string" }, "suffix": { "type": "string" } } }, "addresses": { "type": "array", "items": { "type": "object", "properties": { "street": { "type": "string" }, "city": { "type": "string" }, "state": { "type": "string" }, "zip": { "type": "string" }, "country": { "type": "string" }, "country_code": { "type": "string" }, "type": { "type": "string", "enum": ["HOME", "WORK"] } } } }, "birthday": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "description": "Birthday in YYYY-MM-DD format" }, "emails": { "type": "array", "items": { "type": "object", "properties": { "email": { "type": "string", "format": "email" }, "type": { "type": "string", "enum": ["HOME", "WORK"] } } } }, "org": { "type": "object", "properties": { "company": { "type": "string" }, "department": { "type": "string" }, "title": { "type": "string" } } }, "phones": { "type": "array", "items": { "type": "object", "properties": { "phone": { "type": "string" }, "type": { "type": "string", "enum": ["CELL", "MAIN", "IPHONE", "HOME", "WORK"] }, "wa_id": { "type": "string" } } } }, "urls": { "type": "array", "items": { "type": "object", "properties": { "url": { "type": "string", "format": "uri" }, "type": { "type": "string", "enum": ["HOME", "WORK"] } } } } } }, "InteractiveMessage": { "type": "object", "required": ["type", "action"], "properties": { "type": { "type": "string", "enum": ["button", "list", "product", "product_list", "cta_url", "location_request_message", "flow"] }, "header": { "type": "object", "properties": { "type": { "type": "string", "enum": ["text", "image", "video", "document"] }, "text": { "type": "string" } } }, "body": { "type": "object", "required": ["text"], "properties": { "text": { "type": "string", "maxLength": 1024 } } }, "footer": { "type": "object", "properties": { "text": { "type": "string", "maxLength": 60 } } }, "action": { "type": "object", "description": "Action configuration varies by interactive type" } } }, "TemplateMessage": { "type": "object", "required": ["name", "language"], "properties": { "name": { "type": "string", "description": "Template name" }, "language": { "type": "object", "required": ["code"], "properties": { "code": { "type": "string", "description": "Language/locale code (e.g., en_US)" }, "policy": { "type": "string", "default": "deterministic" } } }, "components": { "type": "array", "items": { "type": "object", "required": ["type"], "properties": { "type": { "type": "string", "enum": ["header", "body", "button"] }, "sub_type": { "type": "string", "enum": ["quick_reply", "url", "copy_code", "flow", "catalog"] }, "index": { "type": "string" }, "parameters": { "type": "array", "items": { "type": "object", "required": ["type"], "properties": { "type": { "type": "string", "enum": ["text", "image", "video", "document", "location", "currency", "date_time", "payload", "coupon_code"] } } } } } } } } }, "ReactionMessage": { "type": "object", "required": ["message_id", "emoji"], "properties": { "message_id": { "type": "string", "description": "ID of the message to react to" }, "emoji": { "type": "string", "description": "Emoji character or empty string to remove reaction" } } } } }