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

# List a contact's conversations

> Returns the conversations of one contact, newest first.

Use `status=open` before you send a template: it tells you whether a
thread with this person is already live, and who holds it.




## OpenAPI

````yaml /openapi.yaml get /contacts/{id}/conversations
openapi: 3.1.0
info:
  title: Kai API
  version: 1.1.0
  description: |
    Push, update, assign and export the contacts of one Kai workspace. Read
    a contact's conversations, list the approved WhatsApp templates, send a
    template message to a customer, and assign the conversation to a
    teammate.

    Every request needs an API key. Make a key in Kai, under
    **Settings → API**. Send the key in the `Authorization` header.

    The API works on one workspace. The key decides which workspace, so no
    request carries a workspace id.
  contact:
    name: Kai support
    url: https://kaisupport.com
servers:
  - url: https://kaisupport.com/api/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Contacts
    description: Customer profiles, their attributes and their account owners.
  - name: Attributes
    description: The attributes that the workspace keeps on every contact.
  - name: Members
    description: The teammates of the workspace. Read-only.
  - name: Conversations
    description: A contact's message threads, and who they are assigned to.
  - name: Templates
    description: The approved WhatsApp message templates of a channel.
  - name: Channels
    description: The connected messaging channels. Read-only.
paths:
  /contacts/{id}/conversations:
    parameters:
      - name: id
        in: path
        required: true
        description: The Kai contact id.
        schema:
          type: string
          format: uuid
    get:
      tags:
        - Conversations
      summary: List a contact's conversations
      description: |
        Returns the conversations of one contact, newest first.

        Use `status=open` before you send a template: it tells you whether a
        thread with this person is already live, and who holds it.
      operationId: listContactConversations
      parameters:
        - name: status
          in: query
          description: |
            `open` returns the live threads. `closed` and `archived` return
            those states. Omit it for all of them.
          schema:
            type: string
            enum:
              - open
              - closed
              - archived
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 50
      responses:
        '200':
          description: The contact's conversations.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/ConversationSummary'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    ConversationSummary:
      type: object
      required:
        - id
        - channel_id
        - status
        - created_at
      properties:
        id:
          type: string
          format: uuid
        channel_id:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - open
            - ai
            - human
            - closed
            - archived
          description: |
            `open`, `ai` and `human` are live states. `closed` rests until
            the customer writes again. `archived` is final.
        assigned_member_id:
          type:
            - string
            - 'null'
          format: uuid
          description: The teammate who holds this thread, or `null` for the shared queue.
        assigned_via:
          type:
            - string
            - 'null'
          enum:
            - member
            - api
            - null
          description: |
            Who made the assignment. `member` is a person in Kai. `api` is a
            call to this API. `null` is Kai's own routing, or an old row.
        last_message_preview:
          type:
            - string
            - 'null'
        last_message_at:
          type:
            - string
            - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
    Error:
      type: object
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
    ErrorBody:
      type: object
      properties:
        type:
          type: string
          description: A stable machine name for the error.
        message:
          type: string
          description: One sentence for a human reader.
        details:
          description: The attributes or the identities that caused the error.
  responses:
    BadRequest:
      description: Kai could not read the request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              type: invalid_request
              message: >-
                Send at least one of "external_id", "email", "phone" or
                "identities" so the contact can be matched.
    Unauthorized:
      description: The API key is missing or not valid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              type: unauthorized
              message: That API key is not valid.
    Forbidden:
      description: The API key does not have the permission that this endpoint needs.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              type: forbidden
              message: This key does not have the "contacts:write" permission.
    NotFound:
      description: There is no such record in this workspace.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              type: not_found
              message: No such contact.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: |
        Send your API key as `Authorization: Bearer kai_live_...`.

        Make, edit and revoke keys in Kai, under **Settings → API**. Kai stores
        only a hash of the key, so the full key is shown one time. You can
        change the name and the permissions of a key later without a new key.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.