Equos.ai official Node.js SDK - Build AI-powered avatars with lifelike faces, voices, and brains.
| SDK | Platform | Package |
|---|---|---|
| @equos/browser-sdk | Browser (vanilla JS/TS) | npm |
| @equos/react | Browser (React) | npm |
| @equos/node-sdk | Node.js (server-side only) | npm |
| equos | Python (server-side only) | PyPI |
- ✅ Full TypeScript Support - Auto-generated types from OpenAPI specification
- ✅ Automatic API Key Management - API key automatically added to all requests
- ✅ Character Management - Create and manage AI characters with faces, voices, and brains
- ✅ Resource Management - Manage faces, voices, brains, and knowledge bases
- ✅ Conversations - Start, stop, list, and fetch live avatar conversations
- ✅ Client Tokens - Mint short-lived tokens for browser and mobile SDKs
- ✅ Health & Organization - Monitor API health and freemium usage
- Go to Equos Studio
- Create an organization
- Create an API Key
npm install @equos/node-sdkimport{EquosClient}from'@equos/node-sdk';// Create client with your API keyconstclient=EquosClient.create(process.env.EQUOS_API_KEY!);// List all charactersconstcharacters=awaitclient.characters.listCharacters({take: 10,skip: 0,});console.log(`Found ${characters.total} characters`);Don't have an API key? Create one here
constclient=EquosClient.create('your-api-key');// Uses: https://api.equos.aiCharacters are the main entities that combine faces, voices, brains, and knowledge bases.
import{CreateEquosCharacterRequest,EquosCharacter}from'@equos/node-sdk';constcharacterData: CreateEquosCharacterRequest={name: 'AI Assistant',livekitIdentity: 'ai-assistant-001',faceId: 'face-id-here',// OptionalvoiceId: 'voice-id-here',// OptionalbrainId: 'brain-id-here',// OptionalknowledgeBaseId: 'kb-id',// Optionalsearch: false,// Enable web search};constcharacter: EquosCharacter=awaitclient.characters.createCharacter({createEquosCharacterRequest: characterData,});console.log('Created character:',character.id);constresponse=awaitclient.characters.listCharacters({take: 20,// Number of items to return (max 50)skip: 0,// Number of items to skipclient: 'my-app',// Optional: filter by client identifier});console.log(`Total: ${response.total}`);response.characters.forEach((char)=>{console.log(`- ${char.name} (${char.id})`);});constcharacter=awaitclient.characters.getCharacter({id: 'character-id',});console.log('Character:',character);// Includes populated face, voice, brain, and knowledgeBase objectsimport{UpdateEquosCharacterRequest}from'@equos/node-sdk';constupdates: UpdateEquosCharacterRequest={name: 'Updated Name',voiceId: 'new-voice-id',brainId: 'new-brain-id',};constupdated=awaitclient.characters.updateCharacter({id: 'character-id',updateEquosCharacterRequest: updates,});constdeleted=awaitclient.characters.deleteCharacter({id: 'character-id',});Faces define the visual appearance of your AI characters.
import{CreateEquosFaceRequest}from'@equos/node-sdk';constfaceData: CreateEquosFaceRequest={identity: 'byron',// or 'emily' - from Equos Galleryclient: 'my-app',// Optional: client identifier};constface=awaitclient.faces.createFace({createEquosFaceRequest: faceData,});console.log('Face ID:',face.id);console.log('Status:',face.status);// 'processing', 'ready', or 'error'constfaces=awaitclient.faces.listFaces({take: 10,skip: 0,});faces.faces.forEach((face)=>{console.log(`${face.id}: ${face.status}`);if(face.thumbnailUrl){console.log(` Thumbnail: ${face.thumbnailUrl}`);}});constface=awaitclient.faces.getFace({id: 'face-id',});awaitclient.faces.deleteFace({id: 'face-id',});Voices define how your AI characters sound.
import{CreateEquosVoiceRequest}from'@equos/node-sdk';constvoiceData: CreateEquosVoiceRequest={name: 'Professional Voice',description: 'Clear and professional tone',voiceId: 'elevenlabs-voice-id',sampleUrl: 'https://example.com/sample.mp3',client: 'my-app',// Optional};constvoice=awaitclient.voices.createVoice({createEquosVoiceRequest: voiceData,});constvoices=awaitclient.voices.listVoices({take: 10,skip: 0,});constvoice=awaitclient.voices.getVoice({id: 'voice-id',});awaitclient.voices.deleteVoice({id: 'voice-id',});Brains define the personality and behavior of your AI characters.
import{CreateEquosBrainRequest}from'@equos/node-sdk';constbrainData: CreateEquosBrainRequest={name: 'Customer Support Brain',instructions:
'You are a helpful customer support agent. Be friendly and professional.',greetingMessage: 'Hello! How can I help you today?',model: 'gemini-2.5-flash-native-audio-preview-09-2025',client: 'my-app',// Optional};constbrain=awaitclient.brains.createBrain({createEquosBrainRequest: brainData,});constbrains=awaitclient.brains.listBrains({take: 10,skip: 0,});constbrain=awaitclient.brains.getBrain({id: 'brain-id',});console.log('Instructions:',brain.instructions);console.log('Greeting:',brain.greetingMessage);awaitclient.brains.deleteBrain({id: 'brain-id',});Knowledge bases let characters ground responses in your own documents.
import{CreateKnowledgeBaseRequest}from'@equos/node-sdk';constkbData: CreateKnowledgeBaseRequest={name: 'Product Docs',client: 'my-app',// Optional};constkb=awaitclient.knowledgeBases.createKnowledgeBase({createKnowledgeBaseRequest: kbData,});constkbs=awaitclient.knowledgeBases.listKnowledgeBases({take: 10,skip: 0,});constdoc=awaitclient.knowledgeBases.addDocument({id: 'kb-id',createDocumentRequest: {name: 'pricing.pdf',url: 'https://example.com/pricing.pdf',},});awaitclient.knowledgeBases.indexDocument({id: 'kb-id',doc: doc.id,});awaitclient.knowledgeBases.deleteDocument({id: 'kb-id',doc: 'doc-id'});awaitclient.knowledgeBases.deleteKnowledgeBase({id: 'kb-id'});Conversations are live sessions between a user and a character.
import{CreateEquosConversationRequest}from'@equos/node-sdk';constconversationData: CreateEquosConversationRequest={name: 'Support chat',characterId: 'character-id',maxSeconds: 600,// Optional: cap the session durationpromptCtx: 'Customer is on the Enterprise plan.',// Optional};constconversation=awaitclient.conversations.startConversation({createEquosConversationRequest: conversationData,});console.log('Room:',conversation.room);console.log('Token:',conversation.token);constconversations=awaitclient.conversations.listConversations({take: 10,skip: 0,});constconversation=awaitclient.conversations.getConversationById({id: 'conversation-id',});awaitclient.conversations.stopConversation({id: 'conversation-id',});Generate short-lived tokens so a browser or mobile client can connect to a character without exposing your API key.
consttoken=awaitclient.tokens.createToken({createEquosTokenRequest: {user: 'user-123',character: 'character-id',// Optionalclient: 'my-app',// Optional},});// Hand `token` to your frontend (@equos/browser-sdk or @equos/react)consthealth=awaitclient.health.checkHealth();console.log('Status:',health.status);console.log('Version:',health.version);constused=awaitclient.organizations.getFreemiumUsage();console.log('Freemium seconds used:',used);import{EquosClient}from'@equos/node-sdk';asyncfunctionmain(){constclient=EquosClient.create(process.env.EQUOS_API_KEY!);// Create a faceconstface=awaitclient.faces.createFace({createEquosFaceRequest: {identity: 'byron',},});// Create a voiceconstvoice=awaitclient.voices.createVoice({createEquosVoiceRequest: {name: 'Professional Voice',description: 'Clear professional tone',voiceId: 'elevenlabs-voice-id',sampleUrl: 'https://example.com/sample.mp3',},});// Create a brainconstbrain=awaitclient.brains.createBrain({createEquosBrainRequest: {name: 'Support Agent',instructions: 'You are a helpful support agent.',greetingMessage: 'Hello! How can I help?',model: 'gemini-2.5-flash-native-audio-preview-09-2025',},});// Create a character with all componentsconstcharacter=awaitclient.characters.createCharacter({createEquosCharacterRequest: {name: 'AI Support Agent',livekitIdentity: 'support-agent-001',faceId: face.id,voiceId: voice.id,brainId: brain.id,search: false,},});console.log('Created character:',character.id);console.log('Face:',character.face?.status);console.log('Voice:',character.voice?.name);console.log('Brain:',character.brain?.name);}main().catch(console.error);try{constcharacter=awaitclient.characters.getCharacter({id: 'non-existent-id',});}catch(error){if(errorinstanceofError){console.error('Error:',error.message);}}Request and response types ship with the package:
import{EquosClient,EquosCharacter,EquosFace,EquosVoice,EquosBrain,CreateEquosCharacterRequest,UpdateEquosCharacterRequest,ListEquosCharactersResponse,}from'@equos/node-sdk';- Equos Slack Community: Join Equos Community Slack
- Support: Support Form
- Official Documentation: https://docs.equos.ai
- Equos NodeJS Examples: https://github.com/EquosAI/equos-examples/tree/main/examples/equos-nextjs-integration
- Equos React Examples: https://github.com/EquosAI/equos-examples/blob/main/examples/equos-react-integration/README.md
See LICENSE for details.