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

# ListVoiceWhatsAppConversationsAPI mirrors erdo_voice_whatsapp_conversation_list.


> A separate resource from /v1/voice/sms-conversations rather than a channel filter on it: WhatsApp keeps its own ledger and opt-out, and its messages carry location, context, referral and profile name that a text does not. The two number filters, the \`canonical\_lead\_id\` filter (a lead UUID or its 22-character reference) and paging ride the query string; the organization always comes from the caller's identity.




## OpenAPI

````yaml /api/openapi.json get /v1/voice/whatsapp-conversations
openapi: 3.0.0
info:
  title: Erdo API
  description: >-
    Erdo's REST API: query and write datasets, run agents, manage threads,
    integrations, pages, evals, workstreams, experiments, and bounded outreach.
    Authenticate with a Bearer API key (erdo_api_...) or scoped token
    (erdo_token_...).
  version: '2026-09-29'
servers:
  - url: https://api.erdo.ai
    description: Production
security:
  - bearerAuth: []
paths:
  /v1/voice/whatsapp-conversations:
    get:
      summary: >
        ListVoiceWhatsAppConversationsAPI mirrors
        erdo_voice_whatsapp_conversation_list.
      description: >
        A separate resource from /v1/voice/sms-conversations rather than a
        channel filter on it: WhatsApp keeps its own ledger and opt-out, and its
        messages carry location, context, referral and profile name that a text
        does not. The two number filters, the \`canonical\_lead\_id\` filter (a
        lead UUID or its 22-character reference) and paging ride the query
        string; the organization always comes from the caller's identity.
      operationId: GET:mcp.ListVoiceWhatsAppConversationsAPI
      parameters:
        - allowEmptyValue: true
          explode: true
          in: query
          name: phone_number
          required: false
          schema:
            type: string
          style: form
        - allowEmptyValue: true
          explode: true
          in: query
          name: address
          required: false
          schema:
            type: string
          style: form
        - allowEmptyValue: true
          explode: true
          in: query
          name: limit
          required: false
          schema:
            format: int64
            type: integer
          style: form
        - allowEmptyValue: true
          explode: true
          in: query
          name: cursor
          required: false
          schema:
            type: string
          style: form
        - allowEmptyValue: true
          explode: true
          in: query
          name: canonical_lead_id
          required: false
          schema:
            type: string
          style: form
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  conversations:
                    items:
                      $ref: >-
                        #/components/schemas/messaging.WhatsAppConversationSummary
                    type: array
                  next_cursor:
                    type: string
                type: object
          description: Success response
        default:
          $ref: '#/components/responses/APIError'
components:
  schemas:
    messaging.WhatsAppConversationSummary:
      description: >
        much, and whether the person has opted out. Never the message bodies —
        those come from GetWhatsAppConversation.
      properties:
        address:
          title: |
            Address is the person's number, in E.164.
          type: string
        agent_ref:
          description: |
            number is not one of an org's agent numbers.
          title: >
            AgentRef is the managed voice agent the number belongs to, empty
            when the
          type: string
        canonical_lead_id:
          type: string
        contact:
          allOf:
            - $ref: '#/components/schemas/messaging.SMSConversationContact'
          description: |
            written by the idle close-out digest.
          title: >
            Contact is what the person gave about themselves across the
            conversation,
        created_at:
          format: date-time
          type: string
        display_name:
          description: >
            recent inbound message. Read live rather than copied onto the
            conversation, because they can change it at any time and the two
            copies would disagree. Empty when they have never sent anything, or
            set no name.
          title: >
            DisplayName is the WhatsApp profile name the person chose, from
            their most
          type: string
        idle_closed_at:
          format: date-time
          type: string
          nullable: true
        last_inbound_at:
          format: date-time
          type: string
          nullable: true
        last_outbound_at:
          format: date-time
          type: string
          nullable: true
        last_outbound_message_id:
          description: >
            the conversation, so a caller can tell whether it was its own. Empty
            when nothing has been sent.
          title: >
            LastOutboundMessageID names the newest message this organization
            sent in
          type: string
        lead_reference:
          type: string
        message_count:
          format: int64
          type: integer
        phone_number:
          description: |
            calls and texts.
          title: >
            PhoneNumber is Erdo's own number, in E.164 — the same number that
            answers
          type: string
        sender_kind:
          type: string
        session_id:
          format: uuid
          type: string
        summary:
          type: string
        suppressed:
          description: >
            org. It is read off WhatsApp's own ledger — the one its egress gate
            enforces — so it cannot disagree with that gate, and it says nothing
            about whether the same person still accepts SMS.
          title: >
            Suppressed is true while this person stands opted out of WhatsApp
            for this
          type: boolean
        topics:
          items:
            type: string
          type: array
          nullable: true
      title: >
        WhatsAppConversationSummary is one conversation's metadata: who, when,
        how
      type: object
    messaging.SMSConversationContact:
      description: >
        field is omitted rather than empty when the person did not give it, so
        "not mentioned" never reads as "blank".
      properties:
        company:
          type: string
        email:
          type: string
        name:
          type: string
        phone:
          type: string
      title: >
        SMSConversationContact is the contact detail a conversation yielded.
        Every
      type: object
  responses:
    APIError:
      content:
        application/json:
          schema:
            externalDocs:
              url: https://pkg.go.dev/encore.dev/beta/errs#Error
            properties:
              code:
                description: Error code
                example: not_found
                externalDocs:
                  url: https://pkg.go.dev/encore.dev/beta/errs#ErrCode
                type: string
              details:
                description: Error details
                type: object
              message:
                description: Error message
                type: string
            title: APIError
            type: object
      description: Error response
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An Erdo API key (erdo_api_...) or scoped token (erdo_token_...).

````