Quickstart
Five minutes. One agent. Voice, chat, and WhatsApp. No call center, no plumbing, just a prompt and a key.
Prerequisites
1. Create your workspace
Sign in at app.saaya.ai. The first thing you'll see is a workspace picker, pick one or create a new one. Workspaces are how Saaya isolates billing, RBAC, and data.
2. Install the SDK
The TypeScript SDK is the canonical client. A Python SDK ships with the same surface area.
npm install @saaya/sdk
# or
pnpm add @saaya/sdk
# or
bun add @saaya/sdk3. Set your API key
Generate a key from Settings → API Keys in the dashboard. Keys are scoped to a workspace and respect RBAC, never commit them.
# .env
SAAYA_API_KEY=sk_live_...4. Define your first agent
Saaya agents are versioned configs. The minimum viable agent has a name, a prompt, and a voice, Saaya picks reasonable defaults for everything else.
import { Saaya } from "@saaya/sdk";
const saaya = new Saaya({ apiKey: process.env.SAAYA_API_KEY });
const agent = await saaya.agents.create({
name: "Maya, Pipeline Concierge",
prompt: `
You're Maya. You qualify inbound interest for Saaya.
Voice is warm, direct, and a little dry.
Always finish a discovery call by booking the next step.
`,
voice: { provider: "elevenlabs", voiceId: "rachel" },
llm: { provider: "anthropic", model: "claude-opus-4-7" },
channels: ["voice", "chat", "whatsapp"],
});
console.log(`Agent ready: ${agent.id}`);Heads up
create call also publishes a draft version. Pull the agent into the dashboard to tune voice, knowledge bases, and tools visually, or stay in code.5. Test it
You can test the same agent on voice, chat, or WhatsApp without deploying.
On voice:
// Place a test call to your phone, Saaya will route the call
// to your agent and dial back when ready.
await saaya.sessions.testCall({
agentId: agent.id,
toNumber: "+919876543210",
});On chat:
const session = await saaya.sessions.create({ agentId: agent.id, channel: "chat" });
const reply = await saaya.sessions.send(session.id, "Hi, what does Saaya do?");
console.log(reply.text);6. Deploy it
Publishing an agent attaches it to a phone number, a chat widget, or a WhatsApp business number. Saaya handles routing on every channel.
await saaya.agents.publish(agent.id, {
// Attach the production phone number you configured in the dashboard.
phoneNumberId: "ph_2N3rH...",
// (Optional) bind a chat widget to your domain.
webChat: { allowedOrigins: ["https://acme.com"] },
});Coming back to a published agent?
saaya.agents.promote(versionId) , and roll back with saaya.agents.rollback(versionId) if a release misbehaves.7. Where to next
That's it, you have a live agent. From here, the path branches based on what you're building:
- API reference , drop the SDK, talk to the API directly, get every endpoint.
- MCP endpoint , let Claude or Cursor query your sessions and KBs.
- Knowledge bases , ground every answer in your sources, with strict citations.
- Campaigns , bulk dispatch, retries, fallbacks across channels.