Skip to content

API overview

Everything the dashboard does, the HTTP API does too. These pages list every endpoint a universe offers.

Every endpoint on these pages has a Try it button. It sends the request for real from your browser and shows the response, its status and timing, and the same call as curl. Send it as:

  • the demo universe: read-only and open to everyone, no account needed;
  • your universes, when you are signed in: the page gets a 15-minute pass for them, with at most the member role;
  • an API key you paste, which stays in that browser tab.

To try things without using AI credits, switch AI writing off in a universe.

Each universe is served by its organization’s server (cell). Your account page shows the API address for each universe:

https://c1.simmail.dev/api

Send an API key as a bearer token:

Terminal window
curl -s https://c1.simmail.dev/api/me -H "Authorization: Bearer smk_your_key"

For clients that cannot set headers, such as a browser’s EventSource, the key can go in the query instead: ?token=smk_your_key. Prefer the header everywhere else, since URLs end up in logs.

GET /api/me says who you are: for a key, its prefix, name, universe and role, and the universes you can open.

An API key belongs to one universe, so requests with a key go there. When signed in as a person, choose with the X-Simmail-Universe header or ?universe=. See Universes.

Each request needs a minimum role:

RequestsLeast role
Every GETviewer
Changes to logins (/api/accounts), webhooks, retention, link rules, recipient rules, faults, the World and resetadmin
Every other changemember
  • Request bodies are JSON. Send Content-Type: application/json.
  • Answers are JSON, indented. A list is always a list, [] when empty, never null.
  • Times are RFC 3339, such as 2026-10-10T14:32:05Z, on the universe’s simulated clock unless noted.
  • Durations are strings: 90s, 45m, 2h, 3d.
  • Message-IDs include their angle brackets, such as <[email protected]>. URL-encode them in query strings (%3C and %3E).
  • PUT on a settings document (world, faults, webhooks, link rules, recipient rules) replaces it. Read it, change it, write all of it back.
  • PATCH merges: fields you leave out keep their values.

Errors have a status code and a JSON body with one field:

{ "error": "no such persona" }
StatusMeaning
200Done.
400The request is wrong: bad JSON, a missing field, an invalid value. A plan’s numeric limit (people, logins, streams) is also refused with 400 and a message such as “the Starter plan includes 250 people; upgrade for more”.
401No key, or a key that is not valid.
402Your plan does not include this feature: insights, MCP, webhooks, link rules, or advanced chaos.
403Your role cannot do this (“your role (viewer) cannot do this”), the key belongs to another universe, the organization is suspended, or the call is for the server’s own administrators.
404No such thing: mailbox, message, persona, case, job or share.
405Wrong method.
408A wait timed out.
409A conflict: a person decided not to reply (wait/reply), or the persona comes from a YAML file and cannot be edited through the API.
429Too many requests. Each key or person may make about 20 a second, in bursts of up to 100; the docs’ Try it consoles a few a second. Also too many sign-ins or deliverability-check addresses.
500Something failed on the server. Sending past your plan’s monthly mail limit with POST /api/send also answers 500, with the plan’s message.
AreaPage
Mailboxes, messages, sending, waitingMail and mailboxes
People, memory, relationsPersonas
Shared contextCases
SMTP and IMAP logins, connection detailsAccounts and logins
The clock and the job queueClock and jobs
Health reportsInspect
Company and inbound streamsWorld
Campaign reportsInsights
SMTP failuresFaults
NotificationsWebhooks
The activity log and live streamEvents and stream
Pace, recipients, links, retentionBehaviour settings