Transactional API

REST endpoint for password resets, receipts, and one-off notifications.

Create a template

Brand → Transactional → New template. Each template has:

  • An ID (auto-generated tpl_xxxx) — what you reference from your code.
  • Subject + HTML + optional plaintext.
  • Variable placeholders: {{name}}, {{link}}, etc.
  • Rate limit (per recipient, per hour) — guards against runaway loops.

Send a transactional email

curl -X POST https://your-app.com/api/public/transactional/<API_KEY>/send \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "tpl_welcome",
    "to": "[email protected]",
    "variables": {
      "name": "Alice",
      "verify_link": "https://yourapp.com/verify?t=xxx"
    }
  }'

Returns 202 Accepted with a send ID:

{ "send_id": "ts_8f2a...", "queued_at": "2026-04-29T18:42:33Z" }

Authentication

  • API key in URL (above), or
  • Bearer header: Authorization: Bearer <API_KEY>

Find the brand API key in Brand settings → API. Treat it as a secret.

Rate limits

Default: 100/hour per recipient. Configurable per template. Trips return 429 Too Many Requests with a Retry-After header.

Variables

Same syntax as campaigns: {{variable}}. Send the values in the JSON body's variables object. Any field not in the object renders as empty string in the rendered email.

Tracking + bounce events

Transactional sends share the same tracking pipeline as campaigns. Open and click events land in the brand-wide analytics; bounces/complaints unsubscribe the contact (if one exists for the email).

Don't use this for campaigns
The Transactional API has no built-in unsubscribe footer. Use it only for legitimate transactional flows (receipts, password resets, one-off notifications). For marketing, use Campaigns.