From elevenlabs-pack
Diagnoses ElevenLabs API errors (401 auth/quota, 400 voice/text issues, 429) with causes, fixes, and curl tests for auth, quota, voices. For TTS, streaming, voice cloning debugging.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin elevenlabs-packThis skill is limited to using the following tools:
Quick diagnostic reference for ElevenLabs API errors organized by HTTP status code, with real error messages, causes, and solutions.
Implements ElevenLabs rate limiting with plan-aware concurrency queuing, exponential backoff, and 429 error handling for TTS requests.
Build and troubleshoot ElevenLabs TTS integrations in Node/Python/web apps: auth, voice/model selection, streaming vs batch generation, latency, fallbacks, secure API keys.
Diagnoses and fixes Speak API errors: authentication, audio format (WAV 16kHz mono), rate limits, session expiration. Includes curl checks, ffprobe validation, TypeScript retry patterns.
Share bugs, ideas, or general feedback.
Quick diagnostic reference for ElevenLabs API errors organized by HTTP status code, with real error messages, causes, and solutions.
# Test API connectivity and auth
curl -s -w "\nHTTP %{http_code}" \
https://api.elevenlabs.io/v1/user \
-H "xi-api-key: ${ELEVENLABS_API_KEY}"
# Check character quota
curl -s https://api.elevenlabs.io/v1/user \
-H "xi-api-key: ${ELEVENLABS_API_KEY}" | \
jq '.subscription | {tier, character_count, character_limit}'
# List available voices (confirms API access)
curl -s https://api.elevenlabs.io/v1/voices \
-H "xi-api-key: ${ELEVENLABS_API_KEY}" | jq '.voices | length'
Error: invalid_api_key
{
"detail": {
"status": "invalid_api_key",
"message": "Invalid API key"
}
}
Cause: API key is missing, malformed, or revoked. Fix:
# Verify key is set
echo "${ELEVENLABS_API_KEY:0:8}..."
# Test with curl
curl -s https://api.elevenlabs.io/v1/user -H "xi-api-key: ${ELEVENLABS_API_KEY}"
# Regenerate at: https://elevenlabs.io/app/settings/api-keys
Error: quota_exceeded
{
"detail": {
"status": "quota_exceeded",
"message": "You have insufficient quota to complete this request"
}
}
Cause: Monthly character limit reached for your plan. Fix: Check usage at https://elevenlabs.io/app/usage. Upgrade plan, or on Creator+ plans, enable usage-based billing in Subscription settings.
Error: voice_not_found
{
"detail": {
"status": "voice_not_found",
"message": "Voice not found"
}
}
Cause: Invalid voice_id in request path.
Fix:
# List your available voices
curl -s https://api.elevenlabs.io/v1/voices \
-H "xi-api-key: ${ELEVENLABS_API_KEY}" | \
jq '.voices[] | {voice_id, name, category}'
Error: text_too_long
{
"detail": {
"status": "text_too_long",
"message": "Text is too long. Maximum text length is 5000 characters."
}
}
Cause: Single TTS request exceeds 5,000 characters.
Fix: Split text into chunks. Use previous_text and next_text parameters to maintain prosody across chunks:
const audio = await client.textToSpeech.convert(voiceId, {
text: currentChunk,
previous_text: previousChunk, // Helps maintain flow
next_text: nextChunk, // Helps maintain flow
model_id: "eleven_multilingual_v2",
});
Error: model_not_found
{
"detail": {
"status": "model_not_found",
"message": "Model not found"
}
}
Cause: Invalid model_id string.
Fix: Use exact model IDs: eleven_v3, eleven_multilingual_v2, eleven_flash_v2_5, eleven_turbo_v2_5, eleven_monolingual_v1, eleven_english_sts_v2.
Error: too_many_concurrent_requests
{
"detail": {
"status": "too_many_concurrent_requests",
"message": "Too many concurrent requests"
}
}
Cause: Exceeded concurrent request limit for your plan. Fix: Queue requests. Concurrency limits by plan:
| Plan | Concurrent Requests |
|---|---|
| Free | 2 |
| Starter | 3 |
| Creator | 5 |
| Pro | 10 |
| Scale | 15 |
| Business | 15 |
import PQueue from "p-queue";
const queue = new PQueue({ concurrency: 5 }); // Match your plan
await queue.add(() => client.textToSpeech.convert(voiceId, options));
Error: system_busy
{
"detail": {
"status": "system_busy",
"message": "Our services are experiencing high traffic"
}
}
Cause: ElevenLabs servers under heavy load.
Fix: Retry with exponential backoff (the SDK does this automatically with maxRetries):
const client = new ElevenLabsClient({
maxRetries: 3, // Auto-retries 429 and 5xx
});
Error: invalid_voice_sample
{
"detail": {
"status": "invalid_voice_sample",
"message": "Invalid audio file"
}
}
Cause: Voice cloning audio file is corrupt, too short, or wrong format. Fix: Ensure audio is MP3/WAV/M4A/FLAC, at least 30 seconds, clean speech without music.
Connection fails silently:
WebSocket connection to 'wss://api.elevenlabs.io/v1/text-to-speech/...' failed
Cause: Missing xi_api_key in the first WebSocket message, or using eleven_v3 model (not supported for WebSocket).
Fix:
ws.send(JSON.stringify({
text: " ",
xi_api_key: process.env.ELEVENLABS_API_KEY, // Required in WS
model_id: "eleven_flash_v2_5", // v3 NOT supported for WS
}));
curl -s https://api.elevenlabs.io/v1/user -H "xi-api-key: $ELEVENLABS_API_KEY"character_count vs character_limit in the responseGET /v1/voices to list valid IDs| HTTP | Error | Retryable | Action |
|---|---|---|---|
| 400 | Bad request | No | Fix request parameters |
| 401 | Auth/quota | No | Check key or upgrade plan |
| 404 | Not found | No | Verify voice_id/model_id |
| 422 | Validation | No | Fix input data format |
| 429 | Rate limit | Yes | Backoff + queue requests |
| 500+ | Server error | Yes | Retry with backoff |
For comprehensive debugging, see elevenlabs-debug-bundle. For rate limit handling, see elevenlabs-rate-limits.