---
title: "Get a conversation thread by id"
method: GET
path: "/threads/{id}"
tags: ["Threads"]
---

# Get a conversation thread by id

`GET /threads/{id}`

Returns a conversation thread: its metadata plus the inbound
and outbound messages that belong to it, interleaved in time
order (oldest first). A thread spans both received emails and
your sends, so an agent can reconstruct an entire back-and-forth
from one call instead of walking reply headers.

Each message carries a `direction` (`inbound` | `outbound`) and
an `id`; fetch the full message via `/emails/{id}` or
`/sent-emails/{id}` accordingly. Bodies are omitted here to keep
the thread view lightweight.

Discover a thread id from the `thread_id` field on any email or
sent-email (list or detail). The message list is capped; compare
`message_count` against `messages.length` to detect truncation.

## Response `200`

Thread detail

- object
  - `success` true, required
  - `data` object, required — A conversation thread: its metadata plus the inbound and outbound messages that belong to it, interleaved oldest-first. Membership is the stored `thread_id` on each message. Bodies are omitted here to keep the thread view lightweight; fetch `/emails/{id}` or `/sent-emails/{id}` for a single message's full content.
    - `id` string, uuid, required
    - `subject` string, nullable — Normalized subject of the thread (Re/Fwd prefixes stripped).
    - `root_message_id` string, nullable — Message-ID of the conversation root, when known.
    - `message_count` integer, required — Total messages in the thread. `messages` is capped (most recent first, then re-sorted oldest-first), so `message_count > messages.length` signals truncation.
    - `first_message_at` string, date-time, nullable
    - `last_message_at` string, date-time, nullable
    - `created_at` string, date-time, required
    - `messages` object[], required
      - `direction` 'inbound' | 'outbound', required — `inbound` for a received email (`/emails/{id}`), `outbound` for a send (`/sent-emails/{id}`). Use it with `id` to fetch full content from the right endpoint.
      - `id` string, uuid, required
      - `message_id` string, nullable
      - `from` string, nullable
      - `to` string, nullable
      - `subject` string, nullable
      - `status` string, nullable — Lifecycle status (an EmailStatus or SentEmailStatus value, per `direction`).
      - `timestamp` string, date-time, nullable — received_at for inbound, created_at for outbound.

## Other responses

- `400` — Invalid request parameters
- `401` — Invalid or missing API key
- `404` — Resource not found

---

[API](https://skmtc.dev/primitive/apis/primitive-api.md) · [All operations](https://skmtc.dev/primitive/apis/primitive-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/primitive/primitive-api/revisions/c2299d28022c/schema)
