WhatsApp Service Messages — Reference

Every message type with its description, request payload, limits, and a field-by-field required / optional breakdown. Companion to the Postman collection.

Host: {{base_url}}/{{phone_number_id}}/messages — provided by Atmik Bharat Auth: Bearer {{access_token}} Media: always link (URL), never id
Common envelope — present in every payload below; the per-type tables only list the type-specific object.
FieldTypeRequired?Notes
messaging_productstringRequiredAlways "whatsapp".
recipient_typestringOptional"individual" (default).
tostringRequiredRecipient phone (E.164, with country code).
typestringRequiredMessage type, e.g. text / image / interactive …
RequiredOptionalConditional — Conditional = required only in certain cases (noted).

Text

text Meta docs ↗

A text body with an optional link preview. URLs in the body are auto-hyperlinked.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "text",
  "text": {
    "preview_url": true,
    "body": "As requested, here's the link to our latest product: https://www.example.com/product"
  }
}

Fields

FieldTypeRequired?Notes
text.bodystringRequiredThe message text. Max 4096 chars.
text.preview_urlbooleanOptionaltrue = render a preview of the first URL in body.

Limits

ConstraintValue
bodymax 4096 characters
preview_urlpreviews first URL only, when true
URL schememust start with http:// or https://

Audio

audio Meta docs ↗

An audio clip delivered from a public URL. Audio has no caption.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "audio",
  "audio": {
    "link": "{{media_audio_url}}"
  }
}

Fields

FieldTypeRequired?Notes
audio.linkstring (URL)RequiredPublic URL of the audio file. Never a media id.

Limits

ConstraintValue
Max file size16 MB
FormatsAAC, AMR, MP3, M4A, OGG (OPUS only, mono)
CaptionNot supported

Image

image Meta docs ↗

An image delivered from a public URL, with an optional caption.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "image",
  "image": {
    "link": "{{media_image_url}}",
    "caption": "Optional caption text"
  }
}

Fields

FieldTypeRequired?Notes
image.linkstring (URL)RequiredPublic URL of the image. Never a media id.
image.captionstringOptionalCaption shown under the image. Max 1024 chars.

Limits

ConstraintValue
Max file size5 MB
FormatsJPEG, PNG
captionmax 1024 characters

Video

video Meta docs ↗

A video delivered from a public URL, with an optional caption.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "video",
  "video": {
    "link": "{{media_video_url}}",
    "caption": "Optional caption text"
  }
}

Fields

FieldTypeRequired?Notes
video.linkstring (URL)RequiredPublic URL of the video. Never a media id.
video.captionstringOptionalCaption shown under the video. Max 1024 chars.

Limits

ConstraintValue
Max file size16 MB
FormatsMP4, 3GPP — H.264 video + AAC audio only
captionmax 1024 characters

Document

document Meta docs ↗

A document (PDF, Office files, txt, etc.) delivered from a public URL.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "document",
  "document": {
    "link": "{{media_document_url}}",
    "caption": "Optional caption text",
    "filename": "document.pdf"
  }
}

Fields

FieldTypeRequired?Notes
document.linkstring (URL)RequiredPublic URL of the document. Never a media id.
document.captionstringOptionalCaption shown with the document. Max 1024 chars.
document.filenamestringOptionalDisplay filename; extension drives the file-type icon.

Limits

ConstraintValue
Max file size100 MB
captionmax 1024 characters
filenamedisplay name; extension drives the file-type icon

Sticker

sticker Meta docs ↗

A WebP sticker delivered from a public URL. No caption.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "sticker",
  "sticker": {
    "link": "{{media_sticker_url}}"
  }
}

Fields

FieldTypeRequired?Notes
sticker.linkstring (URL)RequiredPublic URL of the .webp sticker. Never a media id.

Limits

ConstraintValue
FormatWebP only
Staticmax 100 KB
Animatedmax 500 KB
CaptionNot supported

Contacts

contacts Meta docs ↗

One or more contact cards. contacts is an array — each entry is a full contact.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "contacts",
  "contacts": [
    {
      "name": {
        "formatted_name": "John Doe",
        "first_name": "John",
        "last_name": "Doe"
      },
      "phones": [
        {
          "phone": "+16505551234",
          "type": "WORK",
          "wa_id": "16505551234"
        }
      ],
      "emails": [
        {
          "email": "john@example.com",
          "type": "WORK"
        }
      ],
      "org": {
        "company": "Example Inc",
        "department": "Sales",
        "title": "Manager"
      },
      "urls": [
        {
          "url": "https://www.example.com",
          "type": "WORK"
        }
      ],
      "addresses": [
        {
          "street": "1 Hacker Way",
          "city": "Menlo Park",
          "state": "CA",
          "zip": "94025",
          "country": "United States",
          "country_code": "us",
          "type": "WORK"
        }
      ],
      "birthday": "1990-01-15"
    }
  ]
}

Fields

FieldTypeRequired?Notes
contactsarrayRequiredArray of contact objects.
contacts[].nameobjectRequiredName object.
name.formatted_namestringRequiredFull display name.
name.first_name / last_name / …stringConditionalAt least one required besides formatted_name.
contacts[].phonesarrayOptionalphone, type (HOME/WORK), wa_id.
contacts[].emailsarrayOptionalemail, type.
contacts[].orgobjectOptionalcompany, department, title.
contacts[].urlsarrayOptionalurl, type.
contacts[].addressesarrayOptionalstreet, city, state, zip, country, country_code, type.
contacts[].birthdaystringOptionalYYYY-MM-DD.

Limits

ConstraintValue
nameformatted_name + ≥1 other name field
type fieldsHOME or WORK
birthdayYYYY-MM-DD
wa_idmakes the phone tappable to open a chat

Location

location Meta docs ↗

A pin on the map. Optionally labelled with a name and address.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "location",
  "location": {
    "latitude": "21.1938",
    "longitude": "81.3509",
    "name": "Atmik Bharat Industries",
    "address": "Bhilai, Chhattisgarh, India"
  }
}

Fields

FieldTypeRequired?Notes
location.latitudestring/numberRequiredLatitude.
location.longitudestring/numberRequiredLongitude.
location.namestringOptionalLabel for the pin.
location.addressstringOptionalAddress under the name.

Limits

ConstraintValue
latitude / longituderequired
name + addressoptional — set together so the pin shows a label

Reaction

reaction Meta docs ↗

React to a previous message with a single emoji.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "reaction",
  "reaction": {
    "message_id": "{{wamid_to_react_to}}",
    "emoji": "👍"
  }
}

Fields

FieldTypeRequired?Notes
reaction.message_idstring (wamid)Requiredwamid being reacted to.
reaction.emojistringRequiredSingle emoji, or "" to remove.

Limits

ConstraintValue
message_idvalid wamid, ≤ 30 days old, not deleted
emojisingle emoji; "" removes the reaction

Interactive — Reply buttons

interactive · button Meta docs ↗

Up to 3 quick-reply buttons under a body, with optional header and footer.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "interactive",
  "interactive": {
    "type": "button",
    "header": {
      "type": "image",
      "image": {
        "link": "{{media_image_url}}"
      }
    },
    "body": {
      "text": "Pick an option below."
    },
    "footer": {
      "text": "Powered by Atmik Bharat"
    },
    "action": {
      "buttons": [
        {
          "type": "reply",
          "reply": {
            "id": "btn-1",
            "title": "Yes"
          }
        },
        {
          "type": "reply",
          "reply": {
            "id": "btn-2",
            "title": "No"
          }
        },
        {
          "type": "reply",
          "reply": {
            "id": "btn-3",
            "title": "Maybe"
          }
        }
      ]
    }
  }
}

Fields

FieldTypeRequired?Notes
interactive.typestringRequiredMust be "button".
interactive.body.textstringRequiredBody text. Max 1024.
interactive.headerobjectOptionaltext, or media via link.
interactive.footer.textstringOptionalMax 60.
action.buttonsarrayRequired1–3 buttons.
buttons[].reply.idstringRequiredUnique payload id. Max 256.
buttons[].reply.titlestringRequiredLabel. Max 20.

Limits

ConstraintValue
Buttons1 to 3
Button titlemax 20 characters
Button idmax 256 characters, unique per message
body.textmax 1024 characters
footer.textmax 60 characters
headeroptional — text or media via link

Interactive — List

interactive · list Meta docs ↗

A button that opens a list of selectable rows, grouped into sections.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "interactive",
  "interactive": {
    "type": "list",
    "header": {
      "type": "text",
      "text": "Our Menu"
    },
    "body": {
      "text": "Choose an item from the list."
    },
    "footer": {
      "text": "Powered by Atmik Bharat"
    },
    "action": {
      "button": "View options",
      "sections": [
        {
          "title": "Channels",
          "rows": [
            {
              "id": "row-wa",
              "title": "WhatsApp",
              "description": "WABA messaging & calling"
            },
            {
              "id": "row-ig",
              "title": "Instagram",
              "description": "DM & comment management"
            }
          ]
        },
        {
          "title": "Tools",
          "rows": [
            {
              "id": "row-flow",
              "title": "Workflows",
              "description": "No-code automation"
            }
          ]
        }
      ]
    }
  }
}

Fields

FieldTypeRequired?Notes
interactive.typestringRequiredMust be "list".
interactive.body.textstringRequiredBody text. Max 4096.
interactive.headerobjectOptionalText only.
interactive.footer.textstringOptionalMax 60.
action.buttonstringRequiredOpener label. Max 20.
action.sectionsarrayRequired1–10 sections.
sections[].titlestringConditionalRequired if >1 section. Max 24.
sections[].rowsarrayRequiredMax 10 total across all sections.
rows[].idstringRequiredUnique. Max 200.
rows[].titlestringRequiredMax 24.
rows[].descriptionstringOptionalMax 72.

Limits

ConstraintValue
Total rowsmax 10 across all sections
Sectionsmax 10
Row titlemax 24
Row descriptionmax 72
Row idmax 200
Section titlemax 24
Button labelmax 20
body.textmax 4096
footer.textmax 60
headertext only

Interactive — URL button (CTA URL)

interactive · cta_url Meta docs ↗

A tappable button that opens a URL in the device browser.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "interactive",
  "interactive": {
    "type": "cta_url",
    "header": {
      "type": "text",
      "text": "Special offer"
    },
    "body": {
      "text": "Tap below to view the offer on our website."
    },
    "footer": {
      "text": "Powered by Atmik Bharat"
    },
    "action": {
      "name": "cta_url",
      "parameters": {
        "display_text": "Visit website",
        "url": "https://www.example.com/offer"
      }
    }
  }
}

Fields

FieldTypeRequired?Notes
interactive.typestringRequiredMust be "cta_url".
interactive.body.textstringRequiredMax 1024.
interactive.headerobjectOptionaltext or media via link.
interactive.footer.textstringOptionalMax 60.
action.namestringRequiredMust be "cta_url".
action.parameters.display_textstringRequiredButton label.
action.parameters.urlstring (URL)RequiredDestination URL.

Limits

ConstraintValue
display_text~20 characters
body.textmax 1024
footer.textmax 60
headeroptional — text or media via link

Location request

interactive · location_request_message Meta docs ↗

Prompts the user with a Send location button; result arrives via webhook.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "interactive",
  "interactive": {
    "type": "location_request_message",
    "body": {
      "text": "Please share your location so we can find the nearest store."
    },
    "action": {
      "name": "send_location"
    }
  }
}

Fields

FieldTypeRequired?Notes
interactive.typestringRequiredMust be "location_request_message".
interactive.body.textstringRequiredPrompt. Max 1024.
action.namestringRequiredMust be "send_location".

Limits

ConstraintValue
body.textmax 1024 characters
action.namemust be send_location

Address

interactive · address_message Meta docs ↗

Native address form. Availability: India (IN) and Singapore (SG) only. Result via webhook.

Request payload
{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "{{recipient_phone}}",
  "type": "interactive",
  "interactive": {
    "type": "address_message",
    "body": {
      "text": "Please provide your delivery address."
    },
    "action": {
      "name": "address_message",
      "parameters": {
        "country": "IN",
        "values": {
          "name": "John Doe",
          "phone_number": "+919999999999",
          "in_pin_code": "490001",
          "house_number": "12",
          "floor_number": "2",
          "tower_number": "A",
          "building_name": "Sunrise Apartments",
          "address": "Civic Centre Road",
          "landmark_area": "Near City Mall",
          "city": "Bhilai",
          "state": "Chhattisgarh"
        },
        "saved_addresses": [
          {
            "id": "address1",
            "value": {
              "name": "John Doe",
              "phone_number": "+919999999999",
              "in_pin_code": "490001",
              "house_number": "12",
              "address": "Civic Centre Road",
              "city": "Bhilai",
              "state": "Chhattisgarh"
            }
          }
        ]
      }
    }
  }
}

Fields

FieldTypeRequired?Notes
interactive.typestringRequiredMust be "address_message".
interactive.body.textstringRequiredPrompt text.
action.namestringRequiredMust be "address_message".
action.parameters.countrystringRequired"IN" or "SG".
action.parameters.valuesobjectOptionalPre-fill (country-specific).
action.parameters.saved_addressesarrayOptionalSaved addresses to pick from.
action.parameters.validation_errorsobjectOptionalfield → error map.

Limits

ConstraintValue
AvailabilityIndia (IN) & Singapore (SG) only
countryIN or SG — values schema differs
IN valuesin_pin_code, house_number, floor_number, tower_number, building_name, landmark_area, city, state…
SG valuessg_post_code, unit_number, floor_number…
valuesoptional — prefills the form
saved_addressesoptional — pick from saved
validation_errorsoptional — field → error
On preview images: Meta's docs show a rendered preview per type, but those images use signed CDN URLs that expire within days — embedding them would break. The Meta docs ↗ link on each card opens the page where its live preview is shown.