Updates from: 09/02/2023 03:11:18
Service Microsoft Docs article Related commit history on GitHub Change details
platform Meeting Apps Apis https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/meeting-apps-apis.md
The following table provides a list of APIs available across the Microsoft Teams
|Method| Description| Source| |||-|
-|[**Get user context**](#get-user-context-api)| Get contextual information to display relevant content in a Microsoft Teams tab.| [TeamsJS library](/microsoftteams/platform/tabs/how-to/access-teams-context#get-context-by-using-the-microsoft-teams-javascript-library) |
+|[**Get user context**](#get-user-context-api)| Get contextual information to display relevant content in a Microsoft Teams tab.| [TeamsJS library](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-getcontext&preserve-view=true) |
|[**Get participant**](#get-participant-api)| Fetch participant information by meeting ID and participant ID. | [Microsoft Bot Framework SDK](/dotnet/api/microsoft.bot.builder.teams.teamsinfo.getmeetingparticipantasync?view=botbuilder-dotnet-stable&preserve-view=true)
-|[**Send in-meeting notification**](#send-an-in-meeting-notification)| Provides meeting signals using the existing conversation notification API for user-bot chat and allows to notify user action that shows an in-meeting notification. | [Microsoft Bot Framework SDK](/dotnet/api/microsoft.bot.builder.teams.teamsactivityextensions.teamsnotifyuser?view=botbuilder-dotnet-stable&preserve-view=true) |
+|[**Send in-meeting notification**](#send-an-in-meeting-notification)| Provides meeting signals using the existing conversation notification API for user-bot chat and allows the bot to notify user action that shows an in-meeting notification. | [Microsoft Bot Framework SDK](/dotnet/api/microsoft.bot.builder.teams.teamsactivityextensions.teamsnotifyuser?view=botbuilder-dotnet-stable&preserve-view=true) |
|[**Get meeting details**](#get-meeting-details-api)| Get a meeting's static metadata. | [Microsoft Bot Framework SDK](/dotnet/api/microsoft.bot.builder.teams.teamsinfo.getmeetinginfoasync?view=botbuilder-dotnet-stable&preserve-view=true) | |[**Send real-time captions**](#send-real-time-captions-api)| Send real-time captions to an ongoing meeting. | [TeamsJS library](/azure/cognitive-services/speech-service/speech-sdk?tabs=nodejs%2Cubuntu%2Cios-xcode%2Cmac-xcode%2Candroid-studio#get-the-speech-sdk&preserve-view=true) | |[**Share app content to stage**](build-apps-for-teams-meeting-stage.md#share-app-content-to-stage-api)| Share specific parts of the app to meeting stage from the app side panel in a meeting. | [TeamsJS library](/javascript/api/@microsoft/teams-js/meeting) |
The following table provides a list of APIs available across the Microsoft Teams
## Get user context API
+> [!IMPORTANT]
+>
+> * By default, the [new Teams client](https://www.microsoft.com/en-us/microsoft-365/blog/2023/03/27/welcome-to-the-new-era-of-microsoft-teams/) supports light theme for apps in Teams meetings. When the `app.theme` property in getContext API returns the `default` value, Teams client is in light theme.
+> * Earlier version of Teams clients only support Dark and Contrast theme for apps in Teams meetings
+ To identify and retrieve contextual information for your tab content, see [get context for your Teams tab](../tabs/how-to/access-teams-context.md#get-context-by-using-the-microsoft-teams-javascript-library). `meetingId` is used by a tab running in the meeting context and is added for the response payload. ### Examples
The following are the TeamsJS v2 responses for Get user context API based on mee
* Meeting type
- # [Channel meeting](#tab/channel-meeting)
-
- The following is a JSON payload response for a channel meeting for in-tenant users:
+ # [Channel meeting](#tab/channel-meeting)
- ```json
- {
- "app": {
+ The following is a JSON payload response for a channel meeting for in-tenant users:
+ ```json
+ {
+ "app": {
"locale": "en-us", "sessionId": "ff47ec00-e6a7-4dc1-a6ae-f44110f50c94", "theme": "default", "iconPositionVertical": 0, "osLocaleInfo": {
- "platform": "windows",
- "regionalFormat": "en-in",
- "shortDate": "dd-MM-yyyy",
- "longDate": "dd MMMM yyyy",
- "shortTime": "HH:mm",
- "longTime": "HH:mm:ss"
+ "platform": "windows",
+ "regionalFormat": "en-in",
+ "shortDate": "dd-MM-yyyy",
+ "longDate": "dd MMMM yyyy",
+ "shortTime": "HH:mm",
+ "longTime": "HH:mm:ss"
}, "parentMessageId": "1678109354022", "userClickTime": 1678109521159, "userFileOpenPreference": "inline", "host": {
- "name": "Teams",
- "clientType": "desktop",
- "sessionId": "c3c3c0a0-f7a1-b070-6b89-c8cd1f380042",
- "ringId": "ring1"
+ "name": "Teams",
+ "clientType": "desktop",
+ "sessionId": "c3c3c0a0-f7a1-b070-6b89-c8cd1f380042",
+ "ringId": "ring1"
}, "appLaunchId": "7346ae66-5cac-47f9-8a0d-1228dac474cb"
- },
- "page": {
+ },
+ "page": {
"id": "Test", "frameContext": "sidePanel", "subPageId": "",
- "isFullScreen": false,
- "isMultiWindow": true,
- "sourceOrigin": ""
- },
- "user": {
- "id": "57efa5f3-273c-47e2-a871-4879e5d849cf",
- "displayName": "",
- "isCallingAllowed": undefined,
- "isPSTNCallingAllowed": undefined,
- "licenseType": "Unknown",
- "loginHint": "v-prkamble@microsoft.com",
- "userPrincipalName": "v-prkamble@microsoft.com",
- "tenant": {
- "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
- "teamsSku": "enterprise"
- }
- },
- "channel": {
- "id": "19:49683807ffce4318ad6d6d7a24dbde45@thread.tacv2",
- "displayName": undefined,
- "relativeUrl": undefined,
- "membershipType": undefined,
- "defaultOneNoteSectionId": undefined,
- "ownerGroupId": undefined,
- "ownerTenantId": undefined
- },
- "chat": {
- "id": "19:49683807ffce4318ad6d6d7a24dbde45@thread.tacv2"
- },
- "meeting": {
- "id": "MCMxOTo0OTY4MzgwN2ZmY2U0MzE4YWQ2ZDZkN2EyNGRiZGU0NUB0aHJlYWQudGFjdjIjMTY3ODEwOTM1NDAyMg=="
- },
- "sharepoint": undefined,
- "team": {
- "internalId": "19:b34aeec3f8e54240a5c283e86bfc4878@thread.tacv2",
- "displayName": undefined,
- "type": undefined,
- "groupId": undefined,
- "templateId": undefined,
- "isArchived": undefined,
- "userRole": 1
- },
- "sharePointSite": {
- "teamSiteUrl": "",
- "teamSiteDomain": "microsoft.sharepoint.com",
- "teamSitePath": "",
- "teamSiteId": "",
- "mySitePath": undefined,
- "mySiteDomain": undefined
- }
- }
- ```
-
- # [Scheduled meeting](#tab/scheduled-meeting)
-
- The following is a JSON payload response for a scheduled meeting for in-tenant users:
-
- ```json
- {
- "app": {
- "locale": "en-us",
- "sessionId": "e746c935-0991-47b8-b7f4-16db7646771f",
- "theme": "default",
- "iconPositionVertical": 22.998046875,
- "osLocaleInfo": null,
- "parentMessageId": "",
- "userClickTime": 1678023107126,
- "userFileOpenPreference": "inline",
- "host": {
- "name": "Teams",
- "clientType": "web",
- "sessionId": "5f2a15f6-75bd-2612-c0ff-2e1085dd165a",
- "ringId": "general"
- },
- "appLaunchId": "e07b6f2c-dc0f-4de2-9b1f-44dba2ea733c"
- },
- "page": {
- "id": "Test",
- "frameContext": "content",
- "subPageId": "",
- "isFullScreen": false,
- "isMultiWindow": false,
- "sourceOrigin": NULL
- },
- "user": {
- "id": "e652dd92-dd63-4fcc-b5b2-2005681e8e9f",
- "displayName": null,
- "isCallingAllowed": null,
- "isPSTNCallingAllowed": null,
- "licenseType": "Unknown",
- "loginHint": "admin@M365x94626565.onmicrosoft.com",
- "userPrincipalName": "admin@M365x94626565.onmicrosoft.com",
- "tenant": {
- "id": "aa923623-ae61-49ee-b401-81f414b6ad5a",
- "teamsSku": "enterprise"
- }
- },
- "channel": null,
- "chat": {
- "id": "19:meeting_YmU5NWM3NGEtZjMyMi00ZDg4LTk4OGUtMjUzMGJkZjRhMDhm@thread.v2"
- },
- "meeting": {
- "id": "MCMxOTptZWV0aW5nX1ltVTVOV00zTkdFdFpqTXlNaTAwWkRnNExUazRPR1V0TWpVek1HSmtaalJoTURobUB0aHJlYWQudjIjMA=="
- },
- "sharepoint": null,
- "team": null,
- "sharePointSite": {
- "teamSiteUrl": "",
- "teamSiteDomain": "m365x94626565.sharepoint.com",
- "teamSitePath": "",
- "teamSiteId": null,
- "mySitePath": "/personal/admin_m365x94626565_onmicrosoft_com",
- "mySiteDomain": "m365x94626565-my.sharepoint.com"
- }
- }
-
- ```
-
- # [Instant meeting](#tab/instant-meeting)
-
- The following is a JSON payload response for a Instant meeting (Meet now) for in-tenant users:
-
- ```json
- {
- "app": {
- "locale": "en-us",
- "sessionId": "4b2b69ef-6030-4379-a07b-02a64ff3bd37",
- "theme": "default",
- "iconPositionVertical": 23,
- "parentMessageId": "",
- "userClickTime": 1681216672213,
- "userFileOpenPreference": "inline",
- "host": {
- "name": "Teams",
- "clientType": "web",
- "sessionId": "a384245b-c4ee-0c76-377b-7394bd040532",
- "ringId": "ring3_6"
- },
- "appLaunchId": "f7e97fbd-0b2e-477f-9599-91a5155418d5"
- },
- "page": {
- "id": "Test",
- "frameContext": "content",
- "subPageId": "",
- "isFullScreen": false,
- "isMultiWindow": false,
- "sourceOrigin": null
- },
- "user": {
- "id": "4ebcc4d0-291b-4154-a85f-a89cd77aefa8",
- "licenseType": "Unknown",
- "loginHint": "admin@M365x654992.onmicrosoft.com",
- "userPrincipalName": "admin@M365x654992.onmicrosoft.com",
- "tenant": {
- "id": "36a708ef-700d-4d60-9de0-0a5f7b7693df",
- "teamsSku": "unknown"
+ "isFullScreen": false,
+ "isMultiWindow": true,
+ "sourceOrigin": ""
+ },
+ "user": {
+ "id": "57efa5f3-273c-47e2-a871-4879e5d849cf",
+ "displayName": "",
+ "isCallingAllowed": undefined,
+ "isPSTNCallingAllowed": undefined,
+ "licenseType": "Unknown",
+ "loginHint": "v-prkamble@microsoft.com",
+ "userPrincipalName": "v-prkamble@microsoft.com",
+ "tenant": {
+ "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
+ "teamsSku": "enterprise"
+ }
+ },
+ "channel": {
+ "id": "19:49683807ffce4318ad6d6d7a24dbde45@thread.tacv2",
+ "displayName": undefined,
+ "relativeUrl": undefined,
+ "membershipType": undefined,
+ "defaultOneNoteSectionId": undefined,
+ "ownerGroupId": undefined,
+ "ownerTenantId": undefined
+ },
+ "chat": {
+ "id": "19:49683807ffce4318ad6d6d7a24dbde45@thread.tacv2"
+ },
+ "meeting": {
+ "id": "MCMxOTo0OTY4MzgwN2ZmY2U0MzE4YWQ2ZDZkN2EyNGRiZGU0NUB0aHJlYWQudGFjdjIjMTY3ODEwOTM1NDAyMg=="
+ },
+ "sharepoint": undefined,
+ "team": {
+ "internalId": "19:b34aeec3f8e54240a5c283e86bfc4878@thread.tacv2",
+ "displayName": undefined,
+ "type": undefined,
+ "groupId": undefined,
+ "templateId": undefined,
+ "isArchived": undefined,
+ "userRole": 1
+ },
+ "sharePointSite": {
+ "teamSiteUrl": "",
+ "teamSiteDomain": "microsoft.sharepoint.com",
+ "teamSitePath": "",
+ "teamSiteId": "",
+ "mySitePath": undefined,
+ "mySiteDomain": undefined
+ }
}
- },
- "chat": {
- "id": "19:meeting_OWRiMjg0N2YtNDc1Ni00YWEyLWE4YjgtODkwZTliMzczYzg1@thread.v2"
- },
- "meeting": {
- "id": "MCMxOTptZWV0aW5nX09XUmlNamcwTjJZdE5EYzFOaTAwWVdFeUxXRTRZamd0T0Rrd1pUbGlNemN6WXpnMUB0aHJlYWQudjIjMA=="
- },
- "sharePointSite": {
- "teamSiteUrl": "",
- "teamSiteDomain": "m365x654992.sharepoint.com",
- "teamSitePath": "",
- "mySitePath": "/personal/admin_m365x654992_onmicrosoft_com",
- "mySiteDomain": "m365x654992-my.sharepoint.com"
- }
- }
- ```
-
-
+ ```
+
+ # [Scheduled meeting](#tab/scheduled-meeting)
+
+ The following is a JSON payload response for a scheduled meeting for in-tenant users:
+
+ ```json
+ {
+ "app": {
+ "locale": "en-us",
+ "sessionId": "e746c935-0991-47b8-b7f4-16db7646771f",
+ "theme": "default",
+ "iconPositionVertical": 22.998046875,
+ "osLocaleInfo": null,
+ "parentMessageId": "",
+ "userClickTime": 1678023107126,
+ "userFileOpenPreference": "inline",
+ "host": {
+ "name": "Teams",
+ "clientType": "web",
+ "sessionId": "5f2a15f6-75bd-2612-c0ff-2e1085dd165a",
+ "ringId": "general"
+ },
+ "appLaunchId": "e07b6f2c-dc0f-4de2-9b1f-44dba2ea733c"
+ },
+ "page": {
+ "id": "Test",
+ "frameContext": "content",
+ "subPageId": "",
+ "isFullScreen": false,
+ "isMultiWindow": false,
+ "sourceOrigin": NULL
+ },
+ "user": {
+ "id": "e652dd92-dd63-4fcc-b5b2-2005681e8e9f",
+ "displayName": null,
+ "isCallingAllowed": null,
+ "isPSTNCallingAllowed": null,
+ "licenseType": "Unknown",
+ "loginHint": "admin@M365x94626565.onmicrosoft.com",
+ "userPrincipalName": "admin@M365x94626565.onmicrosoft.com",
+ "tenant": {
+ "id": "aa923623-ae61-49ee-b401-81f414b6ad5a",
+ "teamsSku": "enterprise"
+ }
+ },
+ "channel": null,
+ "chat": {
+ "id": "19:meeting_YmU5NWM3NGEtZjMyMi00ZDg4LTk4OGUtMjUzMGJkZjRhMDhm@thread.v2"
+ },
+ "meeting": {
+ "id": "MCMxOTptZWV0aW5nX1ltVTVOV00zTkdFdFpqTXlNaTAwWkRnNExUazRPR1V0TWpVek1HSmtaalJoTURobUB0aHJlYWQudjIjMA=="
+ },
+ "sharepoint": null,
+ "team": null,
+ "sharePointSite": {
+ "teamSiteUrl": "",
+ "teamSiteDomain": "m365x94626565.sharepoint.com",
+ "teamSitePath": "",
+ "teamSiteId": null,
+ "mySitePath": "/personal/admin_m365x94626565_onmicrosoft_com",
+ "mySiteDomain": "m365x94626565-my.sharepoint.com"
+ }
+ }
+
+ ```
+
+ # [Instant meeting](#tab/instant-meeting)
+
+ The following is a JSON payload response for an Instant meeting (Meet now) for in-tenant users:
+
+ ```json
+ {
+ "app": {
+ "locale": "en-us",
+ "sessionId": "4b2b69ef-6030-4379-a07b-02a64ff3bd37",
+ "theme": "default",
+ "iconPositionVertical": 23,
+ "parentMessageId": "",
+ "userClickTime": 1681216672213,
+ "userFileOpenPreference": "inline",
+ "host": {
+ "name": "Teams",
+ "clientType": "web",
+ "sessionId": "a384245b-c4ee-0c76-377b-7394bd040532",
+ "ringId": "ring3_6"
+ },
+ "appLaunchId": "f7e97fbd-0b2e-477f-9599-91a5155418d5"
+ },
+ "page": {
+ "id": "Test",
+ "frameContext": "content",
+ "subPageId": "",
+ "isFullScreen": false,
+ "isMultiWindow": false,
+ "sourceOrigin": null
+ },
+ "user": {
+ "id": "4ebcc4d0-291b-4154-a85f-a89cd77aefa8",
+ "licenseType": "Unknown",
+ "loginHint": "admin@M365x654992.onmicrosoft.com",
+ "userPrincipalName": "admin@M365x654992.onmicrosoft.com",
+ "tenant": {
+ "id": "36a708ef-700d-4d60-9de0-0a5f7b7693df",
+ "teamsSku": "unknown"
+ }
+ },
+ "chat": {
+ "id": "19:meeting_OWRiMjg0N2YtNDc1Ni00YWEyLWE4YjgtODkwZTliMzczYzg1@thread.v2"
+ },
+ "meeting": {
+ "id": "MCMxOTptZWV0aW5nX09XUmlNamcwTjJZdE5EYzFOaTAwWVdFeUxXRTRZamd0T0Rrd1pUbGlNemN6WXpnMUB0aHJlYWQudjIjMA=="
+ },
+ "sharePointSite": {
+ "teamSiteUrl": "",
+ "teamSiteDomain": "m365x654992.sharepoint.com",
+ "teamSitePath": "",
+ "mySitePath": "/personal/admin_m365x654992_onmicrosoft_com",
+ "mySiteDomain": "m365x654992-my.sharepoint.com"
+ }
+ }
+ ```
+ * User type
- # [Guest user](#tab/guest-user)
+ # [Guest user](#tab/guest-user)
- The following is a JSON payload response in a scheduled private meeting for a guest user :
+ The following is a JSON payload response in a scheduled private meeting for a guest user:
- ```json
- {
- "app": {
- "locale": "en-us",
- "sessionId": "268beeb4-a52d-4ba8-b1c8-8b9f0b9b3492",
- "theme": "default",
- "iconPositionVertical": 23,
- "osLocaleInfo": {
- "platform": "windows",
- "regionalFormat": "en-in",
- "longDate": "dd MMMM yyyy",
- "shortDate": "dd-MM-yyyy",
- "longTime": "HH:mm:ss",
- "shortTime": "HH:mm"
- },
- "parentMessageId": "",
- "userClickTime": 1678023265131,
- "userFileOpenPreference": "inline",
- "host": {
- "name": "Teams",
- "clientType": "desktop",
- "sessionId": "967c980b-1e41-a2cd-eac0-a4bff8f73ce7",
- "ringId": "ring1"
- },
- "appLaunchId": "c35c4496-f28c-4107-8e6c-2dba09fb881a"
- },
- "page": {
- "id": "Test",
- "frameContext": "content",
- "subPageId": "",
- "isFullScreen": false,
- "isMultiWindow": false,
- "sourceOrigin": NULL
- },
- "user": {
- "id": "57efa5f3-273c-47e2-a871-4879e5d849cf",
- "displayName": undefined,
- "isCallingAllowed": undefined,
- "isPSTNCallingAllowed": undefined,
- "licenseType": "Unknown",
- "loginHint": "v-prkamble@microsoft.com",
- "userPrincipalName": "v-prkamble@microsoft.com",
- "tenant": {
- "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
- "teamsSku": "enterprise"
- }
- },
- "channel": undefined,
- "chat": {
- "id": "19:meeting_YmU5NWM3NGEtZjMyMi00ZDg4LTk4OGUtMjUzMGJkZjRhMDhm@thread.v2"
- },
- "meeting": {
- "id": "MCMxOTptZWV0aW5nX1ltVTVOV00zTkdFdFpqTXlNaTAwWkRnNExUazRPR1V0TWpVek1HSmtaalJoTURobUB0aHJlYWQudjIjMA=="
- },
- "sharepoint": undefined,
- "team": undefined,
- "sharePointSite": {
- "teamSiteUrl": "",
- "teamSiteDomain": "microsoft.sharepoint.com",
- "teamSitePath": "",
- "teamSiteId": undefined,
- "mySitePath": "/personal/v-prkamble_microsoft_com",
- "mySiteDomain": "microsoft-my.sharepoint.com"
- }
- }
- ```
+ ```json
+ {
+ "app": {
+ "locale": "en-us",
+ "sessionId": "268beeb4-a52d-4ba8-b1c8-8b9f0b9b3492",
+ "theme": "default",
+ "iconPositionVertical": 23,
+ "osLocaleInfo": {
+ "platform": "windows",
+ "regionalFormat": "en-in",
+ "longDate": "dd MMMM yyyy",
+ "shortDate": "dd-MM-yyyy",
+ "longTime": "HH:mm:ss",
+ "shortTime": "HH:mm"
+ },
+ "parentMessageId": "",
+ "userClickTime": 1678023265131,
+ "userFileOpenPreference": "inline",
+ "host": {
+ "name": "Teams",
+ "clientType": "desktop",
+ "sessionId": "967c980b-1e41-a2cd-eac0-a4bff8f73ce7",
+ "ringId": "ring1"
+ },
+ "appLaunchId": "c35c4496-f28c-4107-8e6c-2dba09fb881a"
+ },
+ "page": {
+ "id": "Test",
+ "frameContext": "content",
+ "subPageId": "",
+ "isFullScreen": false,
+ "isMultiWindow": false,
+ "sourceOrigin": NULL
+ },
+ "user": {
+ "id": "57efa5f3-273c-47e2-a871-4879e5d849cf",
+ "displayName": undefined,
+ "isCallingAllowed": undefined,
+ "isPSTNCallingAllowed": undefined,
+ "licenseType": "Unknown",
+ "loginHint": "v-prkamble@microsoft.com",
+ "userPrincipalName": "v-prkamble@microsoft.com",
+ "tenant": {
+ "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
+ "teamsSku": "enterprise"
+ }
+ },
+ "channel": undefined,
+ "chat": {
+ "id": "19:meeting_YmU5NWM3NGEtZjMyMi00ZDg4LTk4OGUtMjUzMGJkZjRhMDhm@thread.v2"
+ },
+ "meeting": {
+ "id": "MCMxOTptZWV0aW5nX1ltVTVOV00zTkdFdFpqTXlNaTAwWkRnNExUazRPR1V0TWpVek1HSmtaalJoTURobUB0aHJlYWQudjIjMA=="
+ },
+ "sharepoint": undefined,
+ "team": undefined,
+ "sharePointSite": {
+ "teamSiteUrl": "",
+ "teamSiteDomain": "microsoft.sharepoint.com",
+ "teamSitePath": "",
+ "teamSiteId": undefined,
+ "mySitePath": "/personal/v-prkamble_microsoft_com",
+ "mySiteDomain": "microsoft-my.sharepoint.com"
+ }
+ }
+ ```
- # [Anonymous user](#tab/anonymous-user)
+ # [Anonymous user](#tab/anonymous-user)
- The following is a JSON payload response in a scheduled private meeting for an anonymous user:
+ The following is a JSON payload response in a scheduled private meeting for an anonymous user:
- ```json
- {
-     "app": {
-         "locale": "en-us",
-         "sessionId": "a57af773-73b1-480c-a525-0c9487a51792",
-         "theme": "dark",
-         "parentMessageId": "",
-         "userClickTime": 1678369341888,
-         "host": {
-             "name": "Teams",
-             "clientType": "web",
-             "sessionId": "",
-             "ringId": "general"
-         }
-     },
-     "page": {
-         "frameContext": "meetingStage",
-         "subPageId": "",
-         "isMultiWindow": false,
-         "sourceOrigin": ""
-     },
-     "user": {
-         "id": "",
-         "licenseType": "Anonymous",
-         "loginHint": "",
-         "userPrincipalName": ""
-     },
-     "chat": {
-         "id": "19:meeting_NTZmNTI3ODgtOWZkOS00NjgzLWJhNTMtMDhlNjE5ZjAwYWYx@thread.v2"
-     },
-     "meeting": {
-         "id": "MCMxOTptZWV0aW5nX05UWm1OVEkzT0RndE9XWmtPUzAwTmpnekxXSmhOVE10TURobE5qRTVaakF3WVdZeEB0aHJlYWQudjIjMA=="
-     }
- }
+ ```json
+ {
+     "app": {
+         "locale": "en-us",
+         "sessionId": "a57af773-73b1-480c-a525-0c9487a51792",
+         "theme": "dark",
+         "parentMessageId": "",
+         "userClickTime": 1678369341888,
+         "host": {
+             "name": "Teams",
+             "clientType": "web",
+             "sessionId": "",
+             "ringId": "general"
+         }
+     },
+     "page": {
+         "frameContext": "meetingStage",
+         "subPageId": "",
+         "isMultiWindow": false,
+         "sourceOrigin": ""
+     },
+     "user": {
+         "id": "",
+         "licenseType": "Anonymous",
+         "loginHint": "",
+         "userPrincipalName": ""
+     },
+     "chat": {
+         "id": "19:meeting_NTZmNTI3ODgtOWZkOS00NjgzLWJhNTMtMDhlNjE5ZjAwYWYx@thread.v2"
+     },
+     "meeting": {
+         "id": "MCMxOTptZWV0aW5nX05UWm1OVEkzT0RndE9XWmtPUzAwTmpnekxXSmhOVE10TURobE5qRTVaakF3WVdZeEB0aHJlYWQudjIjMA=="
+     }
+ }
+
```
- # [External user](#tab/external-user)
-
- The following is a JSON payload response in a scheduled private meeting for an external user:
+ # [External user](#tab/external-user)
- ```json
- {
- "app": {
- "locale": "en-us",
- "sessionId": "fe4d7f01-e049-4238-8c5a-3c6bcf4517cd",
- "theme": "default",
- "iconPositionVertical": 0,
- "osLocaleInfo": {
- "platform": "windows",
- "regionalFormat": "en-us",
- "shortDate": "M/d/yyyy",
- "longDate": "dddd, MMMM d, yyyy",
- "shortTime": "h:mm tt",
- "longTime": "h:mm:ss tt"
- },
- "parentMessageId": "",
- "userClickTime": 0,
- "userFileOpenPreference": "inline",
- "host": {
- "name": "Teams",
- "clientType": "desktop",
- "sessionId": "d6d8d834-b13c-95bb-96bd-3bed74fdad4c",
- "ringId": "ring1"
- },
- "appLaunchId": "4ce26ee3-a6b6-4dad-9484-3b218d5603be"
- },
- "page": {
- "id": "Test",
- "frameContext": "sidePanel",
- "subPageId": "",
- "isFullScreen": false,
- "isMultiWindow": true,
- "sourceOrigin": ""
- },
- "user": {
- "id": "aeee11b1-7838-4b4a-8064-12ce5b01258f",
- "displayName": "",
- "licenseType": "Unknown",
- "loginHint": "v-hrajandira@microsoft.com",
- "userPrincipalName": "v-hrajandira@microsoft.com",
- "tenant": {
- "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
- "teamsSku": "enterprise"
- }
- },
- "chat": {
- "id": "19:meeting_Mzg5ZmQwYzItY2U3NS00MDE4LThkZjQtMzNjNWZiMzM5MzNi@thread.v2"
- },
- "meeting": {
- "id": "MCMxOTptZWV0aW5nX016ZzVabVF3WXpJdFkyVTNOUzAwTURFNExUaGtaalF0TXpOak5XWmlNek01TXpOaUB0aHJlYWQudjIjMA=="
- },
- "sharePointSite": {
- "teamSiteUrl": "",
- "teamSiteDomain": "microsoft.sharepoint.com",
- "teamSitePath": "",
- "teamSiteId": ""
- }
- }
+ The following is a JSON payload response in a scheduled private meeting for an external user:
- ```
+ ```json
+ {
+ "app": {
+ "locale": "en-us",
+ "sessionId": "fe4d7f01-e049-4238-8c5a-3c6bcf4517cd",
+ "theme": "default",
+ "iconPositionVertical": 0,
+ "osLocaleInfo": {
+ "platform": "windows",
+ "regionalFormat": "en-us",
+ "shortDate": "M/d/yyyy",
+ "longDate": "dddd, MMMM d, yyyy",
+ "shortTime": "h:mm tt",
+ "longTime": "h:mm:ss tt"
+ },
+ "parentMessageId": "",
+ "userClickTime": 0,
+ "userFileOpenPreference": "inline",
+ "host": {
+ "name": "Teams",
+ "clientType": "desktop",
+ "sessionId": "d6d8d834-b13c-95bb-96bd-3bed74fdad4c",
+ "ringId": "ring1"
+ },
+ "appLaunchId": "4ce26ee3-a6b6-4dad-9484-3b218d5603be"
+ },
+ "page": {
+ "id": "Test",
+ "frameContext": "sidePanel",
+ "subPageId": "",
+ "isFullScreen": false,
+ "isMultiWindow": true,
+ "sourceOrigin": ""
+ },
+ "user": {
+ "id": "aeee11b1-7838-4b4a-8064-12ce5b01258f",
+ "displayName": "",
+ "licenseType": "Unknown",
+ "loginHint": "v-hrajandira@microsoft.com",
+ "userPrincipalName": "v-hrajandira@microsoft.com",
+ "tenant": {
+ "id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
+ "teamsSku": "enterprise"
+ }
+ },
+ "chat": {
+ "id": "19:meeting_Mzg5ZmQwYzItY2U3NS00MDE4LThkZjQtMzNjNWZiMzM5MzNi@thread.v2"
+ },
+ "meeting": {
+ "id": "MCMxOTptZWV0aW5nX016ZzVabVF3WXpJdFkyVTNOUzAwTURFNExUaGtaalF0TXpOak5XWmlNek01TXpOaUB0aHJlYWQudjIjMA=="
+ },
+ "sharePointSite": {
+ "teamSiteUrl": "",
+ "teamSiteDomain": "microsoft.sharepoint.com",
+ "teamSitePath": "",
+ "teamSiteId": ""
+ }
+ }
-
+ ```
+ * Call type
- # [One-on-One call](#tab/one-on-one-call)
-
- The following is a JSON payload response for a one-on-one call for an in-tenant user:
-
- ```json
- {
- "app": {
- "locale": "en-us",
- "sessionId": "1b3dc47e-f6ae-4fe2-8ed6-844a505f3186",
- "theme": "dark",
- "iconPositionVertical": null,
- "osLocaleInfo": {
- "platform": "windows",
- "regionalFormat": "en-in",
- "shortDate": "dd-MM-yyyy",
- "longDate": "dd MMMM yyyy",
- "shortTime": "HH:mm",
- "longTime": "HH:mm:ss"
- },
- "parentMessageId": "",
- "userClickTime": 1678088052473,
- "userFileOpenPreference": undefined,
- "host": {
- "name": "Teams",
- "clientType": "desktop",
- "sessionId": "",
- "ringId": "general"
- },
- "appLaunchId": undefined
- },
- "page": {
- "id": "Test",
- "frameContext": "sidePanel",
- "subPageId": "",
- "isFullScreen": undefined,
- "isMultiWindow": true,
- "sourceOrigin": ""
- },
- "user": {
- "id": "e652dd92-dd63-4fcc-b5b2-2005681e8e9f",
- "displayName": undefined,
- "isCallingAllowed": undefined,
- "isPSTNCallingAllowed": undefined,
- "licenseType": "Unknown",
- "loginHint": "admin@M365x94626565.onmicrosoft.com",
- "userPrincipalName": "admin@M365x94626565.onmicrosoft.com",
- "tenant": {
- "id": "aa923623-ae61-49ee-b401-81f414b6ad5a",
- "teamsSku": "unknown"
- }
- },
- "channel": undefined,
- "chat": {
- "id": "19:a74d8489-4455-4670-9581-7b38a8017c58_e652dd92-dd63-4fcc-b5b2-2005681e8e9f@unq.gbl.spaces"
- },
- "meeting": {
- "id": "MCMxOTphNzRkODQ4OS00NDU1LTQ2NzAtOTU4MS03YjM4YTgwMTdjNThfZTY1MmRkOTItZGQ2My00ZmNjLWI1YjItMjAwNTY4MWU4ZTlmQHVucS5nYmwuc3BhY2VzIzA="
- },
- "sharepoint": undefined,
- "team": undefined,
- "sharePointSite": {
- "teamSiteUrl": undefined,
- "teamSiteDomain": "m365x94626565.sharepoint.com",
- "teamSitePath": undefined,
- "teamSiteId": undefined,
- "mySitePath": undefined,
- "mySiteDomain": undefined
- }
- }
-
- ```
-
- # [Group call](#tab/group-call)
+ # [One-on-One call](#tab/one-on-one-call)
- The following is a JSON payload response for a group chat call for an in-tenant user:
+ The following is a JSON payload response for a one-on-one call for an in-tenant user:
- ```json
- {
- "app": {
- "locale": "en-us",
- "sessionId": "cbc005c1-8c10-4dfb-a7c6-711353009cc3",
- "theme": "dark",
- "iconPositionVertical": undefined,
- "osLocaleInfo": {
- "platform": "windows",
- "regionalFormat": "en-in",
- "shortDate": "dd-MM-yyyy",
- "longDate": "dd MMMM yyyy",
- "shortTime": "HH:mm",
- "longTime": "HH:mm:ss"
- },
- "parentMessageId": "",
- "userClickTime": 1678087909562,
- "userFileOpenPreference": undefined,
- "host": {
- "name": "Teams",
- "clientType": "desktop",
- "sessionId": "",
- "ringId": "general"
- },
- "appLaunchId": undefined
- },
- "page": {
- "id": "Test",
- "frameContext": "sidePanel",
- "subPageId": "",
- "isFullScreen": undefined,
- "isMultiWindow": true,
- "sourceOrigin": ""
- },
- "user": {
- "id": "e652dd92-dd63-4fcc-b5b2-2005681e8e9f",
- "displayName": undefined,
- "isCallingAllowed": undefined,
- "isPSTNCallingAllowed": undefined,
- "licenseType": "Unknown",
- "loginHint": "admin@M365x94626565.onmicrosoft.com",
- "userPrincipalName": "admin@M365x94626565.onmicrosoft.com",
- "tenant": {
- "id": "aa923623-ae61-49ee-b401-81f414b6ad5a",
- "teamsSku": "unknown"
- }
- },
- "channel": undefined,
- "chat": {
- "id": "19:a91b5c5f7dbc4eb58e8592240db70299@thread.v2"
- },
- "meeting": {
- "id": "MCMxOTphOTFiNWM1ZjdkYmM0ZWI1OGU4NTkyMjQwZGI3MDI5OUB0aHJlYWQudjIjMA=="
- },
- "sharepoint": undefined,
- "team": undefined,
- "sharePointSite": {
- "teamSiteUrl": undefined,
- "teamSiteDomain": "m365x94626565.sharepoint.com",
- "teamSitePath": undefined,
- "teamSiteId": undefined,
- "mySitePath": undefined,
- "mySiteDomain": undefined
- }
- }
+ ```json
+ {
+ "app": {
+ "locale": "en-us",
+ "sessionId": "1b3dc47e-f6ae-4fe2-8ed6-844a505f3186",
+ "theme": "dark",
+ "iconPositionVertical": null,
+ "osLocaleInfo": {
+ "platform": "windows",
+ "regionalFormat": "en-in",
+ "shortDate": "dd-MM-yyyy",
+ "longDate": "dd MMMM yyyy",
+ "shortTime": "HH:mm",
+ "longTime": "HH:mm:ss"
+ },
+ "parentMessageId": "",
+ "userClickTime": 1678088052473,
+ "userFileOpenPreference": undefined,
+ "host": {
+ "name": "Teams",
+ "clientType": "desktop",
+ "sessionId": "",
+ "ringId": "general"
+ },
+ "appLaunchId": undefined
+ },
+ "page": {
+ "id": "Test",
+ "frameContext": "sidePanel",
+ "subPageId": "",
+ "isFullScreen": undefined,
+ "isMultiWindow": true,
+ "sourceOrigin": ""
+ },
+ "user": {
+ "id": "e652dd92-dd63-4fcc-b5b2-2005681e8e9f",
+ "displayName": undefined,
+ "isCallingAllowed": undefined,
+ "isPSTNCallingAllowed": undefined,
+ "licenseType": "Unknown",
+ "loginHint": "admin@M365x94626565.onmicrosoft.com",
+ "userPrincipalName": "admin@M365x94626565.onmicrosoft.com",
+ "tenant": {
+ "id": "aa923623-ae61-49ee-b401-81f414b6ad5a",
+ "teamsSku": "unknown"
+ }
+ },
+ "channel": undefined,
+ "chat": {
+ "id": "19:a74d8489-4455-4670-9581-7b38a8017c58_e652dd92-dd63-4fcc-b5b2-2005681e8e9f@unq.gbl.spaces"
+ },
+ "meeting": {
+ "id": "MCMxOTphNzRkODQ4OS00NDU1LTQ2NzAtOTU4MS03YjM4YTgwMTdjNThfZTY1MmRkOTItZGQ2My00ZmNjLWI1YjItMjAwNTY4MWU4ZTlmQHVucS5nYmwuc3BhY2VzIzA="
+ },
+ "sharepoint": undefined,
+ "team": undefined,
+ "sharePointSite": {
+ "teamSiteUrl": undefined,
+ "teamSiteDomain": "m365x94626565.sharepoint.com",
+ "teamSitePath": undefined,
+ "teamSiteId": undefined,
+ "mySitePath": undefined,
+ "mySiteDomain": undefined
+ }
+ }
- ```
+ ```
+
+ # [Group call](#tab/group-call)
+
+ The following is a JSON payload response for a group chat call for an in-tenant user:
+
+ ```json
+ {
+ "app": {
+ "locale": "en-us",
+ "sessionId": "cbc005c1-8c10-4dfb-a7c6-711353009cc3",
+ "theme": "dark",
+ "iconPositionVertical": undefined,
+ "osLocaleInfo": {
+ "platform": "windows",
+ "regionalFormat": "en-in",
+ "shortDate": "dd-MM-yyyy",
+ "longDate": "dd MMMM yyyy",
+ "shortTime": "HH:mm",
+ "longTime": "HH:mm:ss"
+ },
+ "parentMessageId": "",
+ "userClickTime": 1678087909562,
+ "userFileOpenPreference": undefined,
+ "host": {
+ "name": "Teams",
+ "clientType": "desktop",
+ "sessionId": "",
+ "ringId": "general"
+ },
+ "appLaunchId": undefined
+ },
+ "page": {
+ "id": "Test",
+ "frameContext": "sidePanel",
+ "subPageId": "",
+ "isFullScreen": undefined,
+ "isMultiWindow": true,
+ "sourceOrigin": ""
+ },
+ "user": {
+ "id": "e652dd92-dd63-4fcc-b5b2-2005681e8e9f",
+ "displayName": undefined,
+ "isCallingAllowed": undefined,
+ "isPSTNCallingAllowed": undefined,
+ "licenseType": "Unknown",
+ "loginHint": "admin@M365x94626565.onmicrosoft.com",
+ "userPrincipalName": "admin@M365x94626565.onmicrosoft.com",
+ "tenant": {
+ "id": "aa923623-ae61-49ee-b401-81f414b6ad5a",
+ "teamsSku": "unknown"
+ }
+ },
+ "channel": undefined,
+ "chat": {
+ "id": "19:a91b5c5f7dbc4eb58e8592240db70299@thread.v2"
+ },
+ "meeting": {
+ "id": "MCMxOTphOTFiNWM1ZjdkYmM0ZWI1OGU4NTkyMjQwZGI3MDI5OUB0aHJlYWQudjIjMA=="
+ },
+ "sharepoint": undefined,
+ "team": undefined,
+ "sharePointSite": {
+ "teamSiteUrl": undefined,
+ "teamSiteDomain": "m365x94626565.sharepoint.com",
+ "teamSitePath": undefined,
+ "teamSiteId": undefined,
+ "mySitePath": undefined,
+ "mySiteDomain": undefined
+ }
+ }
+
+ ```
-
+ ## Get participant API
POST /v1/meetings/{meetingId}/notification
| `meetingId` | The meeting ID is available through bot invoke and TeamsJS library. | | `type` |`targetedMeetingNotification` | | `recipients` | List of user IDs. Get user IDs for meeting participants through [Get participant API](#get-participant-api). Get the entire list of chat roster using [Get members API](../bots/how-to/get-teams-context.md#fetch-the-roster-or-user-profile). Empty or null recipients list will return 400.|
-| `surface` | A type of surface. The supported surface type are `meetingStage` and `meetingTabIcon`. |
+| `surface` | A type of surface. The supported surface types are `meetingStage` and `meetingTabIcon`. |
| `surfaces` | List of surfaces where notifications can be rendered. | | `contentType` | Type of content that the targeted in-meeting notification renders. The supported value is `task`. | | `content` | [TaskModuleContinueResponse](/dotnet/api/microsoft.bot.schema.teams.taskmodulecontinueresponse?view=botbuilder-dotnet-stable&preserve-view=true) |
The JSON response body for meeting details API is as follows:
| **organizer.aadObjectId** | The Organizer's Azure Active Directory object ID. | | **organizer.tenantId** | The Organizer's Azure Active Directory tenant ID. |
-In case of Recurring meeting type,
+In case of recurring meeting type:
**startDate**: Specifies the date to start applying the pattern. The value of startDate must correspond to the date value of the start property on the event resource. The first occurrence of the meeting might not occur on this date if it doesn't fit the pattern.
platform Teams Apps In Meetings https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/teams-apps-in-meetings.md
Learn more about [Teams meetings, expiration, and policies](/microsoftteams/meet
A meeting lifecycle includes pre-meeting, in-meeting, and post-meeting app experience, depending on the user type and user's role in a Teams meeting.
+### App caching for tab app in Teams meeting
+
+You can configure your tab app to enable app caching to reduce the reload time of your app during a meeting. The app reloads from the cache, which improves the app relaunch time within the meeting. For more information, see [app caching for your tab app](../tabs/how-to/app-caching.md).
+
+### Default theme for meeting apps
+
+By default, the [new Teams client](https://www.microsoft.com/en-us/microsoft-365/blog/2023/03/27/welcome-to-the-new-era-of-microsoft-teams/) supports light theme for Teams meetings. Your app can update the app UI based on the user's theme by using the [getContext API](meeting-apps-apis.md#get-user-context-api). Earlier version of Teams clients only support dark and contrast theme for apps in Teams meetings.
+ ## User types in Teams Teams supports user types, such as in-tenant, guest, federated or external, and anonymous users in a Teams meeting. Each user type can have one of the [user roles in Teams meeting](#user-roles-in-teams-meeting).
platform Define Search Command https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/search-commands/define-search-command.md
The following image displays command addition for message extension:
:::image type="content" source="../../../assets/images/tdp/add-a-command-save.PNG" alt-text="Screenshot shows how to save all your setting and parameters for your message extension.":::
-**To add additional parameters**
-
-1. Select ellipse under command section and then select **Edit parameter**.
-
- :::image type="content" source="../../../assets/images/tdp/edit-parameters.PNG" alt-text="Screenshots shows how to edit parameters for your message extension.":::
-
-1. Select **Add a Parameters** and enter all the parameters.
-
- :::image type="content" source="../../../assets/images/tdp/add-parameter.PNG" alt-text="Screenshot shows how to add additional parameters for your message extension."lightbox="../../../assets/images/tdp/add-a-parameters.PNG":::
- ### Create a search command manually To manually add your message extension search command to your app manifest, you must add the following parameters to your `composeExtensions.commands` array of objects:
platform Teams Updates https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/teams-updates.md
Title: Microsoft Teams updates
+ Title: Introducing the new Microsoft Teams client
description: Learn about the latest updates to Microsoft Teams. ms.localizationpriority: medium
-# Microsoft Teams update
+# Introducing the new Microsoft Teams client
[The new Microsoft Teams client](https://www.microsoft.com/en-us/microsoft-365/blog/2023/03/27/welcome-to-the-new-era-of-microsoft-teams/) is reimagined from the ground up with performance in mind. It's faster, simpler, smarter, and flexible to provide better experience for your apps and users. The new Teams client supports all the existing Teams app capabilities except Adaptive Card tabs. If you have an app that runs inside the Classic Teams, the app will most likely run in the new Teams client without any issues.
The following are the Teams features that will be supported soon:
* [External authentication](../tabs/how-to/authentication/auth-oauth-provider.md) isn't supported in the new Teams client. We recommend you use the [authentication using third-party OAuth provider](../tabs/how-to/authentication/auth-flow-tab.md) or use the app in the Classic Teams client.
+* [Message Extensions](../get-started/build-message-extension.md) can't be invoked from the Teams search bar in the new Teams client.
+ For more information on known issues and gaps in the new Teams client, see [new Microsoft Teams](/microsoftteams/new-teams-desktop-admin?tabs=teams-admin-center#known-issues). If your app is working fine in the Classic Teams client but has issues in the new Teams, then raise an issue on [this page](https://github.com/MicrosoftDocs/msteams-docs/issues/new?title=&body=%0A%0A%5BEnter%20feedback%20here%5D%0A%0A%0A%0A%23%23%23%23%20Document%20Details%0A%0A%E2%9A%A0%20*Do%20not%20edit%20this%20section.%20It%20is%20required%20for%20learn.microsoft.com%20%E2%9E%9F%20GitHub%20issue%20linking.*%0A%0A*%20ID%3A%2019ddf42e-0a47-7717-52d4-e549155480a2%0A*%20Version%20Independent%20ID%3A%204bbe9beb-233f-cfd5-097b-f280aab5fde8%0A*%20Content%3A%20%5BMicrosoft%20Teams%20developer%20community%20support%20and%20feedback%20-%20Teams%5D(https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fmicrosoftteams%2Fplatform%2Ffeedback)%0A*%20Content%20Source%3A%20%5Bmsteams-platform%2Ffeedback.md%5D(https%3A%2F%2Fgithub.com%2FMicrosoftDocs%2Fmsteams-docs%2Fblob%2Fmain%2Fmsteams-platform%2Ffeedback.md)%0A*%20Service%3A%20**msteams**%0A*%20GitHub%20Login%3A%20%40surbhigupta%0A*%20Microsoft%20Alias%3A%20**lajanuar**). For any other issues, request you to raise an issue on [support and feedback](../feedback.md#developer-community-forums). ## See also
-[Teams app that fits](../overview.md)
+* [Teams app that fits](../overview.md)
+* [Get context for your tab](../tabs/how-to/access-teams-context.md#handle-theme-change)
platform Collaboration Control https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/collaboration-control.md
The controls run within a Power Apps Model Driven Application (MDA) that can be
* Data can be read from Dataverse via standard OData APIs and submitted to external sources such as a system of record or a portal. ## See also
platform Teams Low Code Solutions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/teams-low-code-solutions.md
Low code platforms provide an intuitive approach to software development with mi
Microsoft Power Platform combines four robust Microsoft technologies, such as Power BI, Power Apps, Power Automate, formerly Microsoft Flow, and Power Virtual Agents in one powerful application platform. These technologies empower you to build solutions, automate processes, analyze data, and create virtual agents within a unified and integrated environment: > [!NOTE] >
platform Virtual Assistant https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-assistant.md
Request forwarding is done through the [SkillHttpClient](/dotnet/api/microsoft.b
``` A similar approach is followed for card action dispatching and task module responses. Task module fetch and submit action data is updated to include `skillId`.
-Activity Extension method `GetSkillId` extracts `skillId` from the payload which provides details about the skill that needs to be invoked.
+Activity Extension method `GetSkillId` extracts `skillId` from the payload, which provides details about the skill that needs to be invoked.
The code snippet for `OnTeamsTaskModuleFetchAsync` and `OnTeamsTaskModuleSubmitAsync` methods are given in the following section:
The following example shows how to convert the Book-a-room app template to a Vir
Book-a-room is a Teams that allows users quickly to find and reserve a meeting room for 30, 60, or 90 minutes starting from the current time. The default time is 30 minutes. The Book-a-room bot scopes to personal or 1:1 conversations. The following image displays a Virtual Assistant with a **book a room** skill: Followings are the delta changes introduced to convert it to a skill, which is attached to a Virtual Assistant. Similar guidelines are followed to convert any existing v4 bot to a skill.
To modify `languages` parameter, update bot skills command as follows:
botskills connect --remoteManifest "<url to skill's manifest>" --luisFolder "<path to luisFolder>" --languages "en-us, your_language_culture" --cs ```
-Virtual Assistant uses `SetLocaleMiddleware` to identify current locale and invoke corresponding dispatch model. Bot framework activity has locale field which is used by this middleware. You can use the same for your skill as well. Book-a-room bot doesn't use this middleware and instead gets locale from Bot framework activity's [clientInfo entity](https://github.com/microsoft/botframework-sdk/blob/master/specs/botframework-activity/botframework-activity.md#clientinfo).
+Virtual Assistant uses `SetLocaleMiddleware` to identify current locale and invoke corresponding dispatch model. Bot framework activity has locale field, which is used by this middleware. You can use the same for your skill as well. Book-a-room bot doesn't use this middleware and instead gets locale from Bot framework activity's [clientInfo entity](https://github.com/microsoft/botframework-sdk/blob/master/specs/botframework-activity/botframework-activity.md#clientinfo).
### Claim validation
You can also leverage existing skills from [Bot Framework Solutions repository](
* **EndOfConversation**: A skill must send an `endOfConversation` activity when it finishes a conversation. Based on the activity, a Virtual Assistant ends context with that particular skill and gets back into Virtual Assistant's root context. For Book-a-room bot, there's no clear state where conversation is ended. Hence we haven't sent `endOfConversation` from `Book-a-room` bot and when user wants to go back to root context they can simply do that by `start over` command. * **Card refresh**: Card refresh isn't yet supported through Virtual Assistant. * **Message extensions**:
- * Currently, a Virtual Assistant can support a maximum of ten commands for message extensions.
+ * Currently, a Virtual Assistant can support a maximum of 10 commands for message extensions.
* Configuration of message extensions isn't scoped to individual commands but for the entire extension itself. This limits configuration for each individual skill through Virtual Assistant. * Message extensions command IDs have a maximum length of [64 characters](../resources/schem#composeextensions) and 37 characters are used for embedding skill information. Thus, updated constraints for command ID are limited to 27 characters.
-You can also leverage existing skills from [Bot Framework Solutions repository](https://github.com/microsoft/botframework-components/tree/main/skills/csharp) or create a new skill altogether from scratch. Tutorials for the later can be found [here](https://microsoft.github.io/botframework-solutions/overview/skills/). Please refer to [documentation](/azure/bot-service/skills-conceptual?view=azure-bot-service-4.0&preserve-view=true) for Virtual Assistant and skills architecture.
+You can also leverage existing skills from [Bot Framework Solutions repository](https://github.com/microsoft/botframework-components/tree/main/skills/csharp) or create a new skill altogether from scratch. Tutorials for the later can be found [here](https://microsoft.github.io/botframework-solutions/overview/skills/). Refer to [documentation](/azure/bot-service/skills-conceptual?view=azure-bot-service-4.0&preserve-view=true) for Virtual Assistant and skills architecture.
## Code sample
platform Virtual Tables For Tasks https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-tables-for-tasks.md
This article provides samples, which demonstrate how to access the virtual table
After you install the Collaboration controls, the virtual tables can be treated as another service to your application that can depend on. **Pre-requisites**
-To follow along with this article, you'll need:
+To follow along with this article, you need:
1. A Dataverse environment where the Collaboration controls have been installed. 1. A user account in the Dataverse environment, which has the **Collaboration controls User** role assigned to it.
Retrieve a Planner Task with `PlannerTaskID` to perform a Read operation on one
-Keep track of the `@odata.etag` property and the`m365_graphplannertaskid` property as these will be needed to perform update or delete operations.
+Keep track of the `@odata.etag` property and the`m365_graphplannertaskid` property as these are needed to perform update or delete operations.
**Task 7: Update a Planner Task**
Header: If-Match: {{@odata.etag}}
* `@odata.etag`: Etag for the task, you must perform a read to retrieve the most up to date version. * `planTitle`: Updated title for the task.
-* `@details.etag`: Etag for the task details, you must perform a read using the query $select query parameter to include the `m365_details` column to retrieve the most up to date version. This value will be included in the `m365_details` column of the response. This value isn't the same as the `@odata.etag` because in the Planner backend, the Task and its details are stored separately.
+* `@details.etag`: Etag for the task details, you must perform a read using the query $select query parameter to include the `m365_details` column to retrieve the most up to date version. This value is included in the `m365_details` column of the response. This value isn't the same as the `@odata.etag` because in the Planner backend, the Task and its details are stored separately.
# [Response](#tab/response7)
To acquire the correct bearer token, an app registration in Azure is required. F
1. Add the **user_impersonation** delegated permission from Dynamics CRM. 1. Grant admin consent for this permission.
- :::image type="content" source="../assets/images/collaboration-control/power-automate-api-permission.png" alt-text="The screenshot is an example that shows the Power Automate API permission":::
+ :::image type="content" source="../assets/images/collaboration-control/power-automate-api-permission.png" alt-text="Screenshot shows the Power Automate API permission.":::
1. Browse to **Manifest**. 1. Set the value of the following attributes to true:
To acquire the correct bearer token, an app registration in Azure is required. F
1. Select Save.
- :::image type="content" source="../assets/images/collaboration-control/power-automate-manifest.png" alt-text="The screenshot is an example that shows the Power Automate manifest":::
+ :::image type="content" source="../assets/images/collaboration-control/power-automate-manifest.png" alt-text="Screenshot shows the Power Automate manifest.":::
### PowerApps environment permissions
-After the app registration has been set up, you must set up an application user in PowerApps environment. This will allow you to authenticate with the correct Dynamics scopes that were configured earlier.
+After the app registration has been set up, you must set up an application user in PowerApps environment. This allows you to authenticate with the correct Dynamics scopes that were configured earlier.
1. Open the [Power Platform Admin Center](https://admin.powerplatform.microsoft.com/). 1. Browse to **Environments** > **Your_Environment** > **Users** > **App Users List**.
After the app registration has been set up, you must set up an application user
1. The **System Administrator** role is applied to allow authentication for any users that have a lower security role. For example, **Collaboration controls User**. 1. This can be restricted by applying a lower role to the application. For example, **Collaboration controls Administrator**.
- :::image type="content" source="../assets/images/collaboration-control/power-automate-admin-center.png" alt-text="The screenshot is an example that shows the Power automate admin center":::
+ :::image type="content" source="../assets/images/collaboration-control/power-automate-admin-center.png" alt-text="Screenshot shows the Power automate admin center.":::
### Getting the bearer token
POST https://login.microsoftonline.com/<AZURE_APP_TENANT_ID>/oauth2/token
From the response payload, copy the value of the **access_token** property. You can then pass this Bearer token as the part of the authorization header when making requests to the Virtual tables. ## Virtual tables error handling
-Virtual tables error handling describes common error scenarios and how the virtual tables will respond.
+Virtual tables error handling describes common error scenarios and how the virtual tables respond.
### Attempt to create a virtual record without a Collaboration session
-A valid collaboration session is required for every request to create a virtual record. When a virtual record is created the virtual table will create a collaboration map record, which includes the virtual record primary key, entity name and the external ID that is, Graph resource ID. This collaboration map is associated with a collaboration session, and this is how the Collaboration controls will keep track of the collaborations associated with a business record.
+A valid collaboration session is required for every request to create a virtual record. When a virtual record is created, the virtual table creates a collaboration map record, which includes the virtual record primary key, entity name and the external ID that is, Graph resource ID. This collaboration map is associated with a collaboration session, and this is how the Collaboration controls keep track of the collaborations associated with a business record.
# [Request](#tab/request8)
To resolve this issue, you must always provide a valid `collaborationRootId` pro
### Attempt to read a virtual record without a Collaboration map
-Virtual tables allow you to execute requests, which return collections of virtual records. We saw this earlier in this document where we requested all the planner tasks associated with a specific collaboration session. It's also possible to request all the planner tasks associated with a specific planner plan by using a $filter system query like this: $filter=m365_planid eq`{{planId}}`. One issue that will happen if you use such a query is that records will be returned for planner tasks, which aren't associated with a collaboration session that is, planner tasks that were created by a means other than using a Collaboration control. If you attempt to read, update, or delete such a record the request will fail because the virtual table can't find the associated collaboration map.
+Virtual tables allow you to execute requests, which return collections of virtual records. We saw this earlier in this document where we requested all the planner tasks associated with a specific collaboration session. It's also possible to request all the planner tasks associated with a specific planner plan by using a $filter system query like this: $filter=m365_planid eq`{{planId}}`. One issue that happens if you use such a query is that records are returned for planner tasks, which aren't associated with a collaboration session that is, planner tasks that were created by a means other than using a Collaboration control. If you attempt to read, update, or delete such a record, the request fails because the virtual table can't find the associated collaboration map.
# [Request](#tab/request9)
To resolve this issue, you must check the error message in the response and if i
### Attempt to read a virtual record and the Graph resource has been deleted
-Related to the previous error, you need to handle the case where a Graph resource has been deleted but the client still has a reference to the deleted virtual record. This can happen if another user deleted the record. If you attempt to read, update, or delete such a record the request will fail because the virtual table can't retrieve the resource from Graph.
+Related to the previous error, you need to handle the case where a Graph resource has been deleted but the client still has a reference to the deleted virtual record. This can happen if another user deleted the record. If you attempt to read, update, or delete such a record, the request fails because the virtual table can't retrieve the resource from Graph.
# [Request](#tab/request10)
This case must be handled by any client code, which retrieves virtual records as
### Attempt to update a virtual record with an invalid @odata.etag
-The `@odata.etag` property is used for data concurrency and to prevent the over writing of the same record if it has been updated by another user. When, a record is read the current etag is returned, and remains valid until the record is changed. The etag should be included in any update request and will be checked before the operation completes. If the record was changed by another user since the current user read the record, then the current users update request will fail.
+The `@odata.etag` property is used for data concurrency and to prevent the over writing of the same record if it has been updated by another user. When, a record is read the current etag is returned, and remains valid until the record is changed. The etag should be included in any update request and are checked before the operation completes. If the record was changed by another user since the current user read the record, then the current users update request fails.
-If you perform two updates requests using the same @odata.etag, then the second request will fail:
+If you perform two updates requests using the same @odata.etag, then the second request fails:
# [Request](#tab/request11)
In Task 5 of above, described how to Retrieve Associated Planner Tasks. This ope
### Querying for Virtual records with required key attributes
-When, Dataverse Web API is called to retrieve multiple records from the following virtual tables a mandatory key attribute is required. Graph Booking Appointments requires a valid `m365_bookingbusinessid` is included in the query. If the key attribute isn't provided, then the request will fail as follows:
+When, Dataverse Web API is called to retrieve multiple records from the following virtual tables a mandatory key attribute is required. Graph Booking Appointments requires a valid `m365_bookingbusinessid` is included in the query. If the key attribute isn't provided, then the request fails as follows:
# [Response](#tab/response13)
To fix this problem, change the request to this format:
### Creating virtual records and Graph access control
-The virtual tables honor the access control specified for Microsoft Graph. The virtual tables won't permit operations that the user couldn't perform using the Microsoft Graph API. For example, if the user you use to create the Plan is Task 3 and isn't a member of group you use then you'll get 403 Forbidden responses.
+The virtual tables honor the access control specified for Microsoft Graph. The virtual tables won't permit operations that the user couldn't perform using the Microsoft Graph API. For example, if the user you use to create the Plan is Task 3 and isn't a member of group you use then you get 403 Forbidden responses.
## See also
platform Access Teams Context https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/access-teams-context.md
Use placeholders in your configuration or content URLs. Microsoft Teams replaces
For example, in your app manifest if you set your tab *configurationUrl* attribute to `"https://www.contoso.com/config?name={user.loginHint}&tenant={user.tenant.id}&group={team.groupId}&theme={app.theme}"` and the signed-in user has the following attributes:
-* Their username is **user@example.com**.
+* Their username is **<user@example.com>**.
* Their company tenant ID is **e2653c-etc**.
-* They're a member of the Office 365 group with ID **00209384-etc**.
+* They're a member of the Microsoft 365 group with ID **00209384-etc**.
* The user has set their Teams theme to **dark**. Teams will call the following URL when configuring the tab:
For more information on shared channels, see [shared channels](~/concepts/build-
## Handle theme change
+> [!IMPORTANT]
+>
+> * By default, the [new Teams client](https://www.microsoft.com/en-us/microsoft-365/blog/2023/03/27/welcome-to-the-new-era-of-microsoft-teams/) supports light theme for apps in Teams meetings. When the `app.theme` property in getContext API returns the `default` value, Teams client is in light theme.
+> * Earlier version of Teams clients only support Dark and Contrast theme for apps in Teams meetings.
+ You can register your app to be informed if the theme changes by calling `microsoftTeams.app.registerOnThemeChangeHandler(function(theme) { /* ... */ })`. The `theme` argument in the function is a string with a value of `default`, `dark`, or `contrast`.
+# [Default](#tab/default)
+
+The following image shows the default theme option in the Teams:
++
+# [Dark](#tab/dark)
+
+The following image shows the dark theme option in the Teams:
++++ ## Code sample | Sample name | Description | Javascript|
The `theme` argument in the function is a string with a value of `default`, `dar
* [Microsoft Teams Connect shared channels](../../concepts/build-and-test/shared-channels.md) * [App manifest schema for Teams](../../resources/schem) * [Use task modules in tabs](../../task-modules-and-cards/task-modules/task-modules-tabs.md)
+* [Introducing the new Teams client](../../resources/teams-updates.md)
platform Teams Faq https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/teams-faq.md
No, Live Share doesn't support Teams Rooms devices.
<details> <summary><b>Do Live Share apps support meeting recordings?</b></summary>
-No, Live Share doesn't support Teams Rooms devices.
+No, Live Share doesn't support meeting recordings.
<br>
platform Whats New https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/whats-new.md
Explore updates from the previous GA releases listed here.
| 11/05/2018 | The **task module** feature is released. A task module allows you to create modal pop-up experiences in your Teams application, from both bots and tabs. Inside the pop-up, you can run your own custom HTML/JavaScript code, show an `<iframe>`-based widget such as a YouTube or Microsoft Stream video, or display an [Adaptive card](/adaptive-cards/). | [Task module Overview](~/concepts/task-modules/task-modules-overview.md), [task module in tabs](~/concepts/task-modules/task-modules-tabs.md), [task module in bots](~/concepts/task-modules/task-modules-bots.md) | | 10/05/2018 | Formatting information for cards is updated and tested in the desktop, iOS, and Android clients for Teams. | [Cards](~/concepts/cards/cards.md), [Card formatting](~/concepts/cards/cards-format.md) | | 09/24/2018 | Calls and online meetings APIs for Microsoft Graph is released to beta, and Teams apps can now interact with users in rich ways using voice and video. | [Calls and online meetings bots](~/concepts/calls-and-meetings/registering-calling-bot.md), [Real-time media concepts](~/concepts/calls-and-meetings/real-time-media-concepts.md), [Registering a calling bot](~/concepts/calls-and-meetings/registering-calling-bot.md), [Debugging and local testing](~/concepts/calls-and-meetings/debugging-local-testing-calling-meeting-bots.md), [Application-hosted media](~/concepts/calls-and-meetings/requirements-considerations-application-hosted-media-bots.md), [Handling incoming call notifications](~/concepts/calls-and-meetings/call-notifications.md) |
-| 09/11/2018 | Tab configuration pages are now significantly taller. | [Tab Design](tabs/design/tabs.md) |
+| 09/11/2018 | Tab configuration pages are now taller. | [Tab Design](tabs/design/tabs.md) |
| 08/15/2018 | Adaptive cards are now supported in Teams.|[Adaptive card actions in Teams](task-modules-and-cards/cards/cards-reference.md#adaptive-card) | | 08/10/2018 | Client support for DevTools.| [DevTools for the Microsoft Teams Desktop Client](~/resources/dev-preview/developer-preview-tools.md)| | 08/08/2018 | Message extensions now supports multiple commands. | [composeExtensions.commands](~/resources/schem#composeextensionscommands)|
Developer preview is a public program that provides early access to unreleased T
**2023 August**
+* ***August 31, 2023***: [The new Teams client supports light theme for apps in Teams meetings.](tabs/how-to/access-teams-context.md#handle-theme-change)
+ * ***August 28, 2023***: [Teams app manifest is now referred to as app manifest.](resources/schem) * ***August 22, 2023***: [Enable RSC permissions for a user using the Graph APIs](graph-api/rsc/grant-resource-specific-consent.md#configure-consent-settings).