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

# Get one IVR flow with its graph

> Returns the flow's metadata plus one revision's nodes and edges, as one document: a canvas that renders nodes before the edges arrive draws a wrong picture for a frame.



## OpenAPI

````yaml /api-reference/openapi-public.json get /ivr-flows/{id}
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
  - name: IVR
  - 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:
  /ivr-flows/{id}:
    get:
      tags:
        - IVR
      summary: Get one IVR flow with its graph
      description: >-
        Returns the flow's metadata plus one revision's nodes and edges, as one
        document: a canvas that renders nodes before the edges arrive draws a
        wrong picture for a frame.
      operationId: getIvrFlowsId
      parameters:
        - in: path
          name: id
          required: true
          schema:
            format: uuid
            type: string
        - $ref: '#/components/parameters/flowRevision'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IVRFlowGraph'
          description: OK
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  parameters:
    flowRevision:
      description: >-
        Which revision of the graph to return: `draft` (the default),
        `published`, or a revision number. Only the published revision is ever
        executed, so `draft` is what the designer edits and `published` is what
        answers calls.
      in: query
      name: revision
      schema:
        default: draft
        type: string
  schemas:
    IVRFlowGraph:
      allOf:
        - $ref: '#/components/schemas/IVRFlow'
        - properties:
            edges:
              items:
                $ref: '#/components/schemas/FlowEdge'
              type: array
            nodes:
              items:
                $ref: '#/components/schemas/FlowNode'
              type: array
            revision:
              description: The revision these nodes and edges belong to.
              type: integer
          required:
            - revision
            - nodes
            - edges
          type: object
    IVRFlow:
      description: >-
        A call flow as a graph. `published_revision` is the revision answering
        calls; a flow with none takes no traffic. `draft_revision` is what the
        designer edits.
      properties:
        campaign_kind:
          description: >-
            Which campaign kind an outbound flow was drawn for. Null means it
            suits both, and is the only valid value on an inbound flow.
          enum:
            - voice_broadcast
            - auto_dial
          nullable: true
          type: string
        created_at:
          format: date-time
          type: string
        description:
          nullable: true
          type: string
        direction:
          description: >-
            Which way the call is going when this graph runs. An inbound flow
            answers a number; an outbound one runs after a campaign's contact
            picks up. A campaign will not accept an inbound flow.
          enum:
            - inbound
            - outbound
          type: string
        draft_revision:
          type: integer
        id:
          format: uuid
          type: string
        name:
          type: string
        organisation_id:
          format: uuid
          type: string
        published_revision:
          description: >-
            The revision currently answering calls. Null means the flow has
            never been published and must not receive traffic.
          nullable: true
          type: integer
        team_id:
          format: uuid
          nullable: true
          type: string
        test_caller:
          description: >-
            Who a test call tells the flow is calling, E.164 (read in the
            organisation's region when typed without +). Null for the tester's
            own extension.
          type: string
        test_number:
          description: >-
            3-8 digits any extension of the organisation dials to walk through
            this flow as a test. Never reachable from outside. Refused if it is
            an extension, a park slot (701-799) or another flow's test number.
            Null to remove.
          type: string
        test_revision:
          description: Which version a test call runs. Default draft.
          enum:
            - draft
            - published
          type: string
        updated_at:
          format: date-time
          type: string
      required:
        - id
        - organisation_id
        - name
        - direction
        - draft_revision
        - created_at
        - updated_at
      type: object
    FlowEdge:
      properties:
        from:
          format: uuid
          type: string
        outlet:
          description: >-
            Which outlet of the source node this edge leaves by: a digit for a
            menu, `timeout` after the retries run out, `match`/`nomatch` for a
            time condition, `next` for a linear node. A menu's valid digits ARE
            its wired digit outlets; there is no separate list of valid keys.
          type: string
        to:
          format: uuid
          type: string
      required:
        - from
        - to
        - outlet
      type: object
    FlowNode:
      properties:
        config:
          additionalProperties: true
          description: >-
            Per-kind settings. The runtime reads: prompt, prompt_asset_id,
            greeting_prompt, greeting_asset_id, invalid_prompt,
            invalid_asset_id, digit_timeout_ms, max_retries, target_id,
            target_value, cause, timezone, days_of_week, start_time, end_time.
          type: object
        id:
          format: uuid
          type: string
        kind:
          description: >-
            Every kind runs. Outlets: menu/collect one per digit plus timeout
            (collect with save_as: next, timeout); time_condition and branch
            match/nomatch; voicemail left/none; http_request and app_action
            ok/error; send_email and send_sms sent/error (send_email config: to,
            template or subject and body; send_sms: to (default the caller),
            template or body, sender_id; once per call; the call's variables
            fill {{placeholders}}; at most 5 recipients and 200 flow emails an
            hour per organisation); others next.
          enum:
            - entry
            - play
            - menu
            - collect
            - route_extension
            - route_queue
            - route_external
            - virtual_agent
            - time_condition
            - branch
            - voicemail
            - hangup
            - hold
            - app_action
            - http_request
            - send_email
            - send_sms
          type: string
        label:
          type: string
        x:
          type: integer
        'y':
          type: integer
      required:
        - id
        - kind
        - label
        - config
        - x
        - 'y'
      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
    NotFound:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
      description: Not found, or not visible to the caller
  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

````

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