EmailSuite API
A REST API for creating disposable inboxes and reading their mail. No API key, no dashboard signup — create an account, exchange it for a token, start reading messages.
Introduction
Every endpoint lives under /api/v1, accepts and returns JSON, and is reachable from the browser — CORS is open, so you can call it directly from client-side code.
Addresses created through this API are permanent: they never expire, and neither does the mail they receive. That differs from inboxes created on the website, which are disposable by default.
Quick start
Four calls take you from nothing to reading mail.
# 1. Get available domains
curl https://api.emailsuite.shop/api/v1/domains
# 2. Create account
curl -X POST https://api.emailsuite.shop/api/v1/accounts \
-H "Content-Type: application/json" \
-d '{"address":"user@yourdomain.com","password":"secret"}'
# 3. Get token
curl -X POST https://api.emailsuite.shop/api/v1/token \
-H "Content-Type: application/json" \
-d '{"address":"user@yourdomain.com","password":"secret"}'
# 4. Fetch messages
curl https://api.emailsuite.shop/api/v1/messages \
-H "Authorization: Bearer TOKEN"Authentication
All message endpoints require a bearer token from POST /api/v1/token. Pass it in the Authorization header.
curl https://api.emailsuite.shop/api/v1/messages \
-H "Authorization: Bearer eyJhbGciOi..."Tokens are valid for 30 days. They are stored hashed, so they cannot be recovered — request a new one if you lose it. The account password is the only long-lived credential.
Domains
/api/v1/domainsReturns the hostnames you may create addresses on. No authentication required.
curl https://api.emailsuite.shop/api/v1/domainsResponse
[
"example.com"
]Accounts
/api/v1/accountsCreates a permanent inbox. No authentication required.
| Field | Type | Description |
|---|---|---|
| address | string | Full address, e.g. user@yourdomain.com |
| password | string | At least 6 characters. Used to obtain tokens. |
curl -X POST https://api.emailsuite.shop/api/v1/accounts \
-H "Content-Type: application/json" \
-d '{"address":"user@yourdomain.com","password":"secret"}'Response · 201
{
"address": "user@yourdomain.com",
"createdAt": "2026-08-17T09:12:44.000Z",
"isPermanent": true
}Address already taken · 409
Taken and reserved addresses come back with ready-to-use alternatives, so you can retry without a second round trip.
{
"error": "That address is already taken",
"suggestions": [
"user1@yourdomain.com",
"user.mail@yourdomain.com",
"user4821@yourdomain.com"
]
}/api/v1/accountsReturns the authenticated account.
curl https://api.emailsuite.shop/api/v1/accounts \
-H "Authorization: Bearer TOKEN"Token
/api/v1/tokenExchanges credentials for a bearer token.
curl -X POST https://api.emailsuite.shop/api/v1/token \
-H "Content-Type: application/json" \
-d '{"address":"user@yourdomain.com","password":"secret"}'Response
{
"token": "Zm9vYmFy...",
"expiresIn": 2592000,
"address": "user@yourdomain.com"
}Messages
/api/v1/messagesLists messages newest first. Supports page and limit (max 100).
curl "https://api.emailsuite.shop/api/v1/messages?page=1&limit=30" \
-H "Authorization: Bearer TOKEN"{
"messages": [
{
"id": "8f2c...",
"from": "noreply@github.com",
"to": "user@yourdomain.com",
"subject": "Verify your email",
"intro": "Click the link below to confirm...",
"seen": false,
"hasAttachments": false,
"size": 5412,
"createdAt": "2026-08-17T09:20:10.000Z"
}
],
"total": 1,
"page": 1,
"limit": 30
}/api/v1/messages/{id}Returns the full message and marks it as read.
curl https://api.emailsuite.shop/api/v1/messages/8f2c... \
-H "Authorization: Bearer TOKEN"{
"id": "8f2c...",
"from": "noreply@github.com",
"to": "user@yourdomain.com",
"subject": "Verify your email",
"text": "Click the link below...",
"html": "<html>...</html>",
"seen": true,
"createdAt": "2026-08-17T09:20:10.000Z",
"attachments": []
}/api/v1/messages/{id}Permanently deletes a message and its attachments.
curl -X DELETE https://api.emailsuite.shop/api/v1/messages/8f2c... \
-H "Authorization: Bearer TOKEN"Attachments
/api/v1/messages/{id}/attachments/{attachmentId}Returns the raw file. Each attachment in a message response carries a ready-made downloadUrl.
curl -O -J https://api.emailsuite.shop/api/v1/messages/8f2c.../attachments/a1b2 \
-H "Authorization: Bearer TOKEN"Errors
Errors return a JSON body with an error field.
| Field | Type | Description |
|---|---|---|
| 400 | Bad Request | Missing or malformed parameters |
| 401 | Unauthorized | Missing, invalid or expired token |
| 404 | Not Found | No such message, or it belongs to another account |
| 409 | Conflict | Address already taken — see suggestions |
| 422 | Unprocessable | Unknown domain, or a reserved address |
| 429 | Too Many Requests | Rate limit exceeded |
Limits
| Field | Type | Description |
|---|---|---|
| Token lifetime | 30 days | Request a new token with the account password |
| Messages per page | 100 | Use page to walk further |
| Account lifetime | Permanent | API accounts and their mail never expire |
| Attachment size | 10 MB | Larger attachments are dropped on receipt |
Questions or a higher limit? Get in touch.