All endpoints

Get a message

GEThttps://anjal.app/v1/inboxes/{id}/messages/{messageId}

Returns full bodies plus attachment metadata. Also marks the message as read.

Some mail clients paste a screenshot straight into the HTML as a data: URI, which can be hundreds of KB inside htmlBody. Pass inlineImages=refs to get each one replaced by attachment:<id>, the id of the attachment holding the same image, and that attachment marked inline: true. Fetch it from the attachments endpoint. The response then also carries inlineImages: { replaced, unmatched }; unmatched counts images that had no matching attachment and were removed with no pointer. Without the parameter htmlBody is returned exactly as received.

Path parameters

id
required
string

Inbox UUID

messageId
required
string

Message UUID

Query parameters

inlineImages
"refs"

`refs` replaces inline `data:` images in `htmlBody` with `attachment:<id>` references.

Responses

200application/jsonOK
id
string

format: uuid

direction
"inbound" | "outbound"

enum: "inbound" | "outbound"

from
string
to
string
subject
string
plainBody
string
htmlBody
string
isRead
boolean
threadId
string

format: uuid

messageIdHeader
string
inReplyTo
string
receivedAt
string

format: date-time

labels
string[]

Lowercase labels on this message.

isSpam
boolean

Flagged by the spam filter. Spam is left out of lists unless `includeSpam=true`.

deliveryStatus
"delivered" | "bounced" | "complained" | "rejected" | null

Outbound only. `delivered` means the recipient's mail server accepted it (not a guarantee of inbox placement). Null until known.

enum: "delivered" | "bounced" | "complained" | "rejected" | null

deliveredAt
string

When the recipient's mail server accepted the message (outbound only).

format: date-time

firstOpenedAt
string

Time of the first open (outbound sends with `trackOpens: true` only). NULL until the first open. Opens are a hint, not proof: Apple Mail Privacy Protection fetches images on delivery, and clients that block images never report an open.

format: date-time

lastOpenedAt
string

Most recent open event. Updates on every open.

format: date-time

openCount
integer

Total opens. Subject to the same caveats as the timestamps.

default: 0

firstClickedAt
string

Timestamp of the first recipient link-click. Reliable signal of engagement (unlike opens, click events are not Apple-MPP-poisoned). NULL until the first click.

format: date-time

lastClickedAt
string

format: date-time

clickCount
integer

default: 0

attachments
object[]
id
string

format: uuid

filename
string
contentType
string
sizeBytes
integer
inline
boolean

Present and true when `htmlBody` embedded this attachment as an inline image and `?inlineImages=refs` replaced it with `attachment:<id>`.

Authentication

Send your API key in the X-API-Key header (or Authorization: Bearer <key>). Any prefix accepted by this endpoint — tk_, wk_, ak_, or sa_ — is documented in the key prefix table.