---
title: "One message, as it stands now"
method: GET
path: "/api/v1/mail/messages/{id}"
tags: ["Desk"]
---

# One message, as it stands now

`GET /api/v1/mail/messages/{id}`

## Request

- Base URL: `http://localhost:5180`
- URL: `http://localhost:5180/api/v1/mail/messages/{id}`
- Auth: API key in cookie `better-auth.session_token`

A reply on its way reads `scheduled`; this is how a screen learns it went out (`sent`) or why it did not (`failed`, with the reason in `entitiesExtracted.mailError`).

## Path parameters

- `id` string, required

## Response `200`

The message.

- object
  - `ok` unknown, required
  - `data` object, required
    - `id` string, required: Stable record id, e.g. `lse_012`.
    - `threadId` string, required: Stable record id, e.g. `lse_012`.
    - `direction` 'inbound' | 'outbound', required
    - `channel` 'email' | 'sms' | 'whatsapp' | 'phone' | 'portal' | 'post', required
    - `fromContactId` string: Stable record id, e.g. `lse_012`.
    - `fromAddress` string: The address an inbound message came from, where the sender is nobody in the address book.
    - `fromActor` object: Set on an outbound message, naming who or what sent it.
      - `kind` 'owner' | 'ai' | 'tenant' | 'contractor' | 'system' | 'channel', required: `ai` is Dardaris acting on the owner’s behalf. Everything it touches is marked.
      - `id` string: Stable record id, e.g. `lse_012`.
      - `name` string, required
    - `toContactIds` string[], required
    - `sentAt` string, required: ISO 8601 timestamp.
    - `subject` string
    - `body` string, required
    - `language` string, required: An ISO 639-1 code. Wider than the four the product authors in, because it is what the reader reads.
    - `attachments` object[], required
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `name` string, required
      - `size` number, required
      - `kind` string, required
    - `intent` string: What the message was about, as classified on arrival. It is what the engine acted on.
    - `intentConfidence` number
    - `workflowRunId` string: Outbound only: the automated run that produced this.
    - `templateId` string: Stable record id, e.g. `lse_012`.
    - `status` 'draft' | 'discarded' | 'pending_approval' | 'scheduled' | 'filed' | 'sent' | 'delivered' | 'read' | 'failed' | 'received', required: `draft` is a reply waiting for the owner to read, `discarded` is one they threw away, and `filed` is on the thread and not sent: the product has no way to send from the owner’s address yet.
    - `deliveryProof` object: Proof of delivery, which some dunning steps legally require.
      - `method` 'registered_post' | 'read_receipt' | 'delivery_receipt', required
      - `reference` string, required
      - `at` string, required: ISO 8601 timestamp.
    - `readAt` string: ISO 8601 timestamp.
    - `provenance` object
      - `actor` object, required
        - `kind` 'owner' | 'ai' | 'tenant' | 'contractor' | 'system' | 'channel', required: `ai` is Dardaris acting on the owner’s behalf. Everything it touches is marked.
        - `id` string: Stable record id, e.g. `lse_012`.
        - `name` string, required
      - `at` string, required: ISO 8601 timestamp.
      - `workflowRunId` string: Set when an automated run produced this, linking the record back to the run.
      - `reasoning` string: The rationale the AI recorded at the moment it acted.
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

## Other responses

- `404`: No such message on this team.

---

[API](https://skmtc.dev/dardaris/apis/dardaris-api.md) · [All operations](https://skmtc.dev/dardaris/apis/dardaris-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dardaris/apis/dardaris-api/revisions/4aff33835c73?raw)
