---
title: "One conversation and everything it is about"
method: GET
path: "/api/v1/messages/{id}"
tags: ["Desk"]
---

# One conversation and everything it is about

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

## Request

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

The thread, every message on it, the people on it and the lease or unit it concerns. An outbound message the AI sent carries `workflowRunId`, so it can be traced back to the run that sent it.

## Path parameters

- `id` string, required

## Response `200`

The conversation.

- object
  - `ok` unknown, required
  - `data` object, required
    - `thread` object, required
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `subject` string, required
      - `channel` 'email' | 'sms' | 'whatsapp' | 'phone' | 'portal' | 'post', required
      - `participantIds` string[], required
      - `unitId` string: Stable record id, e.g. `lse_012`.
      - `buildingId` string: Set where the conversation is about a whole building rather than a lot in it.
      - `leaseId` string: Stable record id, e.g. `lse_012`.
      - `bookingId` string: Stable record id, e.g. `lse_012`.
      - `issueId` string: Stable record id, e.g. `lse_012`.
      - `lastMessageAt` string, required: ISO 8601 timestamp.
      - `messageIds` string[], required
      - `status` 'open' | 'waiting_on_tenant' | 'waiting_on_us' | 'snoozed' | 'closed', required
      - `dueBy` string: When a reply is owed on our side.
      - `snoozedUntil` string: ISO 8601 timestamp.
      - `unread` boolean, required
      - `pinned` boolean, required
      - `labels` string[], required
      - `aiSummary` string: A rolling summary, so a long thread is readable at a glance.
      - `sentiment` 'positive' | 'neutral' | 'frustrated' | 'angry'
      - `escalationRisk` 'none' | 'low' | 'medium' | 'high': How likely this is to turn into a dispute if it is left alone.
    - `messages` object[], required: The whole exchange, in the order it happened.
      - `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.
    - `participants` object[], required: The contacts on the thread. A participant with no contact row is left out rather than guessed at.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `kind` string, required
      - `firstName` string, required
      - `lastName` string, required
      - `companyName` string
      - `email` string
      - `phone` string
      - `language` string, required
    - `lease` object: Set when the thread hangs off a lease.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `reference` string, required
      - `parties` object[], required: Everyone the tenancy names. Absent is refused: every read resolves a tenant through it.
        - `contactId` string, required: Stable record id, e.g. `lse_012`.
        - `role` 'tenant' | 'co_tenant' | 'guarantor' | 'occupant', required
        - `jointlyLiable` boolean, required
        - `sharePct` number: A decimal ratio. 0.21 is 21%.
      - `custom` object
      - `unitId` string, required: Stable record id, e.g. `lse_012`.
      - `extraUnits` object[]: Further units let under this lease, a parking space or a cellar. `rent` is each one’s own part of the lease’s rent; absent comes with the main unit.
        - `unitId` string, required: Stable record id, e.g. `lse_012`.
        - `rent` integer: Money, always in integer cents. €1,250.00 is 125000.
      - `type` string, required
      - `status` 'draft' | 'pending_signature' | 'active' | 'notice_given' | 'ended' | 'terminated_early' | 'cancelled', required
      - `startDate` string, required: A calendar date, `YYYY-MM-DD`.
      - `endDate` string, nullable, required: A calendar date, `YYYY-MM-DD`.
      - `signedOn` string: The day the lease was signed, when it was signed outside the product.
      - `signedByOwnerAt` string: When the owner signed it in the product, which is the last signature a lease signed here takes.
      - `rent` integer, required: Money, always in integer cents. €1,250.00 is 125000.
      - `rentFrequency` string, required
      - `rentDueDay` number, required: Day of the month rent falls due.
      - `chargesProvision` integer, required: Monthly provision for service charges, settled annually.
      - `currency` string, required
    - `unit` object: Set when the thread is about a particular unit.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `buildingId` string, required: Stable record id, e.g. `lse_012`.
      - `label` string, required: Unique within its building: "3A", "Ground floor", "Parking 12".
      - `kind` string, required
      - `mode` string, required
      - `status` string, required
      - `furnished` boolean, required
      - `marketRent` integer: Market rent estimate. Drives vacancy-cost and yield maths.
      - `custom` object
    - `unitLabel` string, required: Resolved through buildingLabel(). "None" when there is no unit.
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

## Other responses

- `404`: No thread with that id belongs to you.

---

[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)
