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

# Choose who takes a number's calls

> Sets `agent_settings.call_mode` of one number the tenant still holds, given in E.164 (the `+` may be left out). `AI_AGENT`: the phone agent answers. `PASSIVE`: Neo does not answer; it rings `help_desk_number`, the caller's phone keeps ringing until the help desk picks up, Neo records the call from that moment, and after the call it writes the transcript and a summary to the ticket while the number's ticket notes are on. The MSP forwards its support line to the Neo number; `help_desk_number` must be a different number on the MSP's own phone system, never a Neo number. Neo plays no recording notice in `PASSIVE`, so the help desk greeting must carry it. The change takes effect for the next call. Returns the updated number. 400 for a missing or invalid help desk number, or for `AI_AGENT` on a number with no default company; 404 `phone_number_not_found` for a number the tenant does not hold.



## OpenAPI

````yaml https://api.neoagent.io/public-api/openapi.json put /public-api/phone/numbers/{number}/call-mode
openapi: 3.1.0
info:
  description: >-
    Neo's public contract for the dashboard ChatAgent, partner integrations, and
    MSP automation. Every response is wrapped in a `{data, meta}` envelope;
    errors use `{error: {code, message, details?}, meta: {request_id}}`.
    Authenticate with a `Bearer neo_sk_<env>_<secret>` API key (service account)
    or a Microsoft Entra ID JWT (dashboard user). Signed-URL endpoints (end-user
    feedback links) take a `signature` query parameter instead.
  title: Neo Public API
  version: 1.0.0
servers:
  - url: https://api.neoagent.io
security: []
tags:
  - description: Service metadata — health, OpenAPI.
    name: Meta
  - description: Agents and workflows — read, version history, delete, stats.
    name: Agents
  - description: Agent/workflow execution history, sub-resources, retry/cancel.
    name: Executions
  - description: >-
      Every tool call the tenant's agents made in the last 30 days, within the
      caller's workflow access.
    name: Audit Log
  - description: PSA webhook events and their workflow-match results.
    name: Callbacks
  - description: Technician-in-the-loop approval requests.
    name: TIL requests
  - description: RMM script executions triggered by agents.
    name: RMM scripts
  - description: Dispatch-agent field-update decisions.
    name: Dispatch
  - description: The authenticated tenant.
    name: Tenant
  - description: Agent-builder schema catalogs (raw JSON payloads).
    name: Schemas
  - description: Escalate to the Neo team (HubSpot ticket).
    name: Escalation
  - description: Tenant settings.
    name: Settings
  - description: Tenant API-key management (dashboard JWT only).
    name: API keys
  - description: End-user feedback links (signed-URL auth).
    name: Feedback
  - description: End-client companies (CRUD + bulk-update).
    name: End companies
  - description: Channels — bind a CONVERSATIONAL agent to a transport (Teams or Slack).
    name: Channels
  - description: PSA/RMM/M365 integration status and connection management.
    name: Integrations
  - description: Technician roster (controls TIL routing and paging).
    name: Technicians
  - description: Future runs queued for TRIGGERED agents.
    name: Scheduled work
  - description: Subscription state and customer-facing credit usage (no provider $).
    name: Billing
  - description: Inbox messages and announcements.
    name: Inbox & Comms
  - description: Tenant-authored agent skills (CRUD) and the built-in skill catalog.
    name: Skills
paths:
  /public-api/phone/numbers/{number}/call-mode:
    put:
      tags:
        - Phone Agent
      summary: Choose who takes a number's calls
      description: >-
        Sets `agent_settings.call_mode` of one number the tenant still holds,
        given in E.164 (the `+` may be left out). `AI_AGENT`: the phone agent
        answers. `PASSIVE`: Neo does not answer; it rings `help_desk_number`,
        the caller's phone keeps ringing until the help desk picks up, Neo
        records the call from that moment, and after the call it writes the
        transcript and a summary to the ticket while the number's ticket notes
        are on. The MSP forwards its support line to the Neo number;
        `help_desk_number` must be a different number on the MSP's own phone
        system, never a Neo number. Neo plays no recording notice in `PASSIVE`,
        so the help desk greeting must carry it. The change takes effect for the
        next call. Returns the updated number. 400 for a missing or invalid help
        desk number, or for `AI_AGENT` on a number with no default company; 404
        `phone_number_not_found` for a number the tenant does not hold.
      operationId: public_api.phone_number_call_mode_put
      parameters:
        - in: path
          name: number
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicCallModeUpdate'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/PublicPhoneNumber'
                  meta:
                    $ref: '#/components/schemas/SuccessMeta'
                required:
                  - data
                  - meta
                type: object
          description: Success.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Bad request — malformed input.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Unauthenticated — missing or invalid credentials.
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Forbidden — authenticated but not allowed.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Not found.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Conflict — the resource is in a state that blocks this operation.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Request validation failed.
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Rate limited — see Retry-After.
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
          description: Internal server error.
      security:
        - bearerAuth: []
components:
  schemas:
    PublicCallModeUpdate:
      description: Who takes the number's calls.
      properties:
        call_mode:
          description: >-
            `AI_AGENT`: the phone agent answers. `PASSIVE`: Neo does not answer;
            it rings `help_desk_number`, the caller's phone keeps ringing until
            the help desk picks up, and, while the number's ticket notes are on,
            Neo writes the transcript and a summary of the call to the ticket
            afterwards. `AI_AGENT` needs a default company on the number.
          enum:
            - AI_AGENT
            - PASSIVE
          title: Call Mode
          type: string
        help_desk_number:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          description: >-
            Required for `PASSIVE`: a number on the MSP's own phone system that
            rings its help desk, with its country code. Never the support line
            forwarded to Neo, and never a Neo number, or the call loops. Ignored
            for `AI_AGENT`, which keeps the stored number.
          title: Help Desk Number
      required:
        - call_mode
      title: PublicCallModeUpdate
      type: object
    PublicPhoneNumber:
      description: >-
        Public projection of a `phone_numbers` row.


        `psa_settings` and `agent_settings` are returned as opaque JSON — their

        inner shapes (which PSA action to take on missing customer, which voice

        profile, which custom prompt) are tenant-curated and not part of the
        public

        contract. Anyone wanting to edit them goes through the dashboard.


        `agent_settings.attached_memory_ids` lists the ids of the MSP-wide
        memories

        attached to the number, which the agent reads on every call, except one

        that was deleted or no longer fits the 4,000-character total. A call
        uses

        the newest edit of each, so an id can name an older version.
      properties:
        agent_settings:
          additionalProperties: true
          title: Agent Settings
          type: object
        country:
          $ref: '#/components/schemas/CountryCode'
        created_at:
          format: date-time
          title: Created At
          type: string
        id:
          title: Id
          type: integer
        minutes_used_this_month:
          anyOf:
            - type: integer
            - type: 'null'
          title: Minutes Used This Month
        number:
          title: Number
          type: string
        psa_settings:
          additionalProperties: true
          title: Psa Settings
          type: object
        status:
          $ref: '#/components/schemas/PhoneNumberStatus'
        updated_at:
          format: date-time
          title: Updated At
          type: string
      required:
        - id
        - number
        - country
        - status
        - minutes_used_this_month
        - psa_settings
        - agent_settings
        - created_at
        - updated_at
      title: PublicPhoneNumber
      type: object
    SuccessMeta:
      properties:
        pagination:
          $ref: '#/components/schemas/Pagination'
        request_id:
          format: uuid
          type: string
        timings_ms:
          additionalProperties:
            type: number
          type: object
        warnings:
          description: >-
            Non-fatal warnings about the created/updated resource (e.g. an
            unhealthy PSA callback).
          items:
            type: string
          type: array
      required:
        - request_id
        - timings_ms
      type: object
    ErrorEnvelope:
      properties:
        error:
          properties:
            code:
              description: Stable machine-readable error code.
              type: string
            details:
              additionalProperties: true
              type: object
            message:
              type: string
          required:
            - code
            - message
          type: object
        meta:
          properties:
            request_id:
              format: uuid
              type:
                - string
                - 'null'
          type: object
      required:
        - error
        - meta
      type: object
    CountryCode:
      enum:
        - - US
          - '+1'
          - null
          - null
        - - CA
          - '+1'
          - null
          - null
        - - GB
          - '+44'
          - BUd29cd8d0f57893ad3311964d784dc9a1
          - AD231ece3809334da636dd351b9f2fdf60
        - - NL
          - '+31'
          - null
          - AD3e3f88b6d5277d90f9a5b3946c8f6b4c
        - - AU
          - '+61'
          - null
          - AD2959da1db1ac1fc0bd2019c9baa658dc
        - - NZ
          - '+64'
          - BUa773bd090fba6fdd9af485916160888b
          - ADdf8429724400c2873c9b7d3874215410
      title: CountryCode
      type: array
    PhoneNumberStatus:
      description: >-
        What a phone number is doing, and who decided it.


        ACTIVE and INACTIVE belong to the customer. INACTIVE means they switched
        the number off

        themselves and can switch it back on whenever they like; it stays
        theirs.


        SUSPENDED belongs to Neo. Nothing is paying for the number, so it stops
        taking calls — but

        Neo keeps it for a short while, and paying again brings it straight back
        with the same

        number. A customer cannot switch a suspended number on themselves.


        RELEASED belongs to Neo, and it is final. The number has been given back
        to the carrier,

        which returns it to a public pool where anyone may buy it. Nothing
        brings a released number

        back; a customer who returns gets a new number.


        RELEASING belongs to the customer's admin, who deleted the agent. The
        number takes

        no calls, leaves their list, and nothing switches it back on; the
        reconciliation gives it to

        the carrier on its next pass and marks it RELEASED. A separate state,
        because RELEASED must

        mean the carrier already has the number.
      enum:
        - ACTIVE
        - INACTIVE
        - SUSPENDED
        - RELEASING
        - RELEASED
      title: PhoneNumberStatus
      type: string
    Pagination:
      properties:
        has_more:
          type: boolean
        next_cursor:
          type:
            - string
            - 'null'
      required:
        - next_cursor
        - has_more
      type: object
  securitySchemes:
    bearerAuth:
      description: >-
        `Authorization: Bearer <token>` where `<token>` is either a
        `neo_sk_<env>_<secret>` API key (service account) or a Microsoft Entra
        ID access token (dashboard user).
      scheme: bearer
      type: http

````

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