Tutorial5 min read

How to Record Microsoft Teams Meetings via API (Without Admin Access)

Gregnote's meeting bot joins Teams meetings as a participant, records audio, and delivers a transcript — no Microsoft 365 admin required.

Gregnote Team

10 August 2026

The Teams recording problem

Microsoft Teams has native recording, but it requires admin configuration, compliance policies, and stores files in SharePoint where extracting structured data means navigating Microsoft Graph API. For developers building meeting intelligence products, that's a lot of friction.

The alternative: a bot that joins as a regular participant and captures what it hears.

How Gregnote joins Teams

When you call POST /v1/bots with a Teams meeting URL, Gregnote sends a bot that joins the meeting as a named participant — visible in the participant list — records the audio from the bot's perspective, transcribes it in real time, and delivers the results via webhook when the meeting ends.

No Microsoft 365 admin access required. No app registration in Entra ID. Just the meeting URL.

The API call

curl -X POST https://api.gregnote.com/v1/bots \
  -H "Authorization: Bearer gk_live_YOUR_KEY" \
  -d '{
    "meeting_url": "https://teams.microsoft.com/l/meetup-join/...",
    "bot_name": "Meeting Recorder",
    "webhook_url": "https://yourapp.com/hooks/teams"
  }'

The response is identical to a Google Meet bot — same payload shape, same webhook events.

What you get in the webhook

{
  "event": "meeting.completed",
  "transcript": {
    "duration_seconds": 2700,
    "segments": [...],
    "speakers": [
      { "display_name": "Emma Rodriguez", "is_bot": false },
      { "display_name": "Meeting Recorder", "is_bot": true }
    ]
  }
}

Speaker names are pulled from Teams' participant metadata — the same names that appear on-screen during the call.

When the bot can't join

If the bot is placed in the lobby and nobody admits it, a bot.no_show event fires to your webhook. Handle it to alert the meeting organiser or retry:

if (payload.event === "bot.no_show") {
  await notifyOrganiser(payload.bot_id);
}

This is a Pro feature, available on the Pro subscription tier.

Try it yourself

API key in 30 seconds. Free credit on sign-up. No card required.