Read a conversation
GET /v1/threads/{thread_id}
Read as Markdown ↗GET /v1/threads/{thread_id}
Requires a Claim-issued API key: Authorization: Bearer YOUR_CREDENTIAL.
GET /v1/threads/{thread_id}?limit=20 returns 200 with conversation metadata, plus messages and next_cursor.
Each entry has direction (received or sent), timestamp (ISO service receipt/submission time), and the fields from received detail or sent detail.
Bodies and attachment metadata are included, without attachment bytes. Received attachments use the ordinary download endpoint. Sent thread attachments have id, filename, mime_type, and size in bytes; use ordinary sent detail for their base64 content.
The first page contains the newest messages, chronological within the page. The next page contains older messages. Metadata counts describe the conversation, not just the current page.
Accepts limit 1–100, default 20. Follow next_cursor as a URL-encoded cursor parameter on the same resource URL. Ordering uses service timestamps, not sender-controlled Date headers.
Conversations can update, and pages are not a snapshot. Previously returned thread IDs remain usable while their conversation exists; the returned id may differ from the requested one. Continue a pagination sequence on the same requested URL, and refetch recent context when needed.
Pending, processing, and failed received messages have thread_id: null and are absent from threads. They remain available through message endpoints. Deleted messages disappear; surviving messages remain grouped. Empty, missing, or other-account conversations return 404. Invalid limits/cursors return 400, and unavailable content can return 503.
Each message retains its own labels; threads have no label set. Filters select conversations without filtering their detail pages. Manual merging is not provided. Thread membership is not proof of identity or delivery. Reply using a message resource ID, not the thread ID.
Parameters
| Parameter | Location | Required | Type | Meaning |
|---|---|---|---|---|
thread_id | path | Yes | string | Owned Cherami resource ID returned by the API. |
limit | query | No | integer | Decimal integer without signs, whitespace or leading zeroes. minimum: 1 maximum: 100 default: 20 |
cursor | query | No | string | Opaque returned cursor. Keep resource URL, filters and ordering unchanged; stop when next_cursor is null. |
curl example
Replace resource-ID placeholders with returned IDs. Supply CHERAMI_API_KEY through your private shell environment.
curl --silent --show-error --include --request GET \
"https://cherami.to/v1/threads/THREAD_ID" \
--header "Authorization: Bearer $CHERAMI_API_KEY"Responses
HTTP 200
Successful operation; inspect resource state and outcome fields.
X-Request-ID: Support correlation ID, not an idempotency key.
Content type: application/json.
{
"id": "11111111-1111-4111-8111-111111111111",
"inbox_id": "11111111-1111-4111-8111-111111111111",
"subject": null,
"last_activity_at": "2026-10-01T00:00:00.000Z",
"message_count": 0,
"received_count": 0,
"accepted_count": 0,
"rejected_count": 0,
"unknown_count": 0,
"messages": [],
"next_cursor": null
}HTTP 400
invalid_limit: Use an integer from 1 to 100.
invalid_cursor: Use the cursor with its original resource and filters, or restart from the first page. Draft listings instead report invalid_draft.
X-Request-ID: Support correlation ID, not an idempotency key.
Content type: application/json.
HTTP 401
unauthorized: Provide a valid bearer credential. Use human-approved recovery if access is lost.
X-Request-ID: Support correlation ID, not an idempotency key.WWW-Authenticate:"Bearer"
Content type: application/json.
HTTP 404
not_found: Resource is absent or inaccessible to this account. Reply targets must be in the sending inbox.
X-Request-ID: Support correlation ID, not an idempotency key.
Content type: application/json.
HTTP 500
internal_error: Operation failed; a write may already have happened. Follow the operation-specific recovery below.
X-Request-ID: Support correlation ID, not an idempotency key.
Content type: application/json.
HTTP 503
content_unavailable: Expected stored content is unavailable. Retry the read later.
X-Request-ID: Support correlation ID, not an idempotency key.
Content type: application/json.
Schema: ThreadDetail
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
inbox_id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
subject | Yes | string or null | |
last_activity_at | Yes | string | UTC service instant with milliseconds and Z suffix. format: date-time pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$ |
message_count | Yes | integer | minimum: 0 |
received_count | Yes | integer | minimum: 0 |
accepted_count | Yes | integer | minimum: 0 |
rejected_count | Yes | integer | minimum: 0 |
unknown_count | Yes | integer | minimum: 0 |
messages | Yes | array of ThreadReceivedDetail or ThreadSentDetail | |
next_cursor | Yes | string or null |
Schema: ThreadReceivedDetail
All of these schemas apply.
Part 1
Part 2
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
direction | Yes | "received" | |
timestamp | Yes | string | UTC service instant with milliseconds and Z suffix. format: date-time pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$ |
Schema: ReceivedDetail
Exactly one of these shapes applies.
Alternative 1
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
inbox_id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
thread_id | Yes | string or null | |
envelope_from | Yes | string | |
envelope_to | Yes | string | |
subject | Yes | string or null | |
received_at | Yes | string | UTC service instant with milliseconds and Z suffix. format: date-time pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$ |
processing_status | Yes | "ready" | |
labels | Yes | array of string | |
message_id | Yes | string or null | |
raw_size | Yes | integer | minimum: 0 |
processed_at | Yes | string or null | |
content | Yes | ReceivedContent |
Alternative 2
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
inbox_id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
thread_id | Yes | string or null | |
envelope_from | Yes | string | |
envelope_to | Yes | string | |
subject | Yes | string or null | |
received_at | Yes | string | UTC service instant with milliseconds and Z suffix. format: date-time pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$ |
processing_status | Yes | "pending" or "processing" or "failed" | |
labels | Yes | array of string | |
message_id | Yes | string or null | |
raw_size | Yes | integer | minimum: 0 |
processed_at | Yes | string or null |
Schema: ReceivedContent
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
from | Yes | ParsedAddress or null | |
sender | Yes | ParsedAddress or null | |
reply_to | Yes | array of ParsedAddress | |
to | Yes | array of ParsedAddress | |
cc | Yes | array of ParsedAddress | |
bcc | Yes | array of ParsedAddress | |
subject | Yes | string or null | |
message_id | Yes | string or null | |
in_reply_to | Yes | string or null | |
references | Yes | string or null | |
date | Yes | string or null | |
reply_text | Yes | string or null | |
text | Yes | string or null | |
html | Yes | string or null | |
attachments | Yes | array of ReceivedAttachment |
Schema: ParsedAddress
Sender-controlled MIME address or group, not verified identity.
Exactly one of these shapes applies.
Alternative 1
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
name | Yes | string | |
address | Yes | string |
Alternative 2
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
name | Yes | string | |
group | Yes | array of object |
group fields
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
name | Yes | string | |
address | Yes | string |
Schema: ReceivedAttachment
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
id | Yes | string | |
filename | Yes | string or null | |
size | Yes | integer | minimum: 0 |
mime_type | Yes | string | |
disposition | Yes | string or null | |
content_id | Yes | string or null | |
related | Yes | boolean |
Schema: ThreadSentDetail
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
inbox_id | Yes | string | Cherami resource ID, distinct from the RFC Message-ID. Use the returned value. |
created_at | Yes | string | UTC service instant with milliseconds and Z suffix. format: date-time pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$ |
recipient_count | Yes | integer | minimum: 0 |
status | Yes | "accepted" or "rejected" or "unknown" | |
provider_message_id | Yes | string or null | |
error_code | Yes | string or null | |
thread_id | Yes | string or null | |
in_reply_to | Yes | string or null | |
labels | Yes | array of string | |
direction | Yes | "sent" | |
timestamp | Yes | string | UTC service instant with milliseconds and Z suffix. format: date-time pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$ |
reply_text | Yes | string or null | |
submission | Yes | object |
submission fields
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
to | Yes | array of Mailbox or string | |
cc | Yes | array of Mailbox or string | |
bcc | Yes | array of Mailbox or string | |
subject | Yes | string | |
text | Yes | string | |
html | No | string | |
attachments | Yes | array of object | |
from | Yes | Mailbox or string | |
headers | No | object |
attachments fields
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
id | Yes | string | |
filename | Yes | string | |
mime_type | Yes | string | |
size | Yes | integer | minimum: 0 |
headers fields
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
In-Reply-To | Yes | string | |
References | Yes | string |
Schema: Mailbox
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
address | Yes | string | Bare ASCII address, at most 254 characters, local part at most 64. No display-name header syntax. maxLength: 254 |
name | No | string | Unicode name, trimmed; blank means unnamed. No control characters. At most 256 UTF-8 bytes after trimming. x-max-utf8-bytes: 256 |
Unknown fields are rejected.
Schema: Error
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
error | Yes | object |
error fields
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
code | Yes | string | Programmatic error code. Handle unrecognized codes by status and operation-specific recovery. |
message | Yes | string | Human-readable context, not a stable string to match. |
HTTP conventions, errors and pagination · Download OpenAPI 3.1