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

# Agents

> How Zelto models the voice and chat bots that drive your conversations.

An **agent** in Zelto is the bot (or human) on the other end of a
[conversation](/docs/conversations). Each agent belongs to one organization and is
tied to the provider its calls come from — Vapi, Retell, or LiveKit — or to none
at all when you [upload calls](/docs/integrations/api-call-upload) directly.

## Anatomy of an agent

| Field         | What it holds                                                                                |
| ------------- | -------------------------------------------------------------------------------------------- |
| Name          | Display name, editable in Zelto and independent of the provider.                             |
| Description   | Optional free-text note.                                                                     |
| System prompt | The agent's prompt, shown next to transcripts when you review and audit it.                  |
| Provider      | The stack the calls came from (`vapi`, `retell`, `livekit`), or empty for direct uploads.    |
| External ID   | The provider's own id for the agent — how Zelto matches incoming calls to an existing agent. |
| Type          | `ai` for a bot, `human` for a person on the line.                                            |

Agents are created the first time a call references them: ingestion looks up the
provider's external id and reuses the matching agent, or creates one if it's
new. If a provider rotates external ids from call to call, Zelto can collapse
those onto a single agent with an org-level pattern, so you don't accumulate
duplicates.

## Agent activity

Click into an agent for a call-volume trend chart, an hour-by-day heatmap, and its
most recent [conversations](/docs/conversations), alongside its system prompt and
the [findings](/docs/findings) surfaced from its calls.

Each agent can also post a [daily status message to
Slack](/docs/integrations/slack#daily-status-message) — yesterday's conversation
count, at a time you choose — once Slack is connected.

## How calls reach an agent

Every payload Zelto receives lands in the append-only **webhooks** table first,
then becomes a [conversation](/docs/conversations) with a turn-by-turn
[transcript](/docs/conversations). How each provider delivers a call:

| Provider                                             | How calls arrive                                                                |
| ---------------------------------------------------- | ------------------------------------------------------------------------------- |
| [Vapi](/docs/integrations/vapi)                      | One `end-of-call-report` webhook per finished call.                             |
| [Retell](/docs/integrations/retell)                  | `call_ended`, then `call_analyzed` once Retell finishes its own post-call pass. |
| [LiveKit](/docs/integrations/livekit)                | Your worker POSTs each finished session to `/webhooks/calls`.                   |
| [Custom & other](/docs/integrations/api-call-upload) | POST the canonical call payload to `/webhooks/calls`.                           |

Recording the raw payload first means ingestion is always replayable, so a
delivery is never lost even if processing has to be re-run.

## Connection status

Each agent's detail page carries a **Connections** card — the at-a-glance signal
that calls are reaching Zelto. It names the provider the agent ingests from and
reports on the last call received:

* **"Last call received 2 hours ago"** — calls are flowing; ingestion is healthy.
* **"No recent calls"** / **"integration may be stale"** — connected, but nothing
  has arrived lately. Place a test call, or check that the provider is still
  sending.
* **"Last webhook errored"** — the most recent delivery reached Zelto but
  couldn't be turned into a [conversation](/docs/conversations).
* **"No calls received yet"** — the agent has a provider but has never received a
  call.

If a call never showed up, start here. For which signal to check per provider, see
[Connect a voice provider](/docs/guides/connect-a-voice-provider#troubleshoot-a-missing-call).

## Recording storage

Most providers hand Zelto a recording URL that stays valid — Vapi, for example,
returns a permanent URL that Zelto stores as-is. Some providers instead return a
short-lived presigned URL that expires within the hour. For those, a background
job downloads the audio and re-hosts it on Zelto storage, so the player on the
[conversation](/docs/conversations) detail page keeps working long after the upstream
URL is gone.
