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

# Set up a TFU Live rep's campaign

> Set a TFU Live rep's start and stop tags, calling hours, its cadence of calls and texts, and the number its texts come from, by API.

A TFU Live rep's campaign is a campaign like any other. Read and change it with the
same [Get campaign](/api-reference/campaigns/get-campaign) and
[Update campaign](/api-reference/campaigns/update-campaign) every agent uses, with the
rep's `tfu_live:` id and `locationId`, its sub-account. Add `campaignId` only when
several campaigns use the rep; without it, the rep's first campaign is used, the one
[Check TFU Live go-live readiness](/api-reference/tfu-live/check-tfu-live-go-live-readiness)
reads. Reading needs `campaigns:read` and `agents:read`; changing needs
`campaigns:write` and `agents:write`.

Send only what you want to change. Each part goes through the same checks as in the
dashboard:

| Setting | Request field |
| - | - |
| Tags that start the rep's calls, and tags that stop them | `trigger: { type: "outbound", activeTags, inactiveTags }` |
| Calling hours | `calling.window`, with `useWindowTimezone`, `multipleTimezoneCheck` and `dropOutsideWindow` |
| Calling straight away, and the follow-up | `calling.speedToLead` and `calling.powerDialer`, with the double dial switches |
| The sequence of calls and texts | `calling.cadence.steps`, each step one `call`, `sms`, `email`, `add-tag` or `move-stage` |
| The number texts come from | `smsFromNumber`, in international format; an empty string or `null` clears it |

Start tags also give the rep a tag start when it has none, as ticking **Tag added**
does in the builder. A rep made to answer calls then starts calls on those tags too,
and keeps answering its numbers; give it start tags before its cadence.

## A text, a call, then a text

```json theme={"dark"}
{
  "trigger": { "type": "outbound", "activeTags": ["new_lead"], "inactiveTags": ["booked", "do_not_contact"] },
  "smsFromNumber": "+14155550123",
  "calling": {
    "window": [{ "days": [1, 2, 3, 4, 5], "start": "09:00", "end": "18:00" }],
    "speedToLead": false,
    "powerDialer": true,
    "cadence": { "steps": [
      { "kind": "sms", "offsetMinutes": 1, "body": "Hi {{first_name}}, thanks for getting in touch. We will call you in a couple of minutes." },
      { "kind": "call", "offsetMinutes": 2 },
      { "kind": "sms", "offsetMinutes": 1, "body": "Sorry we missed you, {{first_name}}. When is a good time to call back?" }
    ] }
  }
}
```

Each wait is measured from the step before it, and the first from when the lead
starts; the shortest wait is one minute. The moment a lead starts, the only touch is
speed to lead, which is a call, so a campaign that texts first turns speed to lead off
and starts its cadence with a text. A text after a call is sent whether or not the
call was answered, unless that call ended the follow-up: a stop tag was added, the
lead was put through to your team, or they asked not to be contacted.

## What the rep sets itself

Some settings belong to the rep, not its campaign. Sending one that would change is
refused with `422 TFU_LIVE_CAMPAIGN_SETTING_ELSEWHERE`, nothing is changed, and
`details.use` names the operation to use instead:

| Field | Use instead |
| - | - |
| `capabilities`, `tools`, `outcomes` | The rep's [workflows](/tfu-live/workflows-contract) |
| `fromNumbers` | [Give the rep a phone number](/tfu-live/numbers), which also puts it on the rep's calling line |
| `active` | [Go live or pause](/tfu-live/go-live), which checks the rep is ready first |
| `masterCampaignEnabled` | [Master families](/tfu-live/master-families) |
| `testing` | The rep's test links |
| `agentId` | Nothing: a campaign stays with its rep |

A value sent back exactly as Get campaign gives it changes nothing and is not refused.
A TFU Live rep's campaign reads `agentId` as the rep's `tfu_live:` id, and its
`capabilities` and `tools` are empty, since its abilities are its workflows.


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