Drafts

Create a draft

Requires scope: send or draft. Creates a draft, or a scheduled draft if send_at is in the future. Scheduling sends the draft at that time, so a send_at needs the send scope: a key with only draft gets 403 insufficient_scope. A draft cannot carry attachments (422 invalid_field, param attachments); send files with POST /v1/messages.

post/v1/drafts

Request

  • Base URL: https://api.mails.ai
  • URL: https://api.mails.ai/v1/drafts
  • Auth: HTTP bearer

Request body

agentstring

Which agent sends the draft: its name or agt_ id. Left out: the agent a key is tied to, else the workspace's only agent, or a new one named agent when there is none and the key may create agents (the manage scope; otherwise 403 insufficient_scope). With several agents and a key tied to none, it is required (400 missing_field).

ccstring[]

Addresses to copy when the draft is sent, up to 50.

bccstring[]

Addresses to blind-copy when the draft is sent, up to 50. They appear in none of the email's headers.

subjectstring

Subject line, 1 to 998 characters. A draft without one is sent with an empty subject.

body_textstring

Plain-text body, up to 1,000,000 characters. A draft can be saved without a body.

body_htmlstring

HTML body, up to 1,000,000 characters. A draft can be saved without a body.

reply_tostring email

The address replies to the sent draft should go to. Left out, replies go to the agent's receiving_address.

in_reply_to_message_idstring

Id of the message this one answers (msg_… or rcv_…), named in the email's In-Reply-To header. Once sent, the draft joins its thread when the same agent sent or received it. Left out, it starts a new thread.

send_atstring date-time

Schedule the draft to send at this time: an ISO 8601 UTC time ending in Z, in the future (400 invalid_field otherwise). It needs the send scope. Left out, the draft waits until it is sent.

list_unsubscribeboolean

Opt in to RFC 8058 one-click unsubscribe: the message carries List-Unsubscribe and List-Unsubscribe-Post: List-Unsubscribe=One-Click headers, so the recipient's mail app shows an Unsubscribe button. One click suppresses the address for your whole workspace: every later send to it from any of your agents is refused with recipient_suppressed until you allowlist it (POST /v1/suppression/allow). Turn it on for newsletters, digests and other recurring mail. Leave it off (the default) for password resets, sign-in links, receipts and anything else the recipient must keep receiving. Needs exactly one to recipient and no cc or bcc.

Response

The created draft.

idstring required

Draft id (dft_…).

agent_idstring required

Id (agt_…) of the agent the draft is sent from, chosen when it was created.

tostring[]

The draft's recipients, always as a list, even when one address was given.

ccstring[]

The draft's Cc addresses. Absent when cc was never given; [] when it was given empty or a PATCH emptied it.

bccstring[]

The draft's Bcc addresses, who receive it but appear in none of its headers. Absent when bcc was never given; [] when it was given empty or a PATCH emptied it.

subjectstring

The draft's subject. Absent when none was given; the draft is then sent with an empty subject.

body_textstring

The draft's plain-text body. Absent when none was given.

body_htmlstring

The draft's HTML body. Absent when none was given.

reply_tostring email

The address replies should go to, as given on create; absent when none was.

in_reply_to_message_idstring

Id of the message this draft answers (msg_… or rcv_…), as given on create; absent when none was.

thread_idstring

The thread the draft's message joined (thrd_…), written when the draft is sent: the thread of the message named by sent_message_id, also when the send could not be fully recorded after that message was stored (see error_message). Absent until it is sent, when a send could not be recorded far enough to store its message (no sent_message_id), once that thread is deleted, and on drafts sent before this field was filled in.

send_atstring date-time

The time the draft is scheduled for (UTC); it stays after the draft is sent. Absent when it was never scheduled or was unscheduled with send_at: null.

list_unsubscribeboolean

Whether the draft is sent with RFC 8058 one-click unsubscribe headers (list_unsubscribe on create or update; off by default). One click suppresses the recipient for the whole workspace.

status'draft' | 'scheduled' | 'sending' | 'sent' | 'failed' | 'canceled' required

draft: saved, not scheduled. scheduled: waiting for send_at. sending: being sent now. sent: see sent_message_id. failed: the send failed, see error_message. canceled: a scheduled reply whose conversation was deleted before it went out. Only draft and scheduled drafts can be edited or sent.

sent_message_idstring

Id (msg_…) of the message the draft became when it was sent. Absent on a draft not yet sent; a sent draft whose send could not be fully recorded (see error_message) can lack it too.

error_messagestring

Why the draft is failed or canceled. On a sent draft it reports a send that went out but could not be fully recorded. Absent otherwise.

created_atstring date-time required

When the draft was created (UTC).

updated_atstring date-time required

When the draft last changed: an edit, a new schedule, or a status change as it is sent.

Changes

No recorded changes to this operation across all 1 revision of this API.