drafts.md
title: "Drafts" description: "Create, update, send and delete drafts: unsent messages a person or agent can review before they go out, including sends scheduled for later with send_at." canonical: "https://machinemail.dev/docs/reference/api/drafts"
Drafts
Create, update, send and delete drafts: unsent messages a person or agent can review before they go out, including sends scheduled for later with send_at.
Source: https://machinemail.dev/docs/reference/api/drafts
| Method | Path | Summary |
|---|---|---|
GET |
/v0/drafts |
List Drafts |
GET |
/v0/drafts/{draft_id} |
Get Draft |
GET |
/v0/inboxes/{inbox_id}/drafts |
List Drafts |
POST |
/v0/inboxes/{inbox_id}/drafts |
Create Draft |
GET |
/v0/inboxes/{inbox_id}/drafts/{draft_id} |
Get Draft |
PATCH |
/v0/inboxes/{inbox_id}/drafts/{draft_id} |
Update Draft |
DELETE |
/v0/inboxes/{inbox_id}/drafts/{draft_id} |
Delete Draft |
GET |
/v0/inboxes/{inbox_id}/drafts/{draft_id}/attachments/{attachment_id}/download |
Download Draft Attachment |
POST |
/v0/inboxes/{inbox_id}/drafts/{draft_id}/send |
Send Draft |
GET |
/v0/pods/{pod_id}/drafts |
List Drafts in Pod |
GET |
/v0/pods/{pod_id}/drafts/{draft_id} |
Get Draft in Pod |
GET |
/v0/pods/{pod_id}/inboxes/{inbox_id}/drafts |
List Drafts in Pod |
POST |
/v0/pods/{pod_id}/inboxes/{inbox_id}/drafts |
Create Draft in Pod |
GET |
/v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id} |
Get Draft in Pod |
PATCH |
/v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id} |
Update Draft in Pod |
DELETE |
/v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id} |
Delete Draft in Pod |
GET |
/v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id}/attachments/{attachment_id}/download |
Download Draft Attachment in Pod |
POST |
/v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id}/send |
Send Draft in Pod |
List Drafts
GET /v0/drafts
Drafts of every inbox in scope, newest first. The labels filter is not supported.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Query parameters
| Field | Type | Description | |
|---|---|---|---|
limit |
integer |
Maximum number of items to return. Default 50, maximum 500; larger values are capped. | |
page_token |
string |
next_page_token from the previous page. | |
before |
string (date-time) |
Only drafts created before this time. | |
after |
string (date-time) |
Only drafts created after this time. | |
ascending |
boolean |
Sort oldest first. |
Response
200 A page of drafts (application/json)
| Field | Type | Description | |
|---|---|---|---|
count |
integer |
required | Number of items returned. |
limit |
integer |
Maximum number of items per page. Default 50, maximum 500; larger values are capped. | |
next_page_token |
string |
Page token for pagination. Absent on the last page. | |
drafts |
DraftItem[] |
required | Ordered by created_at, newest first unless ascending is set. |
Each item of drafts is a DraftItem:
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox. |
draft_id |
string |
required | ID of the draft. |
labels |
string[] |
required | Labels of the draft. The sent message gets them. |
to |
string[] |
Recipient addresses. | |
cc |
string[] |
CC addresses. | |
bcc |
string[] |
BCC addresses. | |
subject |
string |
Subject of the draft. | |
preview |
string |
Text preview of the draft. | |
attachments |
Attachment[] |
Attachments of the draft. size is 0 for attachments given by url until the draft is sent (the URL is fetched then). | |
in_reply_to |
string |
ID of the message being replied to. | |
send_status |
"scheduled" | "sending" | "failed" |
scheduled while waiting for send_at, sending while a sender holds it, failed when a scheduled send failed (it is not retried). Absent on drafts without send_at. | |
send_at |
string (date-time) |
Time at which the draft is sent automatically. | |
updated_at |
string (date-time) |
required | Time at which the draft was last updated. |
client_id |
string |
Client ID given at creation. | |
reply_to |
string[] |
Reply-to addresses. | |
text |
string |
Plain text body. | |
html |
string |
HTML body. | |
references |
string[] |
Message IDs the draft references. | |
created_at |
string (date-time) |
required | Time at which the draft was created. |
pod_id |
string |
required | ID of the pod. |
Errors
| Status | Meaning |
|---|---|
400 |
Invalid request: error.type is validation and error.param names the field. |
401 |
Missing, invalid, expired or revoked credential. |
403 |
The credential lacks the permission or scope for this request (error.type forbidden), or MachineMail suspended the organization or its sending (account_suspended: error.message says what still works; do not retry or re-register). |
500 |
Unexpected server error. |
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/drafts" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
{
"count": 1,
"limit": 50,
"next_page_token": "eyJvIjo1MH0",
"drafts": [
{
"inbox_id": "agent@machinemail.dev",
"draft_id": "drf_01k6x3b7hn0000e1n7qv3z6g8j",
"labels": ["UNREAD"],
"to": ["customer@example.com"],
"cc": ["team@example.com"],
"bcc": ["audit@example.com"],
"subject": "Order #1042",
"preview": "Thanks for the quick reply.",
"attachments": [
{
"attachment_id": "att_01k6x3h7qv0000m7v3xb9f2p4r",
"filename": "invoice.pdf",
"size": 2048,
"content_type": "application/pdf",
"content_disposition": "string",
"content_id": "string"
}
],
"in_reply_to": "msg_01k6x3a1g00000d0m6pt2y5f7h",
"send_status": "scheduled",
"send_at": "2026-10-01T12:00:00.000Z",
"updated_at": "2026-10-01T12:00:00.000Z",
"client_id": "my-client-id",
"reply_to": ["agent@machinemail.dev"],
"text": "Thanks for the quick reply.",
"html": "<p>Thanks for the quick reply.</p>",
"references": ["string"],
"created_at": "2026-10-01T12:00:00.000Z",
"pod_id": "pod_01k6x2m9qd0001b8j4mr0w3d5f"
}
]
}
Get Draft
GET /v0/drafts/{draft_id}
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
draft_id |
string |
required | ID of the draft. |
Response
200 The draft (application/json)
Each item of attachments is a Attachment:
| Field | Type | Description | |
|---|---|---|---|
attachment_id |
string |
required | ID of the attachment. |
filename |
string |
Filename of the attachment. | |
size |
integer |
required | Size of the attachment in bytes. |
content_type |
string |
Content type of the attachment. | |
content_disposition |
string |
Content disposition of the attachment (inline or attachment). | |
content_id |
string |
Content ID of the attachment. |
Errors
| Status | Meaning |
|---|---|
401 |
Missing, invalid, expired or revoked credential. |
403 |
The credential lacks the permission or scope for this request (error.type forbidden), or MachineMail suspended the organization or its sending (account_suspended: error.message says what still works; do not retry or re-register). |
404 |
Not found. Also returned for resources outside the credential scope. |
500 |
Unexpected server error. |
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
{
"inbox_id": "agent@machinemail.dev",
"draft_id": "drf_01k6x3b7hn0000e1n7qv3z6g8j",
"labels": ["UNREAD"],
"to": ["customer@example.com"],
"cc": ["team@example.com"],
"bcc": ["audit@example.com"],
"subject": "Order #1042",
"preview": "Thanks for the quick reply.",
"attachments": [
{
"attachment_id": "att_01k6x3h7qv0000m7v3xb9f2p4r",
"filename": "invoice.pdf",
"size": 2048,
"content_type": "application/pdf",
"content_disposition": "string",
"content_id": "string"
}
],
"in_reply_to": "msg_01k6x3a1g00000d0m6pt2y5f7h",
"send_status": "scheduled",
"send_at": "2026-10-01T12:00:00.000Z",
"updated_at": "2026-10-01T12:00:00.000Z",
"client_id": "my-client-id",
"reply_to": ["agent@machinemail.dev"],
"text": "Thanks for the quick reply.",
"html": "<p>Thanks for the quick reply.</p>",
"references": ["string"],
"created_at": "2026-10-01T12:00:00.000Z",
"pod_id": "pod_01k6x2m9qd0001b8j4mr0w3d5f"
}
List Drafts
GET /v0/inboxes/{inbox_id}/drafts
Drafts of the inbox, newest first. The labels filter is not supported.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox: its email address, as in AgentMail (inbox_id == email). |
Query parameters
Response
200 A page of drafts (application/json)
Each item of drafts is a DraftItem:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/drafts" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Create Draft
POST /v0/inboxes/{inbox_id}/drafts
With send_at the draft is scheduled: a background worker sends it at that time (send_status: scheduled). A scheduled send that fails sets send_status: failed and is not retried, except when the email provider could not take mail for now (throttled, sending paused, daily quota used up, or unavailable): the draft stays scheduled and a later pass sends it.
Reply drafts: set in_reply_to to a message ID in this inbox; recipients are not filled in for you. Forward drafts (forward_of) and reply_all are not supported.
A message can have at most 50 recipients: to, cc and bcc together, each address counted once. An unclaimed sandbox inbox can have at most 5. More is a 400 validation error with param: "to". The cap is checked when the draft is created or updated, and again when it is sent: a scheduled draft over the cap at send time gets send_status: failed.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_create.
Path parameters
Request body
Content type: application/json.
| Field | Type | Description | |
|---|---|---|---|
labels |
string[] |
Labels of the draft. | |
reply_to |
string | string[] |
Reply-to addresses: one address or a list. | |
to |
string | string[] |
Recipient addresses: one address or a list. | |
cc |
string | string[] |
CC addresses: one address or a list. | |
bcc |
string | string[] |
BCC addresses: one address or a list. | |
subject |
string |
Subject. | |
text |
string |
Plain text body. | |
html |
string |
HTML body. | |
attachments |
SendAttachment[] |
Attachments, sent with the draft. Each needs content or url; a url is fetched when the draft is sent. | |
in_reply_to |
string |
ID of a message in this inbox to reply to: the sent message gets its In-Reply-To and References headers. | |
send_at |
string (date-time) | null |
Schedule the draft: it is sent automatically at this time (send_status: scheduled). null or absent: not scheduled. | |
client_id |
string |
Idempotency key: a create with a client_id already used in the organization returns that draft with 200, or 409 when that draft is outside the pod or inbox of the API key or route. |
Each item of attachments is a SendAttachment:
| Field | Type | Description | |
|---|---|---|---|
filename |
string |
Filename of the attachment. Defaults to the last segment of url. | |
content_type |
string |
Content type of the attachment. Defaults to the Content-Type of the url response. | |
content_disposition |
"inline" | "attachment" |
Content disposition of the attachment. | |
content_id |
string |
Content ID, for inline images referenced as cid: in the HTML body. | |
content |
string |
Base64 encoded content of the attachment. | |
url |
string |
URL the API downloads the attachment from: public http(s) only, no redirects, at most 10 MB, 20 second timeout. |
Response
200 A draft with this client_id already exists; it is returned unchanged. (application/json)
Each item of attachments is a Attachment:
201 Created (application/json)
Each item of attachments is a Attachment:
Errors
| Status | Meaning |
|---|---|
400 |
Invalid request: error.type is validation and error.param names the field. |
401 |
Missing, invalid, expired or revoked credential. |
402 |
Free plan over its storage (1 GB: messages, drafts and held mail): a draft cannot grow past it (limit_key: "storage_bytes"). Delete mail or drafts to make room. Paid plans are never refused. |
403 |
The credential lacks the permission or scope for this request (error.type forbidden), or MachineMail suspended the organization or its sending (account_suspended: error.message says what still works; do not retry or re-register). |
404 |
Not found. Also returned for resources outside the credential scope. |
409 |
Conflicts with an existing resource. |
500 |
Unexpected server error. |
503 |
The draft sets or moves send_at and the scheduler is unavailable for a moment: nothing was saved. Retry with backoff. |
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/drafts" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "customer@example.com",
"subject": "Order #1042",
"text": "Thanks for the quick reply."
}'
Get Draft
GET /v0/inboxes/{inbox_id}/drafts/{draft_id}
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox: its email address, as in AgentMail (inbox_id == email). |
draft_id |
string |
required | ID of the draft. |
Response
200 The draft (application/json)
Each item of attachments is a Attachment:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Update Draft
PATCH /v0/inboxes/{inbox_id}/drafts/{draft_id}
Fields you omit are unchanged; null clears a field. in_reply_to cannot be changed.
A message can have at most 50 recipients: to, cc and bcc together, each address counted once. An unclaimed sandbox inbox can have at most 5. More is a 400 validation error with param: "to".
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_update.
Path parameters
Request body
Content type: application/json.
| Field | Type | Description | |
|---|---|---|---|
reply_to |
string | string[] | null |
Reply-to addresses. null clears them. | |
to |
string | string[] | null |
Recipient addresses. null clears them. | |
cc |
string | string[] | null |
CC addresses. null clears them. | |
bcc |
string | string[] | null |
BCC addresses. null clears them. | |
subject |
string | null |
Subject. null clears it. | |
text |
string | null |
Plain text body. null clears it. | |
html |
string | null |
HTML body. null clears it. | |
add_attachments |
SendAttachment[] |
Attachments to add. Each needs content or url. | |
remove_attachments |
string[] |
IDs of attachments to remove. Unknown IDs are ignored. | |
add_labels |
string[] |
Labels to add. | |
remove_labels |
string[] |
Labels to remove (applied after add_labels). | |
send_at |
string (date-time) | null |
Schedule (or reschedule) the draft. null unschedules it. |
Each item of add_attachments is a SendAttachment:
Response
200 The updated draft (application/json)
Each item of attachments is a Attachment:
Errors
Error bodies use the error envelope.
Example
curl -X PATCH "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "customer@example.com",
"subject": "Order #1042",
"text": "Thanks for the quick reply.",
"add_labels": [
"string"
]
}'
Delete Draft
DELETE /v0/inboxes/{inbox_id}/drafts/{draft_id}
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_delete.
Path parameters
Response
200 Deleted (application/json)
| Field | Type | Description | |
|---|---|---|---|
ok |
true |
required |
Errors
Error bodies use the error envelope.
Example
curl -X DELETE "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
{
"ok": true
}
Download Draft Attachment
GET /v0/inboxes/{inbox_id}/drafts/{draft_id}/attachments/{attachment_id}/download
The bytes of a base64 attachment on a draft, served like a message attachment download (nosniff, RFC 6266 Content-Disposition, disposition=inline previews for images, PDF and plain text only). url attachments are fetched when the draft is sent, so they return 404 until then.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
inbox_id |
string |
required | ID of the inbox: its email address, as in AgentMail (inbox_id == email). |
draft_id |
string |
required | ID of the draft. |
attachment_id |
string |
required | ID of the attachment. |
Query parameters
| Field | Type | Description | |
|---|---|---|---|
disposition |
"attachment" | "inline" |
inline previews raster images, PDF and plain text in the browser; every other type downloads regardless. Default: "attachment". |
Response
200 The attachment bytes (application/octet-stream)
Headers:
| Field | Type | Description | |
|---|---|---|---|
Content-Disposition |
string |
attachment; filename=" |
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j/attachments/att_01k6x3h7qv0000m7v3xb9f2p4r/download" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Send Draft
POST /v0/inboxes/{inbox_id}/drafts/{draft_id}/send
Sends the draft now and deletes it; a draft.sent and a message.sent event are emitted. The sent message gets the draft labels plus add_labels, minus remove_labels.
Suppressed recipients and recipients on a send block list return 403, a paused inbox 403. A draft already being sent returns 409.
An unclaimed sandbox agent can send at most 10 messages to at most 10 different recipients per rolling 24 hours: 429 with Retry-After.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_send.
Path parameters
Request body
Content type: application/json.
| Field | Type | Description | |
|---|---|---|---|
add_labels |
string | string[] |
Label or labels to add. | |
remove_labels |
string | string[] |
Label or labels to remove. |
Response
201 Sent (application/json)
| Field | Type | Description | |
|---|---|---|---|
message_id |
string |
required | ID of the message. |
thread_id |
string |
required | ID of the thread. |
timestamp |
string (date-time) |
required | When the message was sent. |
Errors
| Status | Meaning |
|---|---|
400 |
Invalid request: error.type is validation and error.param names the field. |
401 |
Missing, invalid, expired or revoked credential. |
402 |
Free plan over its messages cap: 3,000 a month or 100 a day, inbound messages and outbound recipients together (each recipient counts once). error.limit_key is messages_per_month or messages_per_day; resets_at and Retry-After say when the allowance resets (absent when this message has more recipients than the cap itself). Paid plans are never refused. |
403 |
The credential lacks the permission or scope for this request (error.type forbidden), or MachineMail suspended the organization or its sending (account_suspended: error.message says what still works; do not retry or re-register). |
404 |
Not found. Also returned for resources outside the credential scope. |
409 |
Conflicts with an existing resource. |
429 |
Unclaimed sandbox agent over a send cap: at most 10 messages to at most 10 different recipients per rolling 24 hours. Retry-After says when the next send fits. Claiming the inbox lifts the caps. Also returned when a Free organization goes over its daily number of different recipients. |
500 |
Unexpected server error. |
501 |
Not implemented. |
502 |
The email provider refused or failed the send (error.type is upstream_error). Nothing was sent and no message was stored. error.message says why: a rejected message or recipient is final, and so is a used-up sending quota until it resets; a throttled or unavailable provider can be retried later. A scheduled draft whose send fails this way is marked send_status: failed, unless the provider could not take mail for now (throttled, sending paused, quota used up, or unavailable): it stays scheduled and is retried. |
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j/send" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"add_labels": "string"
}'
{
"message_id": "msg_01k6x3a1g00000d0m6pt2y5f7h",
"thread_id": "thd_01k6x3a1fz0000c9k5ns1x4e6g",
"timestamp": "2026-10-01T12:00:00.000Z"
}
List Drafts in Pod
GET /v0/pods/{pod_id}/drafts
Same as List Drafts (GET /v0/drafts), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
Query parameters
Response
200 A page of drafts (application/json)
Each item of drafts is a DraftItem:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/drafts" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Get Draft in Pod
GET /v0/pods/{pod_id}/drafts/{draft_id}
Same as Get Draft (GET /v0/drafts/{draft_id}), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
draft_id |
string |
required | ID of the draft. |
Response
200 The draft (application/json)
Each item of attachments is a Attachment:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
List Drafts in Pod
GET /v0/pods/{pod_id}/inboxes/{inbox_id}/drafts
Same as List Drafts (GET /v0/inboxes/{inbox_id}/drafts), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
inbox_id |
string |
required | ID of the inbox: its email address, as in AgentMail (inbox_id == email). |
Query parameters
Response
200 A page of drafts (application/json)
Each item of drafts is a DraftItem:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/inboxes/agent@machinemail.dev/drafts" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Create Draft in Pod
POST /v0/pods/{pod_id}/inboxes/{inbox_id}/drafts
Same as Create Draft (POST /v0/inboxes/{inbox_id}/drafts), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_create.
Path parameters
Request body
Content type: application/json.
Each item of attachments is a SendAttachment:
Response
200 A draft with this client_id already exists; it is returned unchanged. (application/json)
Each item of attachments is a Attachment:
201 Created (application/json)
Each item of attachments is a Attachment:
Errors
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/inboxes/agent@machinemail.dev/drafts" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "customer@example.com",
"subject": "Order #1042",
"text": "Thanks for the quick reply."
}'
Get Draft in Pod
GET /v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id}
Same as Get Draft (GET /v0/inboxes/{inbox_id}/drafts/{draft_id}), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
inbox_id |
string |
required | ID of the inbox: its email address, as in AgentMail (inbox_id == email). |
draft_id |
string |
required | ID of the draft. |
Response
200 The draft (application/json)
Each item of attachments is a Attachment:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Update Draft in Pod
PATCH /v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id}
Same as Update Draft (PATCH /v0/inboxes/{inbox_id}/drafts/{draft_id}), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_update.
Path parameters
Request body
Content type: application/json.
Each item of add_attachments is a SendAttachment:
Response
200 The updated draft (application/json)
Each item of attachments is a Attachment:
Errors
Error bodies use the error envelope.
Example
curl -X PATCH "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "customer@example.com",
"subject": "Order #1042",
"text": "Thanks for the quick reply.",
"add_labels": [
"string"
]
}'
Delete Draft in Pod
DELETE /v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id}
Same as Delete Draft (DELETE /v0/inboxes/{inbox_id}/drafts/{draft_id}), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_delete.
Path parameters
Response
200 Deleted (application/json)
| Field | Type | Description | |
|---|---|---|---|
ok |
true |
required |
Errors
Error bodies use the error envelope.
Example
curl -X DELETE "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
{
"ok": true
}
Download Draft Attachment in Pod
GET /v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id}/attachments/{attachment_id}/download
Same as Download Draft Attachment (GET /v0/inboxes/{inbox_id}/drafts/{draft_id}/attachments/{attachment_id}/download), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_read.
Path parameters
| Field | Type | Description | |
|---|---|---|---|
pod_id |
string |
required | ID of the pod. |
inbox_id |
string |
required | ID of the inbox: its email address, as in AgentMail (inbox_id == email). |
draft_id |
string |
required | ID of the draft. |
attachment_id |
string |
required | ID of the attachment. |
Query parameters
Response
200 The attachment bytes (application/octet-stream)
Headers:
Errors
Error bodies use the error envelope.
Example
curl "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j/attachments/att_01k6x3h7qv0000m7v3xb9f2p4r/download" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY"
Send Draft in Pod
POST /v0/pods/{pod_id}/inboxes/{inbox_id}/drafts/{draft_id}/send
Same as Send Draft (POST /v0/inboxes/{inbox_id}/drafts/{draft_id}/send), limited to the pod.
Authentication: Authorization: Bearer <api key> or the dashboard mm_session cookie. Permission: draft_send.
Path parameters
Request body
Content type: application/json.
Response
201 Sent (application/json)
Errors
Error bodies use the error envelope.
Example
curl -X POST "https://api.machinemail.dev/v0/pods/pod_01k6x2m9qd0001b8j4mr0w3d5f/inboxes/agent@machinemail.dev/drafts/drf_01k6x3b7hn0000e1n7qv3z6g8j/send" \
-H "Authorization: Bearer $MACHINEMAIL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"add_labels": "string"
}'