> ## 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.

# GetVoiceWhatsAppConversationAPI mirrors erdo_voice_whatsapp_conversation_get,


> returning the conversation and its messages oldest first. The session id travels in the path; the message paging rides the query string.




## OpenAPI

````yaml /api/openapi.json get /v1/voice/whatsapp-conversations/{sessionID}
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/{sessionID}:
    get:
      summary: >
        GetVoiceWhatsAppConversationAPI mirrors
        erdo_voice_whatsapp_conversation_get,
      description: >
        returning the conversation and its messages oldest first. The session id
        travels in the path; the message paging rides the query string.
      operationId: GET:mcp.GetVoiceWhatsAppConversationAPI
      parameters:
        - allowEmptyValue: true
          explode: false
          in: path
          name: sessionID
          required: true
          schema:
            type: string
          style: simple
        - 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
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  conversation:
                    $ref: '#/components/schemas/messaging.WhatsAppConversationSummary'
                  messages:
                    items:
                      $ref: >-
                        #/components/schemas/messaging.WhatsAppConversationMessage
                    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.WhatsAppConversationMessage:
      description: >
        things a WhatsApp message can be that a text cannot: a shared pin, a
        tapped button, a quoted message, an ad the person came in from.
      properties:
        body:
          type: string
        context:
          additionalProperties:
            type: string
          description: >
            quick-reply button it tapped. Without it a reply reading "yes, that
            one" has lost its referent.
          title: |
            Context is what this message answered: the message it quoted, or the
          type: object
        created_at:
          format: date-time
          type: string
        direction:
          title: |
            inbound | outbound
          type: string
        location:
          additionalProperties:
            type: string
          description: >
            WhatsApp attached. A location share carries an empty body, so
            without this the message would read as somebody saying nothing.
          title: >
            Location is a shared pin: latitude, longitude, and the label and
            address
          type: object
        message_id:
          type: string
        message_type:
          description: |
            button, voice, and so on.
          title: >
            MessageType is WhatsApp's own word for what this was: text,
            location,
          type: string
        num_media:
          description: >
            not served here — and stops resolving when Twilio's retention
            expires, which is why the count is stored rather than derived.
          format: int64
          title: >
            NumMedia counts the attachments. The media itself lives at Twilio
            and is
          type: integer
        profile_name:
          title: >
            ProfileName is who the person said they were at the time of this
            message.
          type: string
        referral:
          additionalProperties:
            type: string
          description: |
            started this conversation from an ad.
          title: |
            Referral is the click-to-WhatsApp ad block, present when the person
          type: object
        status:
          title: |
            …|sent|delivered|read
          type: string
      title: >
        WhatsAppConversationMessage is one message, in reading order. It carries
        the
      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_...).

````