The WhatsApp Business Platform, through the API key you already use for payments. Send order confirmations, receipts and OTPs from your own business number, and receive replies.
One rule governs everything: outside a conversation you may only send a template Meta has approved. Once a customer replies, a 24-hour window opens and free text works until it closes. Almost every message that never arrived is a free-text send outside an open window.
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.
Submit a template to Meta for review
You need an approved template to start any conversation, because outside an open 24-hour window it is the only thing WhatsApp delivers. Templates start PENDING; review usually takes minutes but can take much longer, so get them approved before launch day rather than during it.
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.
List the numbers you can send from
Do this before your first send: it tells you what to put in `from`, and whether your customers see your brand or ours. If the only entry is SHARED_PLATFORM you have no number of your own yet and customers see MALIPOPAY as the sender.
Set the default sender, or point a webhook at a number
Webhook URLs are configured per number here, not per project. These deliveries are separate from your payment webhooks and use a different signature scheme.
Read the business profile of one of your numbers
Read the business profile of one of your numbers
Update the business profile of one of your numbers
A partial update: only the fields you send are changed. The display name is not editable here, because changing an approved one is a separate Meta review.
Set the logo customers see for one of your numbers
Multipart. JPEG or PNG, 5MB maximum. WhatsApp renders it in a circle, so a square image keeps its edges.
Ask Meta to send a verification code to a number
Meta sends the code to the handset itself, so whoever holds the phone has to complete the next step. Nobody at Malipopay can do it for you.
Submit the code and register the number
Returns the two-step verification PIN once. Store it before you close the response.
Fetch one template and refresh its status
Reads the current status back from Meta, so a template approved minutes ago shows as APPROVED here.
Delete a template
Deletion is permanent at Meta, and a name that has been used and deleted cannot always be reused straight away. Version your names rather than deleting and recreating under the same one.
Re-sync every template status from Meta
Pulls the full list from Meta across all your connected accounts and reconciles status, category and rejection reason. This is the fix when the dashboard looks stale.
Upload a media file and get back a media id
Upload once and reuse the id instead of hosting the file yourself. A media id is scoped to the number that uploaded it, so upload under the same `from` you intend to send from or the send fails.
Download the media attached to a message
An inbound media message carries a Meta media id, not the file, and the URL it resolves to is short lived and needs the account token. This resolves and downloads it server side and streams the bytes back, so an inbox can point an image tag straight at it. Responds with the file, not JSON. Do it promptly: Meta expires media ids after 30 days.
Export your messages as CSV
The same data as the message list, as a download.
Clear the unread badge on a conversation
For building your own inbox. Nothing is sent to the customer.
Your WhatsApp spend, by conversation category
WhatsApp is billed per 24-hour conversation, not per message, so batching updates into a single open window is genuinely cheaper than spreading them out. Defaults to the current calendar month.
List your connected WhatsApp Business Accounts
List your connected WhatsApp Business Accounts
Fetch one connected account
Refreshes the fast-moving fields, currency and quality rating, from Meta on read.
Disconnect an account
Marks the account REVOKED. Your messages, conversations and billing records are kept for audit and are not deleted with it.
Rotate the signing secret for a number
The secret that signs your webhook deliveries is per number, not per project, and is not your API key. The new one is returned once and cannot be read back. Deliveries already queued were signed with the previous secret, so accept both for a few minutes after rotating. Every 90 days is a reasonable cadence.
Start Meta Embedded Signup
The first half of connecting your own number through Meta. Returns what the browser flow needs, including a signed state token good for five minutes that you echo back on the callback. Most merchants do this from the dashboard under WhatsApp then Numbers rather than by calling it directly.
Finish Meta Embedded Signup
Exchanges the code Meta returned for a token, stores the account and its numbers, and subscribes us to their webhooks. The response carries a webhook signing secret per number, returned once.
Apply to connect your own number
The other way to get your own number: apply, and we add it to the platform account for you. Use this when you do not have a Meta Business account of your own to run Embedded Signup against.
List your connection requests
List your connection requests
Add your number to the platform account and have Meta text it a code
You drive this rather than us, because Meta sends the code to the handset itself. Only one number can be mid-verification at a time.
Enter the code Meta sent and register the number
Enter the code Meta sent and register the number