---
title: "List a WhatsApp group's join requests"
method: GET
path: "/v1/whatsapp/groups/{group_id}/join-requests"
tags: ["whatsapp-groups"]
---

# List a WhatsApp group's join requests

`GET /v1/whatsapp/groups/{group_id}/join-requests`

## Request

- Base URL: `https://us1.platform.bird.com`
- URL: `https://us1.platform.bird.com/v1/whatsapp/groups/{group_id}/join-requests`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `bird_session`

Returns the join requests still waiting for a decision, oldest first. Each
carries the person who asked and when they asked.

Only a group created with `join_approval_mode` `approval_required` collects
join requests; on any other group the list is empty. A request leaves the
list once you decide it, and also when the person cancels it themselves.

Decide requests with
`POST /v1/whatsapp/groups/{group_id}/join-requests/batch-approve`
or
`POST /v1/whatsapp/groups/{group_id}/join-requests/batch-reject`.

## Path parameters

- `group_id` string, required

## Query parameters

- `sort` 'created_at': Sortable fields for a WhatsApp group join-request list.
- `order` 'asc' | 'desc': Sort direction, ascending or descending.
- `limit` integer
- `starting_after` string
- `ending_before` string

## Headers

- `X-Workspace-Id` string
- `X-Organization-Id` string

## Response `200`

A page of the group's pending join requests.

- WhatsAppGroupJoinRequestList
  - `data` WhatsAppGroupJoinRequest[], required: The join requests still waiting for a decision, oldest first.
    - `id` string, required
    - `bsuid` string, required: Business-scoped user ID, Meta's identifier for this person against your business. The one identifier every request has, and the one that carries over to `participants` if you approve it.
    - `phone_number` string: Phone number in E.164 format. Absent when WhatsApp withholds it, which it does for anyone who has not shared their number with your business.
    - `username` string: The WhatsApp username this person chose. Absent when they have none, and theirs to change, so it names them in a list rather than keying anything.
    - `created_at` string, date-time, required: When the request was made.
  - `next_cursor` string, nullable, required: Cursor for the next page. Pass back as `starting_after` to advance forward. `null` when no next page exists.
  - `prev_cursor` string, nullable, required: Cursor for the previous page. Pass back as `ending_before` to step backward. `null` when no previous page exists.
  - `refresh_cursor` string, nullable, required: Refresh anchor, the first row of this response. Pass back as `ending_before` to fetch what precedes it in the current sort order. On a newest-first sort those are the items that have appeared since; on any other sort they are the items that sort earlier, so refreshing such a list means re-fetching it instead. Non-`null` whenever `data` is non-empty; `null` only on an empty page. Distinct from `prev_cursor`.

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `403`: Insufficient permissions
- `404`: Resource not found
- `422`: The request has invalid field values, violates a business rule, or carries a query parameter the endpoint does not declare. Field validation errors use `type: validation_error` and include the affected fields in `details`. Business-rule errors identify the failed rule in `type`.
- `429`: Rate limit exceeded
- `500`: Internal server error

---

[API](https://skmtc.dev/messagebird/apis/bird-api.md) · [All operations](https://skmtc.dev/messagebird/apis/bird-api/llms.txt) · [OpenAPI document](https://skmtc.dev/messagebird/apis/bird-api/revisions/3e2a50466454?raw)
