# List a WhatsApp group's join requests

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

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`.

## Code samples

**TypeScript**

```ts
for await (const request of bird.whatsapp.groups.joinRequests.list(
  "wag_01krdgeqcxet5s7t44vh8rt9mg",
)) {
  console.log(request.id, request.bsuid);
}
```

Examples: [TypeScript](/docs/api/reference/list-whatsapp-group-join-requests.ts.md) · [Python](/docs/api/reference/list-whatsapp-group-join-requests.py.md) · [Go](/docs/api/reference/list-whatsapp-group-join-requests.go.md) · [PHP](/docs/api/reference/list-whatsapp-group-join-requests.php.md) · [CLI](/docs/api/reference/list-whatsapp-group-join-requests.cli.md) · [MCP](/docs/api/reference/list-whatsapp-group-join-requests.mcp.md) · [cURL](/docs/api/reference/list-whatsapp-group-join-requests.curl.md)

## Example response `200`

```json
{
  "data": [
    {
      "id": "wgj_01krdgeqcxet5s7t44vh8rt9mg",
      "bsuid": "BR.1566655121691972",
      "phone_number": "+16505551234",
      "username": "jim.almeida",
      "created_at": "2026-08-24T10:07:57Z"
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE0OjAzOjEwWlwiIiwiaSI6IjAxOTJmM2IxLTRjN2UtN2EyYi05ZDYxLThmM2E1YzJlN2I0MCJ9",
  "prev_cursor": null,
  "refresh_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE2OjQyOjAxWlwiIiwiaSI6IjAxOTJmM2IxLTllMDQtN2NkMy1iODE3LTJhNmY0ZDFjOGUwOSJ9"
}
```

## Path parameters

- `group_id` (string): ID of the group whose join requests are being listed.

## Query parameters

- `sort` (string)

  Field to sort by.

  Possible values: `created_at`
- `order` (string)

  Sort direction. Defaults to `asc`, which sorts alphabetically or from oldest to newest, depending on the selected sort field.

  Possible values: `asc`, `desc`
- `limit` (integer): Maximum number of items to return per page.
- `starting_after` (string): Cursor from the `next_cursor` field of a previous list response. Returns items immediately after the cursor position in the current sort order.
- `ending_before` (string): Cursor from the `prev_cursor` or `refresh_cursor` field of a previous list response. Returns items immediately before the cursor position in the current sort order. `prev_cursor` returns the preceding page. `refresh_cursor` anchors at the first row of that response, which on a newest-first sort is how to fetch the items that have appeared since.

## Response body

- `data` (array of object, required): The join requests still waiting for a decision, oldest first.
- `data.id` (string, required): Unique identifier for the join request. Pass it to the batch-approve and batch-reject operations.
- `data.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.
- `data.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.
- `data.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.
- `data.created_at` (string, required): When the request was made.
- `next_cursor` (nullable string, required): Cursor for the next page. Pass back as `starting_after` to advance forward. `null` when no next page exists.
- `prev_cursor` (nullable string, required): Cursor for the previous page. Pass back as `ending_before` to step backward. `null` when no previous page exists.
- `refresh_cursor` (nullable string, 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`.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
