---
title: "Integrations - Microsoft Teams (meeting bot)"
url: "https://docs.unified.to/integrations/microsoftteamsmeetingbot"
description: "Build Microsoft Teams (meeting bot) integrations faster with our Unified API — Calendar & Meetings data, OAuth2, real-time sync."
date: "2026-11-09T22:02:40.186Z"
updated: "2026-11-09T22:02:40.186Z"
---

# Microsoft Teams (meeting bot) integration

> What this integration supports through the Unified.to API, by object. Live data: `GET https://api.unified.to/unified/integration?type=microsoftteamsmeetingbot` with your workspace API key (or Core MCP `list_unified_integrations` with `type: "microsoftteamsmeetingbot"`). All integrations: https://docs.unified.to/integrations.md

## Overview

- **Type:** `microsoftteamsmeetingbot`
- **Categories:** [Calendar & Meetings](https://docs.unified.to/calendar/overview.md), [Call Center](https://docs.unified.to/uc/overview.md), [Authentication](https://docs.unified.to/auth/overview.md), [Passthrough](https://docs.unified.to/passthrough/overview.md)
- **Website:** https://www.microsoft.com/en-us/microsoft-teams/group-chat-software
- **Vendor API docs:** https://learn.microsoft.com/en-us/graph/api/resources/callrecords-api-overview?view=graph-rest-1.0
- **Launched:** 2026-11-07

## How end users connect

- **OAuth2** authorization flow. Register your own OAuth2 app with the vendor and add its credentials to the integration.

## OAuth2 scopes

Pass Unified scopes in `scopes=` on the authorization URL; each one requests these vendor scopes. Request only what you need.

| Unified scope | Vendor scopes |
| --- | --- |
| `calendar_bot_read` | `openid`, `email`, `profile`, `OnlineMeetings.Read`, `offline_access` |
| `calendar_bot_write` | `openid`, `email`, `profile`, `OnlineMeetings.Read`, `Calendars.Read`, `offline_access` |
| `calendar_botevent_read` | `openid`, `email`, `profile`, `User.Read`, `OnlineMeetings.Read`, `OnlineMeetingRecording.Read.All`, `OnlineMeetingTranscript.Read.All`, `offline_access` |
| `calendar_busy_read` | `openid`, `email`, `profile`, `Calendars.Read`, `offline_access` |
| `calendar_calendar_read` | `openid`, `email`, `profile`, `Calendars.Read`, `offline_access` |
| `calendar_calendar_write` | `openid`, `email`, `profile`, `Calendars.ReadWrite`, `offline_access` |
| `calendar_event_read` | `openid`, `email`, `profile`, `Calendars.Read`, `offline_access` |
| `calendar_event_write` | `openid`, `email`, `profile`, `Calendars.ReadWrite`, `offline_access` |
| `calendar_recording_read` | `openid`, `email`, `profile`, `OnlineMeetingRecording.Read.All`, `OnlineMeetingTranscript.Read.All`, `OnlineMeetingAiInsight.Read.All`, `OnlineMeetings.Read`, `offline_access` |
| `calendar_webinar_read` | `openid`, `email`, `profile`, `VirtualEvent.Read`, `offline_access` |
| `calendar_webinar_write` | `openid`, `email`, `profile`, `VirtualEvent.ReadWrite`, `offline_access` |
| `uc_call_read` | `openid`, `email`, `profile`, `offline_access` |
| `uc_recording_read` | `openid`, `email`, `profile`, `OnlineMeetingRecording.Read.All`, `OnlineMeetingTranscript.Read.All`, `OnlineMeetings.Read`, `CallRecordings.Read.All`, `CallTranscripts.Read.All`, `offline_access` |

## Supported objects

| Object | Methods | Webhooks |
| --- | --- | --- |
| [calendar_bot](#calendar_bot) | list, get, create, update, remove | none |
| [calendar_botevent](#calendar_botevent) | none | created |
| [calendar_busy](#calendar_busy) | list | none |
| [calendar_calendar](#calendar_calendar) | list, get | none |
| [calendar_event](#calendar_event) | list, get, create, update, remove | created, updated, deleted |
| [calendar_recording](#calendar_recording) | list, get | created, updated |
| [calendar_webinar](#calendar_webinar) | list, get, create, update, remove | created, updated |
| [passthrough](#passthrough) | none | none |
| [uc_call](#uc_call) | list, get | created, updated |
| [uc_recording](#uc_recording) | list, get | created, updated |

Values below come from the integration's support data. "Required list filters" must be sent on list calls; "Required on create" fields must be sent when creating. Webhook events are `native` (pushed by the vendor) or `virtual` (polled by Unified.to). Anything not listed is not supported; an unsupported method returns `501`.

### calendar_bot

- **Methods:** `list`, `get`, `create`, `update`, `remove`
- **Webhooks:** none
- **List filters:** `list_event_id`, `list_limit`, `list_offset`, `list_status`
- **Readable fields:** `created_at`, `ended_at`, `event_id`, `id`, `meeting_metadata`, `meeting_url`, `name`, `participants`, `recording_id`, `started_at`, `status`, `status_changes`, `updated_at`
- **Writable fields:** `event_id`, `meeting_url`, `name`
- **Model:** https://docs.unified.to/calendar/bot/model.md

### calendar_botevent

- **Methods:** none
- **Webhooks:** `created` (native)
- **Readable fields:** `bot_id`, `created_at`, `id`, `participant`, `status_change`, `transcript`, `type`
- **Writable fields:** none
- **Vendor objects:** `call_record`, `recording`, `transcript`
- **Model:** https://docs.unified.to/calendar/botevent/model.md

### calendar_busy

- **Methods:** `list`
- **Webhooks:** none
- **List filters:** `list_calendar_id`, `list_end_lt`, `list_room_id`, `list_start_gte`, `list_user_id`
- **Readable fields:** `description`, `end_at`, `start_at`, `timezone`
- **Writable fields:** none
- **Vendor objects:** `scheduleItems`
- **Model:** https://docs.unified.to/calendar/busy/model.md

### calendar_calendar

- **Methods:** `list`, `get`
- **Webhooks:** none
- **List filters:** `list_limit`, `list_offset`, `list_query`
- **Readable fields:** `id`, `is_primary`, `name`
- **Writable fields:** none
- **Vendor objects:** `calendar`
- **Model:** https://docs.unified.to/calendar/calendar/model.md

### calendar_event

- **Methods:** `list`, `get`, `create`, `update`, `remove`
- **Webhooks:** `created` (native, virtual), `updated` (native, virtual), `deleted` (native)
- **Virtual webhook filters:** `virtual_webhook_calendar_id`, `virtual_webhook_limit`, `virtual_webhook_updated_gte`
- **List filters:** `list_calendar_id`, `list_end_lt`, `list_expand`, `list_limit`, `list_offset`, `list_room_id`, `list_start_gte`, `list_updated_gte`
- **Readable fields:** `attachments`, `attendees`, `calendar_id`, `conference`, `created_at`, `end_at`, `has_conference`, `id`, `is_all_day`, `is_free`, `is_private`, `location`, `notes`, `organizer`, `recurrence`, `recurring_event_id`, `rooms`, `start_at`, `status`, `subject`, `timezone`, `updated_at`, `web_url`
- **Slow fields** (skipped unless you request them in `fields`): `attachments`
- **Writable fields:** `attendees`, `conference`, `has_conference`, `is_all_day`, `is_free`, `is_private`, `location`, `notes`, `recurrence`, `rooms`, `status`, `subject`, `timezone`
- **Required on create:** `end_at`, `start_at`
- **Vendor objects:** `event`
- **Model:** https://docs.unified.to/calendar/event/model.md

### calendar_recording

- **Methods:** `list`, `get`
- **Webhooks:** `created` (virtual), `updated` (virtual)
- **Virtual webhook filters:** `virtual_webhook_end_lt`, `virtual_webhook_event_id`, `virtual_webhook_limit`, `virtual_webhook_start_gte`, `virtual_webhook_updated_gte`
- **List filters:** `list_end_lt`, `list_limit`, `list_offset`, `list_order`, `list_start_gte`, `list_updated_gte`
- **Required list filters:** `list_event_id`
- **Readable fields:** `created_at`, `end_at`, `event_id`, `id`, `media`, `start_at`
- **Writable fields:** none
- **Vendor objects:** `recording`, `transcript`
- **Model:** https://docs.unified.to/calendar/recording/model.md

### calendar_webinar

- **Methods:** `list`, `get`, `create`, `update`, `remove`
- **Webhooks:** `created` (native), `updated` (native)
- **List filters:** `list_limit`, `list_offset`
- **Readable fields:** `conference`, `end_at`, `id`, `join_url`, `notes`, `organizer`, `panelists`, `registrants`, `start_at`, `status`, `subject`, `timezone`
- **Slow fields** (skipped unless you request them in `fields`): `panelists`, `registrants`
- **Writable fields:** `notes`, `panelists`, `status`, `subject`, `timezone`
- **Required on create:** `end_at`, `start_at`
- **Vendor objects:** `virtual event webinar`, `webinar`
- **Model:** https://docs.unified.to/calendar/webinar/model.md

### passthrough

- **Methods:** none
- **Webhooks:** none
- **Readable fields:** none
- **Writable fields:** none

### uc_call

- **Methods:** `list`, `get`
- **Webhooks:** `created` (native, virtual), `updated` (virtual)
- **Virtual webhook filters:** `virtual_webhook_end_lt`, `virtual_webhook_limit`, `virtual_webhook_start_gte`, `virtual_webhook_updated_gte`, `virtual_webhook_user_id`
- **List filters:** `list_end_lt`, `list_limit`, `list_offset`, `list_start_gte`, `list_updated_gte`, `list_user_id`
- **Readable fields:** `contact_id`, `contacts`, `created_at`, `end_at`, `id`, `start_at`, `telephone`, `type`, `updated_at`, `user_id`, `user_name`
- **Writable fields:** none
- **Vendor objects:** `Call Record`
- **Model:** https://docs.unified.to/uc/call/model.md

### uc_recording

- **Methods:** `list`, `get`
- **Webhooks:** `created` (virtual), `updated` (virtual)
- **Virtual webhook filters:** `virtual_webhook_call_id`, `virtual_webhook_end_lt`, `virtual_webhook_limit`, `virtual_webhook_start_gte`, `virtual_webhook_updated_gte`, `virtual_webhook_user_id`
- **List filters:** `list_call_id`, `list_end_lt`, `list_limit`, `list_offset`, `list_order`, `list_sort_by_created_at`, `list_start_gte`, `list_updated_gte`, `list_user_id`
- **Readable fields:** `call_id`, `contacts`, `created_at`, `end_at`, `id`, `media`, `start_at`, `type`, `user_id`, `user_name`, `user_phone`, `web_url`
- **Slow fields** (skipped unless you request them in `fields`): `media`, `user_name`, `type`, `contacts`, `user_phone`
- **Writable fields:** none
- **Vendor objects:** `recording`, `transcript`
- **Model:** https://docs.unified.to/uc/recording/model.md
