---
title: "Send Conversation Message Stream"
method: POST
path: "/v1/convai/conversations/{conversation_id}/messages/stream"
tags: ["Agents Platform"]
---

# Send Conversation Message Stream

`POST /v1/convai/conversations/{conversation_id}/messages/stream`

## Request

- Base URL: `https://api.elevenlabs.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.elevenlabs.io/v1/convai/conversations/{conversation_id}/messages/stream`
- Auth: none declared
- TypeScript: <https://skmtc.dev/elevenlabs/apis/elevenlabs-api-documentation/docs/v1/convai/conversations/:conversation_id/messages/stream/post.ts> (a function with typed inputs; its response is checked against the schema)

Send input to a conversation, and stream the events of the request as server-sent events. The last event is `stream_ended`, which has the outcome of the turn. This endpoint is in alpha and may change.

## Path parameters

- `conversation_id` string, required: The Conversation ID

## Headers

- `xi-api-key` string, nullable: Your API key. This is required by most endpoints to access our API programmatically. You can view your xi-api-key using the 'Profile' tab on the website.

## Request body

- SendConversationMessageStreamRequest
  - `input` union[], required: Either one `user_message`, which starts a new turn, or `client_tool_result` items, which answer the `required_actions` of the waiting turn and continue it. Calls that they leave out stay pending. Client tools wait with no timeout. While calls are pending, a `user_message` is rejected. A `user_message` can come with `contextual_update` items, at most one per `context_id`. `client_tool_result` items that answer every pending call can come with `end` updates.
    - union
      - UserMessageInputItem
        - `type` 'user_message', required
        - `content` union[], required: The parts of the message: at most one text part and up to 5 file parts.
          - union
            - TextContentPart
              - …
            - FileContentPart
              - …
      - ClientToolResultItem: A `client_tool_result` whose `type` is required, so that it can share `input` with other items.
        - `type` 'client_tool_result', required
        - `tool_call_id` string, required: ID of the tool call this result corresponds to.
        - `result` string, required
        - `is_error` boolean, required
        - `error_type` 'user_rejected' | 'external_server' | 'external_client' | 'customer_auth' | 'client_timeout' | 'unknown', nullable: Optional category for the failure reason. When set, `is_error` is treated as true. `user_rejected` is special-cased to mark the tool as not having been called.
      - ContextualUpdateInputItem
        - `type` 'contextual_update', required
        - `text` string, required: Context for the agent that the user did not write, such as the client's current state.
        - `context_id` string, required: What the update describes. The agent sees only the latest update for each `context_id`.
        - `placement` 'in_place' | 'end': Where the LLM view renders a contextual update.

## Response `200`

Server-sent events. Each event has the stream cursor as its `id`, the event type as its `event`, and a stream envelope as its `data`.

- StreamEnvelope
  - `conversation_id` string, required
  - `turn_id` string, required
  - `created_at_unix_ms` integer, required
  - `event` union, required
    - StreamEndedEvent
      - `type` 'stream_ended'
      - `stream_ended_event` StreamEndedData, required
        - `status` 'in_progress' | 'completed' | 'requires_action' | 'failed' | 'timed_out', required
        - `error` AgentOutputError
          - `type` string, required
          - `code` string, required
          - `message` string, required
        - `required_actions` ClientToolCallRequiredAction[]: The actions the agent waits on. Answer each `client_tool_call` with a `client_tool_result` item in `input` to continue.
          - `type` 'client_tool_call'
          - `tool_call_id` string, required
          - `tool_name` string, required
          - `parameters` object, required
    - AgentChatResponsePartClientEvent
      - `text_response_part` AgentChatResponsePartClientEventData, required
        - `text` string, required
        - `type` 'start' | 'delta' | 'stop', required
        - `event_id` integer, required
        - `response_id` string, required
      - `type` 'agent_chat_response_part'
    - AgentReasoningResponsePartClientEvent
      - `reasoning_response_part` AgentReasoningResponsePartClientEventData, required
        - `text` string, required
        - `type` 'start' | 'delta' | 'stop', required
        - `event_id` integer, required
      - `type` 'agent_reasoning_response_part'
    - AgentResponseClientEvent
      - `agent_response_event` AgentResponseClientEventData, required
        - `agent_response` string, required
        - `event_id` integer, required
        - `response_id` string, required
        - `in_response_to_ids` string[]
        - `response_type` 'text' | 'voice'
        - `attachments` AgentResponseAttachment[]
          - `url` string, required
          - `name` string, required
          - `mime_type` string, nullable
      - `type` 'agent_response'
    - AgentToolRequestStreamedEvent
      - `agent_tool_request` AgentToolRequestClientEventData, required
        - `tool_name` string, required
        - `tool_call_id` string, required
        - `tool_type` string, required
        - `event_id` integer, required
        - `expects_response` boolean, required
        - `disable_interruptions` boolean, required
        - `response_timeout_secs` integer, required
        - `execution_mode` string, required
      - `type` 'agent_tool_request'
    - AgentToolResponseStreamedEvent
      - `agent_tool_response` AgentToolResponseClientEventData, required
        - `tool_name` string, required
        - `tool_call_id` string, required
        - `tool_type` string, required
        - `is_error` boolean, required
        - `is_blocked` boolean
        - `event_id` integer, required
        - `is_called` boolean, required
        - `status` 'success' | 'error' | 'blocked' | 'skipped', required
      - `type` 'agent_tool_response'
    - ClientToolCallEvent: `ClientToolCallClientEvent` as a stream event, because its custom `__init__` can't parse its own JSON.
      - `type` 'client_tool_call'
      - `client_tool_call` ClientToolCallClientEventData, required
        - `tool_name` string, required
        - `tool_call_id` string, required
        - `parameters` object, required
        - `event_id` integer, required
        - `expects_response` boolean, required: Whether the server expects a ClientToolResult response.

## Other responses

- `422`: Validation Error

## Changes

- **2026-11-12** `f2fab82c4571`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/elevenlabs/apis/elevenlabs-api-documentation/changes/v1/convai/conversations/:conversation_id/messages/stream/post.md)

---

[API](https://skmtc.dev/elevenlabs/apis/elevenlabs-api-documentation.md) - [All operations](https://skmtc.dev/elevenlabs/apis/elevenlabs-api-documentation/llms.txt) - [OpenAPI document](https://skmtc.dev/elevenlabs/apis/elevenlabs-api-documentation/revisions/f2fab82c4571?raw)
