Base URL
https://app.dmu.email/api/v1
Authentication
Bearer dmk_… API key
Rate limit
120 requests a minute per key

Create a draft

POST/drafts

Writes a message without sending it. Sending is a second call, Send a draft, so that retrying a send can never send twice.

Needs the permissiondrafts:create

What comes back is what will be sent: the HTML has been sanitised and the mailbox’s signature added. Retrying a create is harmless; at worst it makes a second draft, which sends nothing.

To answer a message, use Reply or forward instead. It threads the reply and quotes the original, which this doesn’t.

Body

mailboxIdstringrequired
The mailbox to send from. See List mailboxes.
tolist of stringsoptional
The recipients. It needs at least one by the time you send it.
cclist of stringsoptional
Copied, and bcc, copied without showing.
subjectstringoptional
The subject.
bodyHtmlstringoptional
The message, as HTML.

Returns

idstring
The draft. It keeps this id once it’s sent.
threadIdstring
The conversation it’s in.
mailboxIdstring
The mailbox it will go from, and from, its address.
tolist of strings
With cc and bcc: its recipients.
subjectstring
Its subject.
bodyHtmlstring
Sanitised, with the mailbox’s signature: what will be sent.
updatedAtstring
When it last changed.

Errors

400mailbox_required
There’s no mailboxId.
400invalid_draft
The draft couldn’t be made. The message says why.
401invalid_key
The key is wrong, expired or revoked. With no Authorization header at all, the code is missing_credentials.
403missing_scope
The key doesn’t have drafts:create. The X-Required-Scope header names what’s missing.
404mailbox_not_found
There’s no such mailbox, or the key’s owner can’t see it.
429rate_limited
More than 120 requests a minute from this key. Wait for Retry-After seconds.
curl https://app.dmu.email/api/v1/drafts \
  -X POST \
  -H "Authorization: Bearer dmk_7f3a9c2e1b4d_Xq8v…" \
  -H "Content-Type: application/json" \
  -d '{
    "mailboxId": "9e53e6ba",
    "to": ["maria@example.com"],
    "subject": "Your delivery is booked",
    "bodyHtml": "<p>Your delivery is booked for Tuesday.</p>"
  }'

Response

200 OK

{
  "data": {
    "id": "8c1e2f4a",
    "threadId": "f3d86b25",
    "mailboxId": "9e53e6ba",
    "from": "info@aegeanfreight.gr",
    "to": ["maria@example.com"],
    "cc": [],
    "bcc": [],
    "subject": "Your delivery is booked",
    "bodyHtml": "<p>Your delivery is booked for Tuesday.</p><p>Aegean Freight</p>",
    "updatedAt": "2026-09-27T09:14:05.000Z"
  }
}

Every response wraps its result in data. A page of threads adds nextCursor, which is null on the last page.