---
title: "List conversations"
method: GET
path: "/v1/conversations"
tags: ["Conversations"]
---

# List conversations

`GET /v1/conversations`

List inbox threads, most recently active first. A conversation groups every message with one contact across channels, which is what you need to build an inbox: `GET /v1/messages` returns a flat log with no thread to hang it on.

Use `senderId` to scope the list to a single number, and `channel` to keep only threads that have carried that channel.

## Query parameters

- `channel` 'sms' | 'sms_oneway' | 'whatsapp' | 'email' | 'telegram' | 'instagram' | 'messenger' | 'voice'
- `senderId` string
- `search` string
- `limit` integer
- `cursor` string

## Response `200`

List of conversations.

- object
  - `items` Conversation[], required
    - `id` string, required
    - `contactId` string — ID of the contact this thread belongs to. Absent on group threads and on threads whose contact has not been resolved yet.
    - `contactIdentifier` string, required — The key this thread is filed under: a phone number in E.164, a WhatsApp business-scoped user ID (BSUID), a numeric chat ID (Telegram/Instagram/Messenger), or a group JID. It is not always a phone number, so do not parse it as one.
    - `email` string — Email address of the thread, when the contact was reached by email.
    - `channels` string[], required — Every channel this thread has carried messages on.
    - `lastMessage` object, required — Denormalized preview of the most recent message, so a thread list needs no extra fetch.
      - `id` string, required
      - `text` string, required — Text or caption. Empty when the last message carried no text (e.g. media).
      - `channel` 'auto' | 'sms' | 'sms_oneway' | 'whatsapp' | 'telegram' | 'email' | 'instagram' | 'messenger' | 'voice', required — Delivery channel. Use 'auto' for intelligent routing.
      - `direction` 'inbound' | 'outbound', required
      - `at` string, date-time, required
    - `senderId` string — Sender that last handled this thread. Use it as the `Zavu-Sender` header when replying so the answer leaves from the same number the contact knows.
    - `messageCount` integer, required
    - `unreadCount` integer, required — Inbound messages not yet marked read. Reset with POST /v1/conversations/{conversationId}/read.
    - `whatsapp` object — WhatsApp identity, present when the contact adopted a username.
      - `bsuid` string — Business-scoped user ID. Can be used as `to` when sending.
      - `username` string
    - `group` object — Present when the thread is a group chat rather than a one-to-one conversation.
      - `id` string, required
      - `subject` string
      - `participantCount` integer
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `nextCursor` string, nullable

## Other responses

- `400` — Invalid query parameters.
- `401` — Unauthorized.

---

[API](https://skmtc.net/zavudev/apis/zavu-unified-messaging-layer-api.md) · [All operations](https://skmtc.net/zavudev/apis/zavu-unified-messaging-layer-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zavudev/zavu-unified-messaging-layer-api/revisions/4dacdff2adf8/schema)
