Reference
REST API
Endpoints, authentication and the OpenAPI 3.1 spec.
- Base URL:
https://api.send0.dev - Auth:
Authorization: Bearer s0_live_… - Format: JSON in, JSON out, snake_case fields, ISO 8601 timestamps
- Spec: OpenAPI 3.1, checked against the live API in our test suite. Use it to generate clients in any language.
Endpoints
| Method | Path | Scope |
|---|---|---|
POST | /v1/inboxes | send |
GET | /v1/inboxes · /v1/inboxes/{inbox_id} | read |
PATCH | /v1/inboxes/{inbox_id} | send |
DELETE | /v1/inboxes/{inbox_id} | admin |
GET | /v1/inboxes/{inbox_id}/messages | read |
GET | /v1/inboxes/{inbox_id}/messages/wait | read |
POST | /v1/inboxes/{inbox_id}/messages | send |
GET | /v1/messages: every inbox the key can see, filter by inbox_id, status, direction, q | read |
GET | /v1/messages/{message_id} · /raw · /attachments/{attachment_id} | read |
POST | /v1/messages/{message_id}/reply · /forward | send |
GET | /v1/inboxes/{inbox_id}/threads · /threads/{thread_id} | read |
GET | /v1/drafts (every inbox; status=pending is the approval queue) · /v1/inboxes/{inbox_id}/drafts · /v1/drafts/{draft_id} | read |
PATCH | /v1/drafts/{draft_id}: edit a pending draft's subject, text or html | send |
POST | /v1/drafts/{draft_id}/send · /reject | admin (or a person in the dashboard) |
POST GET PATCH DELETE | /v1/webhooks[/{webhook_id}] | admin |
POST | /v1/webhooks/{webhook_id}/rotate-secret · /test | admin |
GET | /v1/webhooks/{webhook_id}/deliveries | admin |
POST | /v1/webhooks/{webhook_id}/deliveries/{delivery_id}/retry | admin |
GET | /v1/events/stream | read |
GET | /v1/usage: plan, inboxes used, sends today against the daily limit, paused state | read |
GET | /v1/stats?days=14: mail per UTC day (received, sent, delivered, bounced, failed), up to 90 days | read |
POST | /mcp: the remote MCP server (Streamable HTTP) | as the key |
POST GET | /v1/api-keys · DELETE /v1/api-keys/{api_key_id} | admin |
Conventions: errors, idempotency and pagination.
Rate limits
Requests are counted per minute:
| Applies to | Limit | Counted per |
|---|---|---|
| Every request with an API key (and the dashboard) | 600 / min | API key (or person) |
Requests that send mail: send, reply, forward, POST /v1/drafts/{draft_id}/send | 60 / min | API key (or person) |
| Requests with a missing or invalid API key, and signed download links | 60 / min | Client IP |
Over a limit, the API answers 429 with the code rate_limited and a Retry-After header giving the seconds to wait. The SDKs wait that long and retry on their own. /health and /openapi.json aren't limited.
Don't poll for new mail. One GET /v1/inboxes/{inbox_id}/messages/wait counts as one request however long it waits, and it returns as soon as a matching message arrives. For everything else, use webhooks or the event stream, which push new mail and events to you as they happen.