Quickstart
Create an address, then poll it for mail. Two calls, no setup.
# 1. take an address — the token comes back once, keep it
curl -X POST https://weirdlytemp.sbs/v1/inboxes
{
"address": "brisk-harbor-4821@weirdlytemp.sbs",
"token": "H8sQ...",
"created_at": 1785816262,
"expires_at": 1785819862
}
# 2. read the mail
curl https://weirdlytemp.sbs/v1/inboxes/brisk-harbor-4821@weirdlytemp.sbs/messages \
-H "Authorization: Bearer H8sQ..."
Authentication
Two independent credentials, used for different things.
The inbox token is returned once when you create an
inbox and is required to read or delete its mail. Only a hash of it is
stored, so a lost token cannot be recovered — create a new inbox instead.
Send it as Authorization: Bearer <token>.
An API key is optional and identifies you for rate
limiting only. It grants no access to anyone else's mail. Send it as
X-API-Key: wt_.... Create one on the
account page.
Creates an inbox. Every field is optional; an empty body gives you a random address.
| Field | Type | Description |
|---|---|---|
| local_part | string | The name before the @. Omit for a random one. |
| domain | string | Must be one returned by /v1/domains. Defaults to the first. |
| ttl_seconds | number | Lifetime, 60 to 86400. Defaults to 3600. |
curl -X POST https://weirdlytemp.sbs/v1/inboxes \
-H "Content-Type: application/json" \
-d '{"local_part": "my-signup", "ttl_seconds": 7200}'
Metadata for an inbox you hold the token for.
{
"address": "my-signup@weirdlytemp.sbs",
"created_at": 1785816262,
"expires_at": 1785823462,
"message_count": 2
}
Destroys the inbox and every message in it immediately. Returns 204.
Lists messages, newest first. Bodies are omitted — fetch a single message for those.
{
"address": "my-signup@weirdlytemp.sbs",
"expires_at": 1785823462,
"messages": [
{
"id": "0f2c8e1a-...",
"from_addr": "noreply@github.com",
"from_name": "GitHub",
"subject": "Your verification code",
"size": 4821,
"truncated": 0,
"seen": 0,
"received_at": 1785816302
}
]
}
The full message, adding text_body and html_body.
Reading marks it seen.
html_body is attacker-controlled. Render it in a sandboxed
iframe or sanitise it — never inject it into your page directly.
Deletes one message. Returns 204, or 404 if it isn't there.
Service endpoints
| Endpoint | Returns |
|---|---|
| GET /v1/domains | Domains you can create addresses on |
| GET /health | {"status":"ok"} |
Limits
| Limit | Value |
|---|---|
| Inbox lifetime | 1 hour by default, 24 hours maximum |
| Messages per inbox | 50, oldest dropped after that |
| Stored body size | 256 KB, truncated beyond |
| Inbox creation | 10 per minute per IP |
| Reads | 120 per minute per IP |
| Attachments | Not stored |
An API key raises the per-IP limits above.
Address names
A name is 1 to 64 characters of a-z, 0-9,
., -, _ and +, and
cannot start or end with a dot. Names are lowercased.
Eleven names are refused: admin, administrator,
webmaster, hostmaster, postmaster,
abuse, security, root,
sysadmin, ssladmin and ssl-admin.
A certificate authority will issue a TLS certificate for a domain to
whoever receives mail at the first five, so they cannot be handed out.
Note that signup forms elsewhere often validate email more strictly than this API does, so an address accepted here may still be rejected there.
Errors
Every error is JSON of the shape {"error": "..."}.
| Status | Meaning |
|---|---|
| 400 | Malformed request, invalid name, or unknown domain |
| 401 | Missing bearer token |
| 404 | Not found — also returned for a wrong token, so addresses cannot be enumerated |
| 409 | That name is already taken |
| 429 | Rate limited |