> For a complete index of all SignalWire documentation pages, fetch https://signalwire.com/docs/llms.txt

# Send WhatsApp messages

> Send text, media, interactive, and template WhatsApp messages through the SignalWire Messaging API.

All WhatsApp messages are sent through the same endpoint as SMS and MMS,
[`POST /api/messaging/messages`](/docs/apis/rest/messages/create-message). Two things route a
message over WhatsApp instead of SMS/MMS:

* The `from` number is a `whatsapp:`-prefixed [WhatsApp number](/docs/platform/messaging/whatsapp/onboarding) (e.g. `whatsapp:+15557654321`).
* You set a `message_type` (for content messages) or a `template_id` (for template messages).

WhatsApp on SignalWire is in **early-access alpha**. You must
[connect a WhatsApp business number](/docs/platform/messaging/whatsapp/onboarding) before you can send
messages.

For the full request schema (every field, every message type's `body` shape, and authentication),
see the [Send a message](/docs/apis/rest/messages/create-message) API reference.

## Messaging rules

Meta enforces specific rules about when and how a business can send WhatsApp messages:

| Scenario                      | What you can send                                                                                                                                           |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **No prior customer message** | Approved [templates](/docs/platform/messaging/whatsapp/message-templates) only. You cannot start a free-form conversation until the customer has responded. |
| **Customer messaged first**   | Any message type (text, media, interactive, or template) within a **24-hour window** from the customer's last inbound message.                              |

## Message types

Set `message_type` to one of the following for a content message. Each value determines the shape of
`body`, shown below.

### Schema (`Message.WhatsAppContentMessageRequest`)

```yaml
components:
  schemas:
    MessageWhatsAppTextMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppTextMessageRequestCustomVariables
    MessageWhatsAppTextMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_media_text
      title: MessageWhatsAppTextMessageRequestMessageType
    MessageWhatsAppImageMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppImageMessageRequestCustomVariables
    MessageWhatsAppImageMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_media_image
      title: MessageWhatsAppImageMessageRequestMessageType
    Message.WhatsAppImageBody:
      type: object
      properties:
        link:
          type: string
          format: uri
          description: A public HTTP/HTTPS URL to the image.
        id:
          type: string
          description: >-
            The ID of media previously uploaded to WhatsApp. Mutually exclusive
            with `link`.
        caption:
          type: string
          description: Optional caption shown with the image.
      description: Body for an image message. Provide either `link` or `id` (not both).
      title: Message.WhatsAppImageBody
    MessageWhatsAppContentMessageRequestDiscriminatorMappingWhatsappMediaAudioCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: >-
        MessageWhatsAppContentMessageRequestDiscriminatorMappingWhatsappMediaAudioCustomVariables
    Message.WhatsAppAudioBody:
      type: object
      properties:
        link:
          type: string
          format: uri
          description: A public HTTP/HTTPS URL to the audio file.
        id:
          type: string
          description: >-
            The ID of media previously uploaded to WhatsApp. Mutually exclusive
            with `link`.
      description: >-
        Body for an audio message. Provide either `link` or `id` (not both).
        Captions are not supported.
      title: Message.WhatsAppAudioBody
    MessageWhatsAppVideoMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppVideoMessageRequestCustomVariables
    MessageWhatsAppVideoMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_media_video
      title: MessageWhatsAppVideoMessageRequestMessageType
    Message.WhatsAppVideoBody:
      type: object
      properties:
        link:
          type: string
          format: uri
          description: A public HTTP/HTTPS URL to the video.
        id:
          type: string
          description: >-
            The ID of media previously uploaded to WhatsApp. Mutually exclusive
            with `link`.
        caption:
          type: string
          description: Optional caption shown with the video.
      description: Body for a video message. Provide either `link` or `id` (not both).
      title: Message.WhatsAppVideoBody
    MessageWhatsAppDocumentMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppDocumentMessageRequestCustomVariables
    MessageWhatsAppDocumentMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_media_document
      title: MessageWhatsAppDocumentMessageRequestMessageType
    Message.WhatsAppDocumentBody:
      type: object
      properties:
        link:
          type: string
          format: uri
          description: A public HTTP/HTTPS URL to the document.
        id:
          type: string
          description: >-
            The ID of media previously uploaded to WhatsApp. Mutually exclusive
            with `link`.
        caption:
          type: string
          description: Optional caption shown with the document.
        filename:
          type: string
          description: Optional filename shown to the recipient. Maximum 240 characters.
      description: Body for a document message. Provide either `link` or `id` (not both).
      title: Message.WhatsAppDocumentBody
    MessageWhatsAppStickerMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppStickerMessageRequestCustomVariables
    MessageWhatsAppStickerMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_media_sticker
      title: MessageWhatsAppStickerMessageRequestMessageType
    Message.WhatsAppStickerBody:
      type: object
      properties:
        link:
          type: string
          format: uri
          description: >-
            A public HTTP/HTTPS URL to the sticker file. Meta requires `.webp`
            format.
        id:
          type: string
          description: >-
            The ID of media previously uploaded to WhatsApp. Mutually exclusive
            with `link`.
      description: >-
        Body for a sticker message. Provide either `link` or `id` (not both).
        Captions are not supported.
      title: Message.WhatsAppStickerBody
    MessageWhatsAppLocationMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppLocationMessageRequestCustomVariables
    MessageWhatsAppLocationMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_media_location
      title: MessageWhatsAppLocationMessageRequestMessageType
    Message.WhatsAppLocationBody:
      type: object
      properties:
        latitude:
          type: number
          format: double
          description: Latitude, between -90 and 90.
        longitude:
          type: number
          format: double
          description: Longitude, between -180 and 180.
        name:
          type: string
          description: The name of the location.
        address:
          type: string
          description: The address of the location.
      required:
        - latitude
        - longitude
        - name
        - address
      description: Body for a location message. All fields are required.
      title: Message.WhatsAppLocationBody
    MessageWhatsAppContentMessageRequestDiscriminatorMappingWhatsappMediaContactsCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: >-
        MessageWhatsAppContentMessageRequestDiscriminatorMappingWhatsappMediaContactsCustomVariables
    Message.WhatsAppContactName:
      type: object
      properties:
        formatted_name:
          type: string
          description: The contact's full formatted name. Required.
      required:
        - formatted_name
      description: The name fields of a shared contact.
      title: Message.WhatsAppContactName
    Message.WhatsAppContact:
      type: object
      properties:
        name:
          $ref: '#/components/schemas/Message.WhatsAppContactName'
          description: The contact's name. `formatted_name` is required.
      required:
        - name
      description: >-
        A shared contact card. Additional fields (phones, emails, org, etc.)
        follow the WhatsApp contacts message format.
      title: Message.WhatsAppContact
    MessageWhatsAppReactionMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppReactionMessageRequestCustomVariables
    MessageWhatsAppReactionMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_media_reaction
      title: MessageWhatsAppReactionMessageRequestMessageType
    Message.WhatsAppReactionBody:
      type: object
      properties:
        message_id:
          type: string
          description: The ID of the message being reacted to.
        emoji:
          type: string
          description: The emoji to react with.
      required:
        - message_id
        - emoji
      description: Body for a reaction message.
      title: Message.WhatsAppReactionBody
    MessageWhatsAppInteractiveCtaMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppInteractiveCtaMessageRequestCustomVariables
    MessageWhatsAppInteractiveCtaMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_interactive_cta
      title: MessageWhatsAppInteractiveCtaMessageRequestMessageType
    MessageWhatsAppInteractiveBodyAction:
      type: object
      properties: {}
      description: >-
        The interactive action. Its contents depend on `type` (for example, a
        `buttons` array, list `sections`, or Flow parameters).
      title: MessageWhatsAppInteractiveBodyAction
    MessageWhatsAppInteractiveBodyHeader:
      type: object
      properties: {}
      description: Optional header object.
      title: MessageWhatsAppInteractiveBodyHeader
    MessageWhatsAppInteractiveBodyBody:
      type: object
      properties: {}
      description: 'Optional body object, e.g. `{ "text": "How can we help?" }`.'
      title: MessageWhatsAppInteractiveBodyBody
    MessageWhatsAppInteractiveBodyFooter:
      type: object
      properties: {}
      description: Optional footer object.
      title: MessageWhatsAppInteractiveBodyFooter
    Message.WhatsAppInteractiveBody:
      type: object
      properties:
        type:
          type: string
          description: >-
            The interactive type, e.g. `button`, `list`, `cta_url`,
            `location_request_message`, or `flow`.
        action:
          $ref: '#/components/schemas/MessageWhatsAppInteractiveBodyAction'
          description: >-
            The interactive action. Its contents depend on `type` (for example,
            a `buttons` array, list `sections`, or Flow parameters).
        header:
          $ref: '#/components/schemas/MessageWhatsAppInteractiveBodyHeader'
          description: Optional header object.
        body:
          $ref: '#/components/schemas/MessageWhatsAppInteractiveBodyBody'
          description: 'Optional body object, e.g. `{ "text": "How can we help?" }`.'
        footer:
          $ref: '#/components/schemas/MessageWhatsAppInteractiveBodyFooter'
          description: Optional footer object.
      required:
        - type
        - action
      description: >-
        Body for an interactive message. `type` and `action` are required;
        `header`, `body`, and `footer` are optional. The shape of `action`
        depends on the interactive type — buttons, list sections, a
        call-to-action URL, a location request, or a Flow — and follows the
        WhatsApp interactive message format.
      title: Message.WhatsAppInteractiveBody
    MessageWhatsAppInteractiveListMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppInteractiveListMessageRequestCustomVariables
    MessageWhatsAppInteractiveListMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_interactive_list
      title: MessageWhatsAppInteractiveListMessageRequestMessageType
    MessageWhatsAppInteractiveReplyButtonMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppInteractiveReplyButtonMessageRequestCustomVariables
    MessageWhatsAppInteractiveReplyButtonMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_interactive_reply_button
      title: MessageWhatsAppInteractiveReplyButtonMessageRequestMessageType
    MessageWhatsAppInteractiveLocationRequestMessageRequestCustomVariables:
      type: object
      properties: {}
      description: >-
        Your own key/value string pairs to attach to the message. Delivered as
        `custom_variables` in status callbacks when `status_callback` is set.
      title: MessageWhatsAppInteractiveLocationRequestMessageRequestCustomVariables
    MessageWhatsAppInteractiveLocationRequestMessageRequestMessageType:
      type: string
      enum:
        - whatsapp_interactive_location_request_message
      title: MessageWhatsAppInteractiveLocationRequestMessageRequestMessageType
    Message.WhatsAppContentMessageRequest:
      oneOf:
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppTextMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppTextMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              type: string
              description: The message text.
          required:
            - message_type
            - to
            - from
            - body
          description: >-
            Send a plain text WhatsApp message. Allowed only within the 24-hour
            customer service window.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppImageMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppImageMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppImageBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Send an image message, with an optional caption.
        - type: object
          properties:
            message_type:
              type: string
              enum:
                - whatsapp_media_audio
              description: 'Discriminator value: whatsapp_media_audio'
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppContentMessageRequestDiscriminatorMappingWhatsappMediaAudioCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppAudioBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Send an audio message.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppVideoMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppVideoMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppVideoBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Send a video message, with an optional caption.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppDocumentMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppDocumentMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppDocumentBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Send a document message, with an optional filename and caption.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppStickerMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppStickerMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppStickerBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Send a sticker message. Captions are not supported.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppLocationMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppLocationMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppLocationBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Share a location.
        - type: object
          properties:
            message_type:
              type: string
              enum:
                - whatsapp_media_contacts
              description: 'Discriminator value: whatsapp_media_contacts'
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppContentMessageRequestDiscriminatorMappingWhatsappMediaContactsCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              type: array
              items:
                $ref: '#/components/schemas/Message.WhatsAppContact'
              description: One or more contacts to share.
          required:
            - message_type
            - to
            - from
            - body
          description: Share one or more contact cards.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppReactionMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppReactionMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppReactionBody'
          required:
            - message_type
            - to
            - from
            - body
          description: React to a message with an emoji.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveCtaMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveCtaMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppInteractiveBody'
          required:
            - message_type
            - to
            - from
            - body
          description: >-
            Send a call-to-action URL interactive message. The `body.type` is
            `cta_url` and `action` carries the button's display text and URL.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveListMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveListMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppInteractiveBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Send a list interactive message (up to 10 items).
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveReplyButtonMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveReplyButtonMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppInteractiveBody'
          required:
            - message_type
            - to
            - from
            - body
          description: >-
            Send a reply-button interactive message (up to 3 buttons). The
            `body.type` is `button` and each entry in `action.buttons` is a
            `reply` button.
        - type: object
          properties:
            message_type:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveLocationRequestMessageRequestMessageType
            to:
              type: string
              description: Recipient phone number in E.164 format.
            from:
              type: string
              description: >-
                Your WhatsApp business number, prefixed with `whatsapp:`. The
                prefix is what routes the message over WhatsApp instead of
                SMS/MMS.
            status_callback:
              type: string
              format: uri
              description: >-
                A valid URL to receive message status callback events at each
                state change.
            custom_variables:
              $ref: >-
                #/components/schemas/MessageWhatsAppInteractiveLocationRequestMessageRequestCustomVariables
              description: >-
                Your own key/value string pairs to attach to the message.
                Delivered as `custom_variables` in status callbacks when
                `status_callback` is set.
            body:
              $ref: '#/components/schemas/Message.WhatsAppInteractiveBody'
          required:
            - message_type
            - to
            - from
            - body
          description: Request the customer's location.
      discriminator:
        propertyName: message_type
      title: Message.WhatsAppContentMessageRequest
```

## Examples

### Plain text

```json
{
  "to": "+15551234567",
  "from": "whatsapp:+15557654321",
  "body": "Your appointment is confirmed for tomorrow at 2pm.",
  "message_type": "whatsapp_media_text"
}
```

### Interactive reply buttons

Send a message with tappable reply buttons, ideal for simple menus or surveys. The `body.type` is
`button` and each entry in `action.buttons` is a `reply` button (up to 3).

```json
{
  "to": "+15551234567",
  "from": "whatsapp:+15557654321",
  "body": {
    "type": "button",
    "body": { "text": "How can we help?" },
    "action": {
      "buttons": [
        { "type": "reply", "reply": { "id": "sales",   "title": "Talk to Sales" } },
        { "type": "reply", "reply": { "id": "support", "title": "Get Support" } },
        { "type": "reply", "reply": { "id": "exit",    "title": "No thanks" } }
      ]
    }
  },
  "message_type": "whatsapp_interactive_reply_button"
}
```

### Template message

Use a [template](/docs/platform/messaging/whatsapp/message-templates) when reaching out to a customer
for the first time, or outside the 24-hour window. Provide the `template_id` and fill in any
placeholders; the template must be **approved**. Use an array for positional parameters or an object
for named parameters.

#### Positional parameters

```json
{
  "to": "+15551234567",
  "from": "whatsapp:+15557654321",
  "template_id": "{template_id}",
  "header_template_parameters": ["Jane Smith"],
  "body_template_parameters": ["ORD-9821", "out for delivery"]
}
```

#### Named parameters

```json
{
  "to": "+15551234567",
  "from": "whatsapp:+15557654321",
  "template_id": "{template_id}",
  "header_template_parameters": { "name": "Jane" },
  "body_template_parameters": { "order": "ORD-9821", "name": "Jane" }
}
```

## Next steps

#### [Send a message (API reference)](/docs/apis/rest/messages/create-message)

The full request schema for every message type.

#### [Receive messages](/docs/platform/messaging/whatsapp/receive-messages)

View inbound messages and delivery status.

#### [Message templates](/docs/platform/messaging/whatsapp/message-templates)

Create and manage Meta-approved templates.