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

# Connect a voice provider

> Pick the right integration for your stack, then confirm calls are flowing into Zelto.

Every call in Zelto arrives through one of four ingestion paths. This guide
helps you pick the right one and confirm it's working; each provider's own page
has the click-by-click steps.

## Which integration do I need?

| Your stack                                  | Use                                                            | How calls arrive                                                                                                  |
| ------------------------------------------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| [Vapi](/docs/integrations/vapi)             | Native API key                                                 | Webhooks — you paste Zelto's URL into Vapi                                                                        |
| [Retell](/docs/integrations/retell)         | Native API key                                                 | Webhooks — you paste Zelto's URL into Retell                                                                      |
| [Speechify](/docs/integrations/speechify)   | Native API key                                                 | Per-agent webhook — you set Zelto's URL as the agent's `webhook_url`                                              |
| [Telnyx](/docs/integrations/telnyx)         | Native API key                                                 | Import assistants today; forward calls via [Custom & other providers](/docs/integrations/api-call-upload) for now |
| [LiveKit](/docs/integrations/livekit)       | Push from your worker                                          | Your agent forwards each finished session with an API key                                                         |
| [ElevenLabs](/docs/integrations/elevenlabs) | Native API key                                                 | Post-call webhook you add in ElevenLabs (signed), with hourly pull as backup                                      |
| Anything else — Bland, Pipecat, in-house    | [Custom & other providers](/docs/integrations/api-call-upload) | You POST calls to `/webhooks/calls`                                                                               |

If you run on Vapi or Retell, use the native integration — you connect with an
API key, paste Zelto's webhook URL into the provider, and recordings are fetched
for you. LiveKit and the custom path are **push-based**: nothing pulls calls for
you, so your code forwards each finished call with an org API key. All four land
in the same [conversations](/docs/conversations) list, tagged with the originating
[agent](/docs/agents).

## What "connected" looks like

However a call arrives, the path through Zelto is the same:

<Steps>
  <Step title="The payload is recorded">
    Zelto records the raw payload in an append-only log before anything else, so
    ingestion is replayable and no delivery is lost.
  </Step>

  <Step title="A conversation appears">
    A row shows up in [Conversations](/docs/conversations) with the transcript and,
    when present, the re-hosted recording.
  </Step>

  <Step title="Analysis runs">
    The call is analyzed in the background; [findings](/docs/findings) attach as they
    surface.
  </Step>
</Steps>

## Verify your first call

Place a test call to your agent, then:

1. Open **Conversations** and confirm the call is listed with its transcript.
2. Check the agent's **Connections** card — it shows whether a webhook has
   arrived recently, the fastest "is anything getting through?" signal.

That round trip — call placed, webhook arrives, conversation visible — means the
integration is live.

## Troubleshoot a missing call

If a call doesn't appear in [Conversations](/docs/conversations), where you look
depends on how it arrives:

* **Vapi or Retell** — open the [agent](/docs/agents) and check its **Connections**
  card. A recent "last call received" time means calls are flowing; "no recent
  calls" means nothing has arrived lately; "last webhook errored" means the most
  recent delivery reached Zelto but couldn't be turned into a conversation. No
  calls at all? Re-check the webhook URL in the provider, and that the provider
  is actually sending events.
* **LiveKit or a custom stack** — check the HTTP response your code got back from
  `/webhooks/calls`. A `{ "received": true }` body means Zelto accepted the
  call; a `4xx` returns the reason in the body — a missing or wrong
  `X-Zelto-Provider` header, a failed field validation, or an invalid API key.
  Fix the payload against the canonical fields in
  [Custom & other providers](/docs/integrations/api-call-upload), then re-send.

## Related

* [Integrations overview](/docs/integrations) — every provider and channel.
* [Vapi](/docs/integrations/vapi) · [Retell](/docs/integrations/retell) · [Speechify](/docs/integrations/speechify) · [Telnyx](/docs/integrations/telnyx) · [LiveKit](/docs/integrations/livekit) · [ElevenLabs](/docs/integrations/elevenlabs) · [Custom & other providers](/docs/integrations/api-call-upload)
* [Conversations](/docs/conversations) — where ingested calls land.
* [Quickstart](/docs/quickstart) — the five-minute version.
