---
title: "List mailboxes"
canonical: "https://bird.com/docs/api/reference/list-mailboxes"
---

# List mailboxes

`GET /v1/email/mailboxes`

Returns a paginated list of the workspace's mailboxes, newest first. Search across addresses and display names with `q`, look a mailbox up by its exact address, or filter by lifecycle state or domain.

## Code samples

**TypeScript**

```ts
for await (const mailbox of bird.email.mailboxes.list()) {
  console.log(mailbox.address);
}
```

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

## Example response `200`

```json
{
  "data": [
    {
      "id": "mbx_01krdgeqcxet5s7t44vh8rt9mg",
      "address": "concierge@inbox.ai",
      "forwarding_address": "k7q2mzxw4h6p5ra3@eu1.inbound.bird.com",
      "display_name": "Acme Concierge",
      "receive_policy": "open",
      "state": "active",
      "channel": "email",
      "owner": {
        "type": "workspace",
        "id": "ws_01krdgeqcxet5s7t44vh8rt9mg"
      },
      "inbound_address_id": "ina_01krdgeqcxet5s7t44vh8rt9mg",
      "retention_tier": "30d",
      "next": [
        {
          "kind": "operation"
        }
      ]
    }
  ],
  "next_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE0OjAzOjEwWlwiIiwiaSI6IjAxOTJmM2IxLTRjN2UtN2EyYi05ZDYxLThmM2E1YzJlN2I0MCJ9",
  "prev_cursor": null,
  "refresh_cursor": "eyJ2IjoxLCJzIjoiXCIyMDI2LTA1LTI1VDE2OjQyOjAxWlwiIiwiaSI6IjAxOTJmM2IxLTllMDQtN2NkMy1iODE3LTJhNmY0ZDFjOGUwOSJ9"
}
```

## Query parameters

- `address` (string): Filter to the mailbox with exactly this address.
- `q` (string): Case-insensitive search matching the mailbox's address or display name (substring).
- `state` (string)

  Return only `active` or `suspended` mailboxes. Use `include_deleted` for restorable deleted mailboxes.

  Possible values: `active`, `suspended`
- `domain` (string): Filter to mailboxes whose address is on this domain.
- `include_deleted` (boolean): Include mailboxes deleted within their 30-day restore window. Defaults to false, so only active and suspended mailboxes are returned. A deleted mailbox has `deleted_at` set.
- `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)
- `data.id` (string, required): Mailbox ID.
- `data.address` (string, required): The mailbox's email address. Immutable once created.
- `data.forwarding_address` (nullable string, required): An address we generate on our receiving domain when the mailbox is created on a domain not set up for receiving with us. Forward mail for `address` here from your current email provider, and it lands in this mailbox. Replies still go out from `address`. Immutable. It stops receiving while the mailbox is deleted, works again with the same value after a restore, and keeps working if you later enable receiving on the domain. `null` on mailboxes created on the shared domain or on a domain already enabled for receiving.
- `data.display_name` (nullable string, required): Display name used as the sender name on mail from this mailbox. `null` when unset.
- `data.default_reply_to` (nullable string, required): Default `Reply-To` address stamped on mail sent from this mailbox. `null` when unset.
- `data.receive_policy` (string, required)

  Which inbound mail the mailbox accepts:

  - `open`: Accepts everything not blocked by a rule.
  - `replies_only`: Accepts only replies to messages this mailbox has
    sent. A reply must match a message the mailbox sent. Landing in an
    existing thread by itself does not count.
  - `allowlist`: Accepts only senders matching an allow rule. Replies to
    prior outbound mail are always admitted unless blocked.
  - `drop`: Stores nothing.

  Possible values: `open`, `replies_only`, `allowlist`, `drop`
- `data.state` (string, required)

  Lifecycle state. `active` means the mailbox can send, receive, and expose conversations. `suspended` pauses sending, conversation reads, and events; inbound mail is retained with the `blocked` label until you resume it.

  Possible values: `active`, `suspended`
- `data.channel` (string, required)

  The channel this mailbox receives on. Always `email`.

  Possible values: `email`
- `data.owner` (object, required): The principal that owns the mailbox. Always the workspace.
- `data.owner.type` (string, required)

  Owner principal type.

  Possible values: `workspace`
- `data.owner.id` (string, required): Owner principal ID.
- `data.inbound_address_id` (string, required): The underlying inbound address that receives this mailbox's mail.
- `data.retention_tier` (string, required)

  How long message metadata, extracted text, and attachments are kept. Original bodies and inbound raw MIME are limited to 30 days on every tier.

  Possible values: `30d`, `90d`, `1y`
- `data.message_count` (integer, required): Number of retained messages across all threads.
- `data.thread_count` (integer, required): Number of retained threads.
- `data.size_bytes` (integer, required): Stored bytes across the mailbox's retained messages: subject, preview, extracted text, and attachment bytes. Message bodies and raw MIME expire after 30 days and do not count. Maintained with each message written or deleted, so the value is current; messages stored before the counter existed are not counted.
- `data.unread_thread_count` (nullable integer): Number of threads with unread messages in this mailbox, excluding trash. `null` on create/update responses.
- `data.metadata` (object, required): Your own key/value data attached to the mailbox. Up to 2 KB. Keys starting with `__bird` are reserved.
- `data.local_part_generated` (boolean, required): Whether we generated the local part of the address. `false` means a custom handle was chosen at creation. On the shared `inbox.ai` domain a custom handle counts against your plan's custom-handle allowance.
- `data.created_at` (string, required): When the mailbox was created.
- `data.updated_at` (string, required): When the mailbox was last updated.
- `data.deleted_at` (nullable string): When the mailbox was deleted, or `null` if active. Deletion stops receiving; restore is available for 30 days unless permanent erasure has started.
- `data.next` (array of object): What to do next with this mailbox. The response that creates it suggests subscribing to the mail it receives; other reads of one mailbox return an empty list, and lists omit it.
- `data.next.kind` (string, required)

  What you do about this step.

  - `operation`: call the operation named in `operation`, then
    read again.
  - `external`: act somewhere this API does not reach, then read
    again.
  - `wait`: nothing is asked of you, so read again later.
  - `terminal`: nothing you do resolves this, so stop retrying.

  Tolerate a value you do not recognize: show the `description` and
  offer no action.

  Possible values (may grow over time): `operation`, `external`, `wait`, `terminal`
- `data.next.description` (string, required): A short, human-readable label for the step, suitable for display.
- `data.next.operation` (string): The operationId to call. Present only when `kind` is `operation`. The operation's own schema says how to call it; this says only which one, and what to address it with.
- `data.next.params` (object): The parameters that address the operation, by name: `{"sender_id": "…"}` for an operation on `/v1/sms/senders/{sender_id}/requirements`. A parameter the operation takes in its query string is given the same way, so an operation addressed as `?subject_id=` carries `{"subject_id": "…"}`. Every parameter the call needs is here, whether its value came from the thing you were acting on or is fixed for this step, so you can make the call from this object alone. Present only when `kind` is `operation` and the operation names a subject. A request body, when the operation takes one, is described by the operation's own schema and never appears here.
- `data.next.url` (string): A URL to open. Present only when `kind` is `external`, and only when the step has one. An external step whose `description` says to go and do something with no URL to open is normal.
- `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

- [Setting up your coding agent](/learn/basics/setting-up-your-coding-agent) (video)
- [What is an MCP server, and how does an agent use one to send messages?](/explained/platform/what-is-an-mcp-server-and-how-does-an-agent-send-messages) (answer)
- [Coding agents](/ai) (product)
- [Build with AI agents](/learn/paths/agents) (course)

[Get an implementation brief](/learn/workspace?topic=agents)
