Custom Channel
Overview
Custom Channel connects an external messaging system to an ElevenLabs agent. Send user messages to an ElevenLabs webhook, then receive agent replies on your own HTTPS endpoint.
Custom Channel is unavailable for agents or workspaces using zero-retention mode. Inbound requests
for such an agent or workspace are rejected with 403 Forbidden.
Setup
Send a message
Send a POST request to the generated webhook URL:
ElevenLabs returns 202 Accepted before processing the turn:
To continue the conversation, send another request with that conversation_id and a new user_message_id.
Replaying the same scoped user_message_id within 24 hours does not start another turn. Initial
messages are scoped by trigger and user_identifier; continuation messages are additionally
scoped by conversation_id.
Receive replies
ElevenLabs sends a POST request to the reply webhook URL after each turn:
If processing fails, status is failed, data is [], and error contains a description.
data lists events in turn order. Every item has a type and an event:
agent_responsecontains one agent utterance.response_iduniquely identifies the utterance, whileevent_idassociates it with a turn. Join theagent_responsevalues if your channel renders one text bubble per turn.agent_tool_responsereports a tool outcome and shares the turn’sevent_id. Itsstatusissuccess,error,blocked, orskipped. A response withtool_type: "system",tool_name: "end_call", andstatus: "success"means the agent ended the conversation.
Multiple inbound messages can be coalesced into one turn. user_message_ids lists the user message IDs this reply is answering.
Verify reply signatures
Each reply includes an ElevenLabs-Signature header:
The digest is an HMAC-SHA256 signature over {timestamp}.{raw_request_body} using the outbound signing secret. Verify the raw body before parsing JSON and reject stale timestamps.
Delivery behavior
ElevenLabs makes three in-process delivery attempts at approximately 0, 0.5, and 2 seconds. A 2xx response marks delivery successful.
The reply URL must use HTTPS. Local development also permits loopback HTTP URLs such as http://127.0.0.1:8765/webhook.
Request bodies are limited to 256 KiB.