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

# ListVoicePhoneNumbersAPI mirrors erdo_voice_phone_number_list: every number


> with its SMS registration and its part in the organization's caller name.




## OpenAPI

````yaml /api/openapi.json get /v1/voice/phone-numbers
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-24'
servers:
  - url: https://api.erdo.ai
    description: Production
security:
  - bearerAuth: []
paths:
  /v1/voice/phone-numbers:
    get:
      summary: >
        ListVoicePhoneNumbersAPI mirrors erdo_voice_phone_number_list: every
        number
      description: >
        with its SMS registration and its part in the organization's caller
        name.
      operationId: GET:mcp.ListVoicePhoneNumbersAPI
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  business_profile_complete:
                    description: >
                      is still missing fields. It answers the settings page's
                      first question without the caller having to interpret an
                      empty list.
                    title: >
                      BusinessProfileComplete is false when the profile has
                      never been saved or
                    type: boolean
                  caller_name:
                    $ref: '#/components/schemas/mcp.CallerNameSummary'
                  missing_profile_fields:
                    description: >
                      business profile is what every registration on the account
                      depends on, so it is reported once rather than repeated on
                      each row.
                    items:
                      type: string
                    title: >
                      MissingProfileFields is the organization's, not any one
                      number's: the
                    type: array
                  numbers:
                    description: >
                      same keys, plus the number's caller-name state — see
                      VoicePhoneNumber.
                    items:
                      $ref: '#/components/schemas/mcp.VoicePhoneNumber'
                    title: >
                      Numbers carries every SMS field the list has always
                      returned, under the
                    type: array
                  person_call_numbers:
                    description: >
                      person's call (POST /v1/voice/person-calls) can be placed
                      from, written exactly as it appears there. It is the voice
                      service's answer, made by the same check the call itself
                      makes, so a surface that offers only these numbers never
                      offers one every call would refuse: an agent number on an
                      account Erdo does not manage has the agent-number kind but
                      is not listed. Always present; empty when no number can
                      place one.
                    items:
                      type: string
                    title: >
                      PersonCallNumbers is the `address` of every entry in
                      `numbers` that a
                    type: array
                type: object
          description: Success response
        default:
          $ref: '#/components/responses/APIError'
components:
  schemas:
    mcp.CallerNameSummary:
      properties:
        caller_name:
          type: string
        caller_name_out_of_date:
          type: boolean
        missing_profile_fields:
          items:
            type: string
          type: array
        next_step:
          type: string
        reason:
          type: string
        registerable:
          type: boolean
        registered_name:
          type: string
        status:
          type: string
      title: |
        CallerNameSummary is the organization-level caller name, once per list.
      type: object
    mcp.VoicePhoneNumber:
      description: >
        (every field the list has always carried, under the same keys) and,
        beside it, its part in the organization's caller name.


        The SMS fields are restated rather than embedded, because Encore's
        schema and client generators drop an embedded struct's fields — the
        published API reference and the generated clients would lose every SMS
        field. The restated list is held to messaging's by
        TestVoicePhoneNumberCarriesEverySMSField, so a field added there cannot
        go missing here.
      properties:
        address:
          type: string
        agent_ref:
          type: string
        brand_status:
          type: string
        caller_name_attachment:
          description: |
            or attaching — see the voice service's CallerNameNumberView.
          title: >
            CallerNameAttachment is not_registerable, unregistered, pending,
            attached
          type: string
        caller_name_not_registerable_reason:
          type: string
        caller_name_observed:
          type: string
        caller_name_registerable:
          description: >
            be attached to (root account, the org's own Twilio account,
            toll-free, outside the US and Canada), with the reason beside it.
          title: >
            CallerNameRegisterable is false for a number the caller name can
            never
          type: boolean
        campaign_status:
          type: string
        last_polled_at:
          format: date-time
          type: string
        missing_profile_fields:
          items:
            type: string
          type: array
        mock:
          type: boolean
        next_step:
          type: string
        not_registerable_reason:
          type: string
        observed_caller_name:
          description: >
            calls, and CallerNameObserved classifies it: none, ours, or other
            (usually a previous owner's name on a recycled number). Empty before
            any lookup.
          title: >
            ObservedCallerName is what a carrier lookup last showed when this
            number
          type: string
        profile_out_of_date:
          type: boolean
        profile_out_of_date_fields:
          items:
            type: string
          type: array
        profile_status:
          type: string
        reason:
          type: string
        registerable:
          type: boolean
        requested_at:
          format: date-time
          type: string
        sender_kind:
          type: string
        status:
          type: string
      title: >
        VoicePhoneNumber is one of the organization's numbers: its SMS
        registration
      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_...).

````