# List conversations (/docs/api-reference/whatsapp/listWhatsappConversations)

> A number's inbox, newest activity first. Poll it with updated_since for changes since your last call, or page it with cursor. There are no event webhooks, so polling is how an integration learns about new messages.

> **Set up WhatsApp first.** Connect a WhatsApp number in the dashboard or with [Connect numbers](/docs/api-reference/whatsapp/importWhatsappNumbers). Included on every paid plan. [See plans](https://omnidim.io/pricing).

**GET** `/whatsapp/numbers/{number_id}/conversations`

A number's inbox, newest activity first. Poll it with `updated_since`
for changes since your last call, or page it with `cursor`. There are no
event webhooks, so polling is how an integration learns about new
messages.

```yaml
operationId: listWhatsappConversations
parameters:
  - in: path
    name: number_id
    required: true
    schema:
      type: integer
    description: |
      Id of a WhatsApp number in your workspace, from
      [listWhatsappNumbers](/docs/api-reference/whatsapp/listWhatsappNumbers).
      A number in another workspace answers `404`.
  - in: query
    name: filter
    schema:
      type: string
      enum:
        - all
        - unread
        - needs_person
        - agent
        - failed
        - window_closed
        - campaign_replies
      default: all
    description: >-
      `needs_person` is a person-owned or paused conversation. `window_closed` is one you can only
      reach with a template.
  - in: query
    name: q
    schema:
      type: string
      maxLength: 200
    description: Search the customer's name, phone number and message text.
  - in: query
    name: updated_since
    schema:
      type: string
    description: |
      An ISO 8601 date and time, such as `2026-10-01T09:00:00+00:00`. Returns
      conversations with a change at or after it. No offset means UTC.
  - in: query
    name: limit
    schema:
      type: integer
      default: 20
      minimum: 1
      maximum: 100
    description: Rows per page.
  - in: query
    name: cursor
    schema:
      type: string
    description: The `next_cursor` from the previous page.
responses:
  '200':
    description: One page of conversations.
    content:
      application/json:
        schema:
          type: object
          properties:
            data:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    description: The conversation id, `{number id}-{customer phone digits}`.
                    example: 412-15551234567
                  phone_number_id:
                    type: integer
                  customer_phone:
                    type: string
                    example: '+15551234567'
                  customer_name:
                    type: string
                    nullable: true
                    description: The customer's WhatsApp profile name, when set.
                  last_message:
                    type: object
                    description: The newest message in the conversation.
                    properties:
                      preview:
                        type: string
                      type:
                        type: string
                        description: The message type, such as `text`, `image` or `template`.
                      sender:
                        type: string
                        enum:
                          - customer
                          - agent
                          - person
                      timestamp:
                        type: string
                      status:
                        type: string
                        enum:
                          - pending
                          - sent
                          - delivered
                          - read
                          - received
                          - failed
                        description: |
                          `received` is an inbound customer message. The rest are outbound, in
                          order: `pending`, `sent`, `delivered`, `read`, or `failed`.
                  last_message_at:
                    type: string
                    nullable: true
                  unread_count:
                    type: integer
                    description: Customer messages you have not read yet.
                  message_count:
                    type: integer
                  ownership:
                    type: object
                    description: Who is answering this conversation.
                    properties:
                      owner:
                        type: string
                        enum:
                          - person
                          - agent
                        description: '`person` means a human took it over. `agent` means the AI answers.'
                      paused:
                        type: boolean
                  window_open:
                    type: boolean
                    nullable: true
                    description: Whether the 24-hour window is open. Null when the number does not enforce it.
                  window_expires_at:
                    type: string
                    nullable: true
                    description: When the 24-hour window closes. Null when there is no window.
                  has_failed:
                    type: boolean
                    description: A failed outbound message is newer than the last successful one.
                  opted_out:
                    type: boolean
                    description: The customer has opted out of messages from this number.
                  campaign:
                    type: object
                    nullable: true
                    description: The broadcast this conversation came from, when it did.
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
            has_more:
              type: boolean
            next_cursor:
              type: string
              nullable: true
  '400':
    description: >-
      A bad parameter or body. `code` says which, such as `invalid_parameter`, `invalid_json`,
      `invalid_limit` or `invalid_cursor`.
    content:
      application/json:
        schema:
          type: object
          description: |
            The error envelope for every WhatsApp route. Some errors add keys:
            `fields` (the template parameters a send still needs), `ref` (a
            500's support reference) and `failed` (on `import_failed`).
          properties:
            error:
              type: string
              description: Machine-readable category, such as `invalid_request`.
            error_description:
              type: string
              description: Human-readable explanation.
            code:
              type: string
              description: Stable, specific reason, such as `window_closed`.
            request_id:
              type: string
              description: >-
                Correlates this response with the server log. Also sent as the `X-Request-Id`
                header.
            fields:
              type: array
              items:
                type: string
              description: >-
                On a template send missing parameters (`missing_fields`), the field keys you still
                need.
            ref:
              type: string
              description: On a `500`, the reference to quote to support.
            failed:
              type: array
              items:
                type: object
                properties:
                  phone_number_id:
                    type: string
                  message:
                    type: string
                    example: >-
                      This WhatsApp number is already connected to another account. Disconnect it
                      there first, then import it again. Contact support if you cannot access that
                      account.
              description: On `import_failed`, each number and why it could not be connected.
        example:
          error: invalid_request
          error_description: limit must be a whole number from 1 to 100.
          code: invalid_limit
          request_id: req_4a1c7d9e2f60
  '401':
    description: Missing or invalid API key.
    content:
      application/json:
        schema:
          type: object
          description: |
            The error envelope for every WhatsApp route. Some errors add keys:
            `fields` (the template parameters a send still needs), `ref` (a
            500's support reference) and `failed` (on `import_failed`).
          properties:
            error:
              type: string
              description: Machine-readable category, such as `invalid_request`.
            error_description:
              type: string
              description: Human-readable explanation.
            code:
              type: string
              description: Stable, specific reason, such as `window_closed`.
            request_id:
              type: string
              description: >-
                Correlates this response with the server log. Also sent as the `X-Request-Id`
                header.
            fields:
              type: array
              items:
                type: string
              description: >-
                On a template send missing parameters (`missing_fields`), the field keys you still
                need.
            ref:
              type: string
              description: On a `500`, the reference to quote to support.
            failed:
              type: array
              items:
                type: object
                properties:
                  phone_number_id:
                    type: string
                  message:
                    type: string
                    example: >-
                      This WhatsApp number is already connected to another account. Disconnect it
                      there first, then import it again. Contact support if you cannot access that
                      account.
              description: On `import_failed`, each number and why it could not be connected.
        example:
          error: unauthorized
          error_description: Missing or invalid API key
          code: invalid_api_key
          request_id: req_6e2b9d4f1a38
  '403':
    description: |
      `feature_not_enabled` when your plan or role cannot use WhatsApp,
      `permission_denied` when the key's user cannot make changes, or
      `service_unavailable` when the account is on hold.
    content:
      application/json:
        schema:
          type: object
          description: |
            The error envelope for every WhatsApp route. Some errors add keys:
            `fields` (the template parameters a send still needs), `ref` (a
            500's support reference) and `failed` (on `import_failed`).
          properties:
            error:
              type: string
              description: Machine-readable category, such as `invalid_request`.
            error_description:
              type: string
              description: Human-readable explanation.
            code:
              type: string
              description: Stable, specific reason, such as `window_closed`.
            request_id:
              type: string
              description: >-
                Correlates this response with the server log. Also sent as the `X-Request-Id`
                header.
            fields:
              type: array
              items:
                type: string
              description: >-
                On a template send missing parameters (`missing_fields`), the field keys you still
                need.
            ref:
              type: string
              description: On a `500`, the reference to quote to support.
            failed:
              type: array
              items:
                type: object
                properties:
                  phone_number_id:
                    type: string
                  message:
                    type: string
                    example: >-
                      This WhatsApp number is already connected to another account. Disconnect it
                      there first, then import it again. Contact support if you cannot access that
                      account.
              description: On `import_failed`, each number and why it could not be connected.
        example:
          error: forbidden
          error_description: You do not have permission to make changes to WhatsApp.
          code: permission_denied
          request_id: req_9f2c1a4b7d3e
  '404':
    description: |
      No number, conversation, message, template, media upload, agent,
      campaign, contact or opt-out with that id in your workspace. `code`
      says which. Another workspace's id gives the same answer.
    content:
      application/json:
        schema:
          type: object
          description: |
            The error envelope for every WhatsApp route. Some errors add keys:
            `fields` (the template parameters a send still needs), `ref` (a
            500's support reference) and `failed` (on `import_failed`).
          properties:
            error:
              type: string
              description: Machine-readable category, such as `invalid_request`.
            error_description:
              type: string
              description: Human-readable explanation.
            code:
              type: string
              description: Stable, specific reason, such as `window_closed`.
            request_id:
              type: string
              description: >-
                Correlates this response with the server log. Also sent as the `X-Request-Id`
                header.
            fields:
              type: array
              items:
                type: string
              description: >-
                On a template send missing parameters (`missing_fields`), the field keys you still
                need.
            ref:
              type: string
              description: On a `500`, the reference to quote to support.
            failed:
              type: array
              items:
                type: object
                properties:
                  phone_number_id:
                    type: string
                  message:
                    type: string
                    example: >-
                      This WhatsApp number is already connected to another account. Disconnect it
                      there first, then import it again. Contact support if you cannot access that
                      account.
              description: On `import_failed`, each number and why it could not be connected.
        example:
          error: not_found
          error_description: WhatsApp number not found.
          code: number_not_found
          request_id: req_2c8e7a1d9b40
  '500':
    description: Something went wrong on our side. Quote `ref` to support.
    content:
      application/json:
        schema:
          type: object
          description: |
            The error envelope for every WhatsApp route. Some errors add keys:
            `fields` (the template parameters a send still needs), `ref` (a
            500's support reference) and `failed` (on `import_failed`).
          properties:
            error:
              type: string
              description: Machine-readable category, such as `invalid_request`.
            error_description:
              type: string
              description: Human-readable explanation.
            code:
              type: string
              description: Stable, specific reason, such as `window_closed`.
            request_id:
              type: string
              description: >-
                Correlates this response with the server log. Also sent as the `X-Request-Id`
                header.
            fields:
              type: array
              items:
                type: string
              description: >-
                On a template send missing parameters (`missing_fields`), the field keys you still
                need.
            ref:
              type: string
              description: On a `500`, the reference to quote to support.
            failed:
              type: array
              items:
                type: object
                properties:
                  phone_number_id:
                    type: string
                  message:
                    type: string
                    example: >-
                      This WhatsApp number is already connected to another account. Disconnect it
                      there first, then import it again. Contact support if you cannot access that
                      account.
              description: On `import_failed`, each number and why it could not be connected.
        example:
          error: server_error
          error_description: >-
            Something went wrong on our side. Please try again shortly, or contact support with
            reference 9a1f3e8b02c4.
          ref: 9a1f3e8b02c4
          code: server_error
          request_id: req_9a1f3e8b02c4
```

**curl**

```bash
curl -X GET "https://backend.omnidim.io/api/v1/whatsapp/numbers/{number_id}/conversations" \
  -H "Authorization: Bearer $OMNIDIM_API_KEY"
```