/webhooks/calls endpoint as every
other source, tagged with X-Zelto-Provider: livekit so the calls show
up as LiveKit.
Mint a key
- Open Settings → Integrations → LiveKit and click Create API key.
- Give it a descriptive name (e.g.
livekit-prod-worker). - Copy the key once — Zelto only stores a hash. It is the same org-wide key used by the REST API and MCP server.
Forward a session
Set the key asZELTO_API_KEY in your worker’s environment, then POST
each finished session at end of call — for example from your entrypoint’s
shutdown callback:
user, assistant, system, or tool. Everything
except call.externalId and an agent reference is optional; you can also
send durationSeconds, recordingUrl, endedReason, cost, and a
customer block.
A successful upload returns { "received": true }.
Verify the first call
Forward a session, then open Conversations — it shows up tagged as LiveKit within a few seconds. If it doesn’t, check the response your worker got from the POST — a{ "received": true } body means Zelto accepted it,
a 4xx returns the reason — and confirm the worker is sending the
Authorization and X-Zelto-Provider: livekit headers. See
Connect a voice provider.
Stable ids
agent.externalIdidentifies the agent. Zelto finds or creates a LiveKit agent for each distinct value, so use a stable id per agent (not per session). The first session’sagent.namenames it.call.externalId(the room or session id) is the dedup key. Re-posting the same id updates the call in place — refreshing the transcript, recording, or duration — and never double-charges. Send the session once when it ends, then re-send later if you enrich it.
Recordings vs. transcripts
This flow forwards the transcript your agent already has. If you also run egress, include the recording ascall.recordingUrl and Zelto re-hosts the audio. If you
only have audio and no transcript, upload the file through the
REST API instead and Zelto transcribes it.
Connection status
The LiveKit card shows Active once Zelto has ingested at least one LiveKit call. Each agent’s detail page shows when its last session arrived, so you can tell at a glance whether the worker is still forwarding.Related
- Connect a voice provider — pick a path and verify ingestion.
- Custom & other providers — the canonical call shape this endpoint accepts.
- Conversations — where LiveKit calls land.
- API reference · MCP — read your data programmatically.

