Skip to main content
Source: skills/openmail/references/api.md

OpenMail CLI & API Reference

Base URL: https://api.openmail.sh Authentication: Authorization: Bearer All responses are JSON.

CLI commands

Send email

Flags:
  • --to (required) — recipient address
  • --subject (required unless --thread-id is set) — email subject
  • --body (required) — plain text or HTML (HTML is auto-detected and rendered)
  • --thread-id — reply in an existing thread (quotes previous message by default)
  • --no-quote — send only your reply text, skip quoted history
  • --attach — file path to attach (repeatable)
  • --inbox-id — override default inbox
Response:

Threads

Thread object:

Messages

Message object:

Inboxes

Inbox object:

Status & diagnostics

Shows API connection, default inbox, and bridge status.

REST API

All endpoints require Authorization: Bearer .

POST /v1/inboxes//send

Send an email. Requires Idempotency-Key header (UUID).
body accepts plain text or HTML. HTML is auto-detected and rendered; a plain-text fallback is generated automatically. The optional bodyHtml field is for advanced API use only — when the plain-text and HTML versions must differ. When threadId is set, the API appends a quoted copy of the previous message to the body by default. Pass "includeQuote": false to send only your reply text. replyTo is optional. When set, the email’s Reply-To header is populated with that address so replies route there instead of to the sending inbox.
  • Free plan: replyTo must match the address of an inbox you own in OpenMail. Create the destination inbox first, then reference it here.
  • Pro plan or higher: replyTo can be any valid email address, including external addresses on domains you don’t control.
Free-plan sends with an external replyTo return 403 feature_requires_paid_plan with feature: "external_reply_to".

GET /v1/inboxes//threads

PATCH /v1/threads/

GET /v1/threads//messages

Returns messages in a thread, sorted oldest-first.

GET /v1/inboxes//messages

GET /v1/attachments//

Returns attachment data. Signed URL included in message payload — fetch promptly, URLs expire.

Rate limits


Idempotency

The send endpoint requires an Idempotency-Key header. Use a unique UUID per send attempt. Retrying with the same key within 24 hours returns the original response without resending. The CLI generates idempotency keys automatically. For direct API calls, generate a UUID: