---
title: "What the last run over a conversation found"
method: GET
path: "/api/v1/handling/{threadId}"
tags: ["Dardaris"]
---

# What the last run over a conversation found

`GET /api/v1/handling/{threadId}`

## Request

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

The classification, the records it was filed against, every step of the run with what it made, and the reply waiting to be read. All of it is read back off the records the run wrote, so nothing here is a second copy of anything.

## Path parameters

- `threadId` string, required

## Response `200`

What the run left behind. Every field is null where none has been made.

- object
  - `ok` unknown, required
  - `data` object, required
    - `threadId` string, required: Stable record id, e.g. `lse_012`.
    - `messageId` string, nullable, required: Stable record id, e.g. `lse_012`.
    - `runId` string, nullable, required: Stable record id, e.g. `lse_012`.
    - `status` 'running' | 'awaiting_approval' | 'completed' | 'failed' | 'skipped' | 'cancelled', nullable, required
    - `startedAt` string, nullable, required: ISO 8601 timestamp.
    - `summary` string, nullable, required: One line, in Dardaris’s own voice.
    - `intent` string, nullable, required: What the message was read as. The same vocabulary the Messages room displays.
    - `confidence` number, nullable, required: 0 to 1, as the classifier rated its own reading.
    - `sentiment` 'positive' | 'neutral' | 'frustrated' | 'angry', nullable, required
    - `escalationRisk` 'none' | 'low' | 'medium' | 'high', nullable, required: High is what stops a reply going out on its own, whatever the settings say.
    - `about` object, required: The records the conversation is filed against. Resolved through buildingLabel(), so an owner alias is honoured.
      - `leaseId` string: Stable record id, e.g. `lse_012`.
      - `leaseReference` string
      - `unitId` string: Stable record id, e.g. `lse_012`.
      - `unitLabel` string
      - `buildingId` string: Stable record id, e.g. `lse_012`.
      - `buildingLabel` string
    - `steps` object[], required: Every step of the run, in the order it ran.
      - `actionId` string, required
      - `kind` string, required: `classify_message`, `read_document`, `draft_reply`, `create_task`, `send_message` and the rest.
      - `label` string, required
      - `status` 'pending' | 'awaiting_approval' | 'done' | 'skipped' | 'failed', required
      - `at` string: ISO 8601 timestamp.
      - `produced` object[]
        - `kind` string, required
        - `id` string, required: Stable record id, e.g. `lse_012`.
        - `label` string, required
      - `detail` string: What the step did, in the owner’s words. This is what makes a run checkable.
      - `skipReason` string: Why nothing happened, where nothing did.
      - `links` object[], required: Where each record the step made can be opened. A record with no page of its own carries no `to`.
        - `label` string, required
        - `to` string
    - `draft` object, nullable, required: The reply, written and waiting to be read. Null once it is filed on the thread or discarded.
      - `id` string, required: Stable record id, e.g. `lse_012`.
      - `subject` string, required
      - `body` string, required
      - `sentAt` string, required: ISO 8601 timestamp.
    - `filed` boolean, required: True where the run sent its own reply, or filed it on the thread where no mailbox here could send it, rather than leaving it for you.
  - `meta` object, required
    - `requestId` string, required: Echoed in the x-request-id header. Quote it in a bug report.

## Other responses

- `401`: No session. Sign in first.
- `404`: No conversation 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)
