Overview
That's My Mail (TMM) is a transactional email platform: you register a sending
domain, mint an API key, and POST a message; the platform queues it, DKIM-signs it,
and delivers it over SMTP — with delivery events, suppressions, and webhooks.
This site documents the API and the SDK. UI/usage guides come later.
The API at a glance
- Own host. The API is served from
api.thatsmymail.com. Because it's its own host, endpoints carry no/apiprefix — that would be redundant. - A shared, product-agnostic layer
/v1/*that every product reuses, plus thin product layers on top.- Data —
/v1/<table>/<verb>: thin, generic, row-scoped CRUD over the backend's tables. ✅/v1/suppressions/create,/v1/messages/list. - Shared services —
/v1/services/<action>: cross-product business actions that compose several table ops in one transaction. ✅/v1/services/sendEmail. - Product layers —
/<product>/v1/<resource>/<action>: a single product's actions (console/auth/admin), built on the shared layer and never referencing each other. ✅/console/v1/projects.
- Data —
- JSON in, JSON out. Request and response bodies are JSON. Auth is HMAC-signed (see Authentication).
Products (product layers)
| Product | Base path | What it covers |
|---|---|---|
auth |
/auth/v1/* |
Signup, login, logout (issues the account token). |
console |
/console/v1/* |
Project lifecycle + per-project config: projects, API keys, sender domains, webhooks, suppressions. |
admin |
/admin/v1/* |
Internal/staff + platform operations (god-key or staff token). Not for customer use. |
Sending mail is not a separate product. It's the shared service
POST /v1/services/sendEmailon the product-agnostic/v1/*layer, with message status
- delivery events at
GET /v1/messages/get?id=andGET /v1/messages/events?id=.
The SDK mirrors every layer 1:1
The official TypeScript SDK, @thatsmymail/sdk, is a structural replica of
the API paths. Product layers map as client.<product>.<resource>.<action>() →
/<product>/v1/<resource>/<action> — e.g. client.console.projects.create() →
POST /console/v1/projects. The shared layer maps as client.v1.<table>.<verb>() →
/v1/<table>/<verb> (data — e.g. client.v1.suppressions.create() →
POST /v1/suppressions/create) and client.v1.services.<action>() → /v1/services/<action>
(shared services — e.g. client.v1.services.sendEmail() → POST /v1/services/sendEmail).
If you can read an SDK call, you know the exact URL it hits.
Where to go next
- Authentication — sign your requests (HMAC) and pick the right credential.
- API reference — every endpoint, grouped by product.
- SDK reference — install, construct a client, the full surface.
- Errors — the error envelope and codes.
Reading this with an agent? Fetch
/llms.txtfor the index or/llms-full.txtfor every doc in a single file.