> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.meetstream.ai/tutorials/sample-apps/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.meetstream.ai/_mcp/server. # Tutorials and Sample Apps > Runnable MeetStream sample apps and starter templates: meeting bots, transcription, recordings, live streaming, MIA voice agents, calendar automation, webhooks, and CRM, Slack and Notion integrations. Every template lives in [MeetStream Labs](https://github.com/meetstream-ai/labs) and runs on its own. No shared build, no framework to learn first: Node 18+, a `.env` file and one command. > **Tip** > > Building with a coding agent? Point it at [llms.txt](https://docs.meetstream.ai/llms.txt), connect the [MeetStream MCP server](/build-with-ai/meetstream-mcp-server), and paste the guide from [Agent Quickstarts](/build-with-ai/agent-quickstarts). Or tell it to start from one of the templates below. ## Run any template #### Clone Labs ```bash git clone https://github.com/meetstream-ai/labs.git cd labs/quickstart-first-bot ``` #### Add your API key ```bash cp .env.example .env # set MEETSTREAM_API_KEY ``` Create a key at [app.meetstream.ai](https://app.meetstream.ai/api-key). Each template's `.env.example` lists every variable it reads, with comments. #### Install and run ```bash npm install node index.js ``` Templates that receive webhooks need a public HTTPS URL. [`webhook-local-tunnel`](https://github.com/meetstream-ai/labs/tree/main/webhook-local-tunnel) shows how to get one for your laptop. ## Popular starting points #### [Your first bot](https://github.com/meetstream-ai/labs/tree/main/quickstart-first-bot) Send a bot, poll its status, print the result. The hello world. #### [AI notetaker that emails notes](https://github.com/meetstream-ai/labs/tree/main/ai-meeting-notetaker-email) Record, summarize and email the notes to every attendee. #### [Real-time transcription](https://github.com/meetstream-ai/labs/tree/main/realtime-transcription) Stream the transcript while the meeting is still running. #### [Voice agent in a meeting](https://github.com/meetstream-ai/labs/tree/main/MIA-chat-agent) Deploy a MIA agent that listens and talks back. #### [Bots from the calendar](https://github.com/meetstream-ai/labs/tree/main/calendar-auto-schedule) A bot joins every meeting on a connected calendar. #### [Production webhook handler](https://github.com/meetstream-ai/labs/tree/main/webhook-handler-complete) Every event, deduped, with correct terminal handling. ## Start here | Template | What it shows | | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | | [`quickstart-first-bot`](https://github.com/meetstream-ai/labs/tree/main/quickstart-first-bot) | The hello world: send a bot into a meeting, poll status, print the result | | [`post-call-transcription`](https://github.com/meetstream-ai/labs/tree/main/post-call-transcription) | Bot joins, records, and saves the full transcript when the call ends | | [`transcript-fetcher`](https://github.com/meetstream-ai/labs/tree/main/transcript-fetcher) | The canonical transcript flow: resolve `transcript_id`, poll through HTTP 202, parse segments | | [`webhook-handler-complete`](https://github.com/meetstream-ai/labs/tree/main/webhook-handler-complete) | The reference webhook receiver: every event, deduped redeliveries, correct `status_code` reading | **Related guides:** [Create your first bot](/guides/get-started/create-your-first-bot), [Webhooks and events](/guides/webhooks/webhooks-and-events) ## Bots and lifecycle | Template | What it shows | | ------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- | | [`quickstart-first-bot`](https://github.com/meetstream-ai/labs/tree/main/quickstart-first-bot) | Create a bot, poll `GET /bots/{id}/status` until the session ends | | [`bot-status-monitor`](https://github.com/meetstream-ai/labs/tree/main/bot-status-monitor) | Render the bot lifecycle as a live timeline in your terminal | | [`list-and-manage-bots`](https://github.com/meetstream-ai/labs/tree/main/list-and-manage-bots) | List every bot, filter and sort, make an active bot leave | | [`bot-lifecycle-state-machine`](https://github.com/meetstream-ai/labs/tree/main/bot-lifecycle-state-machine) | Webhook-driven state machine, persisted to disk, detects stuck and abandoned bots | | [`scheduled-bot-join-at`](https://github.com/meetstream-ai/labs/tree/main/scheduled-bot-join-at) | Schedule with `join_at`, then reschedule and cancel | | [`manage-scheduled-bots`](https://github.com/meetstream-ai/labs/tree/main/manage-scheduled-bots) | Admin CLI for bots that have not joined yet | | [`bot-retention-config`](https://github.com/meetstream-ai/labs/tree/main/bot-retention-config) | Control how long recordings live with `recording_config.retention` | | [`delete-bot-data`](https://github.com/meetstream-ai/labs/tree/main/delete-bot-data) | Permanently erase a bot's data, behind a typed confirmation | | [`idempotency-and-dedup`](https://github.com/meetstream-ai/labs/tree/main/idempotency-and-dedup) | Both anti-duplicate mechanisms: `Idempotency-Key` (507 replay) and `deduplication_key` (409) | | [`bulk-bot-operations`](https://github.com/meetstream-ai/labs/tree/main/bulk-bot-operations) | Run many bots concurrently with a bounded queue and per-job idempotency | **Related guides:** [How bots work](/guides/introduction/how-bots-work), [Scheduling bots](/guides/features/scheduling-bots), [Idempotency and deduplication](/guides/features/deduplication-idempotency-keys) ## Recording and media | Template | What it shows | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | | [`audio-recording-downloader`](https://github.com/meetstream-ai/labs/tree/main/audio-recording-downloader) | Wait for `audio.processed`, then download the audio | | [`video-recording-downloader`](https://github.com/meetstream-ai/labs/tree/main/video-recording-downloader) | Same for video, via `video.processed` | | [`per-participant-audio-recorder`](https://github.com/meetstream-ai/labs/tree/main/per-participant-audio-recorder) | One audio file per participant, with correct HTTP 202 handling | | [`per-participant-video-recorder`](https://github.com/meetstream-ai/labs/tree/main/per-participant-video-recorder) | One video and audio stream per participant | | [`screenshot-capture`](https://github.com/meetstream-ai/labs/tree/main/screenshot-capture) | Download meeting screenshots and place them on the timeline | | [`pause-resume-recording`](https://github.com/meetstream-ai/labs/tree/main/pause-resume-recording) | Open and close recording privacy windows mid-meeting | | [`custom-s3-storage`](https://github.com/meetstream-ai/labs/tree/main/custom-s3-storage) | Bring your own bucket: point MeetStream at your own S3 via `PUT /admin/configs` | **Related guides:** [Per-participant video](/guides/transcription-recordings/per-participant-video), [Custom storage (S3)](/guides/features/custom-storage-configurations/amazon-s3) ## Transcription | Template | What it shows | | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | | [`post-call-transcription`](https://github.com/meetstream-ai/labs/tree/main/post-call-transcription) | Full transcript saved after the call | | [`realtime-transcription`](https://github.com/meetstream-ai/labs/tree/main/realtime-transcription) | Streaming transcription over webhook or WebSocket while the meeting runs | | [`transcript-fetcher`](https://github.com/meetstream-ai/labs/tree/main/transcript-fetcher) | Resolve `transcript_id` and fetch, handling 202 correctly | | [`re-transcribe-audio`](https://github.com/meetstream-ai/labs/tree/main/re-transcribe-audio) | Re-run transcription with a different provider, model or language | | [`multi-provider-transcription`](https://github.com/meetstream-ai/labs/tree/main/multi-provider-transcription) | All five post-call providers, switched by one env var | | [`multilingual-transcription`](https://github.com/meetstream-ai/labs/tree/main/multilingual-transcription) | Non-English meetings with the right provider and language code | | [`speaker-diarization`](https://github.com/meetstream-ai/labs/tree/main/speaker-diarization) | Deepgram diarization into clean per-speaker turns | | [`live-captions-overlay`](https://github.com/meetstream-ai/labs/tree/main/live-captions-overlay) | Rolling live captions in your terminal | **Related guides:** [Post-call transcription](/guides/transcription-recordings/post-call-transcription), [Live transcription](/guides/transcription-recordings/live-transcription), [Transcription providers](/guides/transcription-recordings/providers/transcription-providers) ## Meeting data and analytics | Template | What it shows | | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | | [`ai-meeting-summary`](https://github.com/meetstream-ai/labs/tree/main/ai-meeting-summary) | MeetStream's native AI summary (`GET /bots/{id}/summary`) | | [`speaker-timeline-analytics`](https://github.com/meetstream-ai/labs/tree/main/speaker-timeline-analytics) | Talk-time, turns, longest monologue, ASCII bar chart | | [`participant-tracker`](https://github.com/meetstream-ai/labs/tree/main/participant-tracker) | Who joined and left, live over webhooks | | [`meeting-chat-logger`](https://github.com/meetstream-ai/labs/tree/main/meeting-chat-logger) | Export in-meeting chat to JSON and Markdown | | [`meeting-analytics-dashboard`](https://github.com/meetstream-ai/labs/tree/main/meeting-analytics-dashboard) | Everything about one meeting in a single consolidated report | **Related guides:** [API reference](/api-reference/introduction) ## Live interaction | Template | What it shows | | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | | [`realtime-audio-streaming`](https://github.com/meetstream-ai/labs/tree/main/realtime-audio-streaming) | Live PCM audio over a WebSocket you host | | [`realtime-video-streaming`](https://github.com/meetstream-ai/labs/tree/main/realtime-video-streaming) | Live fMP4 video over WebSocket, with the ping/pong keepalive | | [`send-chat-message`](https://github.com/meetstream-ai/labs/tree/main/send-chat-message) | Post chat messages into a live meeting, on demand or scheduled | | [`send-image-bot`](https://github.com/meetstream-ai/labs/tree/main/send-image-bot) | Put an image or GIF into the chat, or make it the bot's camera feed | | [`websocket-bot-control`](https://github.com/meetstream-ai/labs/tree/main/websocket-bot-control) | The bring-your-own bridge: `sendaudio`, `sendmsg`, `sendchat`, `interrupt`, `sendimg` | | [`interactive-meeting-agent`](https://github.com/meetstream-ai/labs/tree/main/interactive-meeting-agent) | Two-way loop: hear the room, decide, respond | **Related guides:** [Meeting control patterns](/guides/websockets/meeting-control-patterns) ## MIA voice agents | Template | What it shows | | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------- | | [`MIA-chat-agent`](https://github.com/meetstream-ai/labs/tree/main/MIA-chat-agent) | Deploy a MIA into a meeting and watch it respond | | [`mia-voice-agent-pipeline`](https://github.com/meetstream-ai/labs/tree/main/mia-voice-agent-pipeline) | Pipeline mode: swap STT, LLM and TTS layers independently | | [`mia-realtime-agent`](https://github.com/meetstream-ai/labs/tree/main/mia-realtime-agent) | Realtime mode: a single speech-to-speech model, lower latency | | [`mia-agent-crud`](https://github.com/meetstream-ai/labs/tree/main/mia-agent-crud) | Admin CLI for saved agent configs | | [`mia-wake-word-assistant`](https://github.com/meetstream-ai/labs/tree/main/mia-wake-word-assistant) | Only answers when addressed: "hey acme, ..." | **Related guides:** [What is MIA](/guides/mia/what-is-mia), [Create an agent](/guides/mia/create-an-agent) ## Calendar | Template | What it shows | | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | | [`google-calendar-integration`](https://github.com/meetstream-ai/labs/tree/main/google-calendar-integration) | Connect Google Calendar, including a local OAuth helper | | [`outlook-calendar-integration`](https://github.com/meetstream-ai/labs/tree/main/outlook-calendar-integration) | Connect Outlook / Microsoft 365, including the Azure setup | | [`calendar-event-sync`](https://github.com/meetstream-ai/labs/tree/main/calendar-event-sync) | Sync upcoming events and find the ones with a join link | | [`calendar-schedule-bot`](https://github.com/meetstream-ai/labs/tree/main/calendar-schedule-bot) | Schedule a bot for one event, handling the 409 duplicate case | | [`calendar-auto-schedule`](https://github.com/meetstream-ai/labs/tree/main/calendar-auto-schedule) | A bot joins every meeting automatically | | [`calendar-recurring-events`](https://github.com/meetstream-ai/labs/tree/main/calendar-recurring-events) | Whole series or single occurrence, plus auto-rescheduling | | [`calendar-disconnect`](https://github.com/meetstream-ai/labs/tree/main/calendar-disconnect) | Tear down an integration, with a preview of what is lost | **Related guides:** [Google Calendar setup](/guides/calendar-integrations/google-calendar-oauth-setup), [Outlook Calendar setup](/guides/calendar-integrations/outlook-calendar-setup) ## Platform specifics | Template | What it shows | | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------- | | [`zoom-meeting-bot`](https://github.com/meetstream-ai/labs/tree/main/zoom-meeting-bot) | Zoom's recording-permission flow and its timeout ranges | | [`zoom-authenticated-joins`](https://github.com/meetstream-ai/labs/tree/main/zoom-authenticated-joins) | Host the ZAK / OBF token URL so bots join Zoom as a signed-in user, not a guest | | [`teams-meeting-bot`](https://github.com/meetstream-ai/labs/tree/main/teams-meeting-bot) | Microsoft Teams lifecycle and admission behaviour | | [`gmeet-lobby-handling`](https://github.com/meetstream-ai/labs/tree/main/gmeet-lobby-handling) | Google Meet waiting room: detect `NotAllowed` and `Denied`, then react | | [`google-signed-in-bots-setup`](https://github.com/meetstream-ai/labs/tree/main/google-signed-in-bots-setup) | SAML SSO, certificates and domain registration, end to end | | [`google-login-management`](https://github.com/meetstream-ai/labs/tree/main/google-login-management) | Admin CLI for signed-in bot domains and logins | **Related guides:** [Zoom](/guides/platforms/zoom), [Zoom authenticated bots](/guides/app-integrations/zoom-authenticated-bots), [Google signed-in bots](/guides/app-integrations/google-signed-in-bots) ## Webhooks and reliability | Template | What it shows | | ---------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | [`webhook-handler-complete`](https://github.com/meetstream-ai/labs/tree/main/webhook-handler-complete) | Every documented event, deduped, with correct status handling | | [`webhook-local-tunnel`](https://github.com/meetstream-ai/labs/tree/main/webhook-local-tunnel) | Get webhooks delivering to your laptop over a public HTTPS tunnel | | [`error-handling-and-retries`](https://github.com/meetstream-ai/labs/tree/main/error-handling-and-retries) | The whole error surface: 400, 401 vs 403, 409, 429 with `Retry-After`, 507, 202 | **Related guides:** [Webhooks and events](/guides/webhooks/webhooks-and-events), [Local webhook server](/guides/webhooks/local-webhook-server), [Errors](/errors) ## Integrations and AI workflows | Template | What it shows | | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------- | | [`ai-meeting-notetaker-email`](https://github.com/meetstream-ai/labs/tree/main/ai-meeting-notetaker-email) | Record, summarize, and email the notes to attendees | | [`slack-meeting-summary`](https://github.com/meetstream-ai/labs/tree/main/slack-meeting-summary) | Post the summary and action items into Slack | | [`notion-meeting-notes`](https://github.com/meetstream-ai/labs/tree/main/notion-meeting-notes) | One Notion page per meeting | | [`crm-hubspot-sync`](https://github.com/meetstream-ai/labs/tree/main/crm-hubspot-sync) | Attach the summary and transcript to the HubSpot contact and deal | | [`action-item-extractor`](https://github.com/meetstream-ai/labs/tree/main/action-item-extractor) | LLM-extracted action items with owners and due dates | | [`sentiment-and-insights`](https://github.com/meetstream-ai/labs/tree/main/sentiment-and-insights) | Sentiment, topics and talk-time balance as a coaching report | **Related guides:** [Agent Quickstarts](/build-with-ai/agent-quickstarts) ## Agent and assistant integrations Larger reference integrations that connect MeetStream MIA voice agents to other agent frameworks. | Project | What it shows | | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- | | [`mia-hermes-bridge`](https://github.com/meetstream-ai/labs/tree/main/mia-hermes-bridge) | Bridge a self-hosted Hermes Agent into a live meeting through MIA, with ngrok tunnelling and a one-command launcher | | [`MIA-poster-design`](https://github.com/meetstream-ai/labs/tree/main/MIA-poster-design) | A wake-word MIA assistant that turns a spoken event brief into a poster through the Canva bridge | | [`openclaw-x-meetstream-skill`](https://github.com/meetstream-ai/labs/tree/main/openclaw-x-meetstream-skill) | An OpenClaw skill for operating MeetStream bots from the OpenClaw agent | ## What every template gets right The templates are written against behaviour verified on the live API, so they double as a reference for the details that most often go wrong: * **REST auth is `Authorization: Token `.** The [MCP server](/build-with-ai/meetstream-mcp-server) uses `Bearer`. * **Terminals are two-layer.** Every ending arrives once as `event: "bot.stopped"`, and `bot_event` gives the reason: `bot.stopped`, `bot.kicked`, `bot.notallowed`, `bot.denied` or `bot.failed`. `bot.done` is the final event on every path. * **Transcripts are fetched by `transcript_id`**, and segments carry `transcript`, not `text`. * **`202` means not ready, `507` means an idempotent replay.** Every poll loop has a cap, and a replay counts as success. * **Streaming-only providers produce no post-call transcript.** The live stream is the record, or re-transcribe the stored audio afterwards. * **MIA bots take only `agent_config_id`.** ## Contribute a template Have a use case the list is missing? Templates follow one layout (`README.md`, `.env.example`, `package.json`, `.gitignore`, `index.js`, `src/*.js`) and every endpoint they call is checked against the API before merge. Open a pull request on [MeetStream Labs](https://github.com/meetstream-ai/labs). > Meeting bot API documentation for Zoom, Google Meet and Microsoft Teams: create bots, stream real-time audio, transcribe, and run in-meeting voice agents.