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

# Call records

> Every call leaves a record: when it happened, who took it, what was said, how it ended and what it cost. This is your proof of what happened to every lead.

When a client asks "what happened to my leads?", the answer is on this page.
Every call the platform places or answers writes a **call record**: the
timestamp, the agent, the outcome, the recording, the transcript and the cost.
Nothing is inferred and nothing is summarised away. You can pull the record for
any lead and show it.

## What one record holds

`GET /api/call-history` returns one row per call. The row is the same shape the
dashboard's Calls page reads.

| Field                           | Meaning                                                                                                                                                     |
| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                            | The call record id. Send it to `GET /api/call-history/{callId}`.                                                                                            |
| `callId`                        | The voice platform's own id for the call. Send it to `GET /api/call-history/by-call-id/{callId}`.                                                           |
| `dateTime` and `date`           | When the call started, as a UTC timestamp and as a calendar day.                                                                                            |
| `leadName` and `phoneNumber`    | Who was called, or who called in.                                                                                                                           |
| `direction`                     | `outbound` or `inbound`.                                                                                                                                    |
| `status`                        | The call's final state, for example `ended`.                                                                                                                |
| `duration`                      | Seconds on the line.                                                                                                                                        |
| `agent`                         | Display name of the agent that took the call. In a [split test](/split-testing/overview), each variant has its own name, so this tells you which one spoke. |
| `callSummary`                   | The agent's short written summary of the conversation.                                                                                                      |
| `disposition`                   | The outcome, as an object: `type`, a human `label`, a `color`, and `tag` when the outcome was a tag being applied. See [Outcomes](/agents/outcomes).        |
| `recordingUrl`                  | Where to listen to the call. `null` when no recording exists.                                                                                               |
| `cost`                          | What the call cost on your channel. `null` until the call is costed.                                                                                        |
| `campaignId` and `campaignName` | The campaign that placed the call.                                                                                                                          |
| `agentType`                     | The campaign type of the agent that placed the call.                                                                                                        |
| `projectName` and `locationId`  | Use `locationId` to identify and correlate the project. `projectName` is its display label.                                                                 |

## The full record

The two detail endpoints return everything above plus the conversation itself:

* `transcript`: the full text of the call. An empty string means nobody spoke.
  `null` means no transcript could be sourced.
* `segments`: the same conversation cut into turns, each marked `agent` or
  `lead` with the seconds it starts and ends at, so you can follow the text
  against the recording. `null` when timings were not available.
* `fields`: the [AI-generated fields](/agents/outcomes#the-details-your-ai-generated-fields)
  the agent recorded on this call, as `key` and `value` pairs. An empty array
  means the agent captured none. `null` means they could not be sourced.
* `transcriptSource`: where the transcript came from. `stored` is our own
  record. `live` means it was fetched from the voice platform for this request.
  `unavailable` means neither had it, and `transcript` and `fields` are both
  `null`.

A transcript with `fields: null` is a valid partial answer: we held the text,
and the voice platform could not be reached for the rest.

## Finding the calls you want

Every filter on `GET /api/call-history` is a query parameter. Combine as many
as you need.

| To find                             | Send                                                                                                                                      |
| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| One project's calls                 | `locationId` (preferred) or `projectName`                                                                                                 |
| One campaign's calls                | `campaignId`                                                                                                                              |
| One split-test variant's calls      | `agentVariantId`, together with `campaignId`. A variant id only means something inside its own campaign, so sending it alone is rejected. |
| Calls in a date range               | `dateFromUTC` and `dateToUTC`. A plain `YYYY-MM-DD` covers the whole day. A timestamp must carry `Z` or an offset.                        |
| Calls by outcome                    | `disposition`, comma-separated for several                                                                                                |
| Calls by direction, status or agent | `direction`, `status`, `agent`                                                                                                            |
| Calls of a certain length           | `durationMin` and `durationMax`, in seconds                                                                                               |
| One person's calls                  | `phoneNumber` or `leadName`                                                                                                               |
| Calls nobody has reviewed yet       | `excludeReviewed=true`                                                                                                                    |

Sort with `sort` as `field.direction`, for example `dateTime.desc` or
`duration.asc`. Page with `page` and `limit`. The response carries
`pagination` with `page`, `limit`, `total` and `totalPages`.

`GET /api/call-history/filters` returns the values you can filter on for your
account: the projects, statuses, agents and directions that actually appear in
your calls.

For one contact's history, `GET /api/contacts/{phoneNumber}/calls` returns
their calls with an outcome summary. See [Contacts](/contacts/overview).

## Test calls in the record

A call to a contact you have marked as your own test lead still appears here.
The mark removes it from the performance figures on the dashboard and in
[Analytics](/analytics/overview), not from the record. See
[Test your agent](/agents/test-your-agent).

## Boundaries

* Two ids, two lookups. `id` goes to `GET /api/call-history/{callId}`,
  `callId` goes to `GET /api/call-history/by-call-id/{callId}`.
* `cost` is viewer-safe: an agency sees the agency price, a project user sees
  the project price.
* Records answer with canonical names. `id` and `agentType` are the fields.
  The storage spellings `_id` and `campaignSystem` are not part of the
  response.
* The list does not carry the transcript. Fetch the detail for that.

## In the API

* [List calls](/api-reference/calls/list-calls)
* [List call filters](/api-reference/calls/list-call-filters)
* [Get call](/api-reference/calls/get-call) and
  [Get call by call id](/api-reference/calls/get-call-by-call-id)
* [List contact calls](/api-reference/contacts/list-contact-calls)
* Every field above is defined in the [Glossary](/glossary#calls)

## Related

* [What your agent records](/agents/outcomes) explains the outcome and the
  AI-generated fields.
* [Metrics and how they are calculated](/analytics/overview) rolls these
  records up.
