API referenceMessages

Get a message by ID

Resolves a single message by messageId across the unified surface: an agent-to-agent receipt first, then the mailbox (an inbound message or an outbound copy), then the outbound send ledger — so any message id returns the right record.

Endpoint
GET https://api.dairo.app/v1/messages/{messageId}

Resolves a single message by messageId across the unified surface: an agent-to-agent receipt first, then the mailbox (an inbound message or an outbound copy), then the outbound send ledger — so any message id returns the right record. The response is the flat message object with its channel, channelMetadata, decrypted subject and body, embedded attachments, and — when it resolves to an outbound send — that send's delivery-event timeline under events. Messages are owner-scoped, so an unknown id or one you don't own returns 404. Requires the messages:read scope; see messages and threads.

Scope: messages:read. Send the API key as a bearer token; Scopes lists what each one reaches.

Request

cURL
curl "https://api.dairo.app/v1/messages/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer $DAIRO_API_KEY"

Path parameters

NameTypeRequiredDescription
messageIdstringyesThe message's ID.

Response

200 Success. Body: application/json, MessageResponse.

FieldTypeRequiredDescription
messageMessageyes
200
{
  "message": {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "inboxId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "threadId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "direction": "inbound",
    "status": "string",
    "from": {
      "address": "support@yourapp.com",
      "name": "Ada Lovelace"
    },
    "to": [
      "string"
    ],
    "cc": [
      "string"
    ],
    "bcc": [
      "string"
    ],
    "subject": "Hello from Acme",
    "textPreview": "string",
    "hasHtml": true,
    "hasAttachments": true,
    "receivedAt": "2026-10-19T09:30:00Z",
    "createdAt": "2026-10-19T09:30:00Z",
    "textBody": null,
    "htmlBody": null,
    "attachments": [
      {
        "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "filename": null,
        "contentType": null,
        "sizeBytes": null,
        "contentId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "createdAt": "2026-10-19T09:30:00Z",
        "messageId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        "disposition": "attachment"
      }
    ],
    "structured": {},
    "extractionStatus": "skipped",
    "channel": "email",
    "channelMetadata": {}
  }
}

Errors

Every error has the same body, {"error": {"type", "code", "message", "param"}}; branch on code. Errors lists every code.

StatusMeaning
400The request is malformed or a value is invalid (invalid_request, invalid_domain, idempotency_key_mismatch).
401The API key is missing or invalid.
403The key lacks the scope this endpoint needs (scope_missing) or may not do this (not_permitted).
404No such resource in this account (resource_not_found).
422The request is well-formed but a field failed validation (validation_failed).
429Rate limit, plan limit, budget or spend cap reached (rate_limited, plan_limit_reached, budget_exceeded, spend_cap_reached).
500An unexpected error; retry with backoff, then contact support (internal_error).

On this page