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




## 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-09'
servers:
  - url: https://api.erdo.ai
    description: Production
security:
  - bearerAuth: []
paths:
  /v1/voice/phone-numbers:
    get:
      summary: |
        ListVoicePhoneNumbersAPI mirrors erdo_voice_phone_number_list.
      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
                  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:
                    items:
                      $ref: '#/components/schemas/messaging.SenderSMSStatusResponse'
                    type: array
                type: object
          description: Success response
        default:
          $ref: '#/components/responses/APIError'
components:
  schemas:
    messaging.SenderSMSStatusResponse:
      description: >
        answers with. It carries no tax id, no Twilio credential, and no
        provider SID — a SID is an internal handle, and putting one in a tool
        result invites an agent to try to use it.
      properties:
        address:
          type: string
        agent_ref:
          description: |
            Erdo's own numbers.
          title: |
            AgentRef is the managed voice agent the number belongs to, empty for
          type: string
        brand_status:
          type: string
        campaign_status:
          type: string
        last_polled_at:
          format: date-time
          type: string
        missing_profile_fields:
          description: >
            needs before registration can be submitted, so the answer to "why
            isn't my number replying" is actionable rather than "it isn't
            registered".
          items:
            type: string
          title: >
            MissingProfileFields names what the organization's business profile
            still
          type: array
        mock:
          type: boolean
        next_step:
          type: string
        not_registerable_reason:
          description: |
            when Registerable is true.
          title: >
            NotRegisterableReason says why, in the words a person should see.
            Empty
          type: string
        profile_out_of_date:
          description: >
            since this registration was submitted, so the carriers still hold
            the previous legal identity. It is reported rather than acted on:
            re-sending re-opens carrier review, so it is a person's decision —
            and without this field every surface would go on showing the new
            identity beside a status of "approved" and nothing would say the two
            had parted. ProfileOutOfDateFields names what moved, empty for a
            registration that predates the per-field record.
          title: >
            ProfileOutOfDate says the organization's business profile has been
            edited
          type: boolean
        profile_out_of_date_fields:
          items:
            type: string
          type: array
        profile_status:
          type: string
        reason:
          title: >
            Reason is Twilio's own words for a rejection or the last provider
            error.
          type: string
        registerable:
          description: >
            Erdo's own shared numbers, or one on the root account. It is
            reported rather than left to the attempt, because an approval card
            for a call that can never execute is worse than a refusal: it sits
            in the work feed looking like a decision somebody still has to make.
          title: >
            Registerable is false for a number this flow will never register —
            one of
          type: boolean
        requested_at:
          format: date-time
          type: string
        sender_kind:
          type: string
        status:
          type: string
      title: |
        SenderSMSStatusResponse is what every read and write of a 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_...).

````