---
title: "Retrieve a thread"
method: GET
path: "/v1/finder/threads/{id}"
tags: ["RecruitAffiliates.ai"]
---

# Retrieve a thread

`GET /v1/finder/threads/{id}`

## Request

- Base URL: `https://api.affiliaterail.com`
- URL: `https://api.affiliaterail.com/v1/finder/threads/{id}`
- Auth: HTTP bearer

One thread and its messages, oldest first: who wrote, what kind of reply it was and when. No message bodies: read those in the Mailroom.

**Scope:** `finder:read` (or `finder:write`)

## Path parameters

- `id` string, required: Prefixed id (`fth_…`)

## Response `200`

The thread

- FinderThreadDetail
  - `id` string, required: Prefixed id (`fth_…`)
  - `object` 'finder_thread', required
  - `prospect_id` string, nullable, required: The matched prospect, or null when the reply matches nobody yet
  - `name` string, nullable, required
  - `inbox_id` string, nullable, required
  - `inbox_address` string, required
  - `subject` string, nullable, required: Null once the 30-day mail expiry has cleared it
  - `reply_kind` string, nullable, required: What their latest message was: `positive`, `question`, `not_now`, `negative`, `wrong_person` or `angry`. Null if they haven't written.
  - `last_direction` 'inbound' | 'outbound' | 'null', nullable, required
  - `last_message_at` string, date-time, nullable, required: ISO-8601, UTC
  - `message_count` integer, required
  - `needs_reply` boolean, required
  - `snoozed_until` string, date-time, nullable, required: ISO-8601, UTC
  - `handled_at` string, date-time, nullable, required: ISO-8601, UTC
  - `stage` 'saved' | 'contacting' | 'replied' | 'negotiating' | 'onboarding' | 'activated' | 'no_reply' | 'declined' | 'on_hold' | 'null', nullable, required
  - `owner_user_id` string, nullable, required
  - `campaign_id` string, nullable, required
  - `messages` FinderThreadMessage[], required: Oldest first. The API never returns message bodies: read them in the Mailroom.
    - `id` string, required
    - `object` 'finder_message', required
    - `direction` 'inbound' | 'outbound', required
    - `kind` string, nullable, required: How an inbound message was read: `positive`, `question`, `bounce`, `out_of_office` and so on. Null for what you sent.
    - `subject` string, nullable, required
    - `occurred_at` string, date-time, required: ISO-8601, UTC
    - `expired` boolean, required: True once the 30-day expiry has removed the content. The row stays so the timeline is honest.

## Other responses

- `400`: Invalid request
- `401`: Missing or unknown API key
- `402`: The organization's Recruit Affiliates plan does not include the API
- `403`: Key lacks the required scope
- `404`: No such object in your organization
- `409`: In conflict with the object's state, or the same idempotent request is still running
- `422`: The request was understood and refused
- `429`: Rate limited, by key or by organization: see Retry-After and X-RateLimit-Scope
- `501`: Not available to a test key (`sandbox_no_send`)

---

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