Developer overview
The Rydhm API gives your code the same experts your team uses in the app. Everything is scoped to one workspace and authenticated with an API key.
What you can build
Base URLs
Developers → API reference in the app shows the address for your workspace. To call the API through another host, such as your own proxy, set baseUrl (TypeScript) or base_url (Python) on the SDK client.
The API calls experts agents in its paths and fields: /v1/agents/{id} is an expert, and agentId is an expert’s id.
Requests and responses
- Send JSON bodies with
Content-Type: application/json. A body can be up to 12 MB, which matters for file uploads sent as base64. - Ids are UUIDs. Times are ISO 8601 strings in UTC.
- Every response carries an
X-Request-Idheader. Quote it to support. See Errors. - Errors share one JSON shape, and rate-limited routes send
X-RateLimit-*headers. See Errors.
Versioning
The version is in the path: every route is under /v1. The OpenAPI document also carries a date version in info.version (currently 2026-11-09).
New fields and new routes can appear within v1. Build your client to ignore fields it doesn’t know.
Your first request
You need to be a workspace admin to create a key.
The response is a list of experts:
Each expert also carries its full settings (personaPrompt, voiceConfig, widgetConfig and more). Secrets in its settings are masked. Keep one expert’s id: the next sections use it.
The SDKs aren’t published to npm or PyPI yet. See TypeScript SDK and Python SDK.
Chat with an expert
A chat takes three calls: start a conversation, send a message, then read the reply as a stream. The key needs chat:write.
To continue the conversation, send the next message and stream again. To read it later, call GET /v1/chat/conversations/{id}/messages (needs conversations:read).
To ground a chat in a meeting’s transcript, pass meetingId when you start it.
Stream the reply
The stream is server-sent events. Each event’s data is one JSON frame:
Each reply is a model call, metered as chat usage.
Voice in your own frontend
Your server mints a short-lived voice-session token; your frontend uses it to join the call with the LiveKit client SDK. The key never leaves your server. The key needs voice_sessions:write.
Join with serverUrl and participantToken within 15 minutes. The body can also carry conversationId, to continue an earlier conversation by voice, and variables, values for the expert’s {{variables}} (up to 20).
Send an expert to a meeting
POST /v1/meetings sends an expert into a Google Meet, Zoom or Microsoft Teams call, now or at scheduledAt. It needs its own scope, meetings:join, because it costs money and joins calls with people outside your workspace.
joinUrlis the meeting link. A whole pasted invite works too; the link is taken from it.modeisspeaker(the expert talks) orlistener(it only listens).brieftells the expert what it should know going in.
Always send an Idempotency-Key. A retry with the same key returns the first result instead of sending a second bot. Keys are kept for 24 hours, per workspace and route; a replayed response carries Idempotent-Replayed: true.
Read the meeting, its transcript and its summary with GET /v1/meetings/{id} (needs meetings:read), or subscribe to the meeting.* webhooks.
Next steps
- Authentication: keys, restrictions and rotation.
- Scopes: what each permission allows.
- Errors: the error shape and rate limits.
- The API reference: every route, with its scope.