Genies are voice AI agents powered by ElevenLabs. Each genie has its own system prompt, voice configuration, conversation settings, and optional phone number.
Standard users can only manage their own genies. Admin users can manage all genies and view owner information by passing adminMode: true.
List genies
Retrieves a paginated list of genies with optional search filtering. Returns essential fields suitable for lists and dropdowns.
Results per page. Maximum 500.
Number of results to skip.
Filter genies by name (case-insensitive).
Whether the request succeeded.
Unique genie identifier (UUID).
ElevenLabs agent identifier.
Whether the genie is currently active.
Genie category (for example "Support", "Sales").
ISO 8601 creation timestamp.
Total number of genies matching the filters.
The limit that was applied.
The offset that was applied.
ApiService.invoke()
Request body
Response
const response = await ApiService . invoke ( "genies" , "list" , undefined , {
limit: 30 ,
offset: 0 ,
filters: {
searchTerm: "support" ,
},
});
Get all genies
Retrieves all genies with full configuration using cursor-based pagination. Returns complete genie objects including settings, phone, page, group, and knowledge base data.
Results per page, between 1 and 500.
Pagination cursor returned from a previous request (nextCursor).
Admin only. When true, includes owner profile information in the response.
Admin only. Filter genies to those owned by a specific user.
Whether the request succeeded.
Array of full genie objects. See the get genie response for the complete shape.
Pass this value as cursor in the next request to fetch the next page. null when no more results.
Whether more results are available beyond this page.
ApiService.invoke()
cURL
Request body
Response
// First page
const page1 = await ApiService . invoke ( "genies" , "all" , undefined , {
limit: 25 ,
});
// Next page
const page2 = await ApiService . invoke ( "genies" , "all" , undefined , {
limit: 25 ,
cursor: page1 . data . nextCursor ,
});
When adminMode is true, each genie includes an owner field with id, full_name, and email. Standard users always see owner: null.
Get genie
Retrieves a single genie by ID with its full configuration, including settings, phone number, page, group, and knowledge base.
The UUID of the genie to retrieve.
Whether the request succeeded.
Unique genie identifier (UUID).
ElevenLabs agent identifier.
Whether the genie is active.
Whether the genie has completed initial setup.
Whether conversation reports are sent after calls.
Full genie configuration including conversation config, TTS settings, and turn settings. Initial greeting message.
Whether voice is disabled.
Maximum conversation duration in seconds.
Seconds before a turn times out.
Seconds of silence before ending the call.
Turn detection mode (for example "silence").
Maximum number of calls allowed.
Attached phone number, or null. Phone number in E.164 format.
Phone status (for example "active").
Web page configuration, or null. Welcome message displayed on the page.
Group the genie belongs to, or null. Documents attached to this genie. Whether the document is active.
ISO 8601 creation timestamp.
ISO 8601 last-updated timestamp.
ApiService.invoke()
cURL
Request body
Response
const response = await ApiService . invoke (
"genies" ,
"get" ,
"550e8400-e29b-41d4-a716-446655440000"
);
Create genie
Creates a new voice AI genie with the specified configuration. The genie is automatically provisioned in ElevenLabs.
Display name for the genie.
Primary use case describing what the genie does.
System prompt defining the genie’s behavior and personality.
Initial greeting message spoken when a conversation starts.
Welcome message displayed on the web interface before a call begins.
ElevenLabs voice ID. Defaults to the platform default voice.
llmModel
string
default: "gemini-3-flash-preview"
LLM model identifier.
LLM temperature between 0 and 2.
Maximum number of tokens in the LLM response.
Enable multilingual voice support.
Voice stability between 0 and 1.
Voice similarity between 0 and 1.
Maximum conversation duration in seconds.
Seconds before a turn times out.
Seconds of silence before ending the call.
Detailed description of the genie.
Email addresses for the support team.
Send email reports after each conversation.
Provision and attach a phone number to this genie.
Whether the request succeeded.
ISO 8601 creation timestamp.
ISO 8601 last-updated timestamp.
ApiService.invoke()
cURL
Request body
Response
const response = await ApiService . invoke ( "genies" , "create" , undefined , {
genieName: "Customer Support Bot" ,
useCase: "Handle customer support inquiries" ,
systemPrompt:
"You are a helpful customer support representative. Be friendly and professional." ,
firstMessage:
"Hello! Welcome to our support team. How can I help you today?" ,
webWelcomeMessage: "Let's connect with our support team" ,
voiceId: "EZ3epTG1EiOmx2GWRto6" ,
llmModel: "gemini-3-flash-preview" ,
temperature: 0.7 ,
maxTokens: 8000 ,
brand: "Acme Corp" ,
category: "Support" ,
description: "AI-powered customer support assistant" ,
supportEmails: [ "support@acme.com" ],
sendConversationReports: true ,
attachPhoneNumber: false ,
});
Admin users can create genies on behalf of other users by including impersonatedUserId in the data object.
Update genie
Updates an existing genie’s configuration. Supports partial updates — only the fields you include will be changed.
The UUID of the genie to update.
Nested settings object. Fields are merged, not replaced. Branding configuration. Merged with existing branding.
Whether the request succeeded.
ApiService.invoke()
Request body
Response
const response = await ApiService . invoke (
"genies" ,
"update" ,
"550e8400-e29b-41d4-a716-446655440000" ,
{
name: "Updated Bot Name" ,
description: "Updated description" ,
settings: {
conversation_config: {
agent: {
first_message: "Updated greeting message" ,
prompt: {
prompt: "You are an advanced customer support AI..." ,
temperature: 0.8 ,
max_tokens: 2048 ,
},
},
tts: {
voice_id: "new-voice-id" ,
stability: 0.8 ,
similarity_boost: 0.9 ,
speed: 1.05 ,
},
},
},
}
);
Delete genie
Permanently deletes a genie, removes it from ElevenLabs, and releases any associated phone numbers.
The UUID of the genie to delete.
Whether the request succeeded.
This action is irreversible. The genie, its ElevenLabs agent, and any attached phone numbers will be permanently removed.
ApiService.invoke()
Request body
Response
const response = await ApiService . invoke (
"genies" ,
"delete" ,
"550e8400-e29b-41d4-a716-446655440000"
);
Reorder genies
Updates the display order of genies. Pass an object mapping genie IDs to their desired position (zero-indexed).
An object where keys are genie UUIDs and values are integer positions starting from 0.
Whether the request succeeded.
ApiService.invoke()
Request body
Response
const response = await ApiService . invoke ( "genies" , "reorder" , undefined , {
sort: {
"550e8400-e29b-41d4-a716-446655440000" : 0 ,
"990e8400-e29b-41d4-a716-446655440004" : 1 ,
"aa0e8400-e29b-41d4-a716-446655440005" : 2 ,
},
});
Error codes
Code Status Description UNAUTHORIZED401 Missing or invalid token INVALID_TOKEN401 Token validation failed FORBIDDEN403 User lacks required permissions AGENT_NOT_FOUND404 Genie not found or access denied VALIDATION_ERROR400 Invalid request parameters INTERNAL_ERROR500 Server error