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

# Link a project to this master agent

> Link one project as a child of this master agent.

Creates a child campaign on the target project, copies the parent script, settings and post-call workflow to it, then scans the target project for the assets the shared slots need and binds each one that matches exactly one asset by name. Anything ambiguous or missing is left unbound and reported on the returned campaign, so read `masterBindingScanStatus` and the counts before telling anyone the project is ready. The parent campaign must already be a master; a plain campaign is refused. Linking the same project twice is refused.

Required API key scope: `campaigns:write`.



## OpenAPI

````yaml /openapi.yaml post /api/agent-builder/agents/{id}/campaign/master/projects
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": "..." }` on failure.


    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: 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: >-
      Build one TFU Live agent with its Brain, Voice and equipped actions;
      connect it through shared Campaigns.
  - name: Voices
    description: >-
      Browse the voice catalogue and select a voice; configure speech and
      listening behavior in Agents.
paths:
  /api/agent-builder/agents/{id}/campaign/master/projects:
    post:
      tags:
        - Master agent
      summary: Link a project to this master agent
      description: >-
        Link one project as a child of this master agent.


        Creates a child campaign on the target project, copies the parent
        script, settings and post-call workflow to it, then scans the target
        project for the assets the shared slots need and binds each one that
        matches exactly one asset by name. Anything ambiguous or missing is left
        unbound and reported on the returned campaign, so read
        `masterBindingScanStatus` and the counts before telling anyone the
        project is ready. The parent campaign must already be a master; a plain
        campaign is refused. Linking the same project twice is refused.


        Required API key scope: `campaigns:write`.
      operationId: link-master-agent-project
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
          description: Agent id.
          example: agent_8a488fcfa8fdbf8ce8ad5ccc45
        - name: locationId
          in: query
          required: false
          schema:
            type: string
            minLength: 1
          description: Pair with campaignId; omit both for primary campaign.
          example: loc_abc123
        - name: campaignId
          in: query
          required: false
          schema:
            type: string
            minLength: 1
          description: Pair with locationId; omit both for primary campaign.
          example: cmp_123
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CampaignsLinkMasterProjectRequest'
            examples:
              default:
                value:
                  targetLocationId: loc_child_456
      responses:
        '201':
          description: Child campaign created on the target project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CampaignsMasterLinkResponse'
              examples:
                default:
                  value:
                    success: true
                    campaign:
                      id: campaign_child_789
                      name: Speed to Lead
                      masterRole: child
                      masterCampaignId: campaign_speed_to_lead_123
                      masterSyncStatus: synced
                      masterBindingScanStatus: ready
                      masterBindingScanMatchedCount: 3
                      masterBindingScanMissingCount: 0
                      masterBindingScanError: null
        '400':
          description: Validation failed or the request body is malformed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: VALIDATION
                    message: locationId is required.
                    details:
                      - field: locationId
                        message: locationId is required.
        '401':
          description: Missing or invalid authentication.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: Unauthorized
                    message: Authentication required.
        '403':
          description: >-
            Authenticated but missing the required `campaigns:write` scope or
            tenant access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: FORBIDDEN
                    message: No access to agent "agent_8a488fcfa8fdbf8ce8ad5ccc45".
                insufficientScope:
                  value:
                    success: false
                    error: InsufficientScope
                    message: This API key does not have the required scope.
                    requiredScope: campaigns:write
        '404':
          description: Agent or related project not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: NOT_FOUND
                    message: Agent "agent_8a488fcfa8fdbf8ce8ad5ccc45" not found.
        '409':
          description: Request conflicts with current agent state.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: IN_USE
                    message: Agent is referenced by one or more campaigns or projects.
                    references:
                      projectsV2:
                        - businessName: Acme Roofing
                          campaigns:
                            - id: cmp_123
                              name: Roofing Follow Up
                              agentId: agent_8a488fcfa8fdbf8ce8ad5ccc45
                      masterDb: []
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: TooManyRequests
                    message: Too many requests, please try again later.
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentsErrorResponse'
              examples:
                default:
                  value:
                    success: false
                    error: InternalError
                    message: Unexpected server error.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: bash
          label: cURL
          source: |-
            curl --request POST \
              --url https://api.teamfollowup.ai/api/agent-builder/agents/{id}/campaign/master/projects \
              --header 'Authorization: Bearer YOUR_API_KEY' \
              --header 'Content-Type: application/json' \
              --data '{
              "targetLocationId": "loc_child_456"
            }'
components:
  schemas:
    CampaignsLinkMasterProjectRequest:
      type: object
      additionalProperties: {}
      required:
        - targetLocationId
      properties:
        targetLocationId:
          type: string
          example: loc_child_456
    CampaignsMasterLinkResponse:
      type: object
      additionalProperties: false
      required:
        - success
        - campaign
      properties:
        success:
          type: boolean
        campaign:
          type: object
          additionalProperties: {}
          description: >-
            The child campaign as stored on the target project, including its
            master sync and binding-scan fields.
          required:
            - id
            - masterRole
            - masterCampaignId
          properties:
            id:
              type: string
              example: campaign_child_789
            name:
              type:
                - string
                - 'null'
              example: Speed to Lead
            masterRole:
              type: string
              enum:
                - child
              example: child
            masterCampaignId:
              type: string
              example: campaign_speed_to_lead_123
            masterSyncStatus:
              type: string
              example: synced
            masterBindingScanStatus:
              type: string
              enum:
                - pending
                - ready
                - needs_attention
                - failed
              example: ready
            masterBindingScanMatchedCount:
              type: integer
              example: 3
            masterBindingScanMissingCount:
              type: integer
              example: 0
            masterBindingScanError:
              type:
                - string
                - 'null'
              example: null
    AgentsErrorResponse:
      type: object
      additionalProperties: {}
      required:
        - success
        - error
        - message
      properties:
        success:
          type: boolean
        error:
          type: string
          description: Machine-readable error code.
          example: VALIDATION
        message:
          type: string
          description: Human-readable explanation safe to show to an operator.
          example: locationId is required.
        references:
          type: object
          additionalProperties: {}
          description: Structured conflict details. Present on delete conflicts.
        details:
          type: array
          description: Field-level validation details when available.
          items:
            type: object
            additionalProperties: false
            required:
              - field
              - message
            properties:
              field:
                type:
                  - string
                  - 'null'
                example: locationId
              message:
                type: string
                example: locationId is required.
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: 'Send your API key as `Authorization: Bearer YOUR_API_KEY`.'

````