Skip to navigation

Tutorials and Sample Apps

67 open source, runnable templates for the MeetStream API. Pick the one closest to what you are building, add your API key, and run it.
View as Markdown

Every template lives in MeetStream Labs and runs on its own. No shared build, no framework to learn first: Node 18+, a .env file and one command.

Building with a coding agent? Point it at llms.txt, connect the MeetStream MCP server, and paste the guide from Agent Quickstarts. Or tell it to start from one of the templates below.

Run any template

1

Clone Labs

git clone https://github.com/meetstream-ai/labs.git
cd labs/quickstart-first-bot
2

Add your API key

cp .env.example .env # set MEETSTREAM_API_KEY

Create a key at app.meetstream.ai. Each template’s .env.example lists every variable it reads, with comments.

3

Install and run

npm install
node index.js

Templates that receive webhooks need a public HTTPS URL. webhook-local-tunnel shows how to get one for your laptop.

Start here

TemplateWhat it shows
quickstart-first-botThe hello world: send a bot into a meeting, poll status, print the result
post-call-transcriptionBot joins, records, and saves the full transcript when the call ends
transcript-fetcherThe canonical transcript flow: resolve transcript_id, poll through HTTP 202, parse segments
webhook-handler-completeThe reference webhook receiver: every event, deduped redeliveries, correct status_code reading

Related guides: Create your first bot, Webhooks and events

Bots and lifecycle

TemplateWhat it shows
quickstart-first-botCreate a bot, poll GET /bots/{id}/status until the session ends
bot-status-monitorRender the bot lifecycle as a live timeline in your terminal
list-and-manage-botsList every bot, filter and sort, make an active bot leave
bot-lifecycle-state-machineWebhook-driven state machine, persisted to disk, detects stuck and abandoned bots
scheduled-bot-join-atSchedule with join_at, then reschedule and cancel
manage-scheduled-botsAdmin CLI for bots that have not joined yet
bot-retention-configControl how long recordings live with recording_config.retention
delete-bot-dataPermanently erase a bot’s data, behind a typed confirmation
idempotency-and-dedupBoth anti-duplicate mechanisms: Idempotency-Key (507 replay) and deduplication_key (409)
bulk-bot-operationsRun many bots concurrently with a bounded queue and per-job idempotency

Related guides: How bots work, Scheduling bots, Idempotency and deduplication

Recording and media

TemplateWhat it shows
audio-recording-downloaderWait for audio.processed, then download the audio
video-recording-downloaderSame for video, via video.processed
per-participant-audio-recorderOne audio file per participant, with correct HTTP 202 handling
per-participant-video-recorderOne video and audio stream per participant
screenshot-captureDownload meeting screenshots and place them on the timeline
pause-resume-recordingOpen and close recording privacy windows mid-meeting
custom-s3-storageBring your own bucket: point MeetStream at your own S3 via PUT /admin/configs

Related guides: Per-participant video, Custom storage (S3)

Transcription

TemplateWhat it shows
post-call-transcriptionFull transcript saved after the call
realtime-transcriptionStreaming transcription over webhook or WebSocket while the meeting runs
transcript-fetcherResolve transcript_id and fetch, handling 202 correctly
re-transcribe-audioRe-run transcription with a different provider, model or language
multi-provider-transcriptionAll five post-call providers, switched by one env var
multilingual-transcriptionNon-English meetings with the right provider and language code
speaker-diarizationDeepgram diarization into clean per-speaker turns
live-captions-overlayRolling live captions in your terminal

Related guides: Post-call transcription, Live transcription, Transcription providers

Meeting data and analytics

TemplateWhat it shows
ai-meeting-summaryMeetStream’s native AI summary (GET /bots/{id}/summary)
speaker-timeline-analyticsTalk-time, turns, longest monologue, ASCII bar chart
participant-trackerWho joined and left, live over webhooks
meeting-chat-loggerExport in-meeting chat to JSON and Markdown
meeting-analytics-dashboardEverything about one meeting in a single consolidated report

Related guides: API reference

Live interaction

TemplateWhat it shows
realtime-audio-streamingLive PCM audio over a WebSocket you host
realtime-video-streamingLive fMP4 video over WebSocket, with the ping/pong keepalive
send-chat-messagePost chat messages into a live meeting, on demand or scheduled
send-image-botPut an image or GIF into the chat, or make it the bot’s camera feed
websocket-bot-controlThe bring-your-own bridge: sendaudio, sendmsg, sendchat, interrupt, sendimg
interactive-meeting-agentTwo-way loop: hear the room, decide, respond

Related guides: Meeting control patterns

MIA voice agents

TemplateWhat it shows
MIA-chat-agentDeploy a MIA into a meeting and watch it respond
mia-voice-agent-pipelinePipeline mode: swap STT, LLM and TTS layers independently
mia-realtime-agentRealtime mode: a single speech-to-speech model, lower latency
mia-agent-crudAdmin CLI for saved agent configs
mia-wake-word-assistantOnly answers when addressed: “hey acme, …”

Related guides: What is MIA, Create an agent

Calendar

TemplateWhat it shows
google-calendar-integrationConnect Google Calendar, including a local OAuth helper
outlook-calendar-integrationConnect Outlook / Microsoft 365, including the Azure setup
calendar-event-syncSync upcoming events and find the ones with a join link
calendar-schedule-botSchedule a bot for one event, handling the 409 duplicate case
calendar-auto-scheduleA bot joins every meeting automatically
calendar-recurring-eventsWhole series or single occurrence, plus auto-rescheduling
calendar-disconnectTear down an integration, with a preview of what is lost

Related guides: Google Calendar setup, Outlook Calendar setup

Platform specifics

TemplateWhat it shows
zoom-meeting-botZoom’s recording-permission flow and its timeout ranges
zoom-authenticated-joinsHost the ZAK / OBF token URL so bots join Zoom as a signed-in user, not a guest
teams-meeting-botMicrosoft Teams lifecycle and admission behaviour
gmeet-lobby-handlingGoogle Meet waiting room: detect NotAllowed and Denied, then react
google-signed-in-bots-setupSAML SSO, certificates and domain registration, end to end
google-login-managementAdmin CLI for signed-in bot domains and logins

Related guides: Zoom, Zoom authenticated bots, Google signed-in bots

Webhooks and reliability

TemplateWhat it shows
webhook-handler-completeEvery documented event, deduped, with correct status handling
webhook-local-tunnelGet webhooks delivering to your laptop over a public HTTPS tunnel
error-handling-and-retriesThe whole error surface: 400, 401 vs 403, 409, 429 with Retry-After, 507, 202

Related guides: Webhooks and events, Local webhook server, Errors

Integrations and AI workflows

TemplateWhat it shows
ai-meeting-notetaker-emailRecord, summarize, and email the notes to attendees
slack-meeting-summaryPost the summary and action items into Slack
notion-meeting-notesOne Notion page per meeting
crm-hubspot-syncAttach the summary and transcript to the HubSpot contact and deal
action-item-extractorLLM-extracted action items with owners and due dates
sentiment-and-insightsSentiment, topics and talk-time balance as a coaching report

Related guides: Agent Quickstarts

Agent and assistant integrations

Larger reference integrations that connect MeetStream MIA voice agents to other agent frameworks.

ProjectWhat it shows
mia-hermes-bridgeBridge a self-hosted Hermes Agent into a live meeting through MIA, with ngrok tunnelling and a one-command launcher
MIA-poster-designA wake-word MIA assistant that turns a spoken event brief into a poster through the Canva bridge
openclaw-x-meetstream-skillAn 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 <key>. The 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.