Save a draft

.md

Park a message nobody has sent yet.

Scopesmail:write
POST/v1/me/mail/drafts

The same message as a send, before it leaves. A draft may be half a thought, so only address_id is required.

Keep the id that comes back and send it as draft_id on the next save, and on the send. Without it every save writes a second draft and the writer leaves a trail of copies behind them.

Request

curl -X POST https://api.proppertrading.com/v1/me/mail/drafts \
  -H "Authorization: Bearer ptat_9f2c1a44_3b8e7d2f5c9a1b4e6d8f0a2c4e6b8d1f" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 2c4e6a80-1b3d-4f5a-8c9e-0d1f2a3b4c5d" \
  -d '{
    "address_id": "mbx_w6sy3skvgydh5e3b",
    "to": ["[email protected]"],
    "subject": "Re: Payout request",
    "body": "<p>Your payout is</p>",
    "draft_id": "msg_q9w3k7x2n8m4t6vb"
  }'

Same fields as Send a message, with the same string ids. Only address_id is required, and to, subject and body may all be empty.

Response

{
    "data": {
        "id": "msg_q9w3k7x2n8m4t6vb",
        "object": "mail_message",
        "thread_id": "thr_c4n8w2k7p5x9m3qd",
        "address_id": "mbx_w6sy3skvgydh5e3b",
        "folder": "drafts",
        "subject": "Re: Payout request",
        "to_recipients": [{ "email": "[email protected]", "name": null }],
        "cc_recipients": [],
        "message_at": "2026-08-19T18:04:08.000000Z"
    },
    "meta": { "request_id": "req_01kz4bkr1aj1gv63d8fv3133ey" }
}

Autosaving

Every save is a POST and needs its own Idempotency-Key. Generate a fresh one per save: reusing one would replay the previous answer instead of storing what has been typed since.

A draft is an ordinary message in the drafts folder, so it appears in the list and can be erased like anything else.

Errors

StatusCodeMeaning
400missing_idempotency_keyEvery POST needs one
400not_a_draftdraft_id points at a message that is not a draft
403insufficient_scopeThis device does not hold mail:write
404resource_not_foundThe mailbox or the draft is not one of yours
422validation_failedaddress_id missing, a field is malformed, or an id was sent as a number