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

# List virtual agent profiles

> Sort keys: created_at, name, provider. An unknown sort key is a 400.



## OpenAPI

````yaml /api-reference/openapi-public.json get /virtual-agent-profiles
openapi: 3.0.3
info:
  description: >-
    The API your own systems use: place and follow calls, have an AI agent call
    someone, run campaigns and get their results, keep contacts in step with
    your CRM, and receive signed webhooks. Authenticate with an integration key
    (Authorization: Bearer ft_...), used only from the IP addresses it allows.
  title: FireTone API
  version: 0.1.0
servers:
  - description: Your platform's API host
    url: https://{host}/api/v1
    variables:
      host:
        default: api.firet.one
security:
  - bearerAuth: []
tags:
  - name: Auth
  - description: >-
      Live calls and what can be done to them: hang up, hold, transfer, park,
      merge, monitor, whisper; the Desk's own call.
    name: Calls
  - description: 'Outbound campaigns: contacts, attempts, outcomes.'
    name: Campaigns
  - description: 'Customers: who called, what is known about them, and their memory.'
    name: Contacts
  - description: What was said on an AI call, and the review of it.
    name: Conversations
  - description: >-
      Your own systems: HTTP connections an IVR calls mid-call, and webhooks for
      call events. Tenant URLs must be public https addresses.
    name: Integrations
  - name: Live
  - name: Provisioning
  - name: Reporting
  - description: Tickets raised by people, agents and the API.
    name: Tickets
  - description: Messages left for an extension or a queue.
    name: Voicemail
paths:
  /virtual-agent-profiles:
    get:
      tags:
        - Provisioning
      summary: List virtual agent profiles
      description: 'Sort keys: created_at, name, provider. An unknown sort key is a 400.'
      operationId: getVirtualAgentProfiles
      parameters:
        - $ref: '#/components/parameters/limit'
        - $ref: '#/components/parameters/offset'
        - $ref: '#/components/parameters/sort'
        - $ref: '#/components/parameters/order'
        - $ref: '#/components/parameters/q'
        - $ref: '#/components/parameters/organisationId'
        - $ref: '#/components/parameters/filterProvider'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualAgentProfilePage'
          description: OK
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
components:
  parameters:
    limit:
      in: query
      name: limit
      schema:
        default: 50
        maximum: 500
        type: integer
    offset:
      in: query
      name: offset
      schema:
        default: 0
        type: integer
    sort:
      description: >-
        Sort key. Each list accepts its own allow-list of keys, given in that
        endpoint's description; anything else is a 400. ORDER BY cannot be
        parameterised, so the key is looked up rather than interpolated. Every
        sort carries a tiebreak on the primary key, so paging stays disjoint
        when the sort column has duplicates.
      in: query
      name: sort
      schema:
        type: string
    order:
      description: >-
        Sort direction. Defaults to ascending, except the call log, which reads
        newest first.
      in: query
      name: order
      schema:
        enum:
          - asc
          - desc
        type: string
    q:
      description: >-
        Free-text search across the list's searchable columns (case-insensitive
        substring). % and _ in the term match themselves.
      in: query
      name: q
      schema:
        type: string
    organisationId:
      description: Narrow to one organisation. Outside your scope returns 403.
      in: query
      name: organisation_id
      schema:
        format: uuid
        type: string
    filterProvider:
      description: Filter on virtual agent provider.
      in: query
      name: provider
      schema:
        type: string
  schemas:
    VirtualAgentProfilePage:
      properties:
        items:
          items:
            $ref: '#/components/schemas/VirtualAgentProfile'
          type: array
        limit:
          type: integer
        offset:
          type: integer
        total:
          type: integer
      required:
        - items
        - total
        - limit
        - offset
      type: object
    VirtualAgentProfile:
      properties:
        agent_count:
          type: integer
        boundaries:
          description: What the agent must not do or discuss, beyond the built-in rules.
          maxLength: 2000
          type: string
        business_summary:
          description: Who the organisation is and what it offers, in a paragraph.
          maxLength: 2000
          type: string
        callback_agent_id:
          description: The person (a human agent) a callback is assigned to.
          type: string
        competitor_names:
          description: >-
            Checked in transcripts after the call. Never put in the agent's
            instructions.
          items:
            type: string
          type: array
        config:
          additionalProperties: true
          type: object
        created_at:
          format: date-time
          type: string
        display_name:
          description: >-
            What the agent calls itself, e.g. "Sarah". Distinct from name, which
            is the operator's label for the configuration — renaming a
            configuration should not rename the agent mid-shift.
          type: string
        enabled_skills:
          description: >-
            Actions the agent may use. end_call and request_callback are always
            on; transfer_to_human is added when an escalation target is set.
          items:
            type: string
          type: array
        escalate_kind:
          description: Where a transfer goes.
          enum:
            - queue
            - extension
            - ''
          type: string
        escalate_target:
          description: A queue id or an extension number of the organisation.
          type: string
        goal:
          description: What a successful call achieves, e.g. "book a demo".
          maxLength: 500
          type: string
        id:
          format: uuid
          type: string
        kb_all:
          description: >-
            The agent may use every enabled article of the organisation
            (default); false limits it to kb_article_ids.
          type: boolean
        learning_enabled:
          description: >-
            Allows unconfirmed agent memory to reach the prompt. Off by default:
            an agent that rewrites its own instructions from a single call is
            one persuasive caller away from being reprogrammed.
          type: boolean
        media_sample_rate:
          description: >-
            Rate taken from mod_audio_stream, or null to match the provider
            (8000 for OpenAI, which speaks G.711 at 8 kHz natively; 16000 for
            Gemini, which wants 16 kHz). NOT a pass-through setting: a
            virtual-agent call always transcodes, because the far end is a model
            needing linear audio rather than a second SIP leg, so the switch
            must decode whatever the handset sent. What it decides is how much
            survives - on an OPUS extension 16000 lets wideband audio reach the
            model, where 8000 discards it and the provider reconstructs a worse
            substitute.
          enum:
            - 8000
            - 16000
          nullable: true
          type: integer
        model:
          type: string
        name:
          type: string
        opening_line:
          description: >-
            Spoken deterministically before the model is connected. A model
            asked to 'start by saying X' paraphrases X, and this is the one
            sentence a business needs said identically every time — including
            any recorded-call disclosure.
          type: string
        organisation_id:
          format: uuid
          type: string
        provider:
          description: >-
            Deliberately open, not an enum: the echo stub and a realtime speech
            API differ only in what the media-stream session does with the
            audio.
          example: echo_stub
          type: string
        purpose:
          description: What the agent is for. Built into its instructions as its role.
          enum:
            - sales
            - support
            - reception
            - collections
            - bookings
            - custom
          type: string
        reply_speed:
          default: quick
          description: >-
            How long the agent waits after the caller goes quiet before
            answering. quick suits a phone call; patient suits callers reading
            out numbers.
          enum:
            - quick
            - balanced
            - patient
          type: string
        sop:
          description: The procedure the agent follows, step by step.
          maxLength: 8000
          type: string
        system_prompt:
          type: string
        tone:
          description: >-
            A small enum mapping to concrete prompt fragments, not a second
            system prompt in a field labelled tone.
          enum:
            - professional
            - friendly
            - warm
            - concise
            - formal
          type: string
        unknown_action:
          description: >-
            When the answer is not in its knowledge: offer a person (transfer,
            then a callback if that fails), or go straight to a callback.
          enum:
            - transfer
            - callback
          type: string
        voice:
          type: string
        voice_presentation:
          description: >-
            About the voice, not about a person. Selects the provider voice and
            how the agent refers to itself.
          enum:
            - feminine
            - masculine
            - neutral
          type: string
      required:
        - id
        - organisation_id
        - name
        - provider
        - config
        - agent_count
      type: object
    Error:
      properties:
        error:
          properties:
            code:
              enum:
                - invalid_request
                - invalid_credentials
                - unauthenticated
                - forbidden
                - not_found
                - conflict
                - internal
              type: string
            message:
              type: string
          required:
            - code
            - message
          type: object
      required:
        - error
      type: object
  responses:
    BadRequest:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: The request is not valid. The message names every field that is wrong.
    Unauthorized:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Missing, invalid or expired token
    Forbidden:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Outside the caller's scope, or insufficient role
  securitySchemes:
    bearerAuth:
      bearerFormat: JWT or API key
      description: >-
        Every request sends `Authorization: Bearer <token>`. The token is either
        a panel session (a JWT from /auth/login, 12 hours) or an API key
        `ft_<id>_<secret>`. An API key is accepted only from an address on its
        IP allowlist (403 ip_not_allowed otherwise; 403 ip_allowlist_required
        for an old key that has none), is limited to its rate per minute (429
        rate_limited with Retry-After; X-RateLimit-Limit/Remaining/Reset on
        every response), and at most 60 call placements a minute.
      scheme: bearer
      type: http

````