Developer docs

IotaBot Email API

Send from your own domain, reply in thread, and receive every email as JSON.

Get an API key

Email API documentation

Your mailboxes — support@, sales@ — as an API.

  • Send from your own verified domain
  • Replies stay in the customer's thread
  • HTML, cc, bcc and attachments
  • Inbound email as JSON, with raw and safe HTML
  • Bounces and complaints blocked for you
  • Test mode that never sends
  1. Forward your mailbox to IotaBot and verify your domain.
  2. Create an API key with messages:send.
  3. Send your first email:
POST/v1/messagesmessages:sendThe API key needs the messages:send permission. Without it the call is refused with 403 insufficient_scope.Sign in to try

Send your first email

Request
curl -X POST "https://api.iotabot.com/v1/messages" \
  -H "Authorization: Bearer $IOTABOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "channel": "email",
  "to": "priya@example.com",
  "from": "support@acme.com",
  "subject": "Your order #1042",
  "html": "<p>Hi Priya, your order shipped.</p>"
}' \
  -H "Idempotency-Key: order-1042-shipped"
Response · 202
{
  "data": {
    "id": "6a4ba0f1c3f1a2b3c4d5e733",
    "object": "message",
    "status": "queued",
    "channel": "email",
    "conversation_id": "6a4b9e21c3f1a2b3c4d5e6f7",
    "created_at": "2026-10-01T09:16:10.004Z",
    "type": "email",
    "email": {
      "subject": "Order #1042",
      "mailbox": "support@acme.com",
      "customer": "priya@example.com",
      "message_id": "<0102019a1c.iotabot@acme.com>",
      "thread_id": "<CAF3kq1x@mail.gmail.com>",
      "from": "support@acme.com",
      "to": [
        "priya@example.com"
      ],
      "cc": [],
      "in_reply_to": "<CAF3kq1x@mail.gmail.com>",
      "references": "<CAF3kq1x@mail.gmail.com>"
    }
  }
}
Errors
conversation_closedintegration_pausedsender_not_verifiedsender_not_foundrecipient_suppressedrecipient_unsubscribedfile_already_usedattachments_too_largeapi_quota_exceededidempotency_key_reusedidempotency_in_progress
Retries are safe with an Idempotency-Key header. Give each message its own key (e.g. order-1042-shipped) and reuse it when you retry — a request with a key already seen returns the first result instead of sending again. Kept 24 hours.