ElevenLabs enables AI agents to create, configure, and manage conversational voice agents, inspect conversation transcripts, manage knowledge bases and tools, run evaluations, review support tickets, estimate usage costs, and generate speech audio from text.
Encrypted at rest, isolated from the model
Resolved from an AES-256-GCM vault at the moment of the call and attached to the request — the model never sees the secrets.
Try asking
List ElevenLabs Agents in the authenticated workspace.
Get the full configuration for an ElevenLabs Agent. Defaults to the latest version on the agent's main branch; pass branch_id to read another branch's latest version, or version_id to read the exact configuration at any committed version (e.g. one returned by agents_get_branch). To see what a version changed, fetch it and its parent version (parents.in_branch_parent_id, or parents.out_of_branch_parent_id for the first version on a branch) and compare the two. The full document is large: pass fields, a list of dotted config paths such as conversation_config.tts, to get only those parts, keyed by path under config, alongside agent_id, branch_id and version_id.
Get lightweight summaries for one or more ElevenLabs Agents.
Get widget configuration for an ElevenLabs Agent.
Get the shareable link for an ElevenLabs Agent.
Get the size of an ElevenLabs Agent's knowledge base.
Calculate expected LLM usage for an ElevenLabs Agent. API reference: https://elevenlabs.io/docs/api-reference/agents/calculate
List conversations for the authenticated workspace, optionally filtered to a specific agent via agent_id.
Get the details of a conversation, including its transcript and analysis results.
Get a lightweight summary of a conversation: its title, the generated transcript summary, whether the call was successful, and the plain chat messages when the conversation is short (up to max_messages turns; otherwise messages_omitted is set). Tool calls, tool results, and contextual updates are left out. Prefer this over agents_get_conversation when reading many conversations or when the gist is enough; use agents_get_conversation for the full transcript.
Duplicate an existing ElevenLabs Agent. API reference: https://elevenlabs.io/docs/api-reference/agents/duplicate
Permanently delete an ElevenLabs Agent together with all of its conversations. This cannot be undone. To hide an agent while keeping it and its history, archive it instead with agents_update_operations, passing archived: true.
Search the text of conversation transcripts and return the matching messages, each with its conversation_id, transcript_index, message text, and relevance score. This is the only way to find conversations by something that was said; agents_list_conversations filters on structured attributes and cannot search transcript text. Wrap text_query in double quotes to match the terms as written (do this for error codes, identifiers, and anything a user pasted); leave it unquoted to match fuzzily, tolerating one character of difference per term. Neither form is a substring or phrase match -- a multi-word query matches messages containing all of the terms in any position -- so read the returned text before treating a hit as an occurrence. Results are messages, not conversations: deduplicate by conversation_id before counting.
Search conversation transcripts by meaning rather than exact words, returning the most relevant messages with their conversation_id. Use it for questions phrased as intent (e.g. "callers asking to cancel", "the agent refusing a refund") where the wording varies; use agents_search_conversation_messages instead when the exact text is known (error codes, identifiers, quoted phrases). Narrow with agent_id and branch_id. Results are messages, not conversations: deduplicate by conversation_id before counting.
Resolve a conversation reference (e.g. a dashboard URL or share link) to its conversation.
Get the conversation topics surfaced for an ElevenLabs Agent.
List the branches of an ElevenLabs Agent, main first, each with its name, parent_branch_id, last_committed_at, and current_live_percentage (its share of live production traffic; 0 means it receives none). When diagnosing production behavior, prefer branches with current_live_percentage > 0. Set include_commit_status to also get commits_ahead / commits_behind versus main for each branch (slower: it walks every branch's version history). Call agents_get_branch for one branch's full commit history.
Get a single branch of an ElevenLabs Agent, including its full commit history. Use this to see how a branch evolved: most_recent_versions lists every version committed to the branch, newest first, each with its id, commit message (version_description), seq_no_in_branch, time_committed_secs, and parents: in_branch_parent_id (the previous commit on this branch), out_of_branch_parent_id (the version the branch was forked from, on its first commit), merged_from_branch_id / merged_from_version_id (a merge that landed here), merged_into_branch_id, and rebased_from_version_id. For the agent's main branch, pass the first branch returned by agents_list_branches. Follow up with agents_get_version for one version's metadata, or agents_get with version_id for the full configuration at that version; to see what a version changed, compare its configuration with its in_branch_parent_id's.
Update a branch of an ElevenLabs Agent.
Get metadata for a specific version of an ElevenLabs Agent: its branch_id, commit message (version_description), seq_no_in_branch, time_committed_secs, and parent/merge/rebase lineage (parents). Versions are immutable snapshots on a branch. Does not return the configuration; call agents_get with version_id for that.
Preview the changes that merging a source branch would apply, without mutating anything.
Merge a source branch into its target branch.
Open a merge proposal asking to merge a source branch into a target branch, for someone with write access to the target to review and merge.
List the merge proposals for an agent, newest first.
Get a single merge proposal.
Edit an open merge proposal: change its title or description, replace the list of users asked to review it (requested_reviewer_user_ids), or close it without merging.
Approve a merge proposal or request changes on it. A user's latest review replaces their previous one.
Leave a comment on a merge proposal without recording a review verdict.
Execute the merge for an approved merge proposal. The caller must have write access to the target branch.
Create or update the live traffic split across an ElevenLabs Agent's branches. Each call replaces the whole split, so include every branch that should keep traffic; percentages must total 100.
Create a draft for an ElevenLabs Agent.
Delete the draft of an ElevenLabs Agent.
Create a procedure on an agent branch. A procedure is a standard operating procedure the agent follows for one specific task: trigger says when the agent should use it, content says what to do. There are two types. A free-form procedure (type=free_form) is markdown instructions that are injected into the prompt when the procedure is active; the agent reads them and uses judgment about wording and order. A structured procedure (type=deterministic) is a list of typed steps the agent runs in a fixed order, every time. Set trigger as the top-level field; never write it inside content. For structured content, send the steps object JSON-encoded in content; its shape and rules are documented at https://elevenlabs.io/docs/eleven-agents/customization/procedures/structured-procedures. The procedure is a draft until the agent is published; saving the draft (agents_create_draft) and publishing both validate structured procedures and return per-procedure errors with the path of each offending step.
List the procedures on an agent branch with their name, type and trigger. Does not return procedure content; call agents_get_procedure to read a body. A trigger says when a procedure fires, not everything its body handles -- a general or fallback procedure can cover a case its trigger never names -- so read the plausible candidates before concluding that no procedure handles something.
Get a single procedure on an agent branch, including its full content. Use it to check what a procedure actually handles; agents_list_procedures only returns triggers.
Remove a procedure from an agent branch.
Get the draft of a procedure on an agent branch.
Update the draft of a procedure on an agent branch. Send name, content, type and trigger in full. type must be the procedure's existing type: a procedure's type cannot be changed after creation, so to convert between free_form and deterministic, create a new procedure instead. For structured content, send the steps object JSON-encoded in content; its shape and rules are documented at https://elevenlabs.io/docs/eleven-agents/customization/procedures/structured-procedures. The change is a draft until the agent is published; saving the draft (agents_create_draft) and publishing both validate structured procedures and return per-procedure errors.
Delete the draft of a procedure on an agent branch.
List the documents in the workspace knowledge base.
Get a single knowledge base document.
Create a knowledge base document from raw text.
Create a knowledge base document from a URL.
Create a folder in the knowledge base.
Update a knowledge base document's name and/or content.
Delete a knowledge base document.
Delete multiple knowledge base documents at once.
Move multiple knowledge base items into a folder.
Search the workspace knowledge base by content.
Run a RAG query against an ElevenLabs Agent's knowledge base.
List the agents that depend on a knowledge base document.
Start a crawl job that follows links from a URL (or reads the given sitemap_urls) and adds each crawled page to the knowledge base as a document, inside a new folder. Limit the crawl with max_pages and a URL pattern; parent_folder_id places the folder. Set enable_auto_sync to re-crawl periodically (with auto_remove to drop pages that disappear). Returns immediately with the crawl job; pages arrive as the job runs. Use agents_create_kb_url instead for a single page.
List the RAG indexes of a knowledge base document, with each index's embedding model, status (e.g. created, processing, succeeded, failed), and progress. An agent with RAG enabled can only retrieve from a document once it has a succeeded index for the agent's embedding model (conversation_config.agent.prompt.rag.embedding_model).
Start RAG indexing of a knowledge base document for an embedding model, or return the current status if an index for that model already exists. Pass the model the agent uses (conversation_config.agent.prompt.rag.embedding_model in the agent's configuration) so the agent can retrieve from the document. Indexing runs in the background; poll the document's RAG indexes until the status is succeeded.
Create an ElevenLabs Agent tool (client, webhook, or other type per the request body).
List the ElevenLabs Agent tools in the workspace.
Get a single ElevenLabs Agent tool.
Update an ElevenLabs Agent tool.
Delete an ElevenLabs Agent tool.
List the agents that depend on a tool.
Get the execution history for a tool.
Register an MCP server that agents can use as a tool source.
List the MCP servers registered in the workspace.
Get a single registered MCP server.
Update the configuration of a registered MCP server.
Delete a registered MCP server.
List the tools exposed by a registered MCP server.
List the workspace secrets that agent tools, MCP servers, and integrations can reference, with each secret's id, name, and the resources that use it. Secret values are never returned. Use it to find the secret_id to reference from a tool or MCP server config instead of pasting a credential.
Create an agent response test.
List the agent response tests in the workspace.
Get a single agent response test.
Delete an agent response test.
Replace an agent response test's definition. This is a full replacement, not a patch: read the current test first, change the fields you need, and send the complete test back, or fields you leave out are reset. parent_folder_id is ignored here; use agents_move_tests to move a test.
Create a folder for organizing agent tests, optionally inside parent_folder_id.
Move tests or test folders (entity_ids) into the folder move_to, or to the root when move_to is omitted.
Run a suite of tests against an ElevenLabs Agent.
List test-suite invocations (test runs) in the workspace.
Get the details of a single test-suite invocation (test run).
List the phone numbers in the workspace.
Get a single phone number.
Update a phone number (e.g. assign it to an agent).
Delete a phone number from the workspace.
List an agent's conversation triage tickets, ordered by most recently created first. These are tickets about the agent's own performance on a conversation (for triage with Architect), not tickets an agent opens for end users.
Manually raise a follow-up ticket against an agent, not tied to any conversation (for example a task like 'add the KB about X').
List workspace members who can be assigned a conversation triage ticket for an agent, flagged with whether they currently have at least viewer access to the agent.
Get a conversation triage ticket by ID.
Raise a ticket about an agent's performance on a conversation, for triage with Architect. Provide an overall comment and/or turn-level comments describing what went wrong.
Update a conversation triage ticket's comment, status, priority, and/or assignee.
Append a comment discussing how to resolve a conversation triage ticket.
Append a turn-level comment to a conversation triage ticket.
Delete a conversation triage ticket. Restricted to the ticket creator or a workspace admin.
Rename an ElevenLabs Agent, replace its tag list, or label the version this change publishes. Metadata only: everything about what the agent says or how it behaves lives in a sibling agents_update_* tool, such as agents_update_prompt_settings for the system prompt or agents_update_voice for the voice. Supplying tags replaces the whole list rather than appending to it. API reference: https://elevenlabs.io/docs/api-reference/agents/update Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of name, tags as saved by this call, limited to the fields this tool accepts.
Set how an ElevenLabs Agent conducts a conversation: its first message and whether callers may interrupt it, the spoken language, Hinglish mode, dynamic variable placeholders, text behavior overrides, and the message played when a conversation hits its maximum duration. The system prompt and LLM settings are in agents_update_prompt_settings. dynamic_variables and text_behavior_overrides are replaced wholesale rather than merged. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of the fields it sets under conversation_config.agent as saved by this call, limited to the fields this tool accepts.
Set the system prompt of an ElevenLabs Agent and the model that runs it: prompt text, LLM choice, temperature, token limit, reasoning effort and thinking budget, knowledge base and RAG, a custom LLM endpoint, a backup LLM, the agent's timezone, whether the default personality is ignored, and which custom tools are attached (tool_ids). Each built-in tool has its own agents_update_*_tool tool. tool_ids and custom_llm.request_headers are replaced wholesale rather than merged, so send the whole list you want the agent to end up with. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of the fields it sets under conversation_config.agent.prompt as saved by this call, limited to the fields this tool accepts.
Configure the built-in end call tool on an ElevenLabs Agent, which lets the agent hang up on its own once the conversation is finished. Read the agent's current configuration first: this writes the whole tool slot, so name and params are required even when only one field is changing, and a slot that is currently unset will be rejected without them. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.agent.prompt.built_in_tools.end_call as saved by this call, limited to the fields this tool accepts.
Configure the built-in transfer to agent tool on an ElevenLabs Agent, which hands the conversation to another agent along one of the transfer rules in params.transfers. Read the agent's current configuration first: this writes the whole tool slot, so name and params are required even when only one transfer rule is changing. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.agent.prompt.built_in_tools.transfer_to_agent as saved by this call, limited to the fields this tool accepts.
Configure the built-in language detection tool on an ElevenLabs Agent, which lets the agent switch to a language the caller speaks, optionally only at the start of the conversation. Read the agent's current configuration first: this writes the whole tool slot, so name and params are required even when only one field is changing. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.agent.prompt.built_in_tools.language_detection as saved by this call, limited to the fields this tool accepts.
Configure the built-in transfer to number tool on an ElevenLabs Agent, which forwards a phone call to a human on one of the numbers in params.transfers. Read the agent's current configuration first: this writes the whole tool slot, so name and params are required even when only one number is changing. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.agent.prompt.built_in_tools.transfer_to_number as saved by this call, limited to the fields this tool accepts.
Configure the built-in skip turn tool on an ElevenLabs Agent, which lets the agent stay silent when the caller has asked for a moment to think. Read the agent's current configuration first: this writes the whole tool slot, so name and params are required even when only one field is changing. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.agent.prompt.built_in_tools.skip_turn as saved by this call, limited to the fields this tool accepts.
Configure the built-in play keypad touch tone tool on an ElevenLabs Agent, which plays DTMF tones so the agent can navigate an automated phone menu. Read the agent's current configuration first: this writes the whole tool slot, so name and params are required even when only one field is changing. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.agent.prompt.built_in_tools.play_keypad_touch_tone as saved by this call, limited to the fields this tool accepts.
Configure the built-in voicemail detection tool on an ElevenLabs Agent, which recognizes when an outbound call reached a voicemail system and optionally leaves a message. Read the agent's current configuration first: this writes the whole tool slot, so name and params are required even when only one field is changing. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.agent.prompt.built_in_tools.voicemail_detection as saved by this call, limited to the fields this tool accepts.
Set how an ElevenLabs Agent hears incoming audio: the speech-to-text quality tier, input audio format and sample rate, the user input audio transcription provider, and whether background voice detection filters out speech that is not the caller. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.asr, conversation_config.vad as saved by this call, limited to the fields this tool accepts.
Set how an ElevenLabs Agent decides when to speak: turn timeouts, silence and end-call thresholds, the turn detection mode and eagerness, backchannelling, and how it handles a caller who says nothing. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.turn as saved by this call, limited to the fields this tool accepts.
Set the voice an ElevenLabs Agent speaks with: voice ID, TTS model, output format, stability, speed and similarity, pronunciation dictionaries, optimize-streaming-latency, and the supported voices callers can switch between. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.tts as saved by this call, limited to the fields this tool accepts.
Set the session-level limits and modalities of an ElevenLabs Agent: maximum conversation duration, which text and audio modalities are accepted, client events streamed to the caller, and whether the conversation may be recorded. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.conversation as saved by this call, limited to the fields this tool accepts.
Set the per-language overrides an ElevenLabs Agent applies when a conversation runs in a language other than its default: translated first message and system prompt, and a language-specific voice. The preset map is replaced wholesale rather than merged, so send every language you want to keep. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of conversation_config.language_presets as saved by this call, limited to the fields this tool accepts.
Restyle the embeddable chat widget of an ElevenLabs Agent: colors, radii, placement and size, avatar, the button and expandable variants, on-screen copy and terms text, feedback and transcript controls, language selection, and mic muting. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of platform_settings.widget as saved by this call, limited to the fields this tool accepts.
Set what an ElevenLabs Agent extracts from finished conversations: evaluation criteria, analysis items, data collection fields and their scopes, the LLM used for analysis, the summary language, topic discovery and sentiment analysis. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of the fields it sets under platform_settings as saved by this call, limited to the fields this tool accepts.
Set the operational policy of an ElevenLabs Agent: authentication and allowed origins, privacy and retention, concurrency and daily call limits, call queueing, trust context, alerting thresholds, test configuration, transcript auto-translation, and whether the agent is archived. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of the fields it sets under platform_settings as saved by this call, limited to the fields this tool accepts.
Choose which parts of an ElevenLabs Agent's configuration a client may override when it starts a conversation, and which of those the workspace allows at all. This grants permission to override; it does not set the values themselves. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of platform_settings.overrides, platform_settings.workspace_overrides as saved by this call, limited to the fields this tool accepts.
Set the content guardrails an ElevenLabs Agent enforces on a conversation: which categories are blocked, how strictly, and what the agent does when a guardrail trips. Returns agent_id, branch_id and version_id, and under config, keyed by path, the stored values of platform_settings.guardrails as saved by this call, limited to the fields this tool accepts.
Create a new working branch for an ElevenLabs Agent, forked from an existing version. The branch starts as a copy of that version; change its configuration afterwards with the agents_update_* tools, which all take an optional branch_id.
Create a new ElevenLabs Conversational AI agent from a compact set of common fields. Use this for normal agent creation, then refine the result with the agents_update_* tools. API reference: https://elevenlabs.io/docs/api-reference/agents/create
Take one of the built-in system tools away from an ElevenLabs Agent, so it can no longer end the call, transfer, detect language and so on. The matching agents_update_*_tool tool is what turns a tool back on and configures it; this one only clears the slot. Clearing a slot that is already empty changes nothing but still publishes a new version, so check the agent's configuration first. Returns agent_id, branch_id and version_id, and names the cleared slot's path under unset.
Replace the whole conversation workflow graph of an ElevenLabs Agent. This tool takes the graph as an opaque object and does not describe its shape, so it is only usable when you already have a complete workflow document to send; building one from scratch is not something this tool can guide. Direct the user to the Agents Platform workflow editor instead. Everything outside the workflow graph is configured by the agents_update_* tools. Returns agent_id, branch_id and version_id, and a workflow_summary of the saved graph's node and edge counts and each node's type, rather than the graph itself.
Create a code tool: runs custom JavaScript in a sandboxed environment, for logic a webhook can't express. Requires an Enterprise workspace plan -- the underlying API call fails with a 'code tools are not enabled' error otherwise. Docs: https://elevenlabs.io/docs/eleven-agents/customization/tools/code-tools
Update a code tool. This PATCH replaces the whole tool config, so supply either `body` (the full replacement config) or all of name/description/source_code -- omitting `body` drops any parameters, execution_context, dynamic_variables, or response_mocks the tool previously had. Requires an Enterprise workspace plan. Docs: https://elevenlabs.io/docs/eleven-agents/customization/tools/code-tools
Generate an image from a text prompt. This is the tool for any request to create an image. Returns at once with flow_id, node_id and session_ids, plus a url the user can open to keep editing on the canvas. If a view renders it tracks progress on its own; otherwise poll creative_get_flow_run_status with the flow_id and session_ids until all_completed or has_failures is true. Pass that flow_id back to add to the same flow; omit it and a flow is created. If this generation will feed another (lipsync, a voiceover), call creative_create_flow first and pass that flow_id here and to every related call — nodes on different flows cannot be connected. Spends credits: pass estimate_only to price a run before committing to it, and never call this a second time to retry — that starts and charges a second generation.
Generate a video from a text prompt. This is the tool for any request to create a video. Returns at once with flow_id, node_id and session_ids, plus a url the user can open to keep editing on the canvas. If a view renders it tracks progress on its own; otherwise poll creative_get_flow_run_status with the flow_id and session_ids until all_completed or has_failures is true. Pass that flow_id back to add to the same flow; omit it and a flow is created. If this generation will feed another (lipsync, a voiceover), call creative_create_flow first and pass that flow_id here and to every related call — nodes on different flows cannot be connected. Spends credits: pass estimate_only to price a run before committing to it, and never call this a second time to retry — that starts and charges a second generation.
Generate speech from a text prompt. This is the tool for any request to create speech. Returns at once with flow_id, node_id and session_ids, plus a url the user can open to keep editing on the canvas. If a view renders it tracks progress on its own; otherwise poll creative_get_flow_run_status with the flow_id and session_ids until all_completed or has_failures is true. Pass that flow_id back to add to the same flow; omit it and a flow is created. If this generation will feed another (lipsync, a voiceover), call creative_create_flow first and pass that flow_id here and to every related call — nodes on different flows cannot be connected. Spends credits: pass estimate_only to price a run before committing to it, and never call this a second time to retry — that starts and charges a second generation.
Edit an existing image already on this flow: pass its node_id as connect_from and it starts at once. That node can be one an earlier creative_generate_image call on this same flow just produced ("make it darker", "same image but at sunset"), one from creative_add_flow_asset_node, or one from creative_upload_flow_reference. It must be on this flow_id — pass back the flow_id the earlier call returned rather than letting a new flow be created; nodes on different flows cannot be connected. connect_from is required; a call with none raises — call creative_upload_flow_reference first for a file on the user's own machine. Never say this connector cannot edit images, and never ask the user to attach a file to the chat. Returns flow_id, node_id and session_ids, plus a url to keep editing on the canvas. If a view renders it tracks progress on its own; otherwise poll creative_get_flow_run_status until all_completed or has_failures is true. Spends credits: never call this a second time to retry. For an image edit driven by a reference — 'change X into Y in this image' — use gpt-image-2.5-sunburst unless the user names a model. It is the default for this specifically; the plain text-to-image default does not apply once a reference is wired.
Transcribe speech in an audio file into text. This is the tool for any request to transcribe, caption or "what does this audio say". Pass connect_from with the audio node already on the flow and it starts at once; omit it and a picker is shown to the user that lets them record from their microphone or pick a local file, then uploads the audio and starts the transcription itself. Returns flow_id, node_id and session_ids, plus a url the user can open to keep editing on the canvas. If a view renders it tracks progress on its own; otherwise poll creative_get_flow_run_status until all_completed or has_failures is true — the transcript comes back in `transcripts`, each with per-word start/end seconds in `words` for captions and subtitles, plus `words_download_url` for the full list. Pass flow_id back to stay on the same flow. Do not call this a second time to retry; that starts and charges a second transcription.
Generate an image, video or speech in one call: creates a flow when flow_id is omitted, adds the node, and starts the generation. Returns flow_id, node_id and session_id, plus a link the user can open to keep editing on the canvas. Use this instead of creative_create_flow + creative_add_flow_node + creative_run_flow_nodes for a single generation. Prefer creative_generate_image, creative_generate_video or creative_generate_speech when the modality is one of those — they are the same thing with node_type already set. Use this one for the other node types, and the three-step path only to wire several nodes together. If this generation will feed another (lipsync, a voiceover), call creative_create_flow first and pass that flow_id here and to every related call — nodes on different flows cannot be connected. AFTER calling: if a view renders it tracks progress on its own; otherwise poll creative_get_flow_run_status with the flow_id and session_ids until all_completed or has_failures is true. Pass estimate_only to price a run first. Do not call this again to retry — a second call starts a second generation and is charged again.
Create an empty flow on the user's canvas and return its flow_id. Call this FIRST whenever the request combines generations — lipsync, a video with a voiceover, anything wiring one output into another — and pass the flow_id to every call that follows, so they all land somewhere they can be connected. Not needed for a single one-off generation.
Read a flow's nodes, connections and per-node run state, so an existing flow can be inspected before it is changed.
Read one node's full settings without changing it: prompt, model_id, model_parameters, and every input port with the nodes connected to it (an empty connected_to means nothing feeds that port).
List the node types and models this workspace can actually run in its region, with their default model. Call this before adding a node rather than guessing a node type.
Add one node to a flow without running it. Use connect_from to feed an earlier node's output into this node, which is how a multi-step flow is built. Creates a flow when flow_id is omitted.
Put an existing asset or a previous generation on the flow as a node, so it can be wired into another node's reference input with creative_connect_flow_nodes. Reference inputs (reference_images, start_frame, image, audio, and similar) are input ports wired with edges, never model_parameters. The returned node id is authoritative — some calls return an already-existing node rather than creating one.
Use this when the user wants a file from their own machine as a reference for a generation — for example "change the cat to a dog in this image". Returns at once with a node_id already on the flow — wire it with connect_from right away. The node is EMPTY until the user picks a file in the rendered picker; once they do, it is uploaded into that same node, and completion is published as widget context. This starts no generation and spends no credits. Not for an asset already in the workspace library — use creative_get_available_assets plus creative_add_flow_asset_node for that.
Wire an edge between two nodes that already exist on a flow. Unlike creative_add_flow_node's connect_from, which only wires a node as it is created, this repairs or extends the connections on nodes already on the canvas — for example when connect_from could not resolve a port and left the new node unwired.
Remove the edges between pairs of nodes on a flow, the reverse of creative_connect_flow_nodes. Both nodes stay on the canvas. If any pair has no edge between them, or feeds a node that is not a generation node, nothing is disconnected and the error names that pair.
Delete nodes from a flow, along with every edge into or out of them. The batch is all or nothing. Their past generations stay in the user's history. Only delete nodes the user asked to remove.
Update an existing node's model, parameters, prompt, or label. A static asset node takes only a label change. BEFORE passing model_parameters or model_id: call creative_get_model_schema(node_type, model_id) for the effective model_id during the current turn — parameter names and allowed values vary by model, and an invented name fails validation instead of being coerced. Switching model_id resets model_parameters and can change the node's input ports — the result's input_ports names the new ones, and orphaned_edges names any connection the switch dropped, which creative_connect_flow_nodes can then rewire. This never starts a generation; call creative_run_flow_nodes for that.
Apply creative_update_node to up to 50 nodes on one flow in a single call, in order. Returns only each node's success or error, not the updated nodes, so a large sweep stays small. A failed entry does not stop the rest: retry just the entries whose success is false. The same rules as creative_update_node apply to each entry. This never starts a generation.
Start generating on nodes that already exist. Charges the workspace, so poll creative_get_flow_run_status rather than calling this again.
Check whether a run has finished and read its generations, without showing anything to the user — this never renders a view. Poll it with the flow_id and session_ids a run returned, waiting poll_after_seconds between calls, until all_completed or has_failures is true. Call creative_show_flow_results instead when the goal is to put the results in front of the user.
Put a run's generations back in front of the user, rendering the same view a run starts with. Use this when the user should see results that are not already showing — for example after a run finished off-screen, or when the user asks to see something already generated. Call with the flow_id and session_ids a run returned.
Read prompting guidance for a specific model. Worth calling before writing a prompt for an unfamiliar model, since guidance differs a lot between them.
Read a model's configurable parameters — names, types, and allowed values — without changing anything. Call this for the effective model_id before passing model_parameters to creative_update_node: names and allowed values vary by model, so a name guessed from a different model (for example 'duration' instead of 'duration_secs') fails validation rather than being coerced. Reference or connectable fields (start_frame, reference_images, reference_audios, and similar input ports) are wired with creative_connect_flow_nodes, never passed inside model_parameters.
Search the voices this workspace can speak with, to choose one for a speech node instead of asking the user for a voice id. Combine the free-text search with languages, accent, gender, age, use_cases, descriptives, voice_category and sort filters to narrow results — e.g. a 'warm storytelling male' request reads better as search='warm storytelling' with gender='male' than as search text alone. descriptives and voice_category ('professional'/'famous') narrow results to library voices.
Design a brand-new voice from a text description. Not for picking a voice that already exists — use creative_list_voices for that. Needs two things from the user, never invented or auto-generated: the actual line the previews will speak (text, 100-1000 characters) and its language. Returns three previews to choose between — the result renders a picker; once the user picks one, call creative_save_designed_voice with its generated_voice_id to keep it in the workspace's voice library. The rendered view lets the user edit the line themselves and regenerate; view_state_id is how it does that and is never something you should set. Spends credits: never call this a second time to retry — that generates and charges for three more previews.
Save one preview from creative_design_voice into the workspace's voice library, returning a voice_id usable with creative_generate_speech. Call this only once the user has picked which preview to keep.
Reads back the previews of an earlier creative_design_voice round from its previews[].generated_voice_ids. Preview URLs are short-lived and expire, so this is how you get playable ones again without spending credits on another creative_design_voice call.
For the view to call when it mounts, not for you — never call this yourself. Reads back the state a view previously saved under view_state_id, so a view reopened in an old chat can rehydrate.
For the view to call as its state changes, not for you — never call this yourself. Persists opaque UI state under view_state_id so a view reopened in an old chat can rehydrate what it showed.
Search the assets already in this workspace's library, so an existing upload can be used as a reference instead of asking the user to upload one again. Pass asset_ids instead to look up specific assets already known by id. Each row carries a short-lived preview_url; the asset_id itself goes to creative_add_flow_asset_node, or to creative_finalize_asset_upload with a flow_id, whose returned node_id is then passed as connect_from to a generation tool.
Returns an upload_url; send the file's bytes there with a single HTTP PUT whose Content-Type matches mime_type exactly, then call creative_finalize_asset_upload with the returned asset_id. Never read the file into the conversation. The URL is short-lived and accepts only this one object at this exact size and type. origin is set by the view, never by the model.
Call after the PUT to the upload_url succeeds; verifies the bytes landed and makes the asset usable as a reference. Pass flow_id to place the uploaded file on that flow as a reference node in the same call — its modality (image/video/audio) is derived from the file itself — then pass the returned node_id as connect_from to a generation tool. Pass node_id too when you already have a placeholder reference node waiting for this file — it fills that node instead of creating a new one.
Use this when the file the user wants as a reference is already reachable — attached to this conversation, or at a direct https URL they gave you. We fetch it and store it as an asset, so nothing has to be uploaded again. Pass flow_id to place it on that flow as a reference node in the same call — its modality (image/video/audio) is derived from the file itself — then pass the returned node_id as connect_from to a generation tool. Pass node_id too when a placeholder reference node is already waiting for this file. Not for a file only on the user's own machine, and not for an asset already in the workspace library — use creative_get_available_assets plus creative_add_flow_asset_node for that.
List the brand kits in this workspace, with a one-line summary of what each holds. Use it when the user refers to their brand, their logo or their style guide, then read the match with creative_get_brand_kit. Brand kits are managed in the ElevenLabs app, so a kit the user mentions usually already exists — list before creating one.
Read everything inside one brand kit: its colors, typefaces, dos and don'ts, guideline summaries, brand voice, and its logos and reference media. Call it before generating anything the user wants on brand, then word the colors, typefaces and rules into the prompt yourself. Each media entry carries a content_asset_id or generation_id: pass it to creative_add_flow_asset_node and wire the node it returns with connect_from to place a logo or reference in a generation. The voice's voice_id goes to creative_generate_speech.
Create a brand kit from the colors, typography, rules, voice and workspace media you already know. Gather the brand facts first and create the kit in one call rather than creating an empty kit. A media item (logo, font, document, image, video) references an asset already in the workspace by content_asset_id — from creative_get_available_assets, creative_finalize_asset_upload or creative_attach_reference_file — or a finished generation by generation_id, read off a run's results. A voice item takes a voice_id from creative_list_voices.
Change a brand kit's name or description without changing its items.
Delete a whole brand kit. Use creative_delete_brand_kit_item instead when the user only wants one item removed. This cannot be undone, so confirm with the user first.
Add one logo, font, document, image, video, color palette, rules entry, or voice to an existing brand kit. A media item (logo, font, document, image, video) references an asset already in the workspace by content_asset_id — from creative_get_available_assets, creative_finalize_asset_upload or creative_attach_reference_file — or a finished generation by generation_id, read off a run's results. A voice item takes a voice_id from creative_list_voices.
Replace one brand-kit item wholesale. Read the kit with creative_get_brand_kit first and resend every field that should be kept; the item's type cannot change.
Remove one item from a brand kit while leaving the rest in place.
Build a new brand kit by reading a public website the user named: its logo, colors, typography and tone. Extraction is best-effort and takes a while; use the returned kit as a starting point and refine it with the item tools.
Call this when the user's request cannot be completed with any of the available tools. Describe the capability you were looking for, so it can inform which tools get built next. Do not call it when an available tool already covers the request.
One endpoint, the same key, whichever client you use.
~/Library/Application Support/Claude/claude_desktop_config.json (Mac) · %APPDATA%\Claude\claude_desktop_config.json (Windows)
Replace API_KEY with your own key.
Already have an "mcpServers" section in your config? Just add the server entry inside it.
Discovery, routing, credentials, tool scoping and execution logs all happen at the gateway→connections stay ACTIVE with no work from you
ElevenLabs MCP runs through a gateway that holds the credentials, scopes the access and records every call.
Managed auth, hosted MCP servers, and every Gmail tool your agent needs.
Free to start.