Sign in

API reference / Mail

Mail

Mailboxes, folders, messages, drafts, sending and the changes feed.

Base URL https://api.zilomail.in

List mailboxes#

GET/v1/mail/mailboxes
mail.read

The person's own mailboxes.

Answer · 200 OK

dataarray of object
idstring
addressstring
namestring | null
quotaBytesinteger
usedBytesinteger
primaryboolean
The one used when mailbox isn't given.
curl "https://api.zilomail.in/v1/mail/mailboxes" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Answer · 200 OK
{
  "data": [
    {
      "id": "string",
      "address": "string",
      "name": "string",
      "quotaBytes": 0,
      "usedBytes": 0,
      "primary": false
    }
  ]
}
Try it

Sign in to call it as yourself.

List folders#

GET/v1/mail/folders
mail.read

Every folder of a mailbox with its message and unread counts.

Query

mailboxstring
Which of the person's mailboxes: its id or address. Default: their first. Up to 320 characters.

Answer · 200 OK

dataarray of object
idstring
namestring
roleenum | null
A special folder's job; null for the person's own folders. One of inbox, sent, drafts, trash, junk, archive.
parentIdstring | null
totalinteger
unreadinteger
uidValidityinteger
As IMAP's UIDVALIDITY: if it changes, forget the folder's UIDs.
uidNextinteger
curl "https://api.zilomail.in/v1/mail/folders" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Answer · 200 OK
{
  "data": [
    {
      "id": "string",
      "name": "string",
      "role": "inbox",
      "parentId": "string",
      "total": 0,
      "unread": 0,
      "uidValidity": 0,
      "uidNext": 0
    }
  ]
}
Try it

Sign in to call it as yourself.

Create a folder#

POST/v1/mail/folders
mail.writeIdempotency-Key

Body

mailboxstring
Which of the person's mailboxes: its id or address. Default: their first. Up to 320 characters.
namestringrequired
Up to 100 characters.
parentIdstring
An id this API gave out. Up to 64 characters.

Answer · 201 Created

idstring
namestring
roleenum | null
A special folder's job; null for the person's own folders. One of inbox, sent, drafts, trash, junk, archive.
parentIdstring | null
totalinteger
unreadinteger
uidValidityinteger
As IMAP's UIDVALIDITY: if it changes, forget the folder's UIDs.
uidNextinteger
curl -X POST "https://api.zilomail.in/v1/mail/folders" \
  -H "Authorization: Bearer $ZILO_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Invoices"
}'
Answer · 201 Created
{
  "id": "string",
  "name": "string",
  "role": "inbox",
  "parentId": "string",
  "total": 0,
  "unread": 0,
  "uidValidity": 0,
  "uidNext": 0
}
Try it

Sign in to call it as yourself.

Rename a folder#

PATCH/v1/mail/folders/{id}
mail.write

Special folders (Inbox, Sent, Drafts, Trash, Junk) keep their names.

Path

idstringrequired
An id this API gave out. Up to 64 characters.

Body

namestringrequired
Up to 100 characters.

Answer · 200 OK

idstring
namestring
roleenum | null
A special folder's job; null for the person's own folders. One of inbox, sent, drafts, trash, junk, archive.
parentIdstring | null
totalinteger
unreadinteger
uidValidityinteger
As IMAP's UIDVALIDITY: if it changes, forget the folder's UIDs.
uidNextinteger
curl -X PATCH "https://api.zilomail.in/v1/mail/folders/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "string"
}'
Answer · 200 OK
{
  "id": "string",
  "name": "string",
  "role": "inbox",
  "parentId": "string",
  "total": 0,
  "unread": 0,
  "uidValidity": 0,
  "uidNext": 0
}
Try it

Sign in to call it as yourself.

Delete a folder#

DELETE/v1/mail/folders/{id}
mail.write

Its messages go to Trash first. Special folders can't be deleted.

Path

idstringrequired
An id this API gave out. Up to 64 characters.
curl -X DELETE "https://api.zilomail.in/v1/mail/folders/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN"

Answers 204 with no body.

Try it

Sign in to call it as yourself.

List messages#

GET/v1/mail/messages
mail.read

Newest first. Search with q (sender, subject, text and attachment names). For keeping an app in step, list once, then follow the changes feed.

Query

mailboxstring
Which of the person's mailboxes: its id or address. Default: their first. Up to 320 characters.
folderstring
A folder id, name or role ("inbox", "sent"…). Default: inbox. Omit with q to search everywhere. Up to 200 characters.
qstring
Up to 200 characters.
unreadboolean
Only unread (true) or only read (false).
starredboolean
sincestring
Received at or after.
threadIdstring
Only this conversation. Up to 998 characters.
limitinteger
How many to return (1–200). Default 50.
cursorstring
The next value from the previous page. Up to 500 characters.

Answer · 200 OK

dataarray of object
idstring
mailboxIdstring
folderIdstring
uidinteger
The message's IMAP UID in its folder (changes when it moves).
threadIdstring | null
Messages of one conversation share it.
fromobject | null
namestring | null
addressstring
toarray of object
namestring | null
addressstring
ccarray of object
namestring | null
addressstring
subjectstring | null
snippetstring
The start of the text.
datestring | null
The Date header.
receivedAtstring
ISO 8601 date and time, UTC, e.g. 2026-10-17T09:30:00.000Z.
sizeBytesinteger
readboolean
starredboolean
answeredboolean
draftboolean
attachmentsinteger
zilosecurstring | null
ZiloSecur's verdict: "safe", "caution", "danger" or null.
nextstring | null
Pass as cursor for the next page; null on the last.
curl "https://api.zilomail.in/v1/mail/messages?limit=20" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Answer · 200 OK
{
  "data": [
    {
      "id": "string",
      "mailboxId": "string",
      "folderId": "string",
      "uid": 0,
      "threadId": "string",
      "from": {
        "name": "string",
        "address": "string"
      },
      "to": [
        {
          "name": "string",
          "address": "string"
        }
      ],
      "cc": [
        {
          "name": "string",
          "address": "string"
        }
      ],
      "subject": "string",
      "snippet": "string",
      "date": "2026-10-17T09:30:00.000Z",
      "receivedAt": "2026-10-17T09:30:00.000Z",
      "sizeBytes": 0,
      "read": false,
      "starred": false,
      "answered": false,
      "draft": false,
      "attachments": 0,
      "zilosecur": "string"
    }
  ],
  "next": "string"
}
Try it

Sign in to call it as yourself.

Get a message#

GET/v1/mail/messages/{id}
mail.readETag · If-Match

Headers, text, HTML and the list of attachments. ?format=raw answers the whole message as RFC 822 (message/rfc822). Reading doesn't mark it read: send read: true.

Path

idstringrequired
An id this API gave out. Up to 64 characters.

Query

formatenum
Default "full". One of full, raw.

Answer · 200 OK

idstring
mailboxIdstring
folderIdstring
uidinteger
The message's IMAP UID in its folder (changes when it moves).
threadIdstring | null
Messages of one conversation share it.
fromobject | null
namestring | null
addressstring
toarray of object
namestring | null
addressstring
ccarray of object
namestring | null
addressstring
subjectstring | null
snippetstring
The start of the text.
datestring | null
The Date header.
receivedAtstring
ISO 8601 date and time, UTC, e.g. 2026-10-17T09:30:00.000Z.
sizeBytesinteger
readboolean
starredboolean
answeredboolean
draftboolean
attachmentsinteger
zilosecurstring | null
ZiloSecur's verdict: "safe", "caution", "danger" or null.
messageIdstring | null
The Message-ID header (use as inReplyTo to reply).
inReplyTostring | null
replyToobject | null
namestring | null
addressstring
bccarray of object
Only on drafts and mail this mailbox sent.
namestring | null
addressstring
textstring | null
htmlstring | null
Cleaned of scripts and trackers, as webmail shows it.
attachmentListarray of object
idstring
filenamestring
contentTypestring
sizeBytesinteger
inlineboolean
urlstring
curl "https://api.zilomail.in/v1/mail/messages/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Answer · 200 OK
{
  "id": "string",
  "mailboxId": "string",
  "folderId": "string",
  "uid": 0,
  "threadId": "string",
  "from": {
    "name": "string",
    "address": "string"
  },
  "to": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "cc": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "subject": "string",
  "snippet": "string",
  "date": "2026-10-17T09:30:00.000Z",
  "receivedAt": "2026-10-17T09:30:00.000Z",
  "sizeBytes": 0,
  "read": false,
  "starred": false,
  "answered": false,
  "draft": false,
  "attachments": 0,
  "zilosecur": "string",
  "messageId": "string",
  "inReplyTo": "string",
  "replyTo": {
    "name": "string",
    "address": "string"
  },
  "bcc": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "text": "string",
  "html": "string",
  "attachmentList": [
    {
      "id": "string",
      "filename": "string",
      "contentType": "string",
      "sizeBytes": 0,
      "inline": false,
      "url": "string"
    }
  ]
}
Try it

Sign in to call it as yourself.

Mark or move a message#

PATCH/v1/mail/messages/{id}
mail.writeETag · If-Match

Change any of: read, starred, answered, or the folder (id, name or role). Moving gives the message a new uid.

Path

idstringrequired
An id this API gave out. Up to 64 characters.

Body

readboolean
starredboolean
answeredboolean
folderstring
Up to 200 characters.

Answer · 200 OK

idstring
mailboxIdstring
folderIdstring
uidinteger
The message's IMAP UID in its folder (changes when it moves).
threadIdstring | null
Messages of one conversation share it.
fromobject | null
namestring | null
addressstring
toarray of object
namestring | null
addressstring
ccarray of object
namestring | null
addressstring
subjectstring | null
snippetstring
The start of the text.
datestring | null
The Date header.
receivedAtstring
ISO 8601 date and time, UTC, e.g. 2026-10-17T09:30:00.000Z.
sizeBytesinteger
readboolean
starredboolean
answeredboolean
draftboolean
attachmentsinteger
zilosecurstring | null
ZiloSecur's verdict: "safe", "caution", "danger" or null.
curl -X PATCH "https://api.zilomail.in/v1/mail/messages/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "read": true,
  "folder": "archive"
}'
Answer · 200 OK
{
  "id": "string",
  "mailboxId": "string",
  "folderId": "string",
  "uid": 0,
  "threadId": "string",
  "from": {
    "name": "string",
    "address": "string"
  },
  "to": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "cc": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "subject": "string",
  "snippet": "string",
  "date": "2026-10-17T09:30:00.000Z",
  "receivedAt": "2026-10-17T09:30:00.000Z",
  "sizeBytes": 0,
  "read": false,
  "starred": false,
  "answered": false,
  "draft": false,
  "attachments": 0,
  "zilosecur": "string"
}
Try it

Sign in to call it as yourself.

Delete a message#

DELETE/v1/mail/messages/{id}
mail.write

Moves it to Trash. A message already in Trash (or with ?permanent=true) is deleted for good.

Path

idstringrequired
An id this API gave out. Up to 64 characters.

Query

permanentboolean
curl -X DELETE "https://api.zilomail.in/v1/mail/messages/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN"

Answers 204 with no body.

Try it

Sign in to call it as yourself.

Download an attachment#

GET/v1/mail/messages/{id}/attachments/{attachmentId}
mail.readanswers a file

Path

idstringrequired
An id this API gave out. Up to 64 characters.
attachmentIdstringrequired
An id this API gave out. Up to 64 characters.
curl "https://api.zilomail.in/v1/mail/messages/ID/attachments/ATTACHMENT_ID" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Try it

Sign in to call it as yourself.

Send a message#

POST/v1/mail/send
mail.sendIdempotency-Key

Sends from one of the person's mailboxes; a copy goes to Sent. Mail to addresses on this server arrives at once; other mail is queued and retried. Up to 50 recipients (to, cc and bcc together) and 25 MB of attachments; each person may send to 500 recipients an hour through the API.

Body

mailboxstring
Send from this mailbox (id or address). Default: their first. Up to 320 characters.
fromNamestring
Shown beside the address; default: the person's name. Up to 200 characters.
toarray of stringrequired
ccarray of string
bccarray of string
replyTostring
Up to 320 characters.
subjectstringrequired
Up to 998 characters.
textstring
Up to 5000000 characters.
htmlstring
Up to 5000000 characters.
inReplyTostring
The Message-ID being answered: threads the reply. Up to 998 characters.
attachmentsarray of object
Up to 25 MB in all.
filenamestringrequired
Up to 255 characters.
contentTypestring
Up to 255 characters.
contentstringrequired
The file, base64-encoded.

Answer · 202 Accepted

idstring
The message in Sent.
messageIdstring | null
fromstring
toarray of string
ccarray of string
bccarray of string
curl -X POST "https://api.zilomail.in/v1/mail/send" \
  -H "Authorization: Bearer $ZILO_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "to": [
    "priya@example.com"
  ],
  "subject": "Order 1182 shipped",
  "text": "It'\''s on its way: AWB 1290012.",
  "html": "<p>It'\''s on its way: <b>AWB 1290012</b>.</p>"
}'
Answer · 202 Accepted
{
  "id": "string",
  "messageId": "string",
  "from": "string",
  "to": [
    "string"
  ],
  "cc": [
    "string"
  ],
  "bcc": [
    "string"
  ]
}
Try it

Sign in to call it as yourself.

Delivery status#

GET/v1/mail/send/{id}
mail.send

For each outside recipient: queued, sent, deferred (retrying) or failed, with the last error.

Path

idstringrequired
An id this API gave out. Up to 64 characters.

Answer · 200 OK

idstring
deliveriesarray of object
recipientstring
statusstring
attemptsinteger
lastErrorstring | null
nextAttemptAtstring | null
curl "https://api.zilomail.in/v1/mail/send/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Answer · 200 OK
{
  "id": "string",
  "deliveries": [
    {
      "recipient": "string",
      "status": "string",
      "attempts": 0,
      "lastError": "string",
      "nextAttemptAt": "2026-10-17T09:30:00.000Z"
    }
  ]
}
Try it

Sign in to call it as yourself.

List drafts#

GET/v1/mail/drafts
mail.read

Query

mailboxstring
Which of the person's mailboxes: its id or address. Default: their first. Up to 320 characters.
limitinteger
How many to return (1–200). Default 50.
cursorstring
The next value from the previous page. Up to 500 characters.

Answer · 200 OK

dataarray of object
idstring
mailboxIdstring
folderIdstring
uidinteger
The message's IMAP UID in its folder (changes when it moves).
threadIdstring | null
Messages of one conversation share it.
fromobject | null
namestring | null
addressstring
toarray of object
namestring | null
addressstring
ccarray of object
namestring | null
addressstring
subjectstring | null
snippetstring
The start of the text.
datestring | null
The Date header.
receivedAtstring
ISO 8601 date and time, UTC, e.g. 2026-10-17T09:30:00.000Z.
sizeBytesinteger
readboolean
starredboolean
answeredboolean
draftboolean
attachmentsinteger
zilosecurstring | null
ZiloSecur's verdict: "safe", "caution", "danger" or null.
nextstring | null
Pass as cursor for the next page; null on the last.
curl "https://api.zilomail.in/v1/mail/drafts?limit=20" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Answer · 200 OK
{
  "data": [
    {
      "id": "string",
      "mailboxId": "string",
      "folderId": "string",
      "uid": 0,
      "threadId": "string",
      "from": {
        "name": "string",
        "address": "string"
      },
      "to": [
        {
          "name": "string",
          "address": "string"
        }
      ],
      "cc": [
        {
          "name": "string",
          "address": "string"
        }
      ],
      "subject": "string",
      "snippet": "string",
      "date": "2026-10-17T09:30:00.000Z",
      "receivedAt": "2026-10-17T09:30:00.000Z",
      "sizeBytes": 0,
      "read": false,
      "starred": false,
      "answered": false,
      "draft": false,
      "attachments": 0,
      "zilosecur": "string"
    }
  ],
  "next": "string"
}
Try it

Sign in to call it as yourself.

Save a draft#

POST/v1/mail/drafts
mail.writeIdempotency-Key

Drafts are messages in the Drafts folder, the same ones webmail and mail apps show.

Body

mailboxstring
Send from this mailbox (id or address). Default: their first. Up to 320 characters.
fromNamestring
Shown beside the address; default: the person's name. Up to 200 characters.
toarray of string
ccarray of string
bccarray of string
replyTostring
Up to 320 characters.
subjectstring
Up to 998 characters.
textstring
Up to 5000000 characters.
htmlstring
Up to 5000000 characters.
inReplyTostring
The Message-ID being answered: threads the reply. Up to 998 characters.
attachmentsarray of object
Up to 25 MB in all.
filenamestringrequired
Up to 255 characters.
contentTypestring
Up to 255 characters.
contentstringrequired
The file, base64-encoded.

Answer · 201 Created

idstring
mailboxIdstring
folderIdstring
uidinteger
The message's IMAP UID in its folder (changes when it moves).
threadIdstring | null
Messages of one conversation share it.
fromobject | null
namestring | null
addressstring
toarray of object
namestring | null
addressstring
ccarray of object
namestring | null
addressstring
subjectstring | null
snippetstring
The start of the text.
datestring | null
The Date header.
receivedAtstring
ISO 8601 date and time, UTC, e.g. 2026-10-17T09:30:00.000Z.
sizeBytesinteger
readboolean
starredboolean
answeredboolean
draftboolean
attachmentsinteger
zilosecurstring | null
ZiloSecur's verdict: "safe", "caution", "danger" or null.
messageIdstring | null
The Message-ID header (use as inReplyTo to reply).
inReplyTostring | null
replyToobject | null
namestring | null
addressstring
bccarray of object
Only on drafts and mail this mailbox sent.
namestring | null
addressstring
textstring | null
htmlstring | null
Cleaned of scripts and trackers, as webmail shows it.
attachmentListarray of object
idstring
filenamestring
contentTypestring
sizeBytesinteger
inlineboolean
urlstring
curl -X POST "https://api.zilomail.in/v1/mail/drafts" \
  -H "Authorization: Bearer $ZILO_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
Answer · 201 Created
{
  "id": "string",
  "mailboxId": "string",
  "folderId": "string",
  "uid": 0,
  "threadId": "string",
  "from": {
    "name": "string",
    "address": "string"
  },
  "to": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "cc": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "subject": "string",
  "snippet": "string",
  "date": "2026-10-17T09:30:00.000Z",
  "receivedAt": "2026-10-17T09:30:00.000Z",
  "sizeBytes": 0,
  "read": false,
  "starred": false,
  "answered": false,
  "draft": false,
  "attachments": 0,
  "zilosecur": "string",
  "messageId": "string",
  "inReplyTo": "string",
  "replyTo": {
    "name": "string",
    "address": "string"
  },
  "bcc": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "text": "string",
  "html": "string",
  "attachmentList": [
    {
      "id": "string",
      "filename": "string",
      "contentType": "string",
      "sizeBytes": 0,
      "inline": false,
      "url": "string"
    }
  ]
}
Try it

Sign in to call it as yourself.

Change a draft#

PATCH/v1/mail/drafts/{id}
mail.write

Fields sent replace the draft's; the rest stay. The draft gets a new id (mail apps store a new version and remove the old).

Path

idstringrequired
An id this API gave out. Up to 64 characters.

Body

mailboxstring
Send from this mailbox (id or address). Default: their first. Up to 320 characters.
fromNamestring
Shown beside the address; default: the person's name. Up to 200 characters.
toarray of string
ccarray of string
bccarray of string
replyTostring
Up to 320 characters.
subjectstring
Up to 998 characters.
textstring
Up to 5000000 characters.
htmlstring
Up to 5000000 characters.
inReplyTostring
The Message-ID being answered: threads the reply. Up to 998 characters.
attachmentsarray of object
Up to 25 MB in all.
filenamestringrequired
Up to 255 characters.
contentTypestring
Up to 255 characters.
contentstringrequired
The file, base64-encoded.

Answer · 200 OK

idstring
mailboxIdstring
folderIdstring
uidinteger
The message's IMAP UID in its folder (changes when it moves).
threadIdstring | null
Messages of one conversation share it.
fromobject | null
namestring | null
addressstring
toarray of object
namestring | null
addressstring
ccarray of object
namestring | null
addressstring
subjectstring | null
snippetstring
The start of the text.
datestring | null
The Date header.
receivedAtstring
ISO 8601 date and time, UTC, e.g. 2026-10-17T09:30:00.000Z.
sizeBytesinteger
readboolean
starredboolean
answeredboolean
draftboolean
attachmentsinteger
zilosecurstring | null
ZiloSecur's verdict: "safe", "caution", "danger" or null.
messageIdstring | null
The Message-ID header (use as inReplyTo to reply).
inReplyTostring | null
replyToobject | null
namestring | null
addressstring
bccarray of object
Only on drafts and mail this mailbox sent.
namestring | null
addressstring
textstring | null
htmlstring | null
Cleaned of scripts and trackers, as webmail shows it.
attachmentListarray of object
idstring
filenamestring
contentTypestring
sizeBytesinteger
inlineboolean
urlstring
curl -X PATCH "https://api.zilomail.in/v1/mail/drafts/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'
Answer · 200 OK
{
  "id": "string",
  "mailboxId": "string",
  "folderId": "string",
  "uid": 0,
  "threadId": "string",
  "from": {
    "name": "string",
    "address": "string"
  },
  "to": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "cc": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "subject": "string",
  "snippet": "string",
  "date": "2026-10-17T09:30:00.000Z",
  "receivedAt": "2026-10-17T09:30:00.000Z",
  "sizeBytes": 0,
  "read": false,
  "starred": false,
  "answered": false,
  "draft": false,
  "attachments": 0,
  "zilosecur": "string",
  "messageId": "string",
  "inReplyTo": "string",
  "replyTo": {
    "name": "string",
    "address": "string"
  },
  "bcc": [
    {
      "name": "string",
      "address": "string"
    }
  ],
  "text": "string",
  "html": "string",
  "attachmentList": [
    {
      "id": "string",
      "filename": "string",
      "contentType": "string",
      "sizeBytes": 0,
      "inline": false,
      "url": "string"
    }
  ]
}
Try it

Sign in to call it as yourself.

Discard a draft#

DELETE/v1/mail/drafts/{id}
mail.write

Path

idstringrequired
An id this API gave out. Up to 64 characters.
curl -X DELETE "https://api.zilomail.in/v1/mail/drafts/ID" \
  -H "Authorization: Bearer $ZILO_TOKEN"

Answers 204 with no body.

Try it

Sign in to call it as yourself.

Send a draft#

POST/v1/mail/drafts/{id}/send
mail.sendIdempotency-Key

Sends it as it is (with its attachments) and removes it from Drafts.

Path

idstringrequired
An id this API gave out. Up to 64 characters.

Answer · 202 Accepted

idstring
messageIdstring | null
fromstring
toarray of string
ccarray of string
bccarray of string
curl -X POST "https://api.zilomail.in/v1/mail/drafts/ID/send" \
  -H "Authorization: Bearer $ZILO_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
Answer · 202 Accepted
{
  "id": "string",
  "messageId": "string",
  "from": "string",
  "to": [
    "string"
  ],
  "cc": [
    "string"
  ],
  "bcc": [
    "string"
  ]
}
Try it

Sign in to call it as yourself.

What changed#

GET/v1/mail/changes
mail.read

Everything that happened in a mailbox since since, in order: new mail, read/starred/moved, deleted, from any app (webmail, phones over IMAP, other API apps). Start with no since to get the current position, then pass back cursor each time. With wait (seconds, up to 25) the request holds until something changes: an app can keep one open instead of polling. A position older than 30 days answers 410: list the folders again.

Query

mailboxstring
Which of the person's mailboxes: its id or address. Default: their first. Up to 320 characters.
sincestring
waitinteger
Default 0.
limitinteger
Default 500.

Answer · 200 OK

dataarray of object
seqstring
kindenum
One of created, updated, deleted.
messageIdstring
folderIdstring
uidinteger
atstring
ISO 8601 date and time, UTC, e.g. 2026-10-17T09:30:00.000Z.
cursorstring
Pass as since next time.
moreboolean
More changes are waiting: ask again straight away.
curl "https://api.zilomail.in/v1/mail/changes?limit=20&since=CURSOR&wait=25" \
  -H "Authorization: Bearer $ZILO_TOKEN"
Answer · 200 OK
{
  "data": [
    {
      "seq": "string",
      "kind": "created",
      "messageId": "string",
      "folderId": "string",
      "uid": 0,
      "at": "2026-10-17T09:30:00.000Z"
    }
  ],
  "cursor": "string",
  "more": false
}
Try it

Sign in to call it as yourself.