# AgentMail — Orthogonal API

> Pay-per-use API on Orthogonal. Each call is billed to your Orthogonal balance.
> Base API: `https://api.orth.sh/v1/run` · [llms.txt](https://orthogonal.com/llms.txt) · [browse all APIs](https://orthogonal.com/discover)

Programmatic email for AI agents. Create inboxes, send/receive emails, manage threads and drafts. Inboxes cost $2/month. Inboxes inactive for 30+ days are automatically deleted.

**Verified:** yes

## Access

**Run API:** `POST https://api.orth.sh/v1/run`
**Auth:** `Authorization: Bearer $ORTHOGONAL_API_KEY`
Get an API key at https://orthogonal.com/dashboard/settings/api-keys

Every call goes through the unified Run API: send the API `slug`, the endpoint `path`, and the `query`/`body` parameters. The response is `{ "success": true, "price": "<usd>", "data": { ... } }`.

## Endpoints

### Get Thread

Get a thread and all its messages. Returns the full conversation including message bodies, timestamps, and metadata.

`GET /v0/inboxes/{inbox_id}/threads/{thread_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `thread_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {inbox_id}, {thread_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/threads/{thread_id}","method":"GET"}'
```

### Update Inbox

Update an existing inbox display name or client ID.

`PATCH /v0/inboxes/{inbox_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `display_name` | string | No | Display name: Display Name <username@domain.com>. |
| `client_id` | string | No | Client ID of inbox. |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}","method":"PATCH","body":{"display_name":"<string>","client_id":"<string>"}}'
```

### Delete Thread

Move a thread to trash, or permanently delete if already trashed. Important: pass method: "DELETE" in your run request.

`DELETE /v0/inboxes/{inbox_id}/threads/{thread_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `thread_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `permanent` | boolean | No | If true, permanently delete instead of moving to trash. |

```bash
# Replace {inbox_id}, {thread_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/threads/{thread_id}","method":"DELETE","query":{"permanent":"<boolean>"}}'
```

### Delete Inbox

Permanently delete an inbox and all its contents. Important: pass method: "DELETE" in your run request to distinguish from Get Inbox.

`DELETE /v0/inboxes/{inbox_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}","method":"DELETE"}'
```

### Get Inbox

Get details of a specific inbox including display name, creation date, and metadata.

`GET /v0/inboxes/{inbox_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}","method":"GET"}'
```

### Create Inbox

Create a new email inbox. Inboxes cost $2/month. Inboxes with no API activity for 30+ days are automatically deleted. Any request using the inbox resets the inactivity timer. Returns an inbox_id in email format (e.g., myagent@agentmail.to) used for all subsequent operations. If username is omitted, a random one is generated.

`POST /v0/inboxes`

**Estimated cost:** $2

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `username` | string | No | Local part of the email address (e.g., myagent becomes myagent@agentmail.to). Randomly generated if omitted. |
| `domain` | string | No | Email domain. Must be a verified custom domain. Defaults to agentmail.to. |
| `display_name` | string | No | Human-readable name shown in the From header (e.g., My Agent <myagent@agentmail.to>). |
| `client_id` | string | No | Your own identifier to associate with this inbox. |

```bash
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes","body":{"username":"<string>","domain":"<string>","display_name":"<string>","client_id":"<string>"}}'
```

### Get Message

Get a specific message including headers, body (text and HTML), attachments, and metadata.

`GET /v0/inboxes/{inbox_id}/messages/{message_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `message_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {inbox_id}, {message_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages/{message_id}","method":"GET"}'
```

### Get Raw Message

Get the original raw RFC 2822 email content including all headers, MIME parts, and encoded attachments.

`GET /v0/inboxes/{inbox_id}/messages/{message_id}/raw`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `message_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {inbox_id}, {message_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages/{message_id}/raw","method":"GET"}'
```

### Update Message

Update labels on a message (e.g., mark as read, archive, star).

`PATCH /v0/inboxes/{inbox_id}/messages/{message_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `message_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `labels` | array | No | Array of label strings to set on the message (e.g., ["read", "starred"]). Replaces existing labels. |

```bash
# Replace {inbox_id}, {message_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages/{message_id}","method":"PATCH","body":{"labels":"<array>"}}'
```

### Get Draft

Get a specific draft including its full content, recipients, and attachments.

`GET /v0/inboxes/{inbox_id}/drafts/{draft_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `draft_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {inbox_id}, {draft_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/drafts/{draft_id}","method":"GET"}'
```

### Delete Draft

Permanently delete a draft. Important: pass method: "DELETE" in your run request.

`DELETE /v0/inboxes/{inbox_id}/drafts/{draft_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `draft_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |

```bash
# Replace {inbox_id}, {draft_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/drafts/{draft_id}","method":"DELETE"}'
```

### Send Draft

Send an existing draft as an email. The draft is converted to a sent message and deleted from drafts. Returns the message_id and thread_id.

`POST /v0/inboxes/{inbox_id}/drafts/{draft_id}/send`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `draft_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `labels` | array | No | Labels to apply to the sent message (overrides draft labels). |

```bash
# Replace {inbox_id}, {draft_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/drafts/{draft_id}/send","body":{"labels":"<array>"}}'
```

### List Threads

List all email threads in an inbox, ordered by most recent. Supports pagination and filtering.

`GET /v0/inboxes/{inbox_id}/threads`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `limit` | integer | No | Max number of threads to return (default varies by API). |
| `page_token` | string | No | Token from previous response for fetching the next page. |
| `labels` | string | No | Filter by label (e.g., unread, sent, trash). |
| `before` | string | No | Only return threads before this ISO 8601 timestamp. |
| `after` | string | No | Only return threads after this ISO 8601 timestamp. |
| `ascending` | boolean | No | If true, sort oldest first. Default is newest first. |
| `include_spam` | boolean | No | Include threads labeled as spam. |
| `include_blocked` | boolean | No | Include threads from blocked senders. |
| `include_trash` | boolean | No | Include threads in trash. |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/threads","method":"GET","query":{"limit":"<integer>","page_token":"<string>","labels":"<string>","before":"<string>","after":"<string>","ascending":"<boolean>","include_spam":"<boolean>","include_blocked":"<boolean>","include_trash":"<boolean>"}}'
```

### Create Draft

Create a new draft in an inbox. The draft can be edited later and sent with Send Draft.

`POST /v0/inboxes/{inbox_id}/drafts`

**Estimated cost:** $0.01

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `to` | array | No | Recipient email addresses as an array of strings. |
| `cc` | array | No | CC recipient email addresses. |
| `bcc` | array | No | BCC recipient email addresses. |
| `reply_to` | array | No | Reply-to addresses. |
| `subject` | string | No | Email subject line. |
| `text` | string | No | Plain text body of the draft. |
| `html` | string | No | HTML body of the draft. |
| `labels` | array | No | Labels to tag the draft. |
| `attachments` | array | No | Array of attachment objects: {filename, content_type, content (base64)} or {filename, content_type, url}. |
| `headers` | object | No | Custom email headers as key-value pairs. |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/drafts","body":{"to":"<array>","cc":"<array>","bcc":"<array>","reply_to":"<array>","subject":"<string>","text":"<string>","html":"<string>","labels":"<array>","attachments":"<array>","headers":"<object>"}}'
```

### Send Message

Send an email message from an inbox. At least one recipient (to, cc, or bcc) is required. Returns the message_id and thread_id. Replace {inbox_id} directly in the path with the full inbox email (e.g., /v0/inboxes/myagent@agentmail.to/messages/send).

`POST /v0/inboxes/{inbox_id}/messages/send`

**Estimated cost:** $0.01

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `to` | array | No | Recipient email address(es). At least one of to, cc, or bcc is required. Can be a string or array of strings. |
| `cc` | array | No | CC recipient email address(es). String or array of strings. |
| `bcc` | array | No | BCC recipient email address(es). String or array of strings. |
| `reply_to` | array | No | Reply-to address(es) if different from the inbox address. |
| `subject` | string | No | Email subject line. |
| `text` | string | No | Plain text body. Provide text, html, or both. |
| `html` | string | No | HTML body. Provide text, html, or both. |
| `labels` | array | No | Array of label strings to tag the sent message. |
| `attachments` | array | No | Array of attachment objects: {filename: string, content_type: string, content: string (base64)} or {filename: string, content_type: string, url: string}. |
| `headers` | object | No | Custom email headers as key-value pairs (e.g., {"X-Custom": "value"}). |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages/send","body":{"to":"<array>","cc":"<array>","bcc":"<array>","reply_to":"<array>","subject":"<string>","text":"<string>","html":"<string>","labels":"<array>","attachments":"<array>","headers":"<object>"}}'
```

### List Drafts

List all drafts in an inbox. Returns draft metadata including subject, recipients, and timestamps.

`GET /v0/inboxes/{inbox_id}/drafts`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `limit` | integer | No | Max number of drafts to return. |
| `page_token` | string | No | Token from previous response for fetching the next page. |
| `labels` | string | No | Filter by label. |
| `before` | string | No | Only return drafts before this ISO 8601 timestamp. |
| `after` | string | No | Only return drafts after this ISO 8601 timestamp. |
| `ascending` | boolean | No | If true, sort oldest first. Default is newest first. |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/drafts","method":"GET","query":{"limit":"<integer>","page_token":"<string>","labels":"<string>","before":"<string>","after":"<string>","ascending":"<boolean>"}}'
```

### Reply All Message

Reply to all recipients of a message. Includes all original To and CC recipients automatically.

`POST /v0/inboxes/{inbox_id}/messages/{message_id}/reply-all`

**Estimated cost:** $0.01

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `message_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `to` | array | No | Additional recipient(s) beyond the original ones. |
| `cc` | array | No | Additional CC recipients. |
| `bcc` | array | No | BCC recipient address(es). |
| `reply_to` | array | No | Reply-to address(es) if different from the inbox. |
| `text` | string | No | Plain text body of the reply. |
| `html` | string | No | HTML body of the reply. |
| `labels` | array | No | Labels to tag the reply message. |
| `attachments` | array | No | Array of attachment objects: {filename, content_type, content (base64)} or {filename, content_type, url}. |
| `headers` | object | No | Custom email headers as key-value pairs. |

```bash
# Replace {inbox_id}, {message_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages/{message_id}/reply-all","body":{"to":"<array>","cc":"<array>","bcc":"<array>","reply_to":"<array>","text":"<string>","html":"<string>","labels":"<array>","attachments":"<array>","headers":"<object>"}}'
```

### Reply To Message

Reply to a specific message. Automatically sets In-Reply-To and References headers for proper threading.

`POST /v0/inboxes/{inbox_id}/messages/{message_id}/reply`

**Estimated cost:** $0.01

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `message_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `to` | array | No | Override recipient(s). Defaults to the original sender if omitted. |
| `cc` | array | No | CC recipient address(es). |
| `bcc` | array | No | BCC recipient address(es). |
| `reply_to` | array | No | Reply-to address(es) if different from the inbox. |
| `reply_all` | boolean | No | If true, reply to all original recipients. |
| `text` | string | No | Plain text body of the reply. |
| `html` | string | No | HTML body of the reply. |
| `labels` | array | No | Labels to tag the reply message. |
| `attachments` | array | No | Array of attachment objects: {filename, content_type, content (base64)} or {filename, content_type, url}. |
| `headers` | object | No | Custom email headers as key-value pairs. |

```bash
# Replace {inbox_id}, {message_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages/{message_id}/reply","body":{"to":"<array>","cc":"<array>","bcc":"<array>","reply_to":"<array>","reply_all":"<boolean>","text":"<string>","html":"<string>","labels":"<array>","attachments":"<array>","headers":"<object>"}}'
```

### List Messages

List all messages in an inbox, ordered by most recent. Supports pagination and filtering by labels or time range.

`GET /v0/inboxes/{inbox_id}/messages`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `limit` | integer | No | Max number of messages to return. |
| `page_token` | string | No | Token from previous response for fetching the next page. |
| `labels` | string | No | Filter by label (e.g., unread, sent, trash). |
| `before` | string | No | Only return messages before this ISO 8601 timestamp. |
| `after` | string | No | Only return messages after this ISO 8601 timestamp. |
| `ascending` | boolean | No | If true, sort oldest first. Default is newest first. |
| `include_spam` | boolean | No | Include messages labeled as spam. |
| `include_blocked` | boolean | No | Include messages from blocked senders. |
| `include_trash` | boolean | No | Include messages in trash. |

```bash
# Replace {inbox_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages","method":"GET","query":{"limit":"<integer>","page_token":"<string>","labels":"<string>","before":"<string>","after":"<string>","ascending":"<boolean>","include_spam":"<boolean>","include_blocked":"<boolean>","include_trash":"<boolean>"}}'
```

### Update Draft

Update an existing draft. Only the fields you include will be changed; omitted fields are left unchanged.

`PATCH /v0/inboxes/{inbox_id}/drafts/{draft_id}`

**Cost:** Free

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `draft_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `to` | array | No | Updated recipient email addresses. |
| `cc` | array | No | Updated CC recipients. |
| `bcc` | array | No | Updated BCC recipients. |
| `reply_to` | array | No | Updated reply-to addresses. |
| `subject` | string | No | Updated subject line. |
| `text` | string | No | Updated plain text body. |
| `html` | string | No | Updated HTML body. |
| `labels` | array | No | Updated labels. |
| `attachments` | array | No | Updated attachments: {filename, content_type, content (base64)} or {filename, content_type, url}. |
| `headers` | object | No | Updated custom email headers. |

```bash
# Replace {inbox_id}, {draft_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/drafts/{draft_id}","method":"PATCH","body":{"to":"<array>","cc":"<array>","bcc":"<array>","reply_to":"<array>","subject":"<string>","text":"<string>","html":"<string>","labels":"<array>","attachments":"<array>","headers":"<object>"}}'
```

### Forward Message

Forward a message to new recipients. Includes the original message content and any attachments.

`POST /v0/inboxes/{inbox_id}/messages/{message_id}/forward`

**Estimated cost:** $0.01

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `inbox_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `message_id` | string | Yes | Path parameter — substitute directly into the endpoint `path`. |
| `to` | array | No | Recipient email address(es) to forward to. At least one of to, cc, or bcc is required. |
| `cc` | array | No | CC recipient address(es). |
| `bcc` | array | No | BCC recipient address(es). |
| `reply_to` | array | No | Reply-to address(es) if different from the inbox. |
| `subject` | string | No | Override subject. Defaults to "Fwd: [original subject]". |
| `text` | string | No | Additional plain text to prepend before the forwarded content. |
| `html` | string | No | Additional HTML to prepend before the forwarded content. |
| `labels` | array | No | Labels to tag the forwarded message. |
| `attachments` | array | No | Additional attachments: {filename, content_type, content (base64)} or {filename, content_type, url}. |
| `headers` | object | No | Custom email headers as key-value pairs. |

```bash
# Replace {inbox_id}, {message_id} in "path" with real values before sending
curl -X POST 'https://api.orth.sh/v1/run' \
  -H 'Authorization: Bearer $ORTHOGONAL_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"api":"agentmail","path":"/v0/inboxes/{inbox_id}/messages/{message_id}/forward","body":{"to":"<array>","cc":"<array>","bcc":"<array>","reply_to":"<array>","subject":"<string>","text":"<string>","html":"<string>","labels":"<array>","attachments":"<array>","headers":"<object>"}}'
```

---

Full details and an interactive quickstart: https://orthogonal.com/discover/agentmail
