OpenTelemetry traces
ElevenLabs Agents can export conversations as OpenTelemetry traces encoded as OTLP JSON (resourceSpans). Forward them to Datadog, Grafana Tempo, Honeycomb, or any backend that ingests OTLP.
ElevenLabs does not push traces directly to your OTLP collector. You receive OTLP-shaped JSON from a webhook, API, or monitoring WebSocket and forward it to your backend.
Overview
Export traces from three surfaces. All three share the same trace ID per conversation and elevenlabs.* attribute naming. Span shape and timing differ between post-call/GET (transcript-based) and monitoring (event-based).
Export surfaces
Choosing a surface
- Every completed call in your data warehouse: post-call webhook
- One-off export or repair: GET conversation with
format=opentelemetry - Live supervisor UI or alerting: monitoring WebSocket
- Full fidelity timeline after the fact: post-call webhook or GET conversation
- Tool, MCP, or guardrail events as they happen: monitoring WebSocket
Use traceId or elevenlabs.conversation_id to join data across surfaces. Combine monitoring for live operations, webhooks for durable analytics, and GET for backfill.
You need an OTLP-capable collector or observability vendor for every surface. Post-call webhooks require a workspace webhook endpoint. The GET API and monitoring WebSocket each have their own API key scopes and setup; see the sections below.
Post-call webhook
After a conversation finishes, ElevenLabs sends a POST request when a post-call webhook is configured, events includes transcript, and transcript_format is opentelemetry.
The webhook type is post_call_transcription_otel (not post_call_transcription, which returns JSON transcripts).
Webhook payload
Enable OpenTelemetry transcripts
Configure via the dashboard
Configure via the CLI
Configure via the API
Create a workspace webhook
In the ElevenAgents Dashboard, create a workspace webhook with your HTTPS URL and authentication.
Attach the post-call webhook
Open Agents settings, assign the webhook as the post-call webhook, enable the Transcript event, and turn on OpenTelemetry transcript payloads.

OpenTelemetry transcript webhooks do not include audio. Use post_call_audio if you need
recordings.
Return 2xx for success. 4xx and 5xx count as failures.
Retries apply to transcript webhooks (including OpenTelemetry) only when Enable retries is on for the workspace webhook. Transient errors (5xx, 429, 408) retry up to 5 times; 4xx does not. Audio webhooks are never retried. Repeated failures can auto-disable the webhook. See Post-call webhooks for details and HIPAA exceptions.
Delivery
Trace shape
Each delivery is one complete trace: a root span plus children.
Timing comes from transcript time_in_call_secs and call metadata. The root span sets elevenlabs.source = post_call_webhook and status ERROR when the call did not end with a normal client disconnect.
GET conversation
Request OpenTelemetry format on Get conversation to receive the same otlp_traces object as the post-call OpenTelemetry webhook, plus the full conversation model.
Requires an API key with CONVAI_READ. With format=json (default), otlp_traces is omitted.
Expected span names include elevenlabs.conversation, elevenlabs.recv.user_transcript, and elevenlabs.recv.agent_response.
Monitoring WebSocket
Real-time monitoring requires an Enterprise workspace or the realtime-monitoring feature flag.
See Real-time monitoring for configuration,
control commands, and access requirements.
Stream OpenTelemetry trace data as OTLP JSON while a conversation is in progress. Each message is a small resourceSpans batch, not one end-of-call trace.
Authentication requires CONVAI_WRITE, xi-api-key (or Authorization), and EDITOR access on the agent workspace. Connect after the conversation starts.
Enable monitoring on the agent
Set monitoring_enabled: true and configure monitoring_events before the call. See Real-time monitoring.
Session protocol
- Connect with authentication headers.
- Receive
{"type": "connected"}. - Receive a root span batch (
elevenlabs.conversation,elevenlabs.source=monitoring). - Receive cached history (around the last 100 events), then
{"type": "history_complete"}. - Receive live span batches as events occur.
With events_format=json (default), the WebSocket returns raw client events instead of resourceSpans. Control commands match Real-time monitoring.
Trace shape
Structured events map to dedicated attributes (for example elevenlabs.user.text, elevenlabs.agent.text). Unknown events use elevenlabs.event.data with truncated JSON.
Do not assume event order matches speaking order. Correlate live spans with post-call data using
the same traceId.
Example connection
OTLP JSON structure
OpenTelemetry traces from all surfaces share the same OTLP JSON batch layout:
Limitations
- No direct push to your OTLP gRPC endpoint.
- Payloads are JSON shaped like OTLP export, not raw protobuf on the wire.