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

> ## Agent Instructions
> Use the public API base URL: https://api.teamfollowup.ai/api.
> Authenticate public API requests with Authorization: Bearer YOUR_API_KEY.
> Use product-owned terms: agents, campaigns, projects (GoHighLevel sub-accounts), contacts, calls, outcomes, skills, cadences, phone numbers.
> Scope requests by locationId rather than projectName.
> Read the guide linked from each API reference group before recommending an endpoint.

# Preview TFU Live agent move

> Reads what moving this TFU Live agent to toLocationId would do, before you move it. It writes nothing and alerts no one. The plan has the same parts as `GET /api/tfu-live-agents/{id}/clone/plan`. live is true when the agent is live now: its new campaign takes test calls until it goes live there. Send your answers and the fingerprint, as ifPlan, to `POST /api/tfu-live-agents/{id}/move`. An input you leave out takes its default. An API key or OAuth client cannot answer create_field.

Required scope: `agents:write`.

Required API key scope: `agents:write`.



## OpenAPI

````yaml /openapi.yaml get /api/tfu-live-agents/{id}/move/plan
openapi: 3.1.0
info:
  title: TFUAI Server API
  version: 1.0.0
  description: >-
    API reference for the TFUAI SaaS server.


    All published endpoints are mounted under `/api`. Responses use a standard
    envelope: `{ "success": true, ... }` on success and `{ "success": false,
    "error": "<code>", "message": "..." }` on failure. Branch on the `error`
    code; `message` is for people and its wording can change.


    Product API modules are being launched module by module. This spec currently
    exposes only contracted public modules.


    Authenticate public API requests with an API key in the `Authorization`
    header: `Authorization: Bearer YOUR_API_KEY`.
servers:
  - url: https://api.teamfollowup.ai
    description: Production API origin. Public API paths are under /api.
security: []
tags:
  - name: Agents
    description: >-
      Build the conversation: identity and settings, script, lead context and
      split testing.
  - name: Analytics
    description: >-
      Understand call volume, pickup, booking and transfer metrics within the
      selected reporting scope.
  - name: Billing
    description: >-
      Balances, spend, purchases and sub-account rebilling. Reference and guides
      only; the builder chatbot has no billing playbook.
  - name: Caller ID
    description: >-
      Register the businesses behind your calling numbers with Twilio, so
      carriers know who is calling and label the calls less often as spam. Read
      where every number stands, then register one business per call, naming the
      person who confirmed its details.
  - name: Calls
    description: >-
      Review completed calls, recordings, transcripts and campaign run history;
      distinguish observation from placing a new call.
  - name: Campaigns
    description: >-
      Configure what starts calls, who is eligible, calling windows, caller IDs,
      activation and the actions that follow each outcome.


      What runs after a call lands: for each outcome (booked, opted out, asked
      for a callback…), an ordered chain of actions — tag the contact, move a
      pipeline stage, send an SMS, book an appointment. Stored as a graph:
      `nodes` are the actions, `edges` say what follows what, and
      `dispositionEntries` maps each outcome to the node its chain starts at.


      **Pick the narrowest endpoint that does the job.**


      | To | Call | |

      | --- | --- | --- |

      | See what fires per outcome | `GET .../workflow?view=summary` | Reads as
      plain text, no graph walking |

      | Add steps to an outcome | `POST .../outcomes/{outcome}/nodes` | Server
      derives node ids, edge ids, handles, layout |

      | Change a message, tag or setting | `PATCH .../workflow` | Merges;
      carries no graph, so it cannot damage one |

      | Remove one step | `DELETE .../nodes/{nodeId}` | Also re-links the chain
      around it |

      | Author or replace the whole graph | `PUT .../workflow` | Replaces
      everything you send |


      `PUT` is the only one that can re-wire, position nodes, build an `if`,
      save an unconfigured draft, or copy a whole workflow — and the only one
      that can overwrite a change someone else made after you read it. Use it
      when you are genuinely authoring the graph, and send `expectedVersion`
      when you do. For everything else the narrower endpoints are both easier
      and safer.
  - name: Contacts
    description: >-
      Find contacts and their calls, manage do-not-call status and identify
      internal contacts excluded from reporting.
  - name: In-call Capabilities
    description: >-
      Configure actions and instructions the agent uses during a live call:
      booking, transfers, lookups and custom skills.
  - name: Master agent
    description: >-
      Run a shared agent and campaign across linked projects; manage
      inheritance, local bindings, synchronization and rollout readiness.
  - name: Native Calendar
    description: >-
      The diary of a sub-account with no CRM: its bookable calendars, the free
      slots they offer, and the appointments on them. Availability is computed
      per request against live bookings and is never cached, because a cached
      slot is one somebody else has already taken.
  - name: Native Contacts
    description: >-
      The people a sub-account with no CRM calls, and the fields it keeps on
      them. This is the system of record for those contacts: there is nowhere
      else they exist. A sub-account with a CRM keeps its contacts there and
      every operation here answers 400 for it.
  - name: Phone Numbers
    description: >-
      Find and manage caller IDs, assign numbers to campaigns and understand
      connected Twilio numbers.
  - name: Projects
    description: >-
      Understand project ownership, inspect configuration and validate the local
      resources used by a campaign.
  - name: TFU Live
    description: >-
      Configure instructions, conversation style, workflows, Chat and call
      handling, then test and go live.
  - name: Voices
    description: >-
      Browse the voice catalogue and select a voice; configure speech and
      listening behavior in Agents.
paths:
  /api/tfu-live-agents/{id}/move/plan:
    get:
      tags:
        - TFU Live
      summary: Preview TFU Live agent move
      description: >-
        Reads what moving this TFU Live agent to toLocationId would do, before
        you move it. It writes nothing and alerts no one. The plan has the same
        parts as `GET /api/tfu-live-agents/{id}/clone/plan`. live is true when
        the agent is live now: its new campaign takes test calls until it goes
        live there. Send your answers and the fingerprint, as ifPlan, to `POST
        /api/tfu-live-agents/{id}/move`. An input you leave out takes its
        default. An API key or OAuth client cannot answer create_field.


        Required scope: `agents:write`.


        Required API key scope: `agents:write`.
      operationId: get-tfu-live-agents-by-id-move-plan
      parameters:
        - name: locationId
          in: query
          required: true
          schema:
            type: string
          description: >-
            The sub-account. It must belong to the agency, and be the
            credential’s own sub-account when the credential is limited to one.
        - name: id
          in: path
          required: true
          schema:
            type: string
          description: >-
            The TFU Live agent id, with its tfu_live: prefix, as `GET
            /api/tfu-live-agents` returns it. Other agent ids are refused.
        - name: toLocationId
          in: query
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 200
          description: The sub-account to copy or move the agent to.
      responses:
        '200':
          description: The plan, worded for the reader. Nothing was written.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLivePlanResponse'
              example:
                success: true
                data:
                  mode: move
                  fromLocationId: loc_source
                  toLocationId: loc_target
                  live: true
                  inputs:
                    - id: calendar:cal_a1
                      kind: calendar
                      original:
                        id: cal_a1
                        name: Consultations
                      uses:
                        - list: workflow
                          workflowId: wf_book0001
                          workflowName: Book appointment
                          stepId: slots
                          node: find_slots
                          field: calendarId
                        - list: campaign
                          path: config.calendarId
                      options:
                        - id: cal_b1
                          name: consultations
                        - id: cal_b2
                          name: Support
                      suggested: cal_b1
                      choices:
                        - later
                        - remove
                      default: cal_b1
                      required: false
                    - id: field:contact.custom.a_roof
                      kind: field
                      original:
                        id: contact.custom.a_roof
                        name: Roof age
                      uses:
                        - list: workflow
                          workflowId: wf_book0001
                          workflowName: Book appointment
                          stepId: check
                          node: condition
                          field: cases[c1].field
                      options:
                        - id: contact.custom.b_type
                          name: Roof type
                      suggested: null
                      createField:
                        name: Roof age
                        type: text
                      choices:
                        - create_field
                      default: null
                      required: true
                    - id: caller_id:+14155550123
                      kind: caller_id
                      original:
                        id: '+14155550123'
                      uses:
                        - list: campaign
                          path: fromNumbers[0]
                      options: []
                      suggested: null
                      choices:
                        - carry
                        - leave
                      default: carry
                      required: false
                  carried:
                    - kind: agent
                      code: same_agent
                      params: {}
                      message: It stays the same agent.
                    - kind: campaign
                      code: calling_hours_and_direction
                      params: {}
                      message: The calling hours and call direction come across.
                  removed: []
                  wontMove:
                    - code: stays_on_original
                      params:
                        what: calls
                        count: 14
                      message: 14 calls stay on the old sub-account.
                    - code: revisions_not_restorable
                      params: {}
                      message: >-
                        Earlier versions stay, but you can no longer restore
                        them.
                  leftToSetUp:
                    - code: start
                      params:
                        kinds:
                          - contact_created
                      message: >-
                        Pick how calls start on the new sub-account. On the old
                        sub-account, calls started on a new contact.
                  fingerprint: >-
                    6eddd770a8e44114d62d8b3fbe31dd66a2f74bf12651acf651f13f51428cc67f
        '400':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              example:
                success: false
                error: invalid_request
                message: Some details are missing. Please fill them in and try again.
                code: invalid_request
        '401':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              example:
                success: false
                error: Unauthorized
                message: Please sign in to continue.
        '403':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              examples:
                scope:
                  summary: The key lacks agents:write
                  value:
                    success: false
                    error: InsufficientScope
                    message: >-
                      This access key does not allow this action. Please ask
                      your account admin to change its permissions.
                    requiredScope: agents:write
        '404':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              example:
                success: false
                error: not_found
                message: >-
                  We couldn't find that agent. Please refresh and choose
                  another.
                code: not_found
        '409':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              examples:
                inProgress:
                  summary: Another move or copy of the agent is running
                  value:
                    success: false
                    error: TFU_LIVE_OPERATION_IN_PROGRESS
                    message: >-
                      Another move or copy of this agent is still running. Try
                      again once it finishes.
                    code: TFU_LIVE_OPERATION_IN_PROGRESS
                masterParent:
                  summary: The agent is a master agent
                  value:
                    success: false
                    error: TFU_LIVE_MASTER_PARENT_REFUSED
                    message: >-
                      This is a master agent, so it cannot be moved or copied
                      yet.
                    code: TFU_LIVE_MASTER_PARENT_REFUSED
                masterChild:
                  summary: The agent runs under a master agent
                  value:
                    success: false
                    error: TFU_LIVE_MASTER_CHILD_REFUSED
                    message: >-
                      This agent runs under a master agent, so it cannot be
                      moved or copied yet.
                    code: TFU_LIVE_MASTER_CHILD_REFUSED
        '422':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              examples:
                crmUnsupported:
                  summary: A sub-account runs another CRM
                  value:
                    success: false
                    error: TFU_LIVE_MOVE_CRM_UNSUPPORTED
                    message: >-
                      An agent moves only between GoHighLevel and TFU AI CRM
                      sub-accounts. One of these uses another CRM.
                    code: TFU_LIVE_MOVE_CRM_UNSUPPORTED
        '429':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              example:
                success: false
                error: TooManyRequests
                message: That's a lot at once. Please wait a moment and try again.
        '502':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              example:
                success: false
                error: provider_unavailable
                message: This isn't available right now. Please try again in a moment.
                code: provider_unavailable
                ref: 3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b
        '503':
          description: >-
            TFU Live refused the request: { success: false, error, message,
            code, workflowId?, stepId?, field?, setupItems? }. Branch on error
            (code holds the same value), show message to people, and read the
            current agent before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TfuLiveError'
              examples:
                unreadable:
                  summary: A list of the new sub-account could not be read
                  value:
                    success: false
                    error: TFU_LIVE_MOVE_RESOURCES_UNAVAILABLE
                    message: >-
                      The new sub-account's calendars could not be read just
                      now. Try again.
                    code: TFU_LIVE_MOVE_RESOURCES_UNAVAILABLE
                    kinds:
                      - calendar
                    ref: 3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |-
            curl --request GET \
              --url https://api.teamfollowup.ai/api/tfu-live-agents/{id}/move/plan \
              --header 'Authorization: Bearer YOUR_API_KEY'
components:
  schemas:
    TfuLivePlanResponse:
      type: object
      required:
        - success
        - data
      properties:
        success:
          const: true
        data:
          type: object
          additionalProperties: {}
          required:
            - mode
            - fromLocationId
            - toLocationId
            - inputs
            - carried
            - removed
            - wontMove
            - leftToSetUp
            - fingerprint
          description: What the copy or the move would do. Nothing was written.
          properties:
            mode:
              type: string
              enum:
                - copy
                - move
            fromLocationId:
              type: string
            toLocationId:
              type: string
            live:
              const: true
              description: >-
                Only on a move of an agent that is live now. Its new campaign
                takes test calls until it goes live on the new sub-account.
            inputs:
              type: array
              items:
                type: object
                required:
                  - id
                  - kind
                  - original
                  - uses
                  - options
                  - suggested
                  - choices
                  - default
                  - required
                additionalProperties: {}
                properties:
                  id:
                    type: string
                    description: The question’s id. Answer it under this key in answers.
                  kind:
                    type: string
                    description: >-
                      What it asks for: calendar, field, tag, qualified_tag,
                      stage, template, sender, texting_number, transfer, notify,
                      slack, caller_id (a move’s number), knowledge (the
                      business details), cadence_default or brain_name.
                  original:
                    type: object
                    additionalProperties: {}
                    description: >-
                      What the agent uses now: its id and, when it could be
                      read, its name.
                  uses:
                    type: array
                    items:
                      type: object
                      additionalProperties: {}
                    description: >-
                      Every place the agent uses it. list is workflow,
                      after_call, end_call, campaign, cadence or script.
                  options:
                    type: array
                    items:
                      type: object
                      required:
                        - id
                        - name
                      additionalProperties: {}
                      properties:
                        id:
                          type: string
                        name:
                          type: string
                    description: >-
                      What the new sub-account has. Send an option’s id to pick
                      it.
                  suggested:
                    type:
                      - string
                      - 'null'
                    description: >-
                      The one option with the same name, when there is exactly
                      one. Two of the same name are never suggested. A transfer
                      or notify input is never suggested.
                  choices:
                    type: array
                    items:
                      type: string
                    description: >-
                      What you may send besides an option id: later, remove,
                      keep, copy_text, create_field, carry, leave, use_default,
                      fill, replace or use_target. Only the ones listed here are
                      taken.
                  default:
                    type:
                      - string
                      - 'null'
                    description: >-
                      What the question takes when you do not answer it. Null:
                      it must be answered.
                  required:
                    type: boolean
                    description: >-
                      True: there is no default, so the apply refuses until it
                      is answered.
                  createField:
                    type: object
                    additionalProperties: {}
                    description: >-
                      With create_field: the field a signed-in person can have
                      made on a GoHighLevel sub-account. An API key or OAuth
                      client cannot.
                    properties:
                      name:
                        type: string
                      type:
                        type: string
                  useTarget:
                    type: object
                    additionalProperties: {}
                    description: >-
                      With use_target: the new sub-account’s business name,
                      given to the Brain in place of the old one.
                    properties:
                      name:
                        type: string
              description: >-
                The questions, each with the new sub-account’s options, a
                suggested match and a default.
            carried:
              type: array
              items:
                type: object
                required:
                  - code
                  - params
                  - message
                additionalProperties: {}
                properties:
                  code:
                    type: string
                    description: >-
                      What it is, a stable code to branch on, such as
                      stays_on_original or step_not_supported. New codes can
                      appear.
                  params:
                    type: object
                    additionalProperties: {}
                    description: >-
                      What the sentence names, such as a tag, a number or a
                      count.
                  kind:
                    type: string
                    description: >-
                      On carried items: what comes across, such as orb, campaign
                      or stop_tag.
                  where:
                    type: object
                    additionalProperties: {}
                    description: >-
                      On removed items: where it was. list is workflow,
                      after_call, end_call, campaign or cadence.
                  message:
                    type: string
                    description: >-
                      The item in words, in the reader’s language. An API key or
                      OAuth client gets English.
              description: What comes across.
            removed:
              type: array
              items:
                type: object
                required:
                  - code
                  - params
                  - message
                additionalProperties: {}
                properties:
                  code:
                    type: string
                    description: >-
                      What it is, a stable code to branch on, such as
                      stays_on_original or step_not_supported. New codes can
                      appear.
                  params:
                    type: object
                    additionalProperties: {}
                    description: >-
                      What the sentence names, such as a tag, a number or a
                      count.
                  kind:
                    type: string
                    description: >-
                      On carried items: what comes across, such as orb, campaign
                      or stop_tag.
                  where:
                    type: object
                    additionalProperties: {}
                    description: >-
                      On removed items: where it was. list is workflow,
                      after_call, end_call, campaign or cadence.
                  message:
                    type: string
                    description: >-
                      The item in words, in the reader’s language. An API key or
                      OAuth client gets English.
              description: >-
                What is removed with no question, such as a step the new
                sub-account’s CRM cannot run.
            wontMove:
              type: array
              items:
                type: object
                required:
                  - code
                  - params
                  - message
                additionalProperties: {}
                properties:
                  code:
                    type: string
                    description: >-
                      What it is, a stable code to branch on, such as
                      stays_on_original or step_not_supported. New codes can
                      appear.
                  params:
                    type: object
                    additionalProperties: {}
                    description: >-
                      What the sentence names, such as a tag, a number or a
                      count.
                  kind:
                    type: string
                    description: >-
                      On carried items: what comes across, such as orb, campaign
                      or stop_tag.
                  where:
                    type: object
                    additionalProperties: {}
                    description: >-
                      On removed items: where it was. list is workflow,
                      after_call, end_call, campaign or cadence.
                  message:
                    type: string
                    description: >-
                      The item in words, in the reader’s language. An API key or
                      OAuth client gets English.
              description: >-
                What will not come across, such as calls that stay on the old
                sub-account or a merge field inside a message.
            leftToSetUp:
              type: array
              items:
                type: object
                required:
                  - code
                  - params
                  - message
                additionalProperties: {}
                properties:
                  code:
                    type: string
                    description: >-
                      What it is, a stable code to branch on, such as
                      stays_on_original or step_not_supported. New codes can
                      appear.
                  params:
                    type: object
                    additionalProperties: {}
                    description: >-
                      What the sentence names, such as a tag, a number or a
                      count.
                  kind:
                    type: string
                    description: >-
                      On carried items: what comes across, such as orb, campaign
                      or stop_tag.
                  where:
                    type: object
                    additionalProperties: {}
                    description: >-
                      On removed items: where it was. list is workflow,
                      after_call, end_call, campaign or cadence.
                  message:
                    type: string
                    description: >-
                      The item in words, in the reader’s language. An API key or
                      OAuth client gets English.
              description: What is left blank. Go-live asks for each one.
            fingerprint:
              type: string
              description: Send it back as ifPlan.
      additionalProperties: false
    TfuLiveError:
      type: object
      description: >-
        A TFU Live refusal: the standard error envelope, plus where a workflow
        refusal points and what setup still needs.
      required:
        - success
        - error
        - message
      properties:
        success:
          type: boolean
          example: false
        error:
          type: string
          description: >-
            The refusal’s code, the same value as code. A shared gate
            (authentication, scope, rate limit) answers with its own code, such
            as Unauthorized, InsufficientScope or TooManyRequests, and sends no
            code.
        message:
          type: string
          description: >-
            One plain sentence for a person: what happened and what to do next.
            Show it, never parse it: the wording can change, and browser users
            get it in their own language. API keys and OAuth apps always get
            English.
          example: We couldn't find that. It may have been moved or deleted.
        errors:
          type: array
          description: >-
            Sent when specific fields were refused: one entry for each field to
            fix.
          items:
            type: object
            additionalProperties: false
            required:
              - field
              - code
              - message
            properties:
              field:
                type: string
                description: Where the value sits in the request, as a dotted path.
                example: name
              code:
                type: string
                description: A stable code for what is wrong with the value.
                example: FieldRequired
              message:
                type: string
                description: One plain sentence for a person.
                example: Please fill this in.
        details:
          type: object
          additionalProperties: {}
          description: >-
            Data your code may need to act on the failure, such as ids or
            limits. Never text for people.
        ref:
          type: string
          description: >-
            Sent only when the failure was on our side. Quote it to support so
            they can find the request. It matches the `x-request-id` response
            header.
          example: 3f2b8c1e-7d4a-4f8e-9b6a-2c1d0e5f7a9b
        code:
          type: string
          enum:
            - invalid_workflow
            - setup_incomplete
            - workflow_resource_not_found
            - workflow_resource_unavailable
            - workflow_secret_refused
            - invalid_agent
            - invalid_request
            - unauthorized
            - insufficient_balance
            - forbidden
            - not_found
            - conflict
            - too_large
            - provider_unavailable
            - internal_error
            - AGENT_OPERATION_UNSUPPORTED
            - TFU_LIVE_CAMPAIGN_PENDING
            - TFU_LIVE_CAMPAIGN_REFUSED
            - TFU_LIVE_ALREADY_ON_GOHIGHLEVEL
            - TFU_LIVE_CONNECTION_NOT_CONFIGURED
            - TFU_LIVE_GO_LIVE_BLOCKED
            - TFU_LIVE_CALLS_SCHEDULED
            - TFU_LIVE_PLAN_CHANGED
            - TFU_LIVE_PLAN_ANSWER_INVALID
            - TFU_LIVE_PLAN_ANSWER_REQUIRED
            - TFU_LIVE_CLONE_RESOURCES_UNAVAILABLE
            - TFU_LIVE_MOVE_RESOURCES_UNAVAILABLE
            - TFU_LIVE_OPERATION_IN_PROGRESS
            - TFU_LIVE_MASTER_PARENT_REFUSED
            - TFU_LIVE_MASTER_CHILD_REFUSED
            - TFU_LIVE_CLONE_UNSUPPORTED
            - TFU_LIVE_MOVE_CHANGED
            - TFU_LIVE_MOVE_CRM_UNSUPPORTED
            - TFU_LIVE_MOVE_DEFINITION_INVALID
            - TFU_LIVE_MOVE_CHANGES_TOO_MUCH
            - TFU_LIVE_MOVE_BRAIN_SYNC_PENDING
          description: >-
            The same code as error, kept for integrations built before error
            carried it. The kind of refusal: invalid_workflow (a workflow’s
            structure or a node’s settings, including a workflow whose calendars
            are on more than one system), setup_incomplete (a setting still to
            fill or a Brain template placeholder still in the prompt, where the
            agent must be complete: preparing it, or a save that sets it up;
            setupItems lists every one), workflow_resource_not_found (a
            calendar, custom field, pipeline stage, team or rep the sub-account
            lacks, or an inactive calendar), workflow_resource_unavailable (503:
            the sub-account’s resources could not be read; retry),
            workflow_secret_refused (a secret header rule), invalid_agent (any
            other part of the agent), else by status. TFU_LIVE_* names a product
            state.
        workflowId:
          type: string
          description: >-
            The workflow a workflow refusal is about. Absent on a workflow being
            created, which has no id yet.
        stepId:
          type: string
          description: The step inside it.
        field:
          type: string
          description: >-
            The setting inside the step: calendarId, routing[1].calendarId,
            items[0].field, destination.teamId, headers.Authorization;
            brain.prompt for a placeholder. On a create from a Brain template,
            the request value: values.<to-fill id>, values or brainTemplateId.
        setupItems:
          type: array
          items:
            type: object
            required:
              - kind
              - message
            additionalProperties: false
            description: >-
              Something the agent still needs before it can be prepared for real
              calls.
            properties:
              kind:
                type: string
                enum:
                  - workflow_setting
                  - prompt_placeholder
                description: >-
                  workflow_setting: a setting still to fill (a calendar, a tag,
                  who takes a transfer, zip codes, a choice’s answers, an item’s
                  label); prompt_placeholder: a Brain template [bracketed]
                  placeholder still in the prompt (legacy: templates no longer
                  hold any).
              workflowId:
                type: string
              workflowName:
                type: string
              stepId:
                type: string
              node:
                type: string
                description: The node type.
              field:
                type: string
                description: >-
                  The setting inside the step (calendarId, destination,
                  items[0].choices), or brain.prompt.
              placeholder:
                type: string
              message:
                type: string
                description: What to do about it, for a person.
          description: >-
            On setup_incomplete: everything the agent still needs, the first of
            which the refusal names.
        blockers:
          type: array
          items:
            type: object
            required:
              - code
              - who
              - message
            additionalProperties: false
            description: One thing that stops the agent’s campaign from taking real calls.
            properties:
              code:
                type: string
                description: >-
                  What it is, such as no_caller_id, no_trigger_tag,
                  not_prepared, calling_line_not_ready, needs_gohighlevel or
                  card_required.
              who:
                type: string
                enum:
                  - rep
                  - operator
                  - staff
                description: >-
                  Who clears it. rep: a setting of the agent’s own (its number,
                  its trigger, its setup). operator: the person (approve
                  GoHighLevel, add a card, upgrade the plan). staff: Team Follow
                  Up.
              message:
                type: string
                description: >-
                  What to do about it. An API key or OAuth client gets the
                  go-live check’s own words.
              page:
                type: string
                description: >-
                  Where a person does it in the dashboard, when there is a page
                  for it.
              place:
                type: object
                additionalProperties: false
                required:
                  - workflowId
                  - stepId
                description: The workflow step it is about, when it is about one.
                properties:
                  workflowId:
                    type: string
                  stepId:
                    type: string
          description: >-
            On TFU_LIVE_GO_LIVE_BLOCKED: everything standing between the agent’s
            campaign and real calls, as `GET
            /api/tfu-live-agents/{id}/go-live-check` lists it. The campaign
            stayed paused.
        scheduledCalls:
          type: integer
          minimum: 1
          description: >-
            On TFU_LIVE_CALLS_SCHEDULED (409): how many leads of the agent’s
            live campaign have a call still to come (a cadence call, an AI
            callback, a promised callback). An agent with calls off makes none
            of them. Nothing was saved; send the same edit with
            confirmScheduledCallsLost: true to turn calls off anyway.
        inputs:
          type: array
          items:
            type: string
          description: >-
            On TFU_LIVE_PLAN_ANSWER_INVALID and TFU_LIVE_PLAN_ANSWER_REQUIRED
            (422): the ids of the plan’s inputs whose answer is wrong or
            missing. It can be empty when the answers fail together, such as
            answers that leave a cadence with no steps.
        kinds:
          type: array
          items:
            type: string
          description: >-
            On TFU_LIVE_CLONE_RESOURCES_UNAVAILABLE and
            TFU_LIVE_MOVE_RESOURCES_UNAVAILABLE (503): the new sub-account’s
            lists that could not be read, such as calendar, field or tag. Absent
            when the cadences could not be read. Nothing was written. Try again.
      additionalProperties: {}
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: 'Send your API key as `Authorization: Bearer YOUR_API_KEY`.'

````

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