Developer docs

IotaBot Email API

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

Get an API key

Reply to an email in the same thread via API

Reply with conversation_id — In-Reply-To and References are set for you.

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

Reply

Request
curl -X POST "https://api.iotabot.com/v1/messages" \
  -H "Authorization: Bearer $IOTABOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "conversation_id": "6a4b9e21c3f1a2b3c4d5e6f7",
  "text": "Thanks — we have refunded the difference."
}' \
  -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