Migrate from Recall.ai

A one-command tool that scans your Recall.ai codebase, maps every API call to its MeetStream equivalent, shows you the diff, and rewrites it — for both Node.js and Python.

View as Markdown

MeetStream is a near drop-in replacement for Recall.ai at a lower price point — roughly 30% less per hour, and about half at volume. The migration kit does the mechanical rewrite for you and tells you exactly what — if anything — needs a human.

What it does

Point the tool at your existing Recall.ai project and it works in four passes:

  1. Scan — recursively finds Recall base URLs, endpoint calls, field names, webhook handlers, SDK imports, and RECALL_API_KEY usage.
  2. Map — prints endpoint, field, and webhook mapping tables so you can see every change before it happens.
  3. Transform — rewrites base URLs, endpoint paths, field names, webhook event handling, env vars, and imports.
  4. Report — summarizes what changed, warns on anything that needs manual review, and prints a post-migration checklist.

Run it in scan or --dry-run mode as many times as you like — nothing is written until you confirm.

Install & run

$# Scan only — no changes
$npx @meetstream/migrate scan /path/to/your-recall-project
$
$# Dry run — see the full diff
$npx @meetstream/migrate --dry-run /path/to/your-recall-project
$
$# Migrate (asks for confirmation first)
$npx @meetstream/migrate /path/to/your-recall-project
$
$# Verify against the live API after migrating
$npx @meetstream/migrate test --api-key YOUR_MEETSTREAM_API_KEY
$
$# Full lifecycle test against a real meeting
$npx @meetstream/migrate test --api-key YOUR_KEY --meeting-url https://meet.google.com/xxx-xxxx-xxx

What gets rewritten

Endpoints

Recall.aiMeetStream.aiNotes
POST /api/v1/bot/POST /api/v1/bots/create_botField names differ (see below)
GET /api/v1/bot/{id}/GET /api/v1/bots/{id}/detailAlso /status
POST /api/v1/bot/{id}/leave_call/GET /api/v1/bots/{id}/remove_botMethod changes POST → GET
DELETE /api/v1/bot/{id}/DELETE /api/v1/bots/{id}/delete
GET /api/v1/bot/GET /api/v1/botsList all bots
GET /bot/{id}/audio/GET /bots/{id}/get_audio
GET /bot/{id}/video/GET /bots/{id}/get_video
GET /bot/{id}/transcript/GET /transcript/{transcript_id}/get_transcriptUses transcript_id, resolved from /detail
GET /bot/{id}/participants/GET /bots/{id}/get_participants
GET /bot/{id}/chat_messages/GET /bots/{id}/get_chats
POST /bot/{id}/send_chat_message/POST /bots/{id}/send_messageBody { "message": "..." }
POST /bot/{id}/output_video/POST /bots/{id}/send_imagePublic img_url (not base64)
GET /bot/{id}/speaker_timeline/GET /bots/{id}/get_speaker_timeline
POST /api/v1/webhook/callback_url on create_botWebhooks are per-bot

Fields

Recall.aiMeetStream.ai
meeting_urlmeeting_link
recording_modevideo_required (boolean)
metadatacustom_attributes
transcription_optionsrecording_config.transcript
noone_joined_timeoutvoice_inactivity_timeout
assembly_aiassemblyai
destination_urlwebhook_url

Webhooks

Recall’s global webhook becomes a per-bot callback_url passed to create_bot, and Recall’s string events map onto MeetStream’s event model. The event envelope key is event, and bot completion is two-layered (bot.stopped carries a bot_status such as Stopped, NotAllowed, Denied, or Error). Before finalizing your handlers, read the Webhooks and Events guide (Guides → Webhooks), or have your assistant call the webhook_events_guide tool on the MeetStream MCP server.

Feature parity & gaps

As of v2.1 (June 2026) MeetStream matches Recall.ai across recording, per-participant audio/video streams, real-time audio/video/transcript, chat and image output, Google and Outlook calendar, advance scheduling, signed-in bots, and retention — and adds native AI summaries and MIA voice agents that Recall does not have.

The migrator explicitly flags the two remaining gaps, both shipping with the video launch:

  • Pause / resume recording mid-call
  • Live video output into the meeting

Everything else migrates automatically.

After migrating

  1. Swap RECALL_API_KEY for MEETSTREAM_API_KEY in your environment and secrets manager.
  2. Change the auth header to Authorization: Token <your-key>.
  3. Point webhooks at your handler via callback_url on create_bot.
  4. Run test --api-key ... (optionally with --meeting-url) to confirm the live API responds as expected.
  5. Review anything the report flagged for manual attention.

Prefer to drive MeetStream from a chat assistant instead of rewriting code by hand? The MeetStream MCP server gives Claude direct access to the same API.