Group management | Developer Documentation
Group management
Updated: Mar 25, 2026
Overview
The Groups API gives you simple functions to control groups through their lifecycle.
When you create a new group, an invite link is created for inviting participants to the group.
Since you cannot manually add participants to the group, simply send a message with your invite link to WhatsApp users who you would like to join the group.
Group management features
To learn how to message groups, view the Group Messaging reference.
Subscribe to groups metadata webhooks
In order to receive webhook notifications for metadata about your groups, please subscribe to the following webhook fields:
group_lifecycle_updategroup_participants_updategroup_settings_updategroup_status_update
For a full reference of webhooks for the Groups API, please visit our Webhooks for Groups API reference.
Create
group
invite_linkRequest syntax
POST /<BUSINESS_PHONE_NUMBER_ID>/groupsRequest body
{ "messaging_product": "whatsapp", "subject": "<GROUP_SUBJECT>", "description": "<GROUP_DESCRIPTION>", "join_approval_mode": "<JOIN_APPROVAL_MODE>" }
Request parameters
| | |
| | |
| | |
| | |
Webhooks
group_lifecycle_updateGroup create succeed
Group create fail
User joins group using invite link
Groups with join requests
You can create groups that require join request approval. Once enabled, WhatsApp users who click the group invitation link can submit a request to join the group, or cancel a prior request:
When a WhatsApp user joins the group using a join request, a [
group_participants_update webhook for a user accepting the join request] (/documentation/business-messaging/whatsapp/groups/webhooks#user-accepts-or-cancels-join-request) is triggered. You can also get a list of open join requests via API. Use the contents of the webhook or API response to approve or reject requests.GetApprove join requests
Request
syntax
GET /<GROUP_ID>/join_requestsRequest parameters
<GROUP_ID>String
Required.
Group ID.
Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZDResponse
syntax
{ "data": [ { "join_request_id": "<JOIN_REQUEST_ID>", "wa_id": "<WHATSAPP_USER_ID>", "creation_timestamp": "<JOIN_REQUEST_CREATION_TIMESTAMP"> }, //Additional join request objects would follow, if any ], "paging": { "cursors": { "before": "<BEFORE_CURSOR>", "after": "<AFTER_CURSOR>" } } }
Response parameters
<JOIN_REQUEST_ID>String
MTY0NjcwNDM1OTU6MTIwMzYzNDA0Njk0MjMzODIw<WHATSAPP_USER_ID>16505551234<JOIN_REQUEST_CREATION_TIMESTAMP>1755548877<BEFORE_CURSOR>eyJvZAmZAzZAXQiOjAsInZAlcnNpb25JZACI6IjE3NTU1NTM3MDUxNzUwNTQ1MTAifQZDZD<AFTER_CURSOR>eyJvZAmZAzZAXQiOjAsInZAlcnNpb25JZACI6IjE3NTU1NTM3MDUxNzUwNTQ1MTAifQZDZDApprove join requests
Request syntax
POST /<GROUP_ID>/join_requestsRequest body
{ "messaging_product": "whatsapp", "join_requests": [ "<JOIN_REQUEST_ID>", // Additional join request IDs would go here, if approving in bulk ] }
Request parameters
| |
Response syntax
{ "messaging_product": "whatsapp", "approved_join_requests": [ "<JOIN_REQUEST_ID>", // Additional join request IDs would go here, it approved in bulk ], //Only included if unable to approve one or more join requests "failed_join_requests": [ { "join_request_id": "<JOIN_REQUEST_ID>", "errors": [ { "code": "<ERROR_CODE>", "message": "<ERROR_MESSAGE>", "title": "<ERROR_TITLE>", "error_data": { "details": "<ERROR_DETAILS>" } } ] } ], "errors": [ { "code": "<ERROR_CODE>", "message": "<ERROR_MESSAGE>", "title": "<ERROR_TITLE>", "error_data": { "details": "<ERROR_DETAILS>" } } ] }
Response parameters
| ID of approved join request, or ID of failed join request, if we were unable to approve. |
MTY0NjcwNDM1OTU6MTIwMzYzNDA0Njk0MjMzODIw<ERROR_CODE>Integer
Error code, if unable to approve.
131203<ERROR_MESSAGE>String
Error message, if unable to approve.
(#131203) Recipient has not accepted our new Terms of Service and Privacy Policy.<ERROR_TITLE>String
Error title, if unable to approve.
Unable to add participant to group<ERROR_DETAILS>String
Error details, if unable to approve.
Recipient has not accepted our new Terms of Service and Privacy Policy.Webhook
group_participants_updateReject join requests
Request
syntax
DELETE /<GROUP_ID>/join_requestsRequest body
{ "messaging_product": "whatsapp", "join_requests": [ "<JOIN_REQUEST_ID>", //Additional join request IDs would go here, it rejecting in bulk ] }
Request parameters
<GROUP_ID>String
Required.
Group ID.
Y2FwaV9ncm91cDoxNzA1NTU1MDEzOToxMjAzNjM0MDQ2OTQyMzM4MjAZD<JOIN_REQUEST_ID>String
Required.
ID of join request to reject.
MTY0NjcwNDM1OTU6MTIwMzYzNDA0Njk0MjMzODIwResponse
syntax
{ "messaging_product": "whatsapp", "rejected_join_requests": [ "<JOIN_REQUEST_ID>", //Additional join request IDs would go here, it rejecting in bulk ], //Only included if unable to reject one or more join requests "failed_join_requests": [ { "join_request_id": "<JOIN_REQUEST_ID>", "errors": [ { "code": "<ERROR_CODE>", "message": "<ERROR_MESSAGE>", "title": "<ERROR_TITLE>", "error_data": { "details": "<ERROR_DETAILS>" } } ] } ], "errors": [ { "code": "<ERROR_CODE>", "message": "<ERROR_MESSAGE>", "title": "<ERROR_TITLE>", "error_data": { "details": "<ERROR_DETAILS>" } } ] }
Response parameters
<JOIN_REQUEST_ID>String
ID of rejected join request, or ID of failed join request, if we were unable to reject.
MTY0NjcwNDM1OTU6MTIwMzYzNDA0Njk0MjMzODIw<ERROR_CODE>Integer
Error code, if unable to reject.
131203<ERROR_MESSAGE>String
Error message, if unable to reject.
(#131203) Recipient has not accepted our new Terms of Service and Privacy Policy.<ERROR_TITLE>String
Error title, if unable to reject.
Unable to add participant to group<ERROR_DETAILS>String
Error details, if unable to reject.
Recipient has not accepted our new Terms of Service and Privacy Policy.Webhook
Get
and reset group invite link
| |
Get group invite link
Request syntax
GET /<GROUP_ID>/invite_linkResponse body
{ "messaging_product": "whatsapp", "invite_link": "https://chat.whatsapp.com/<LINK_ID>" }
invite_linkhttps://chat.whatsapp.com/<LINK_ID>Reset group invite link
Request syntax
POST /<GROUP_ID>/invite_linkRequest body
{ "messaging_product": "whatsapp", }
Response body
{ "messaging_product": "whatsapp", "invite_link": "https://chat.whatsapp.com/<LINK_ID>" }
Send group invite link template message
utilityStep 1. Add a group invite link template in Template Library to your account templates:
GET /message_template_library?category=utility&topic=group_invite_link&language=enStep 2. Send the template message
Request syntax
POST /<BUSINESS_PHONE_NUMBER_ID>/messagesEndpoint parameters
| |
Request body
curl --location 'https://graph.facebook.com/<API_VERSION>/<BUSINESS_PHONE_NUMBER_ID>/messages?access_token=' \ --header 'Content-Type: application/json' \ --data '{ "messaging_product": "whatsapp", "to": "<WHATSAPP_USER_PHONE_NUMBER>", "type": "template", "template": { "name": "<TEMPLATE_NAME>", "language": { "code": "<TEMPLATE_LANGUAGE>" }, "components": [ { "type": "body", "parameters": [ { "type": "group_id", "group_id": "<GROUP_ID>" }, { ...additional parameters } ] } ] } }'
Webhooks
User joins group using invite link
Delete group
This endpoint deletes the group and removes all participants, including the business. No request body is required.
Request
Syntax
DELETE /<GROUP_ID>Request properties
<GROUP_ID>String
Required
Y2FwaV9ncm91cDoxOTUwNTU1MDA3OToxMjAzNjMzOTQzMjAdOTY0MTUZDWebhooks
group_lifecycle_updateDelete group succeed
Delete group fails
Remove group participants
Request syntax
DELETE /<GROUP_ID>/participantsRequest body
{ "messaging_product": "whatsapp", "participants": [ { "user": "<WHATSAPP_USER_PHONE_NUMBER> or <WHATSAPP_USER_ID>" }, { "user": "<WHATSAPP_USER_PHONE_NUMBER> or <WHATSAPP_USER_ID>"" }, ... ] }
Request properties
| |
Webhooks
group_participants_updateGroup participant leaves
Get group info
Request syntax
GET /<GROUP_ID>?fields=<FIELDS>Endpoint parameters
| | |
| |
Available fields
| | |
| | |
| | |
| | |
| | |
| | |
| |
Sample response
{ "messaging_product": "whatsapp", "id": "<GROUP_ID>", "subject": "<SUBJECT>", "creation_timestamp": "<TIMESTAMP>", "suspended": "<SUSPENDED>", "description": "<DESCRIPTION>", "total_participant_count": "<TOTAL_PARTICIPANT_COUNT>", "participants": [ { "wa_id": "<WA_ID>" }, { "wa_id": "<WA_ID>" } ], "join_approval_mode": "<JOIN_APPROVAL_MODE>" }
Get active groups
Request syntax
GET /<BUSINESS_PHONE_NUMBER_ID>/groupsQuery Parameters
?limit=<LIMIT>, // Optional &after=<AFTER_CURSOR>, // Optional &before=<BEFORE_CURSOR> // Optional
| |
| |
|
Response Object
{ "data": { "groups": [ {"id": "GROUP_ID", "subject": SUBJECT, "created_at": "TIMESTAMP"}, {"id": "GROUP_ID", "subject": SUBJECT, "created_at": "TIMESTAMP"} … ] }, "paging": { "cursors": { "after": "MTAxNTExOTQ1MjAwNzI5NDE=", "before": "NDMyNzQyODI3OTQw" }, "previous": "https://graph.facebook.com/VERSION/PHONE_NUMBER_ID/groups?limit=10&before=NDMyNzQyODI3OTQw", "next": "https://graph.facebook.com/VERSION/PHONE_NUMBER_ID/groups?limit=25&after=MTAxNTExOTQ1MjAwNzI5NDE=" } }
Response parameters
| |
|
Update group settings
Request syntax
POST /<GROUP_ID>Request body
{ "messaging_product": "whatsapp", "subject": "<GROUP_SUBJECT>", "profile_picture_file": "<FILE_PATH>", "description": "<GROUP_DESCRIPTION>", }
Request properties
| | |
| | |
| |
Webhooks
group_settings_updateGroup settings update succeed
Group settings update partial fail
Group settings update total fail
Group message status webhooks
When you send a message to a group, you receive a status messages webhook when the message is delivered or read by group participants.
Status webhooks for individual group participants may be aggregated into a single webhook containing multiple participants’participants' statuses are generated at approximately the same time, they may be combined into a single webhook. If statuses are generated at different times, you may receive separate webhooks for each participant.
status objects in the statuses array. However, aggregation is not guaranteed. If multiple Each webhook only ever references a single message sent to a single group and a single status type (for example,
delivered). Statuses for different messages, groups, or status types are never combined into a single webhook.For the full webhook payload reference, see the status messages webhook reference.
Pricing information
Status messages webhooks that contain pricing information will have
<CONVERSATION_CATEGORY> set to one of:group_marketing group_utility group_service