Send an approved WhatsApp template
Send `values` to fill everything the template asks for: body variables, a media header, and a value per button (a link, a coupon code, or a quick-reply payload). A link button without its value renders with nothing substituted, so every recipient lands on the same page. Read the field list for a template from `inputs` on GET /api/v1/waba/templates. `variables` remains as a body-only shorthand. A send missing a required value is refused with 400 naming the field, and nothing is billed.
Send any WhatsApp message type
Text, template, media, interactive, location, contacts or reaction. Free text only reaches a customer inside an open 24-hour window; use a template to start one.
List the messages you sent and received
List the messages you sent and received
Bulk send from a CSV or Excel file
Multipart upload. The file needs a header row with a `to` column, one recipient per row, and may be CSV or .xlsx. Upload the workbook rather than exporting it first: a phone number in a General-formatted Excel cell exports to CSV as 2.55712E+11.
Summarise one bulk send by status
Counts the batch by message status, so a run of hundreds gives one number per outcome rather than pages of rows. `queued` has not reached Meta yet, which is expected immediately after upload.
List your WhatsApp templates
Each template carries an `inputs` object describing what a send must supply: body variables, header, and every button that takes a value with its index and label.
List 24-hour conversation windows
List 24-hour conversation windows
Read one conversation thread
Returns the whole exchange with that contact on that number, oldest first, scoped to your own project. It resolves the conversation to its contact rather than reading the single billing window, so a template you sent appears in the same thread as the reply it produced. On a number shared with other merchants you never see theirs.
Reply with free text inside an open window
Only delivers while the 24-hour window is open. Send a template to reopen one. Pass `replyToMessageDocId` to quote a specific message in the thread, which WhatsApp renders attached to it. That is the message id returned by the timeline route, not Meta's wamid: the wamid is read off our own record, which is what stops a caller quoting a message outside their own conversation.
WhatsApp usage analytics
Daily sent / delivered / failed series, status totals and delivery rate, inbound count, spend per category, and credit balance. Defaults to the trailing 30 days.
Send an image, document, audio, video or sticker into a conversation
Multipart. The file is uploaded to Meta and sent as a media message, and a copy is archived so the thread still renders it after Meta's 30-day media retention expires. The WhatsApp type is inferred from the MIME type, so `image/webp` becomes a sticker rather than an image. Size ceilings are Meta's own and differ sharply by type: image 5MB, sticker 512KB, audio and video 16MB, document 100MB. Checked before upload, so an oversized file is refused with the limit and the actual size named. Session message, so it needs an open window.
React to a message in a conversation
Takes the id of our own message row, not Meta's wamid: the wamid is read off the row, so a caller cannot react to a message outside their own conversation. Send an empty `emoji` to remove a reaction, which is how Meta models it; there is no delete call. Reactions are never charged.
Send an approved template into a conversation
The one message WhatsApp still delivers once the 24-hour window has closed. Prefer `values` over a hand-built `components` array: the stored template definition is read and the component array assembled, which is the only way an authentication template gets its code into both the body and the OTP button.