Conecxt
Create account

Resources Insight

WhatsApp API to send messages: the Cloud API request, templates, and the no-code route

Sending a WhatsApp message through Meta's Cloud API is one HTTPS request. Knowing which kind of message you're allowed to send, to how many people, and what comes back afterwards is the longer part.

Conecxt team 11 min read

Share WhatsApp LinkedIn

The short version

  • Every send is a POST to the messages endpoint of your business phone number ID on graph.facebook.com, with a bearer token and a JSON body. Meta's examples showed Graph API v26.0 on 9 October 2026.
  • Free-form messages only go through inside the 24-hour window after the customer last wrote or called. Outside it you must send a template Meta has approved.
  • Each request carries one recipient. Sending to many numbers is a loop, bounded by your messaging limit (250 people a day for a new portfolio) and by WhatsApp's per-person marketing cap.
  • A 200 response means Meta accepted the request, not that the message arrived. Sent, delivered, read and failed statuses come later on your webhook.
  • To Indian numbers Meta charges ₹0.8631 per delivered marketing template and ₹0.115 per utility, authentication or service message, before GST, on the rate card effective 1 October 2026.

Abhinav Saxena runs a water-purifier service business in Raipur: eleven people, about 4,200 households on annual maintenance contracts, and a technician schedule kept in a spreadsheet. He wants the “your filter change is due” message to go out by itself, so he asked Keerthi, the freelance developer who built his booking form, to find a WhatsApp API to send messages.

Keerthi had the first message working in an afternoon. The rules around it took her the rest of the week. This page covers both: the request itself, then what decides whether a message is allowed, delivered and billed.

What does a send-message request look like?

It’s one HTTPS POST to Meta’s Cloud API, addressed to the ID of your business phone number. Meta’s send-messages page gives the path as POST /<WHATSAPP_BUSINESS_PHONE_NUMBER_ID>/messages, and its examples used Graph API v26.0 when we read them on 9 October 2026. Earlier pages in the same docs still show v23.0, so copy the version from the page you’re reading, not from an old blog post.

A text message, with placeholders where your own values go:

curl 'https://graph.facebook.com/v26.0/<PHONE_NUMBER_ID>/messages' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer <ACCESS_TOKEN>' \
  -d '{
    "messaging_product": "whatsapp",
    "recipient_type": "individual",
    "to": "+14155550142",
    "type": "text",
    "text": {
      "preview_url": false,
      "body": "Thanks, we have noted Saturday 11 am for the filter change."
    }
  }'

Three things in that request trip people up.

The ID in the URL is not the phone number. It’s the phone number ID that Meta’s App Dashboard shows under API Setup. The token should be a system user token with the whatsapp_business_messaging permission, because the temporary token the dashboard hands you expires quickly.

Write to with the plus sign and country code. Meta’s page says that if you leave the plus out, your own business number’s country code is added in front, which “can result in undelivered or misdelivered messages”. An Indian business that sends to a bare ten-digit number gets 91 added, which is fine until the day a customer has a Dubai number.

And type decides the rest of the body. Set it to text and a text block follows; set it to image, document or interactive and a block of that name follows instead.

What comes back

The response looks like this:

{
  "messaging_product": "whatsapp",
  "contacts": [{ "input": "+14155550142", "wa_id": "<WHATSAPP_USER_ID>" }],
  "messages": [{ "id": "wamid.<MESSAGE_ID>" }]
}

Meta is blunt about what it means: the response “only indicates that the API successfully accepted your request”, and “it does not indicate successful delivery of your message”. Store the wamid value. It’s the key you’ll match delivery updates against later.

Template or free-form: which one are you allowed to send?

Free-form messages like the one above only work inside the 24-hour customer service window. Outside it, you can only send a template Meta has approved.

The window starts when a customer messages or calls you, and resets to 24 hours each time they do it again. Abhinav’s confirmation above is a reply to a customer who had just written in, so it goes as plain text. His filter-due reminder is the opposite case. Nobody wrote to him first, so it has to be a template.

A template send uses the same endpoint with a different body:

{
  "messaging_product": "whatsapp",
  "recipient_type": "individual",
  "to": "+14155550142",
  "type": "template",
  "template": {
    "name": "filter_change_due",
    "language": { "code": "en" },
    "components": [
      {
        "type": "body",
        "parameters": [
          { "type": "text", "text": "Meenakshi" },
          { "type": "text", "text": "14 October" }
        ]
      }
    ]
  }
}

The two parameters fill the {{1}} and {{2}} placeholders in the approved template body, in order. The template has to exist first. You create it in WhatsApp Manager or through the API, Meta reviews it, and review can take up to 24 hours. Meta also decides whether it’s marketing, utility or authentication, which matters for the bill; our guide to how Meta decides a message’s category covers that, and the glossary defines the terms.

Free-form messageTemplate message
When it can be sentOnly inside the 24-hour windowAny time
Approval neededNoYes, by Meta, before first use
type in the bodytext, image, interactive and so ontemplate
Meta’s billing categoryServiceMarketing, utility or authentication
If you break the ruleFails with error 131047Fails with 132001 if not approved in that language

How do you send a WhatsApp message to multiple numbers?

One request per person. Each call carries a single to, and Meta’s send-messages page describes no version of the endpoint that takes a list. A tool that offers bulk sending on the official API is running this loop for you.

So a bulk send is your own code going through a list and calling the endpoint for each row. Three limits decide how that loop behaves.

Your messaging limit. This is the number of different people you can deliver to outside the customer service window in a moving 24 hours. A new business portfolio starts at 250. Completing business verification is the usual way to 2,000, and Meta then raises it to 10,000, 100,000 and unlimited as you send good-quality messages and use at least half your limit over seven days. The limit is shared by every number in the portfolio.

For Abhinav it’s the limit that matters most. At 250 a day, a message to all 4,200 households takes 17 days. At 2,000 it takes three. Our messaging limits guide covers how to move up.

Throughput is the speed limit. Cloud API supports up to 80 messages a second per number by default, and returns error 130429 if you go faster. A small business will rarely touch that, but a tight loop with no delay can. Sending repeatedly to the same person in a short time hits a separate limit, error 131056.

Then there’s the per-person marketing cap. WhatsApp limits how many marketing templates each person receives from all businesses combined, and Meta publishes no number for it. A capped message fails with 131049, and your loop must not retry it. The reasons are in our piece on error 131049.

You also need each person’s opt-in before any of this, and sending bulk WhatsApp messages without a ban explains what goes wrong when the list wasn’t collected properly.

How do you find out whether a message was delivered?

Through webhooks. Meta posts a status update to a URL you host each time a message is sent, delivered, read or failed, and the update carries the same message ID you stored from the response.

A trimmed delivered status looks like this:

{
  "statuses": [
    {
      "id": "wamid.<MESSAGE_ID>",
      "status": "delivered",
      "timestamp": "<UNIX_TIMESTAMP>",
      "recipient_id": "<USER_PHONE_NUMBER>",
      "pricing": {
        "billable": true,
        "pricing_model": "PMP",
        "type": "regular",
        "category": "utility"
      }
    }
  ]
}

The pricing block is how you reconcile Meta’s bill. regular means the message is charged. A service reply still inside the free monthly allowance reports free_customer_service, and anything inside a window opened by a click-to-WhatsApp ad reports free_entry_point.

A few behaviours from Meta’s reference are worth building for from day one:

  • A message read the instant it arrives may produce a read status with no delivered status before it. Treat read as implying delivered.
  • Delivery order isn’t guaranteed to match the order of your requests. If sequence matters, wait for the delivered status before sending the next message.
  • If a phone is unreachable, Meta keeps trying for 30 days by default (10 minutes for authentication templates), then drops the message.
  • Failed webhooks are re-sent with increasing gaps for up to 7 days, so your server will see old updates after an outage.

Which errors will you see most often?

Most failures fall into a handful of codes, and several arrive on the webhook after the request itself looked fine. These are the ones Keerthi met in her first fortnight, with Meta’s own description of each.

CodeWhat Meta saysWhat to do
190Access token has expiredUse a system user token, not the temporary one
131047More than 24 hours since the recipient last repliedSend a template instead
131026Unable to deliver; for example the number isn’t on WhatsAppMark the contact, don’t retry
132000Number of parameter values doesn’t match the templateSend one value per placeholder
132001Template doesn’t exist in that language or isn’t approvedCheck name, language code and status
131049Not delivered “to maintain healthy ecosystem engagement”Wait at least 24 hours; never auto-retry
131050Recipient chose to stop marketing messages from youStop marketing to that person
130429Throughput has been reachedSlow the loop down
131042Error related to your payment methodFix billing in Meta Business Suite

The mistake we’d warn a developer about first is a single retry rule for every failure. A timeout deserves one retry. 131049, 131050 and 131026 deserve none.

What does each message cost?

Meta charges per delivered message, by category and by the recipient’s country code. A request that’s accepted but never delivered costs nothing.

For Indian (+91) numbers, on Meta’s rupee rate card effective 1 October 2026, read on 9 October 2026, before GST:

What you sendMeta’s rate per delivered message
Marketing template₹0.8631
Utility template₹0.115
Authentication template₹0.115
Service (free-form reply in the window)₹0.115 after the first 1,000 per business number each month

Take Abhinav’s first month as an example. He sends 1,800 filter-due reminders as utility templates (1,800 × ₹0.115 = ₹207), one monsoon offer to all 4,200 opted-in households as a marketing template (4,200 × ₹0.8631 = ₹3,625), and 1,400 replies, of which 400 are charged (400 × ₹0.115 = ₹46). That’s about ₹3,878 before GST, and the single offer is about 93% of it. The cost guide has larger worked examples.

Is there a WhatsApp bot API?

There’s no separate one. A bot is the same two pieces used together: a webhook that receives the customer’s message, and the send endpoint that answers it inside the 24-hour window.

That makes bot replies service messages, so they count towards the 1,000 a month per number and cost ₹0.115 each after it. A bot also can’t start a conversation with free-form text; for that it needs a template like anything else. Our WhatsApp chatbot guide compares the kinds of bot you can build and what each costs to run.

When is a no-code tool simpler than writing this yourself?

When people, not just a script, need to work the conversations. The send call is the small part of the job. Replies need a screen, a person assigned to each one, and a history that survives staff changes.

Going direct suits you if messages are triggered by your own system, volumes are steady, and you have a developer who will still be around when Meta changes something. Meta’s own pages show examples on two Graph API versions today, and service-message billing changed on 1 October. Somebody has to own that. You also host the webhook server, build template management, store opt-ins and opt-outs, and handle every row in the error table above.

Going direct, you pay Meta’s message charges, your developer’s time and a server for the webhook. There are also API providers that sit between you and Meta. We’ve priced two of them separately, one that bills per message and one that charges per number. And if you haven’t got access yet, start with how to get the WhatsApp Business API in India.

A no-code tool is the better choice when the sender is a marketing or operations person, when replies come to a team, or when nobody wants to be on call for a webhook. It’s the worse choice if you need custom logic deep inside your own software and already have the engineers.

Abhinav ended up doing both. Keerthi’s script still sends the booking confirmation the moment the form is submitted, because that’s one template tied to one event. The reminders and the monsoon offer moved to a tool his office manager can run. If you’re starting this week, send one template to your own phone with the curl above, read the webhook that comes back, and decide after that how much of the rest you want to build.

Common questions

Which WhatsApp API do I use to send messages?

Meta's Cloud API, part of the WhatsApp Business Platform. Every message is a POST request to the messages endpoint of your business phone number ID on graph.facebook.com, with a bearer access token and a JSON body naming the recipient, the message type and its contents. Meta's examples showed Graph API v26.0 on 9 October 2026.

Can the WhatsApp API send a message to multiple numbers at once?

Not in one request. Each call to the messages endpoint carries one recipient, so sending to many numbers means one request per person. A new business portfolio can reach 250 different people in a rolling 24 hours outside the customer service window, and business verification is the usual way to 2,000.

Can I send any text through the WhatsApp API, or only templates?

Free-form text is allowed only inside the 24-hour customer service window, which opens and resets each time the customer messages or calls you. Outside that window you can only send a template Meta has approved. A free-form message sent too late fails with error 131047.

How much does it cost to send a WhatsApp message through the API in India?

On Meta's rupee rate card effective 1 October 2026, a delivered marketing template to an Indian number costs ₹0.8631 and a utility or authentication template ₹0.115, before GST. Free-form service replies cost ₹0.115 each after the first 1,000 per business number per month. Undelivered messages aren't charged.

How do I know whether a WhatsApp API message was delivered?

The API response only confirms that Meta accepted the request. Delivery arrives later as status updates on your messages webhook: sent, delivered, read or failed, each carrying the message ID from the original response. A failed status includes an error code that explains why.

Sources

  1. Send messages (Meta for Developers) · Updated 21 May 2026, read 9 Oct 2026
  2. Text messages (Meta for Developers) · Updated 2 Jul 2026, read 9 Oct 2026
  3. Get started with Cloud API (Meta for Developers) · Updated 16 Jun 2026, read 9 Oct 2026
  4. Template fundamentals (Meta for Developers) · Updated 21 May 2026, read 9 Oct 2026
  5. Status messages webhook reference (Meta for Developers) · Updated 14 Sep 2026, read 9 Oct 2026
  6. Messaging limits (Meta for Developers) · Updated 21 May 2026, read 9 Oct 2026
  7. Throughput (Meta for Developers) · Updated 17 Jun 2026, read 9 Oct 2026
  8. Per-user marketing template message limits (Meta for Developers) · Updated 17 Jun 2026, read 9 Oct 2026
  9. Error codes (Meta for Developers) · Updated 18 Jun 2026, read 9 Oct 2026
  10. Get opt-in for WhatsApp (Meta for Developers) · Updated 16 Jun 2026
  11. Pricing on the WhatsApp Business Platform (Meta for Developers) · Updated 30 Sep 2026; INR rate card effective 1 Oct 2026, read 9 Oct 2026
Share WhatsApp LinkedIn

Get the next one

One email when something new is published. Nothing else.

Unsubscribe from any email. See our privacy policy.

Run this on your own number

Create an account, connect your WhatsApp number, and invite your team.