---
title: "Create a mailbox"
method: POST
path: "/v1/email/mailboxes"
tags: ["email-mailboxes"]
---

# Create a mailbox

`POST /v1/email/mailboxes`

## Request

- Base URL: `https://us1.platform.bird.com`
- URL: `https://us1.platform.bird.com/v1/email/mailboxes`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `bird_session`

Creates a mailbox. The address is `local_part@domain`. The domain defaults to `inbox.ai`, Bird's shared mailbox domain, where creating the mailbox claims the address for your organization. It is first come, first served, and reserved to your organization even after the mailbox is deleted. You may instead name one of your own domains. A domain enabled for receiving email delivers to the mailbox directly. A domain this workspace has verified (its `status` is `verified`) that is not set up for receiving gives the mailbox a `forwarding_address` to forward its mail to. If another workspace receives the domain's mail, creation fails with `E17009`. An omitted local part is generated. On a custom domain, addresses of deleted mailboxes are quarantined for 30 days and remain reserved for your workspace.

## Headers

- `Idempotency-Key` string
- `X-Workspace-Id` string
- `X-Organization-Id` string

## Request body

- MailboxCreate: Parameters for creating a mailbox.
  - `local_part` string: The local part of the mailbox address (the part before `@`). Letters, digits, dots, underscores, and hyphens. Stored lowercase. On the shared `inbox.ai` domain, separators must sit between letters or digits. Leading, trailing, and repeated separators are not allowed. Reserved names such as `postmaster` and `abuse` are unavailable. Choosing your own local part uses one of your plan's custom-handle allowance slots; generated addresses remain available. Omit this field to generate a random local part.
  - `domain` string: The domain the address lives under. Defaults to `inbox.ai`, our shared mailbox domain. Creating a mailbox claims the shared address for your organization on a first-come, first-served basis. The address remains reserved to your organization after the mailbox is deleted. You can instead use one of your own domains. On a domain enabled for receiving, mail arrives directly. On a domain this workspace has verified (its `status` is `verified`) that is not set up for receiving, the mailbox gets a `forwarding_address`: forward mail for the address there from your current email provider, with no MX change. If another workspace receives the domain's mail, creation fails with `E17009`.
  - `display_name` string: Display name used as the sender name on mail from this mailbox.
  - `default_reply_to` string, email: Default `Reply-To` address stamped on mail sent from this mailbox.
  - `receive_policy` 'open' | 'replies_only' | 'allowlist' | 'drop': 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. - `drop`: Stores nothing.
  - `retention_tier` '30d' | '90d' | '1y': How long message metadata, extracted text, and attachments are kept. Original bodies and inbound raw MIME are limited to 30 days on every tier. Longer tiers require a plan that includes them.
  - `metadata` object: Your own key/value data to attach to the mailbox. Up to 2 KB. Keys starting with `__bird` are reserved.

## Response `201`

Mailbox created.

- Mailbox: A durable mailbox identity for an agent. A mailbox owns an email address, groups mail into threads, applies receive policy, and remembers message metadata, extracted text, and attachments for its retention tier. The body and raw MIME of each message remain available for 30 days.
  - `id` string, required
  - `address` string, email, required: The mailbox's email address. Immutable once created.
  - `forwarding_address` string, email, nullable, 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.
  - `display_name` string, nullable, required: Display name used as the sender name on mail from this mailbox. `null` when unset.
  - `default_reply_to` string, email, nullable, required: Default `Reply-To` address stamped on mail sent from this mailbox. `null` when unset.
  - `receive_policy` 'open' | 'replies_only' | 'allowlist' | 'drop', 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.
  - `state` 'active' | 'suspended', 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.
  - `channel` 'email', required: The channel this mailbox receives on. Always `email`.
  - `owner` MailboxOwner, required: The principal that owns the mailbox. Always the workspace.
    - `type` 'workspace', required: Owner principal type.
    - `id` string, required
  - `inbound_address_id` string, required
  - `retention_tier` '30d' | '90d' | '1y', 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.
  - `message_count` integer, required: Number of retained messages across all threads.
  - `thread_count` integer, required: Number of retained threads.
  - `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.
  - `unread_thread_count` integer, nullable: Number of threads with unread messages in this mailbox, excluding trash. `null` on create/update responses.
  - `metadata` object, required: Your own key/value data attached to the mailbox. Up to 2 KB. Keys starting with `__bird` are reserved.
  - `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.
  - `created_at` string, date-time, required: When the mailbox was created.
  - `updated_at` string, date-time, required: When the mailbox was last updated.
  - `deleted_at` string, date-time, nullable: When the mailbox was deleted, or `null` if active. Deletion stops receiving; restore is available for 30 days unless permanent erasure has started.
  - `next` NextAction[]: 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.
    - `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.
    - `description` string, required: A short, human-readable label for the step, suitable for display.
    - `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.
    - `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.
    - `url` string, uri: 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.

## Other responses

- `400`: Bad request
- `401`: Authentication required
- `402`: Insufficient balance
- `403`: Insufficient permissions
- `404`: Resource not found
- `409`: Resource conflict
- `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
- `503`: The service is temporarily unavailable. If `Retry-After` is present, wait for that delay before retrying; otherwise, retry with exponential backoff. Reuse the same idempotency key and request when retrying a mutation.

---

[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/6dfce1179799?raw)
