API-first. SDKs for TS + Python. MCP-native.
Every UI action is a REST call. Live transcripts and tool-call events stream over WebSocket. Connect Claude, Cursor, or any AI client through the MCP endpoint. Bearer-auth, idempotent, cursor-paginated, shape-stable.
The whole platform, programmable.
The Saaya dashboard is a thin client over the Saaya API. Anything you can do in the UI — create an agent, upload to a knowledge base, launch a campaign, fetch a session, register a webhook — is a documented REST call. There are no console-only features. There are no UI-only features.
For real-time work, a WebSocket layer streams live transcripts, sentiment updates, and tool-call events as they happen. For AI-native work, an MCP endpoint exposes every Saaya resource as a tool that Claude, Cursor, Windsurf, or any MCP client can call directly — your agents, your KBs, your sessions, all addressable from another agent.
The shape contract is strict. Every endpoint is bearer-authenticated, idempotent on writes (with an idempotency key header), cursor-paginated on lists, and shape-stable across minor versions. Breaking changes ship as a new major version, with the old version supported for at least twelve months.
A platform you can script.
The bits that make a developer experience feel inevitable, instead of inflicted.
REST + WebSocket
CRUD on agents, KBs, campaigns, sessions, and webhooks via REST. Live transcripts, sentiment, and tool-call events stream over WebSocket — sub-100ms from event to subscriber.
TypeScript SDK
Strong types end-to-end, generated from the OpenAPI spec. Discriminated unions for events. Works in Node, Bun, Deno, and the Edge runtimes. Tree-shakeable, zero runtime deps.
Python SDK
Async-first, Pydantic v2 models, asyncio-native event subscribers. Drops into FastAPI handlers and LangGraph nodes. Synchronous wrappers included.
MCP endpoint
Native Model Context Protocol server at /mcp. Connect Claude Desktop, Cursor, Windsurf, or any MCP client — every Saaya resource is a tool, every webhook is a notification.
Webhooks
Signed, retried, replayable webhooks on every state change. Ten event categories, ~80 events. Replay from the dashboard or the API. Deliveries logged with full request and response.
Cursor pagination
Every list endpoint is cursor-paginated, shape-stable, and idempotent. Bearer auth, idempotency keys, RFC-7807 error envelopes. The boring parts done right.
Three steps from key to production.
Most teams have a working integration before lunch.
Get a key
Generate a scoped API key from the dashboard. Per-environment (sandbox, production), per-resource (agents:read, campaigns:write), with rate-limit and IP-allowlist policies.
Pick a SDK / cURL / MCP
TypeScript or Python SDK for typed calls. cURL for one-offs and CI. MCP for AI-native clients (Claude, Cursor, Windsurf). Same auth, same shapes, same docs.
Ship
Wire up webhooks, subscribe to the WebSocket events you care about, and roll forward. Idempotency keys make retries safe; cursor pagination keeps backfills clean.
The same operations, three ways.
Create an agent, upload to a KB, stream a session — pick the surface that fits your stack.
# 1. Create an agent
curl -X POST https://api.saaya.ai/v1/agents \
-H "Authorization: Bearer $SAAYA_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "name": "maya-inbound", "identity": { "language": "en-US" } }'
# 2. Upload a doc to a knowledge base
curl -X POST https://api.saaya.ai/v1/knowledge-bases/kb_docs/uploads \
-H "Authorization: Bearer $SAAYA_API_KEY" \
-F "file=@./handbook.pdf" \
-F "tags=public,handbook"
# 3. Stream a live session over WebSocket
wscat -c "wss://api.saaya.ai/v1/sessions/ses_01HXAB/stream" \
-H "Authorization: Bearer $SAAYA_API_KEY"
# < {"type":"transcript.delta","role":"user","text":"hello"}
# < {"type":"sentiment.update","value":0.42}
# < {"type":"tool_call","name":"lookup_account","ms":312}On every tier — what you get.
The API is the platform. Every plan ships with full REST and WebSocket access; the difference is rate limits, MCP, and SLA.
Full REST + WebSocket access · 60 req/min · webhooks · TypeScript & Python SDKs · sandbox environment.
600 req/min · MCP endpoint · production environment · idempotency keys · saved API-key scopes · webhook replay tooling.
Custom rate limits · IP allowlists · BYO domain (api.yourco.com) · region-pinned endpoints · 99.95% SLA · dedicated support channel.
Pair this with the right Solution.
Frequently Asked Questions.
60 req/min on Free, 600 req/min on Growth, custom on Enterprise. Limits are per-key and per-endpoint-class. WebSocket connections are counted separately. 429s include a Retry-After header and a token-bucket refill timestamp.
Build on the API.
Generate a sandbox key in two clicks, paste a cURL into your terminal, and watch your first agent answer. Production access is the same call with a different key.