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.
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).
format=opentelemetryUse 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.
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).
In the ElevenAgents Dashboard, create a workspace webhook with your HTTPS URL and authentication.
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.
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.
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.
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.
Set monitoring_enabled: true and configure monitoring_events before the call. See Real-time monitoring.
{"type": "connected"}.elevenlabs.conversation, elevenlabs.source = monitoring).{"type": "history_complete"}.With events_format=json (default), the WebSocket returns raw client events instead of resourceSpans. Control commands match Real-time monitoring.
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.
OpenTelemetry traces from all surfaces share the same OTLP JSON batch layout: