Three SDKs, a CLI and an MCP server

The same API from TypeScript, Python, Go, a terminal or an agent.

One document

  1. OpenAPI documentevery route, its fields and its errors
  2. TypeScript, Python and Go SDKsnever behind the API
  3. minket CLIsends, tails logs, replays webhooks
  4. MCP server37 tools for an agent

Every error says whether to retry

So a client retries the right failures without a table of codes.

{
  "error": {
    "code": "concurrent_idempotent_requests",
    "message": "A request with this idempotency key is still being processed. Retry shortly.",
    "retryable": true,
    "request_id": "req_019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b"
  }
}
One error body for every route

One set of conventions on every route

snake_case JSON in and out, and ids that sort by the time they were made.

Ids
UUIDv7
Lists
by cursor, 20 a page, up to 100
Logs
GET /v1/logs finds a request by its id

The minket command line

Each profile keeps a live and a test key apart.

minket send --to rui.okafor@example.com --template receipt --var order=10452
minket logs tail --events --types email.bounced,email.complained
minket templates push emails/receipt.tsx --alias receipt --publish
Three commands

Tools an agent can use safely

Each tool takes the same fields as the API; broadcasts and automations stay read-only.

send_email
with dry_run: true, nothing is sent
revoke_key
marked destructive, so the client can ask first
Reads
marked read-only

References and guides

Questions

Is there a rate limit?

10 requests a second per key by default, up to 100.

Is there a daily cap?

10,000 live emails per project a day by default.