Skip to main content
Sniko uses ElevenLabs as its core AI voice engine. Every agent you create in Sniko is backed by an ElevenLabs Conversational AI agent. Voices, knowledge bases, and live conversation sessions are all managed through the ElevenLabs API.

Prerequisites

ElevenLabs Conversational AI features — including agents and real-time conversation sessions — require a paid ElevenLabs plan. A free-tier key will allow basic API connectivity but will not support agent creation or live calls.

Getting your API key

1

Log in to ElevenLabs

Go to elevenlabs.io and sign in to your account.
2

Open API keys

Click your avatar in the top-right corner, then select Profile + API key. Your API key is shown under the API Key section. Copy it.
3

Add the key to Sniko

Open your .env file and set:
.env
ELEVENLABS_API_KEY=sk_your_key_here
Then run php artisan config:clear to reload the configuration.
Sniko reads this key from config/elevenlabs.php via the ELEVENLABS_API_KEY environment variable. It is also registered in config/services.php under the elevenlabs key for use across the application.

What Sniko uses ElevenLabs for

Conversational AI agents

Each Sniko agent maps to an ElevenLabs agent. Sniko creates, updates, and deletes agents through the ElevenLabs API when you manage them in the UI.

Voices

Sniko fetches available voices from ElevenLabs — both shared library voices and voices you have created or cloned — so you can assign them to agents.

Knowledge bases

Documents uploaded to Sniko are pushed to ElevenLabs as knowledge base entries. Agents use these documents during conversations for retrieval-augmented responses.

Conversation sessions

Live and batch call sessions are initiated and tracked through ElevenLabs. Conversation history, audio recordings, and extracted data all originate from the ElevenLabs conversation API.

Customer isolation

Sniko enforces strict per-customer isolation on all ElevenLabs resources. When a resource (agent, voice, or knowledge base) is created for a customer, Sniko prefixes its display name with the customer’s UUID:
[{customer_uuid}] Resource Name
This prefix is stripped when displaying names in the UI, but it is stored in ElevenLabs exactly as shown above. This means:
  • Admin users see all resources across all customers.
  • Each customer only sees resources that carry their own UUID prefix.
  • Cache keys for ElevenLabs API responses are scoped per user (elevenlabs_{resource}_{customer_uuid}), preventing cross-customer data leakage even at the cache layer.

Webhook secret

Some ElevenLabs tool integrations (custom webhooks, SMS tools) send signed requests back to Sniko. Set the webhook secret so Sniko can verify these signatures:
.env
ELEVENLABS_TOOL_WEBHOOK_SECRET=your_webhook_secret_here
The base URL for API calls defaults to https://api.elevenlabs.io but can be overridden:
.env
ELEVENLABS_BASE_URL=https://api.elevenlabs.io

Plan requirements and quotas

Sniko tracks and enforces quotas against ElevenLabs resource limits based on the customer’s Sniko subscription plan. The following ElevenLabs features require a paid plan:
FeatureRequirement
Conversational AI agentsStarter plan or higher
Voice Design (generative voices)Creator plan or higher
Instant Voice CloningStarter plan or higher
Concurrent conversation sessionsVaries by plan
When an ElevenLabs API call fails due to quota exhaustion, Sniko surfaces a clear error message and logs the event. Quota counters in Sniko are updated on each API response so usage is reflected in real time.
Use the ElevenLabs dashboard to monitor your character and minute usage independently of Sniko quotas. Sniko’s internal quotas are set by your Sniko plan, while ElevenLabs enforces its own account-level limits.

Rate limits and timeouts

The Sniko HTTP client for ElevenLabs is configured with:
  • Connection timeout: 30 seconds
  • Request timeout: 120 seconds (voice generation can be slow on large inputs)
If ElevenLabs returns a rate-limit error (HTTP 429), the operation fails and is logged. You can configure your queue workers to retry these jobs automatically.

Verifying connectivity

After adding your API key, confirm the connection is working:
php artisan tinker --execute 'app(\App\Services\ElevenLabsService::class)->testApiConnectivity();'
A successful response returns ['success' => true]. If the key is missing or invalid, you will see a RuntimeException with the message ElevenLabs API key is not configured.

Build docs developers (and LLMs) love