<Intro>

<EndpointHeader />

<Description>

Sends a new message from the mailbox's own address and starts a new conversation with it. The request mirrors the plain send request minus `from` — the mailbox is the sender identity — and Bird mints the RFC 5322 Message-ID, so later replies from the recipients thread back into the conversation automatically. The send is recorded in the mailbox's durable memory and returned as the conversation's first message. Scheduled sends are not accepted on the mailbox surface. A suspended mailbox cannot send and returns `403`.

</Description>

</Intro>

<Payload kind="request">

<Field name="to" type="array of string or object" required>

<Description>

Primary recipients. Each entry is a plain email string, an RFC 5322 mailbox string (`Jane <jane@example.com>`), or an object with an optional display name.

</Description>

<FieldChildren kind="request">

<Field name="email" type="string" prefix="to." required>

<Description>

Email address.

</Description>

</Field>

<Field name="name" type="string" prefix="to.">

<Description>

Display name shown alongside the address in mail clients.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="cc" type="array of string or object">

<Description>

CC recipients. Each entry is a plain email string, an RFC 5322 mailbox string (`Jane <jane@example.com>`), or an object with an optional display name.

</Description>

<FieldChildren kind="request">

<Field name="email" type="string" prefix="cc." required>

<Description>

Email address.

</Description>

</Field>

<Field name="name" type="string" prefix="cc.">

<Description>

Display name shown alongside the address in mail clients.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="bcc" type="array of string or object">

<Description>

BCC recipients. Each entry is a plain email string, an RFC 5322 mailbox string (`Jane <jane@example.com>`), or an object with an optional display name.

</Description>

<FieldChildren kind="request">

<Field name="email" type="string" prefix="bcc." required>

<Description>

Email address.

</Description>

</Field>

<Field name="name" type="string" prefix="bcc.">

<Description>

Display name shown alongside the address in mail clients.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="subject" type="string" required>

<Description>

Message subject line.

</Description>

</Field>

<Field name="html" type="string">

<Description>

HTML body. At least one of html or text must be provided.

</Description>

</Field>

<Field name="text" type="string">

<Description>

Plain-text body. At least one of html or text must be provided.

</Description>

</Field>

<Field name="reply_to" type="array of string or object">

<Description>

Reply-To addresses. When omitted, the mailbox's `default_reply_to` applies (replies then come back to the mailbox itself).

</Description>

<FieldChildren kind="request">

<Field name="email" type="string" prefix="reply_to." required>

<Description>

Email address.

</Description>

</Field>

<Field name="name" type="string" prefix="reply_to.">

<Description>

Display name shown alongside the address in mail clients.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="attachments" type="array of object">

<Description>

File attachments. The send is rejected when the estimated generated message size exceeds 20 MB (bodies plus all attachments after base64 encoding). Attachment metadata endures on the message's `attachment_manifest`; the bytes are downloadable for 30 days.

</Description>

<FieldChildren kind="request">

<Field name="filename" type="string" prefix="attachments." required>

<Description>

Filename shown to the recipient. Required.

</Description>

</Field>

<Field name="content" type="string" prefix="attachments." required>

<Description>

Base64-encoded attachment bytes. Required. Counts toward the 20 MB estimated generated message-size cap after encoding and MIME wrapping.

</Description>

</Field>

<Field name="path" type="string" prefix="attachments.">

<Description>

Preview feature — provide a URL and Bird fetches the attachment for you. Currently unavailable. Use `content` instead. The schema currently requires `content`, so a request with only `path` is rejected with 422 for missing `content`; a request supplying both `content` and `path` is rejected with 422 `UnsupportedEmailFeature` until this preview ships. When generally available: HTTPS-only, single redirect followed and re-validated, private IP ranges blocked, request timeout enforced, fetched content counts toward the 20 MB estimated generated message-size cap after encoding and MIME wrapping.

</Description>

</Field>

<Field name="content_type" type="string" prefix="attachments.">

<Description>

MIME type. Inferred from `filename` extension when omitted. Used to enforce the blocklist of disallowed executable / script types.

</Description>

</Field>

<Field name="content_id" type="string" prefix="attachments.">

<Description>

RFC 2392 Content-ID. When set, the attachment is rendered inline and can be referenced from the HTML body as `<img src="cid:{content_id}"/>`. When omitted, the attachment is rendered as a regular file attachment.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="tags" type="array of object">

<Description>

Structured `{name, value}` labels for filtering and analytics on the sent-message log. Cap: 20 tags per send.

</Description>

<FieldChildren kind="request">

<Field name="name" type="string" prefix="tags." required>

<Description>

Tag name. ASCII letters, digits, underscore, and hyphen only. Case-sensitive. Maximum 32 characters.

</Description>

</Field>

<Field name="value" type="string" prefix="tags." required>

<Description>

Tag value. ASCII letters, digits, underscore, and hyphen only. Case-sensitive. Maximum 64 characters.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="metadata" type="object">

<Description>

Arbitrary JSON object stored on the send and echoed in webhook payloads. Cap: 2 KB serialized.

</Description>

</Field>

<Field name="category" type="string">

<Description>

Content classification. Controls suppression policy: `marketing` blocks on all suppression reasons; `transactional` allows delivery through complaint and unsubscribe suppressions, for receipts, password resets, and similar operational mail.

</Description>

<Description>

Possible values: `marketing`, `transactional`

</Description>

</Field>

</Payload>

<Payload kind="response">

<Field name="id" type="string" required>

<Description>

Message ID. Received messages carry a `rem_` ID, sent messages an `em_` ID — the same IDs used by the received-message and sent-message logs.

</Description>

</Field>

<Field name="direction" type="string" required>

<Description>

Direction of the message — `inbound` for a received message, `outbound` for a sent one.

</Description>

<Description>

Possible values: `inbound`, `outbound`

</Description>

</Field>

<Field name="channel" type="string" required>

<Description>

Channel this message was carried on. Always `email`.

</Description>

</Field>

<Field name="thread_id" type="string" required>

<Description>

Conversation this message belongs to.

</Description>

</Field>

<Field name="from" type="string" required>

<Description>

Sender address.

</Description>

</Field>

<Field name="to" type="array of string" required>

<Description>

Recipient addresses on the To line.

</Description>

</Field>

<Field name="cc" type="array of string" required>

<Description>

Recipient addresses on the Cc line. Empty when the message had none.

</Description>

</Field>

<Field name="delivered_to" type="nullable string" required>

<Description>

Address the message was actually delivered to, when it differs from the mailbox address (for example mail routed in from another address). Null for sent messages and for mail addressed directly to the mailbox.

</Description>

</Field>

<Field name="subject" type="nullable string" required>

<Description>

Message subject. Null when the message had no subject.

</Description>

</Field>

<Field name="preview" type="nullable string" required>

<Description>

Short plain-text preview of the message body.

</Description>

</Field>

<Field name="extracted_text" type="nullable string">

<Description>

Plain-text content of the message with quoted history stripped — readable for the mailbox's full retention period, both directions. Always present when fetching a single message; on list endpoints it is included only when the request sets `include=extracted_text`. Null when no text could be extracted.

</Description>

</Field>

<Field name="labels" type="array of string" required>

<Description>

Labels on this message. System labels carry its state: a received message holds exactly one placement label — `inbox` for accepted mail, `archive` when its conversation was filed away, `spam` (failed sender authentication), or `blocked` (rejected by the mailbox's receive policy or rules) — plus `unread` until it is read. `trash` marks a message in the trash, either direction. Custom labels share the same list; a message carries at most 20.

</Description>

</Field>

<Field name="status" type="nullable string" required>

<Description>

Folded delivery status of a sent message: `accepted`, `sent` (provider handoff), `delivered` (all attempted recipients delivered), or `failed` (terminal failure). Null for received messages.

</Description>

</Field>

<Field name="recipients" type="nullable array" required>

<Description>

Terminal per-recipient delivery outcomes of a sent message, folded in as they become known — part of the message's durable memory. Null for received messages and before any recipient reaches a terminal state. Per-recipient event detail lives on the sent-message log (`source`) for 30 days.

</Description>

</Field>

<Field name="authentication" type="nullable string" required>

<Description>

Whether the sender of a received message was authenticated. `pass` means the sender's identity was verified; `fail` means it was checked and did not verify; `unknown` means no verdict could be determined and the sender should not be treated as verified. Null for sent messages. Part of the message's durable memory — readable for the mailbox's full retention period, so the verdict survives after the 30-day inbound log has expired.

</Description>

<Description>

Possible values: `pass`, `fail`, `unknown`, `null`

</Description>

</Field>

<Field name="spf_pass" type="nullable boolean" required>

<Description>

Whether SPF passed for the sender of a received message. Null for sent messages and when no verdict is available. Durable for the mailbox's retention period.

</Description>

</Field>

<Field name="dkim_pass" type="nullable boolean" required>

<Description>

Whether DKIM passed for the sender of a received message. Null for sent messages and when no verdict is available. Durable for the mailbox's retention period.

</Description>

</Field>

<Field name="dmarc_pass" type="nullable boolean" required>

<Description>

Whether DMARC passed for the sender of a received message. Null for sent messages and when no verdict is available. Durable for the mailbox's retention period.

</Description>

</Field>

<Field name="purge_at" type="string" required>

<Description>

When the message will be permanently deleted: the end of the mailbox's retention period, pulled nearer (at most 30 days out) while the message is in the trash. Restore a trashed message before then with `PATCH {"labels": {"remove": ["trash"]}}`.

</Description>

</Field>

<Field name="attachment_count" type="integer" required>

<Description>

Number of attachments on the message.

</Description>

</Field>

<Field name="attachment_manifest" type="array of object" required>

<Description>

Attachment metadata (filename, content type, size). Remains readable for the mailbox's retention period even after the attachment bytes themselves have expired.

</Description>

<FieldChildren kind="response">

<Field name="id" type="string" prefix="attachment_manifest." required>

<Description>

Attachment ID, used to download the attachment bytes.

</Description>

</Field>

<Field name="filename" type="nullable string" prefix="attachment_manifest." required>

<Description>

Original filename, or null when the attachment had none.

</Description>

</Field>

<Field name="content_type" type="nullable string" prefix="attachment_manifest." required>

<Description>

MIME content type, or null when it could not be determined.

</Description>

</Field>

<Field name="size" type="integer" prefix="attachment_manifest." required>

<Description>

Attachment size in bytes.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="reference_ids" type="array of string" required>

<Description>

RFC 5322 References header entries used to thread the conversation.

</Description>

</Field>

<Field name="contact_id" type="nullable string" required>

<Description>

Contact linked to this message, or null when none is linked.

</Description>

</Field>

<Field name="source" type="object" required>

<Description>

Link to the message's entry in the received-message or sent-message log, which carries delivery analytics such as per-recipient events. Log entries expire 30 days after the message occurred.

</Description>

<FieldChildren kind="response">

<Field name="resource" type="string" prefix="source." required>

<Description>

API path of the log entry for this message.

</Description>

</Field>

<Field name="available_until" type="string" prefix="source." required>

<Description>

When the log entry (and the message's original rendered source) expires.

</Description>

</Field>

</FieldChildren>

</Field>

<Field name="occurred_at" type="string" required>

<Description>

When the message was received or accepted for sending.

</Description>

</Field>

</Payload>