WhatsApp API & Developers

How to Send a Message to a WhatsApp Group via API

You run a class batch, a dealer network or a customer community in a WhatsApp group, and you want your system to post into it: the morning rate card, a schedule change, a "new stock just landed" alert. It sounds like one API call. Whether you can send a message to a WhatsApp group by API depends on which group you mean.

In 2026 there are two real answers. Meta's Groups API lets an Official Business Account create small, invite-only groups and message them. Linked-number APIs post into the groups your number already belongs to. They solve different problems, and picking the wrong one costs a week.

This guide helps you choose, then shows the working calls for both.

Which group API do you need?

If the group already exists on your number, Meta's API can't reach it. That one fact decides most cases.

Your situationUse
The group exists today and your customers are in itLinked-number API
The group has, or will have, more than 8 peopleLinked-number API (Meta's Groups API caps groups at 8 participants)
Your number runs on the WhatsApp Business appLinked-number API (Groups API isn't available for Business app numbers)
You have an Official Business Account and want small new groups per customer, deal or projectMeta's Groups API
You need Meta billing, templates and Cloud API compliance for group messagesMeta's Groups API

If you've used a WhatsApp API tool before and wondered why your groups never showed up, our earlier post on why API tools couldn't access your groups explains the background. Meta has since added the Groups API, but it still can't read or join groups a number is already in.

Option 1: Meta's Groups API

Create a group, share its invite link, then send to the group ID with recipient_type set to group.

Requirements and limits, as of October 2026, from Meta's Groups API docs:

  • Your business must be an Official Business Account (OBA), and the number must be on the Cloud API, not the Business app.
  • Up to 8 participants per group, up to 10,000 groups per business number, and one Cloud API business per group.
  • Groups are invite-only: people join through an invite link you send them. You can't add someone directly.
  • Supported: text, media, and text or media templates. Not supported: interactive messages, calling, disappearing messages, view-once, authentication and commerce messages, and editing or deleting messages.

The flow:

  1. Create the group with a subject and optional description using the Create Group endpoint (see Meta's Groups reference for the exact request).
  2. Wait for the group_lifecycle_update webhook. On success it includes an invite_link.
  3. Send the link to each person. Meta's docs describe doing this with an approved group invite link template.
  4. Watch group_participants_update to see who joined.
  5. Send to the group through the normal messages endpoint:
curl -X POST "https://graph.facebook.com/v23.0/PHONE_NUMBER_ID/messages" \
  -H "Authorization: Bearer $WHATSAPP_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "messaging_product": "whatsapp",
    "recipient_type": "group",
    "to": "GROUP_ID",
    "type": "text",
    "text": { "body": "Site visit moved to 11 am tomorrow. Same address." }
  }'

Use the current Graph API version from Meta's changelog in place of v23.0. Delivery and read statuses for groups come back with recipient_type: group and are aggregated across participants. Group messages use per-message pricing, which Meta documents on a separate Groups pricing page. One practical tip from Meta's docs: create templates specifically for group use, because template performance metrics aren't available for templates sent in groups.

This option fits a specific shape of work: a verified brand opening a small room with a customer and two of its own staff, such as a project, a claim or a high-value order.

Option 2: Post into groups your number is already in

A linked-number API sees the same groups your phone sees, so you look up the chat's ID and send to it.

Because the API connects as a linked device on your own account, every group your number belongs to is just another conversation. With Tenashi's API it's two calls. First, list your groups:

curl "https://usetenashi.com/api/v1/conversations?filter=groups" \
  -H "Authorization: Bearer $TENASHI_KEY"

Each item has an id, type (group), name, lastMessageAt and unreadCount, 50 per page with a nextCursor. Then send using the group's id as conversationId:

curl https://usetenashi.com/api/v1/messages \
  -H "Authorization: Bearer $TENASHI_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: batch12-2026-10-30-schedule" \
  -d '{"conversationId": "cmh0a9s8d7f6g5h4j3k2l1", "text": "Reminder: the batch starts Monday at 7 am."}'

Here's a small Node.js script (Node 18 or later, saved as post-rates.mjs) that finds a group by name and posts the day's rate card as a PDF:

const API = "https://usetenashi.com/api/v1";
const headers = {
  Authorization: `Bearer ${process.env.TENASHI_KEY}`,
  "Content-Type": "application/json",
};

async function findGroup(name) {
  let cursor = null;
  do {
    const qs = cursor ? `&cursor=${encodeURIComponent(cursor)}` : "";
    const res = await fetch(`${API}/conversations?filter=groups${qs}`, { headers });
    if (!res.ok) throw new Error(`List failed: ${res.status}`);
    const page = await res.json();
    const hit = page.items.find((c) => c.name === name);
    if (hit) return hit.id;
    cursor = page.nextCursor;
  } while (cursor);
  throw new Error(`No group named "${name}"`);
}

const today = new Date().toISOString().slice(0, 10);
const conversationId = await findGroup("Dealers North");

const res = await fetch(`${API}/messages`, {
  method: "POST",
  headers: { ...headers, "Idempotency-Key": `rates-${today}` },
  body: JSON.stringify({
    conversationId,
    text: `Rate card for ${today}. Reply here with orders before 2 pm.`,
    media: { url: "https://example.com/rates/today.pdf", filename: `rates-${today}.pdf` },
  }),
});
console.log(res.status, await res.json());

The Idempotency-Key means a cron job that fires twice still posts once: a repeat with the same key within 24 hours returns the first response and sends nothing. The send returns 202 with the message queued, and replies from members arrive as message.received webhooks with the chat type group. For the receiving side, see our guide to WhatsApp API webhooks.

Group etiquette that keeps the number healthy

Groups are shared rooms. Automate like a considerate member, not a broadcaster.

  • Post where you're expected: groups you run, or groups that invited your business to post.
  • Don't fan the same message into dozens of groups at once. It irritates members and looks like spam to WhatsApp's systems.
  • Check the group's settings. If only admins can send messages, your number has to be an admin.
  • Respect quiet hours for the people in the group, not your server's time zone.
  • Watch the signals. Members leaving or reporting after automated posts means change the content or the cadence.

Using a linked number to post in groups isn't authorized by WhatsApp's terms; our explainer on the unofficial WhatsApp API covers that risk honestly.

Where Tenashi fits

If the groups you need are the ones your number is already in, Tenashi is built for exactly this. Link your existing WhatsApp or WhatsApp Business number by QR scan, list groups with ?filter=groups, and post with conversationId, with text, images, video or documents. Every API post appears in the shared team inbox next to the group's history, so whoever is on duty sees the rate card that went out and the orders that came back, and can reply, assign or add a note.

The limits are honest ones. Sends are paced at one every 4 to 12 seconds per number, identical text going to 5 chats within 10 minutes is paused, and there are no polls, buttons or templates. Tenashi is not endorsed by Meta, and WhatsApp can still act on a number that spams groups.

Read the API docs · Get started

FAQ

Can the WhatsApp Business API send messages to a group?

Yes, with limits. Meta's Groups API lets an Official Business Account create invite-only groups of up to 8 participants and send text, media and templates to them. It can't post into groups your number was already in before. For those, you need a linked-number API that connects to your existing account.

How many people can be in a Groups API group?

Meta's Groups API allows up to 8 participants per group, with up to 10,000 groups per business number, as of October 2026. That suits small rooms for a customer, deal or project, not communities or class batches. Groups your number belongs to through the normal app follow WhatsApp's regular group size limits.

Can I add people to a WhatsApp group through the API?

Not directly with Meta's Groups API. It's invite-only: you create the group, receive an invite link by webhook and send that link to people, who decide whether to join. With a linked-number API, you post into groups your number already belongs to, and membership is managed the way it is in the app.

Can I send files or images to a WhatsApp group by API?

Yes on both routes. Meta's Groups API supports media messages and media templates in groups. Tenashi's API accepts a media object with a URL or base64 data alongside conversationId, with images up to 5 MB, video up to 16 MB, and PDFs and Office files up to 25 MB.

How do I read replies from a WhatsApp group by API?

On Meta's Groups API, group messages and participant changes arrive through Cloud API webhooks for the groups you created. With Tenashi, a message.received webhook fires for every inbound message in a DM or group, carrying the conversation ID and sender, so your code can match replies to the post that prompted them.


Pick the API by the group: new and small with an Official Business Account, Meta's Groups API; existing and busy, a linked number. If yours is the second kind, read the Tenashi API docs, and for every other WhatsApp API question see our complete guide to the WhatsApp API.