> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thinnest.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Conversations

> GET /api/v1/conversations and /conversations/{id}/messages — read threads and catch up on anything your webhook missed.

```http theme={null}
GET /api/v1/conversations?channel=whatsapp&since=2026-09-21T10:00:00Z
Authorization: Bearer ta_live_…
```

```json theme={null}
{
  "items": [
    {
      "id": "conv_e0829641-…",
      "channel": "whatsapp",
      "customer": { "id": "cust_6f4a9fb9-…", "phone": "919876543210" },
      "status": "active",
      "lastInboundAt": "2026-09-21T10:15:01Z",
      "createdAt": "2026-09-18T08:02:44Z"
    }
  ],
  "nextCursor": null
}
```

```http theme={null}
GET /api/v1/conversations/conv_e0829641-…/messages?since=2026-09-21T10:00:00Z
Authorization: Bearer ta_live_…
```

```json theme={null}
{
  "items": [
    {
      "id": "msg_91c2…",
      "author": "customer",
      "parts": [
        { "type": "text", "text": "Here is the damaged box" },
        { "type": "image", "url": "https://…signed…", "alt": "" }
      ],
      "createdAt": "2026-09-21T10:15:01Z"
    }
  ],
  "nextCursor": null
}
```

## Catching up after a missed webhook

A [webhook](/api-reference/webhooks) delivery is attempted once. If your
endpoint was down, read back what you missed:

1. Take the `receivedAt` of the last event you handled and go back **five
   minutes** — messages that arrive together can be delivered out of order.
2. `GET /api/v1/conversations?since=<that time>` — every conversation a
   customer has written in since then, including brand-new ones.
3. For each, `GET /api/v1/conversations/{id}/messages?since=<same time>`.
4. Skip any message whose `id` matches a `messageId` you already handled.

Poll this every few minutes as a safety net and a missed message never goes
unanswered for long.

## `GET /conversations`

Newest first.

<ParamField query="channel" type="string">
  `whatsapp`, `web`, `telegram`, `voice` or `email`.
</ParamField>

<ParamField query="since" type="string">
  ISO 8601. Keeps conversations where the customer last wrote at or after this.
</ParamField>

<ParamField query="limit" type="number">
  Up to 100. Default 25. Follow `nextCursor` with `?cursor=` for the next page.
</ParamField>

## `GET /conversations/{id}/messages`

Newest first. The customer's messages, your agent's replies, and replies a
teammate sent from the inbox (`author: "teammate"`). Your team's internal notes
are not included.

<ParamField query="since" type="string">
  ISO 8601. Keeps messages written after this.
</ParamField>

<ParamField query="limit" type="number">
  Up to 100. Default 25. Follow `nextCursor` with `?cursor=`.
</ParamField>

**Photos, voice notes, videos and documents** a customer sent come back as
links that stay valid for **eight hours**. Download what you need to keep.

## Errors

| Status | Why                                                  |
| ------ | ---------------------------------------------------- |
| `400`  | `since`, `channel`, `limit` or `cursor` is not valid |
| `404`  | The conversation is not in your workspace            |
| `429`  | Too many requests. Wait and retry                    |
