Developers

Build with Kazuni

One REST API for transactional email, with SMS on the same endpoint. Idempotent by design, so a retry never sends twice.

Quickstart

01

Get your API key

Create a workspace, verify your sending domain, and copy your key from API Keys. Test keys sandbox everything.

02

Send your first email

One POST request. The response returns a message id you can follow for as long as the record lives.

03

Check delivery

Read the current status of any message with a GET. Delivery, bounce and complaint outcomes land there as SES reports them.

Send an email

curl -X POST https://api.kazuni.io/v1/emails/send \
  -H "Authorization: Bearer cl_live_..." \
  -H "Idempotency-Key: order-4519-confirmation" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Yourshop <receipts@yourshop.mw>",
    "to": "amina@example.com",
    "subject": "Your order is on its way",
    "html": "<p>Order 4519 shipped today.</p>",
    "text": "Order 4519 shipped today."
  }'

202 { "id": "9f2c1a84-...", "status": "queued" }

The TypeScript SDK is published: npm i @kazuni/sdk

Endpoints

POST/v1/emails/sendSend one transactional email
GET/v1/emails/{id}Delivery status for one email
POST/v1/messages/sendSame shape with a channel field: email or sms
GET/v1/messages/{id}Delivery status for one message, any channel
GET/v1/contactsList, create, update and delete contacts and their identifiers
GET/v1/meVerify a key and read the permissions it carries
Planned

Webhooks

Signed delivery events posted to your endpoint. Today the same outcomes are readable by polling a message.

Templates

Author once, send a template name plus data, with a per-channel variant chosen server-side.

Segments

Resolve a saved audience to its members from the API.

Delivery status

A send returns immediately as queued. Poll the message to see where it got to.

GET /v1/messages/9f2c1a84-...

200 {
  "id": "9f2c1a84-...",
  "channel": "email",
  "from": "receipts@yourshop.mw",
  "to": "amina@example.com",
  "subject": "Your order is on its way",
  "segments": null,
  "status": "delivered",
  "error": null,
  "queuedAt": "2026-07-24T09:14:02.118Z",
  "sentAt": "2026-07-24T09:14:03.402Z",
  "deliveredAt": "2026-07-24T09:14:06.881Z"
}