Official SDKs
MeetStream ships official clients for TypeScript and Python. Both cover the full API surface, both are typed, and both encode the handful of API behaviours that are easy to get wrong.
TypeScript
Python
Node 18.17+. ESM and CommonJS. Zero runtime dependencies.
Get an API key from the MeetStream dashboard.
The SDKs talk to the REST API and send Authorization: Token <key>. The MCP server uses Bearer instead. The two schemes are not interchangeable, and the SDKs handle this for you.
Async (Python)
Every synchronous method has an awaitable twin with the same name and signature.
What the SDKs handle for you
A few API behaviours look like bugs until you know them. Rather than documenting them and hoping, the SDKs encode them.
Retries are built in for 429 and 5xx with exponential backoff, honouring Retry-After.
Coverage
Seven resource namespaces spanning every endpoint in the API reference.
Bots: lifecycle, media, live interaction
TypeScript
Python
Transcripts
TypeScript
Python
transcribeBotAudio / transcribe_bot_audio is the rescue path when a bot used a streaming-only provider: the live stream was the only record, and this generates a post-call transcript from the stored audio afterwards.
Calendar: auto-join and scheduling
TypeScript
Python
Setup guides: Google Calendar and Outlook.
MIA voice agents
TypeScript
Python
Attach an agent with agent_config_id alone. Passing socket_connection_url or live_audio_required alongside it is the most common cause of an agent that joins but never speaks, because those fields are for bring-your-own-bridge setups and MeetStream hosts the MIA bridge itself.
See Create MIA and MIA configurations.
Google signed-in bots, Zoom OAuth, and custom storage
TypeScript
Python
Guides: Google signed-in bots, Zoom OBF, custom storage.
Webhooks
Both SDKs verify signatures. Pass the raw request body: re-serializing a parsed object changes key order and whitespace, so the signature will never match.
TypeScript
Python
Use express.raw() on the webhook route, not express.json().
isTerminal / is_terminal recognises bot.stopped, which is the single terminal event and always carries status_code: 200. The reason lives in bot_status, and describeStop / describe_stop turns it into a sentence. Full lifecycle: Webhooks and events.
Errors
Every failure maps to a distinct class carrying the API’s own message, the HTTP status, and the request id.
TypeScript
Python
AuthenticationError (401) means the header never arrived. PermissionError (403) means the key itself was rejected. Full list: Errors.
Configuration
TypeScript
Python
Anything the SDK does not wrap yet is reachable through the raw transport, so a new endpoint never blocks you:
TypeScript
Python
Source and support
@meetstream/sdk on npm. Source at meetstream-node.
meetstream-sdk on PyPI. Source at meetstream-python.
Prefer a different surface? The MCP server exposes the same capability as tools for coding agents, and the CLI covers it from your terminal. Runnable examples live in Labs.
