Generate speech, sound effects and transcripts with ElevenLabs: text-to-speech with character timestamps, speech-to-text, the voice library, models, generation history and plan usage.
ElevenLabs ships in the w6w first-party pack. It declares 22 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.
io.w6w.elevenlabsElevenLabs turns text into speech and audio into text, and this app covers the generative-audio surface a workflow reaches for: text-to-speech with optional per-character timestamps for captioning or lip-sync, speech-to-text from a hosted audio or video URL, and one-shot sound-effect generation.
Beyond generation, it manages the voice catalogue and public library — listing, reading and editing voice settings, and adding a shared voice to your own account — plus generation history, including re-downloading past audio without spending new credits, and ElevenLabs Studio project listings.
It also surfaces account and plan visibility: current subscription tier, character usage against your limit, and remaining voice slots, so a workflow can check headroom before an expensive batch of generations. Health checks track ElevenLabs’ own status page and that same plan headroom, and audio responses come back as portable base64 so a workflow step can pass generated speech straight to whatever comes next.
Three routes to the same 22 actions. The Workflow tab is generated from ElevenLabs's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.
history-audio-get Re-download the audio of a past generation as base64. Costs no characters — it is not regenerated.
history-get Fetch one past generation's metadata, including its request_id and cost.
history-list List past generations, filtered by voice, model, source, text or date.
model-list List the models available to this account, with their capabilities, limits and cost factors.
sound-generation Generate a sound effect from a text prompt. Returns base64-encoded audio.
speech-to-text Transcribe an audio or video file addressed by URL, with optional diarization.
studio-project-get Fetch one Studio project in full, including its chapters and default settings.
subscription-get Read the plan tier, character allowance, voice slots and overage state.
text-to-speech Synthesise speech from text with a chosen voice. Returns base64-encoded audio.
text-to-speech-with-timestamps Synthesise speech and get per-character start/end times alongside the base64 audio.
usage-character-stats-get Read usage over a time window as a series, optionally broken down by voice, model, API key or user.
user-get Fetch the connected account's profile. The account's own API key is removed from the response; the vendor's masked preview of it is kept.
voice-add-from-library Copy a public Voice Library voice into this account under a name you choose.
voice-library-search Search the public Voice Library for voices you can add to this account.
voice-settings-default-get Read the platform-wide default voice settings.
voice-settings-edit Replace a voice's stored settings. Send every field you want to keep — omitted fields are not preserved.
A workflow step names the app and the action, and the editor fills in the
connection when you pick one. This is the Step shape from the
workflow spec, carrying ElevenLabs's real ids.
{
"manifestVersion": "2",
"name": "elevenlabs-example",
"steps": [
{
"id": "history-audio-get",
"uses": {
"app": "io.w6w.elevenlabs",
"action": "history-audio-get",
"connection": "conn_YOUR_CONNECTION_ID"
},
"with": {
"historyItemId": "<historyItemId>"
}
}
]
}history-audio-get history-get history-list model-list sound-generation +17 more actions available
Every app-specific value here is a blank you have to fill in. An
app action is reached through the connection that authenticates it, so the
address is a connection id, not the app id — and connections belong to your account,
so a public page cannot know yours. Create one for ElevenLabs, then fill in
the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the
parameters that action declares. The call itself is real — the shape is transcribed
from the studio's own snippet builder, which prints the same kind of blanks — but
nothing in it is specific to ElevenLabs. The Workflow tab is where this app's
real ids are.
npm install @w6w/sdkyarn add @w6w/sdkpnpm add @w6w/sdkdeno add npm:@w6w/sdkimport { W6wClient, isActionRun } from "@w6w/sdk";
// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();
const envelope = await client.run({
urn: "conn_YOUR_CONNECTION_ID",
action: "text-to-speech",
payload: {
voiceId: "<value>",
text: "<value>",
// modelId: "<value>",
// outputFormat: "<value>",
// languageCode: "<value>",
// voiceSettings: "<value>",
// seed: "<value>",
// applyTextNormalization: "<value>",
// previousText: "<value>",
// nextText: "<value>",
// previousRequestIds: "<value>",
// nextRequestIds: "<value>",
// enableLogging: "<value>",
},
});
if (isActionRun(envelope)) console.log(envelope.value); npm install -g @w6w/cli w6w run conn_YOUR_CONNECTION_ID --action text-to-speech --payload '{"voiceId":"<value>","text":"<value>"}' Give an AI agent ElevenLabs — without giving it ElevenLabs's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.
One tool call{
"name": "w6w_invoke",
"arguments": {
"ref": "app:io.w6w.elevenlabs#history-audio-get",
"input": {
"historyItemId": "<historyItemId>"
}
}
}
Every tool names its target with a single ref. The
app: form above doesn't name a connection at all — the
host resolves which of the caller's ElevenLabs connections to sign
with, and refuses rather than guesses when the answer is ambiguous.
The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.
Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.
Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.
ElevenLabs's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.
The MCP surface is part of the hosted platform. ElevenLabs itself is MIT, and the runtime that executes it is source-available (FSL).
ElevenLabs declares its own checks, so its health is a property of the app rather than something the host guesses at.
Component status from status.elevenlabs.io. Covers Text to Speech, Speech to Text, Conversations, Telephony, RAG, Quality, UI, Integrations, ElevenCreative and the catch-all API endpoint components.
Character/credit allowance for the current billing period, plus voice slots and voice add/edit allowance, read from GET /v1/user/subscription.