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

# Agencies, projects and sub-accounts

> A project is one GoHighLevel sub-account connected to Team Follow Up. Your agency owns the projects, each project owns its campaigns, and locationId is the id to build on.

You run an agency. Each client you serve lives in their own GoHighLevel
sub-account. Team Follow Up mirrors that exactly: your **agency** is your
account, and each connected sub-account is a **project**. Agents, campaigns,
contacts, calls and phone numbers all belong to one project.

The dashboard says "sub-account". The API says "project" and "location". They
are the same thing.

## The three names for one project

Every project carries three identifiers, and they are not interchangeable.

| Field                               | What it is                                                                | Use it for                                                                                                                |
| ----------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `locationId`                        | The GoHighLevel location id of the sub-account, for example `loc_9f7a123` | Almost everything. It never changes, and most endpoints take it as a filter or in the path.                               |
| `projectName` (also `businessName`) | The display name, for example `Acme Clinic`                               | Labels and search. It is editable, so a stored name can go stale and a stale name returns zero rows rather than an error. |
| `id`                                | The project record id, for example `64f2a8c8a2b3c4d5e6f7a8b9`             | Only the `/api/v2/projects/{id}` endpoints.                                                                               |

Build on `locationId`. When an endpoint accepts both `locationId` and
`projectName`, it applies the id and ignores the name.

## What a project holds

A project record from `GET /api/v2/projects/{id}` carries the settings that
apply to every campaign inside it:

* `status` and `active`, described below.
* `installed`: whether the GoHighLevel integration is set up. A project can be
  installed and still `disconnected` when its credential has stopped working.
  That needs a reconnect, not a reinstall.
* `timezone`: the sub-account's timezone. Calling windows use it unless a
  campaign says otherwise.
* `multipleTimezoneCheck`: the project-level default for
  [contact timezone](/campaigns/timezones). A campaign can override it.
* `callingWindowOverride`: a project-wide [calling window](/campaigns/calling-window)
  that campaigns inherit.
* `callbacksHandledByHuman`: whether callback requests go to your team rather
  than back to the agent. See [Speed to lead and power dialer](/campaigns/dispatch-modes).
* `knowledgeBase`: plain text about the business that every agent in the
  project can draw on, such as opening hours or service areas.
* `campaigns[]`: every campaign in the project, with its own settings. See
  [What a campaign is](/campaigns/overview).
* `ghl`: live location data read from GoHighLevel, such as the business
  address and phone. `null` means the connection could not be used. Read
  `status` rather than interpreting this yourself.
* `crm`: the CRM behind the project. For the software this is `ghl`. See
  [Built around GoHighLevel](/concepts/built-on-ghl).

`GET /api/agent-builder/projects` is the lightweight list: just the projects
that can hold campaigns, for pickers and lookups. Use `GET /api/v2/projects`
when you need the full record.

## Project states

| `status`       | `active` | Meaning                                                                     |
| -------------- | -------- | --------------------------------------------------------------------------- |
| `live`         | `true`   | Connected and dialling.                                                     |
| `stopped`      | `false`  | Connected but parked. Nothing dials, and the project occupies no plan slot. |
| `disconnected` | either   | The GoHighLevel connection is not usable. Reconnect it from the dashboard.  |

Park a project by setting `active: false` with `PUT /api/v2/projects/{id}`.
Parking frees its plan slot. `DELETE /api/v2/projects/{id}` goes further: it
disconnects the sub-account and hides the project from your workspace, and it
needs the separate `projects:delete` scope.

## Agencies

`GET /api/v2/projects/agencies` lists the agencies you can see, each with its
`id`, `name`, `niche` and `agencyType`. An agency admin is always pinned to
their own agency, so the `agencyName` filter on `GET /api/v2/projects` narrows
within it and never widens beyond it.

An API key belongs to an agency. Everything it reads or writes is scoped to
that agency's projects. See [Authentication](/authentication).

## Systems and validation

`GET /api/v2/projects/systems` returns the seven legacy campaign templates,
such as `appointment_booking` and `inbound_receptionist`. Each one lists the
`dispositions` (outcomes) an agent built on it can produce, the `postCallFields`
it records, and the `dynamicVars` its prompt can use.

`GET /api/v2/projects/{id}/campaigns/{campaignId}/validate` checks that a
campaign's agent has the fields and variables its system expects. `ok: false`
comes with `missing`, `present` and `extra`, so you can see exactly what to fix
before [going live](/campaigns/going-live).

## Boundaries

* One project is one GoHighLevel sub-account. There is no project without one.
* A campaign belongs to exactly one project, and its `locationId` is that
  project's.
* The `agentType` on a project's campaigns is the legacy template id, not the
  three-value type the Agents module uses. See
  [Campaign types and capabilities](/agents/agent-types).
* Names are labels. Ids are identity.

## In the API

* [List projects](/api-reference/projects/list-projects) and
  [Get project](/api-reference/projects/get-project)
* [Update project](/api-reference/projects/update-project) to park, rename or
  set the knowledge base
* [Delete project](/api-reference/projects/delete-project) to disconnect and hide
* [List project agencies](/api-reference/projects/list-project-agencies)
* [List campaign systems](/api-reference/projects/list-campaign-systems) and
  [Validate project campaign agent](/api-reference/projects/validate-project-campaign-agent)
* Every field above is defined in the [Glossary](/glossary#projects)

## Related

* [Master Agent](/master-agent/overview) runs one campaign across many projects.
* [Quickstart](/quickstart) creates your first agent inside a project.
