Overview
This document covers the current authenticated Developer API implemented under /api.
It documents only the public API surface that exists in code today:
- account
- subscription
- usage
- domains
- mailboxes
- emails
- attachment download URLs
Reference for the current Zemail Developer API.
This document covers the current authenticated Developer API implemented under /api.
It documents only the public API surface that exists in code today:
/apiAuthorization: Bearer <api_key>2026-04-23Authorization: Bearer <api_key> is required on all Developer API endpointsZemail-Version: 2026-04-23 is optionalIf Zemail-Version is omitted, the API resolves to the app default version for the key, then falls back to the platform default.
Zemail-VersionZemail-Request-IdZemail-Request-Id is also echoed inside error payloads.
The Developer API is account-scoped:
account:readsubscription:readusage:readdomains:readmailboxes:readmailboxes:createmailboxes:deleteemails:reademails:deleteemails:mark-read31012025000100507 days103060015000010010030 days{
"object": "mailbox",
"data": {},
"meta": {}
}
{
"object": "list",
"data": [],
"has_more": false,
"next_cursor": null,
"meta": {}
}
List endpoints use Laravel page pagination. Pass ?page= to move forward. next_cursor is currently the next page number when another page exists.
{
"error": {
"type": "authentication_error",
"code": "missing_api_key",
"message": "A Zemail API key must be provided via the Authorization Bearer header.",
"param": null,
"request_id": "zreq_example"
}
}
Validation errors add an errors object keyed by field name.
Required scope: account:read
Returns the authenticated account snapshot.
idnameemailemail_verified_attiertier_labelcurrent_plandeveloper_apiExample abbreviated for readability:
{
"object": "account",
"data": {
"id": 1,
"name": "Jane Doe",
"email": "[email protected]",
"email_verified_at": "2026-04-20T12:00:00+00:00",
"tier": "plus",
"tier_label": "PLUS",
"current_plan": {
"slug": "plus",
"name": "Plus"
},
"developer_api": {
"enabled": true,
"default_version": "2026-04-23",
"limits": {
"apps_limit": 3,
"keys_limit": 10,
"requests_per_minute": 120,
"requests_per_day": 25000,
"mailboxes_page_size": 100,
"emails_page_size": 50,
"request_log_retention_days": 7
}
}
},
"meta": {}
}
Required scope: subscription:read
Returns the user’s current subscription snapshot.
statustierplanstarts_atends_atcancelled_atRequired scope: usage:read
Returns mailbox, storage, and Developer API usage details.
mailboxes.active_countmailboxes.active_limitmailboxes.daily_countmailboxes.daily_limitstorage.limit_bytesstorage.actual_used_bytesstorage.visible_used_bytesstorage.hidden_email_countstorage.percentdeveloper_api.apps_countdeveloper_api.keys_countdeveloper_api.limitsRequired scope: domains:read
Returns active, non-archived domains accessible to the authenticated user.
idnameallowed_typesRequired scope: mailboxes:read
limit optional, default 25, capped by planpage optionalReturns the authenticated user’s non-blocked mailboxes ordered newest first.
idaddresstypedomainexpires_atcreated_atunread_countemails_countcurrent_pageper_pagetotalRequired scope: mailboxes:create
Creates a mailbox for the authenticated user.
type required, one of random or customdomain optional stringusername required when type=customgoogle_alias_mode optional, one of auto, dot, plus, combinedtype=random
domain is provided, it must be an accessible active public domaintype=custom
domain<username>@<domain>., -, or + separators between alphanumeric segmentsRequired scope: mailboxes:read
Returns a single owned mailbox using the same shape as mailbox list items.
Required scope: mailboxes:delete
Deletes an owned mailbox.
{
"object": "mailbox.deleted",
"data": {
"deleted": true,
"id": 123
},
"meta": {}
}
Required scope: emails:read
limit optional, default 25, capped by planpage optionalsearch optional, matches subject, sender_email, and sender_nameReturns visible emails for an owned mailbox ordered newest first.
idsendersender_emailsubjectpreviewreceived_atis_readis_blockedattachments_countBlocked sender domains are returned as blocked email summaries instead of normal message details.
Required scope: emails:read
Returns full details for an owned visible email.
idsendersender_namesender_emailsubjectpreviewreceived_atis_readis_blockedblocked_domainbody_textbody_htmlattachmentsidnamesizedownloadableIf the email is blocked by mailbox policy:
is_blocked is trueblocked_domain is setbody_html is nullattachments is an empty arrayRequired scope: emails:delete
Deletes an owned email.
{
"object": "email.deleted",
"data": {
"deleted": true,
"id": 456
},
"meta": {}
}
Required scope: emails:mark-read
Marks an owned email as read.
{
"object": "email",
"data": {
"id": 456,
"is_read": true
},
"meta": {}
}
Required scope: emails:read
Creates a temporary download URL for an owned attachment.
urlexpires_atThis endpoint only works when the attachment exists and has a downloadable S3 key.
The following error codes are currently implemented in the Developer API surface:
missing_api_keyinvalid_api_keyapi_key_revokedapi_key_expireddeveloper_api_not_enabledinsufficient_scopeunsupported_versionrate_limit_exceededdaily_rate_limit_exceededvalidation_faileddomain_not_accessibledaily_limit_reachedmailbox_limit_reachedmailbox_creation_failedaddress_in_useaddress_in_cooldownmailbox_delete_failedattachment_not_availablemailbox_not_foundemail_not_foundThe following are intentionally not part of the current public Developer API contract: