Base URL: shown on your project’s API page. Authenticate every request with
Authorization: Bearer <API key>.
| Method |
Path |
Purpose |
POST |
/v1/emails |
Submit a message. Requires Idempotency-Key. |
GET |
/v1/emails/{id} |
Read a message’s status and history. Needs a key with read scope. |
POST |
/v1/emails/{id}/cancel |
Cancel a message that hasn’t been sent yet. |
GET |
/v1/usage |
Read your usage and remaining allowance. |
Keys are either send-only or send, read and usage. A send-only key can’t look up status;
use the dashboard instead.
| Field |
Required |
Notes |
stream_id |
yes |
UUID from the project’s API page |
from |
yes |
{ email, name? }; must match your approved sender |
to |
yes |
Exactly one { email, name? } |
subject |
yes |
Up to 998 characters |
text / html |
at least one |
Body |
reply_to |
no |
Exactly one { email, name? } |
expires_at |
no |
ISO 8601 time; not sent afterwards |
tags |
no |
Up to 10 keys (1–64 characters), values up to 256 characters |
| Code |
Meaning |
202 |
Stored and queued (or recorded as suppressed). Not yet delivered. |
400 |
Malformed request. |
401 |
Missing, wrong or expired key. |
403 |
The key isn’t allowed to do this, for example the wrong sender or scope. |
404 |
Message or stream not found for this key. |
409 |
Conflict, for example an idempotency key reused with different content. |
413 |
Message too large. |
422 |
Valid JSON that can’t be accepted, for example an unapproved sender. |
429 |
Rate limit or allowance reached. |
503 |
Temporarily unavailable or result uncertain. Retry with the same key and body. |