Design & media

ElevenLabs

Try it

Generate speech, clone voices, and create sound effects through the ElevenLabs API with managed authentication.

What it does

Routes ElevenLabs API calls through a Maton proxy at api.maton.ai/elevenlabs/, authenticating with a MATON_API_KEY bearer token and per-app OAuth connections. Covers text-to-speech, voice cloning and management, sound effects, audio isolation, speech-to-text, speech-to-speech, projects, and pronunciation dictionaries. Write operations such as voice edits, history deletes, or new connections require explicit user confirmation.

When to use it

  • Generate speech audio from text
  • Clone or manage custom voices
  • Create sound effects from text prompts
  • Transcribe or convert speech audio

The skill document

ElevenLabs

Access the ElevenLabs API with managed authentication. Generate lifelike speech from text, clone voices, create sound effects, and process audio.

Quick Start

# List available voices
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/elevenlabs/v1/voices')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Base URL

https://api.maton.ai/elevenlabs/{native-api-path}

Maton proxies requests to api.elevenlabs.io and automatically injects your API key.

Authentication

All requests require the Maton API key in the Authorization header:

Authorization: Bearer $MATON_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

Getting Your API Key

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your ElevenLabs connections at https://api.maton.ai.

List Connections

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=elevenlabs&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Connection

python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'elevenlabs'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Connection

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "connection": {
    "connection_id": "{connection_id}",
    "status": "ACTIVE",
    "creation_time": "2026-02-12T00:50:40.292363Z",
    "last_updated_time": "2026-02-12T00:51:14.547893Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "elevenlabs",
    "metadata": {}
  }
}

Open the returned url in a browser to complete authorization.

Delete Connection

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Specifying Connection

If you have multiple ElevenLabs connections, specify which one to use with the Maton-Connection header:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/elevenlabs/v1/voices')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If you have multiple connections, always include this header to ensure requests go to the intended account.

Security & Permissions

  • Access is scoped to text-to-speech, voices, voice cloning, audio generation, and projects within the connected ElevenLabs account.
  • All write operations require explicit user approval. Before executing any create, update, or delete call, confirm the target resource and intended effect with the user.

API Reference

Text-to-Speech

Convert Text to Speech

POST /elevenlabs/v1/text-to-speech/{voice_id}
Content-Type: application/json

{
  "text": "Hello, this is a test of the ElevenLabs API.",
  "model_id": "eleven_multilingual_v2",
  "voice_settings": {
    "stability": 0.5,
    "similarity_boost": 0.75
  }
}

Returns audio data (mp3 by default).

Query parameters:

  • output_format - Audio format (e.g., mp3_44100_128, pcm_16000, pcm_22050)

Stream Text to Speech

POST /elevenlabs/v1/text-to-speech/{voice_id}/stream
Content-Type: application/json

{
  "text": "Hello, this is streamed audio.",
  "model_id": "eleven_multilingual_v2"
}

Returns streaming audio data.

Text to Speech with Timestamps

POST /elevenlabs/v1/text-to-speech/{voice_id}/with-timestamps
Content-Type: application/json

{
  "text": "Hello world",
  "model_id": "eleven_multilingual_v2"
}

Returns audio with word-level timestamps.

Voices

List Voices

GET /elevenlabs/v1/voices

Returns all available voices including premade and cloned voices.

Get Voice

GET /elevenlabs/v1/voices/{voice_id}

Returns metadata about a specific voice.

Get Default Voice Settings

GET /elevenlabs/v1/voices/settings/default

Get Voice Settings

GET /elevenlabs/v1/voices/{voice_id}/settings

Create Voice Clone

POST /elevenlabs/v1/voices/add
Content-Type: multipart/form-data

name: My Cloned Voice
files: [audio_sample.mp3]
description: A custom voice clone
remove_background_noise: false

Edit Voice

PATCH /elevenlabs/v1/voices/{voice_id}/edit
Content-Type: multipart/form-data

name: Updated Voice Name
description: Updated description

Delete Voice

DELETE /elevenlabs/v1/voices/{voice_id}

Models

List Models

GET /elevenlabs/v1/models

Returns available models:

  • eleven_multilingual_v2 - Latest multilingual model
  • eleven_turbo_v2_5 - Low-latency model
  • eleven_monolingual_v1 - Legacy English model (deprecated)

User

Get User Info

GET /elevenlabs/v1/user

Get Subscription Info

GET /elevenlabs/v1/user/subscription

Returns subscription details including character limits and usage.

History

List History Items

GET /elevenlabs/v1/history?page_size=100

Query parameters:

  • page_size - Number of items per page (default: 100, max: 1000)
  • start_after_history_item_id - Cursor for pagination
  • voice_id - Filter by voice

Get History Item

GET /elevenlabs/v1/history/{history_item_id}

Get Audio from History

GET /elevenlabs/v1/history/{history_item_id}/audio

Returns the audio file for a history item.

Delete History Item

DELETE /elevenlabs/v1/history/{history_item_id}

Download History Items

POST /elevenlabs/v1/history/download
Content-Type: application/json

{
  "history_item_ids": ["id1", "id2", "id3"]
}

Returns a zip file with the requested audio files.

Sound Effects

Generate Sound Effect

POST /elevenlabs/v1/sound-generation
Content-Type: application/json

{
  "text": "A thunderstorm with heavy rain and distant thunder",
  "duration_seconds": 10.0
}

Query parameters:

  • output_format - Audio format (e.g., mp3_44100_128)

Audio Isolation

Remove Background Noise

POST /elevenlabs/v1/audio-isolation
Content-Type: multipart/form-data

audio: [audio_file.mp3]

Returns cleaned audio with background noise removed.

Stream Audio Isolation

POST /elevenlabs/v1/audio-isolation/stream
Content-Type: multipart/form-data

audio: [audio_file.mp3]

Speech-to-Text

Transcribe Audio

POST /elevenlabs/v1/speech-to-text
Content-Type: multipart/form-data

audio: [audio_file.mp3]
model_id: scribe_v1

Returns transcription with optional word-level timestamps.

Speech-to-Speech (Voice Changer)

Convert Voice

POST /elevenlabs/v1/speech-to-speech/{voice_id}
Content-Type: multipart/form-data

audio: [source_audio.mp3]
model_id: eleven_multilingual_sts_v2

Transforms audio to use a different voice while preserving intonation.

Projects

List Projects

GET /elevenlabs/v1/projects

Get Project

GET /elevenlabs/v1/projects/{project_id}

Create Project

POST /elevenlabs/v1/projects
Content-Type: application/json

{
  "name": "My Audiobook Project",
  "default_title_voice_id": "voice_id",
  "default_paragraph_voice_id": "voice_id"
}

Pronunciation Dictionaries

List Pronunciation Dictionaries

GET /elevenlabs/v1/pronunciation-dictionaries

Create Pronunciation Dictionary

POST /elevenlabs/v1/pronunciation-dictionaries/add-from-file
Content-Type: multipart/form-data

name: My Dictionary
file: [lexicon.pls]

Response Headers

ElevenLabs API responses include useful headers:

  • x-character-count - Characters used in the request
  • request-id - Unique request identifier

Pagination

History and other list endpoints use cursor-based pagination:

GET /elevenlabs/v1/history?page_size=100&start_after_history_item_id=last_item_id

Code Examples

JavaScript - Text to Speech

const response = await fetch(
  'https://api.maton.ai/elevenlabs/v1/text-to-speech/JBFqnCBsd6RMkjVDRZzb',
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      text: 'Hello world!',
      model_id: 'eleven_multilingual_v2'
    })
  }
);
const audioBuffer = await response.arrayBuffer();

Python - Text to Speech

import os
import requests

response = requests.post(
    'https://api.maton.ai/elevenlabs/v1/text-to-speech/JBFqnCBsd6RMkjVDRZzb',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
    json={
        'text': 'Hello world!',
        'model_id': 'eleven_multilingual_v2'
    }
)
audio_data = response.content
with open('output.mp3', 'wb') as f:
    f.write(audio_data)

Python - List Voices

import os
import requests

response = requests.get(
    'https://api.maton.ai/elevenlabs/v1/voices',
    headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
voices = response.json()
for voice in voices['voices']:
    print(f"{voice['name']}: {voice['voice_id']}")

Notes

  • Text-to-Speech is billed per character
  • Sound Effects are billed per generation
  • Speech-to-Text is billed per audio minute
  • Audio output format can be specified as codec_sample_rate_bitrate (e.g., mp3_44100_128)
  • Models available: eleven_multilingual_v2 (recommended), eleven_turbo_v2_5 (low latency)
  • Voice IDs can be found using the List Voices endpoint
  • Maximum text length varies by model
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
  • IMPORTANT: When piping curl output to jq, environment variables may not expand correctly. Use Python examples instead.

Error Handling

StatusMeaning
400Missing ElevenLabs connection or invalid request
401Invalid or missing Maton API key
403Insufficient permissions or quota exceeded
422Invalid parameters
429Rate limited
4xx/5xxPassthrough error from ElevenLabs API

Troubleshooting: API Key Issues

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Troubleshooting: Invalid App Name

  1. Ensure your URL path starts with elevenlabs. For example:
  • Correct: https://api.maton.ai/elevenlabs/v1/voices
  • Incorrect: https://api.maton.ai/v1/voices

Resources

Questions people ask

How is authentication handled?
Each request carries MATON_API_KEY as a Bearer token; Maton proxies the call to api.elevenlabs.io and injects the upstream ElevenLabs key. Use the /connections endpoints to create, list, or revoke ElevenLabs connections, and the Maton-Connection header to target a specific account.
What API areas are exposed?
Text-to-speech (convert, stream, with timestamps), voices (list, get, clone, edit, delete, settings), models, user and subscription, history (list, fetch, audio, delete, bulk download), sound generation, audio isolation, speech-to-text, speech-to-speech, projects, and pronunciation dictionaries.
Do write operations require approval?
Yes. Access is scoped to TTS, voices, cloning, audio generation, and projects within the connected account, and any create, update, or delete call must be confirmed with the user beforehand.

Related skills

Join a video meeting as an AI bot with voice, avatar, and screenshare across four operating modes.

by johnpatternai21 installs8 stars

Stores durable facts in a categorized, plain-markdown vault on disk, alongside your agent's built-in memory.

by Iván556 installs18 stars

Generate and edit Draw.io, Mermaid, and Excalidraw diagrams from natural language using a structured JSON spec.

by nssa.io1.0k installs47 stars

Fetch raw ad creative, app, ranking, and revenue data from AdMapix as structured JSON.

by fly0pants4.3k installs296 stars

Find why your productivity system keeps failing, then apply the smallest fix — capacity math, bottleneck routing, durable local notes.

by Iván855 installs69 stars

More from byungkyu

Browse all skills

Read and write Excel workbooks, worksheets, ranges, tables, and charts in OneDrive through Microsoft Graph with managed OAuth.

by byungkyu802 installs42 stars

Manage Stripe customers, subscriptions, invoices, products, prices, and payments through OAuth-authenticated API calls.

by byungkyu721 installs29 stars

Search, read, and manage YouTube videos, playlists, channels, subscriptions, and comments via managed OAuth.

by byungkyu883 installs145 stars

Manage WooCommerce products, orders, customers, coupons, shipping, taxes, and more through managed OAuth REST API calls.

by byungkyu510 installs18 stars

Manage ClickUp workspaces, spaces, folders, lists, and tasks via the ClickUp API with managed OAuth.

by byungkyu612 installs12 stars

Query and manage Salesforce CRM records via REST API with managed OAuth authentication.

by byungkyu705 installs8 stars