Updates from: 08/23/2023 01:59:19
Service Microsoft Docs article Related commit history on GitHub Change details
platform Grant Resource Specific Consent https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/grant-resource-specific-consent.md
Title: Grant RSC permissions to an app
-description: In this article, learn how to grant resource-specific consent (RSC) permissions, which allows team and chat owners and meeting organizers to grant consent for an app.
+description: In this article, learn how to grant resource-specific consent (RSC) permissions, which allows team, chat owners, users, and meeting organizers to grant consent for an app.
ms.localizationpriority: medium
Last updated 03/28/2023
# Grant RSC permissions to your app
-Resource-specific consent (RSC) is a Microsoft Teams and Microsoft Graph API integration that enables your app to use API endpoints to manage specific resources, either teams or chats, within an organization.
+Resource-specific consent (RSC) is a Microsoft Teams and Microsoft Graph API integration that enables your app to use API endpoints to manage specific resources, either teams, chats, or users within an organization.
In this section, you'll learn to: 1. [Add RSC permissions to your Teams app](#add-rsc-permissions-to-your-teams-app)
-1. [Install your app in a team or chat](#install-your-app-in-a-team-or-chat)
+1. [Install your app in a team, chat, or user](#install-your-app-in-a-team-chat-or-user)
1. [Verify app RSC permission granted to your app](#verify-app-rsc-permission-granted-to-your-app) ## Add RSC permissions to your Teams app
To add RSC permissions to your app, follow these steps:
The Azure Active Directory (Azure AD) portal provides a central platform for you to register and configure your apps. You must register your app in the Azure AD portal to integrate with the identity platform and call Graph APIs. For more information, see [register an app with the identity platform](/graph/auth-register-app-v2). > [!WARNING]
-> You mustn't share your Azure AD app ID across multiple Teams apps. There must be a 1:1 mapping between a Teams app and an Azure AD app. Attempts to install multiple Teams apps which are associated with the same Azure AD app ID will cause installation or runtime failures.
+> You mustn't share your Azure AD app ID across multiple Teams apps. There must be a 1:1 mapping between a Teams app and an Azure AD app. Installing multiple Teams apps associated with the same Azure AD app ID will cause installation or runtime failures.
### Update your Teams app manifest
Example for RSC permissions in a chat:
} ```
+Example for RSC permissions for user:
+
+```json
+"webApplicationInfo": {
+ "id": "XXxxXXXXX-XxXX-xXXX-XXxx-XXXXXXXxxxXX",
+ "resource": "https://RscBasedStoreApp"
+ },
+"authorization": {
+ "permissions": {
+ "orgWide": []
+ "resourceSpecific": [
+ {
+ "name": "InAppPurchase.Allow.User",
+ "type": "Delegated"
+ },
+ {
+ "name": "TeamsActivity.Send.User",
+ "type": "Application"
+ },
+ ]
+ }
+}
+```
+ <br> </details>
Example for RSC permissions in a chat:
} ```
+Example for RSC permissions for a user:
+
+```json
+"webApplicationInfo": {
+ "id": "XXxxXXXXX-XxXX-xXXX-XXxx-XXXXXXXxxxXX",
+ "resource": "https://RscBasedStoreApp",
+ "applicationPermissions": [
+ "TeamsActivity.Send.User"
+ ]
+ }
+```
+ <br> </details>
-## Install your app in a team or chat
+## Install your app in a team, chat, or user
-To install your app on which you've enabled RSC permission in a team or chat, follow these steps:
+To install your app on which you've enabled RSC permission in a team, chat, or user, follow these steps:
-1. Ensure that you've configured [consent settings](#configure-consent-settings) for team or chat.
+1. Ensure that you've configured [consent settings](#configure-consent-settings) for team, chat, or user.
1. [Sideload your app in Teams](#sideload-your-app-in-teams). ### Configure consent settings
The default value of the property `isChatResourceSpecificConsentEnabled` is base
* Teams app with RSC permissions is installed in a chat or meeting. > [!NOTE]
-> Admin control is added to allow or block RSC consent settings based on the sensitivity of the data accessed. It isn't based on the single master switch that enables or disables consent settings for app RSC permissions for all apps in the tenant.
+> Admin control is added to allow or block RSC settings based on the sensitivity of the accessed data. The control is independent of the org-wide app settings for RSC that allows or blocks RSC permissions for all apps in the tenant.
<br> </details>
+<br>
+<details>
+
+<summary><b>Configure user owner consent settings for RSC for a user using the Graph APIs</b></summary>
+
+You can enable or disable RSC for user using Graph API. The property `isUserPersonalScopeResourceSpecificConsentEnabled` in [teamsAppSettings](/graph/api/teamsappsettings-update#example-1-enable-installation-of-apps-that-require-resource-specific-consent-in-chats-meetings) governs whether user RSC is enabled in the tenant.
++
+The default value of the property `isUserPersonalScopeResourceSpecificConsentEnabled` is based on whether [user consent settings](/azure/active-directory/manage-apps/configure-user-consent?tabs=azure-portal) is turned on or off in the tenant when RSC for user is first used. The default value is defined either when:
+
+* [TeamsAppSettings](/graph/api/teamsappsettings-get) are retrieved for the first time.
+* Teams app with RSC permissions is installed for a user.
+
+> [!NOTE]
+> Admin control is added to allow or block RSC consent settings based on the sensitivity of the data accessed. It isn't based on the single master switch that enables or disables consent settings for app RSC permissions for all apps in the tenant.
+
+</details>
+
+<br>
+ ### Sideload your app in Teams
-If your Teams admin allows custom app uploads, you can [sideload your app](~/concepts/deploy-and-publish/apps-upload.md) directly to a specific team or chat.
+If your Teams admin allows custom app uploads, you can [sideload your app](~/concepts/deploy-and-publish/apps-upload.md) directly to a specific team, chat, or user.
## Verify app RSC permission granted to your app
For more information, see [get access on behalf of a user](/graph/auth-v2-user?v
You can check the type of RSC permission granted to a resource in the app:
-* For application RSC permissions, call the following APIs to retrieve the list of apps installed in a team or chat:
+* For application RSC permissions, call the following APIs to retrieve the list of apps installed in a team, chat, or user:
* [List apps in chat](/graph/api/chat-list-installedapps?view=graph-rest-1.0&tabs=http&preserve-view=true) * [List apps in team](/graph/api/team-list-installedapps?view=graph-rest-1.0&tabs=http&preserve-view=true)
+ * [List apps for user](/graph/api/userteamwork-list-installedapps?view=graph-rest-1.0&tabs=http&preserve-view=true)
These are all the application RSC permissions granted on this specific resource. Each entry in the list can be correlated to the Teams app by matching the `clientAppId` in the permission grants list with the `webApplicationInfo.Id` property in the app's manifest.
For more information on how to get details of the apps installed in a specific t
For more information on how to get details of apps installed in a specific chat, see [get the names and other details of apps installed in the specified chat](/graph/api/chat-list-installedapps#example-2-get-the-names-and-other-details-of-apps-installed-in-the-specified-chat).
+#### Check your app for added RSC permissions for a user
+
+1. Use the [Get user API](/graph/api/user-get?view=graph-rest-1.0&tabs=http&preserve-view=true). In the request url, pass the user's UPN and from the response body use the `id` field as the user's ID.
+1. Sign in to **Graph Explorer**.
+1. Make a **GET** call to this endpoint: `https://graph.microsoft.com/beta/users/{user-id}/permissionGrants`.
+
+ Alternatively, you can pass the user's UPN instead of the `user-id`.
+
+ The `clientAppId` field in the response must map to the `webApplicationInfo.id` specified in the Teams app manifest.
+
+ :::image type="content" source="../../assets/images/user-graph-permissions.png" alt-text="Screenshot shows the Graph explorer response to GET call for user RSC permissions.":::
+
+For more information on how to get details of the apps installed for the user, see [get the names and other details of apps installed for the user](/graph/api/userteamwork-list-installedapps?view=graph-rest-1.0&branch=main&tabs=http&preserve-view=true).
+ ## Code sample | **Sample name** | **Description** | **.NET** |**Node.js** | **Manifest**|
For more information on how to get details of apps installed in a specific chat,
* [Resource-specific consent in Microsoft Teams for admins](/MicrosoftTeams/resource-specific-consent) * [Group owner consent](/azure/active-directory/manage-apps/configure-user-consent-groups?tabs=azure-portal) * [Global Administrator](/azure/active-directory/roles/permissions-reference#global-administrator&preserve-view=true)
+* [List permissionGrants of a user](/graph/api/user-list-permissiongrants?view=graph-rest-beta&preserve-view=true)
+* [Send notification to a user](/graph/api/userteamwork-sendactivitynotification?view=graph-rest-beta&tabs=http&preserve-view=true)
platform Resource Specific Consent https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/resource-specific-consent.md
Through RSC, an authorized user can give an app access to the data of a specific
For example, a person who owns both team A and team B can decide to give Contoso app access to the data of only team A and not team B. The same concept of scoped data access applies to chats and meetings as well.
-RSC permissions are categorized based on:
+Following are the types of RSC permissions:
1. The resource type on which data access is being granted: * Teams (and the channels within those teams)
RSC permissions are categorized based on:
1. The mode of data access: * Application: The app accesses data without the presence of a signed-in user.
- * Delegated: The app accesses data in the context of a signed-in users session only. No access is allowed in the absence of a signed-in user.
+ * Delegated: The app only accesses data in the context of a signed-in user's sessions. It doesn't allow access in the absence of a signed-in user.
| &nbsp; | Application context RSC permissions | Delegated context RSC permissions | | - | :-: | :-: | | **Resource type** | &nbsp; | &nbsp; | | Team | ✔️ | ✔️ | | Chat or meeting | ✔️ | ✔️ |
-| User | NA | ✔️ |
+| User | ✔️ | ✔️ |
In this section, you'll learn more about:
In this section, you'll learn more about:
Use RSC permissions to determine the data access methods for your app. A user's ability to grant RSC permissions varies based on resource types and access modes. The following are the types of RSC permissions for an app based on access mode:
-* **Application context RSC permissions (application permission)**: This type of RSC permission allows an app to access data without the user being signed in. Only resource owners can grant application RSC permissions.
+* **Application context RSC permissions (application permission)**: Allows an app to access data without the user being signed in. Only resource owners can grant application RSC permissions.
> [!NOTE] > Application RSC permissions for chat scope are available in [public developer preview](../../resources/dev-preview/developer-preview-intro.md) only.
-* **Delegated context RSC permissions (delegated permission)**: This type of RSC permission allows an app to access data only on behalf of a signed-in user. No access is allowed in the absence of a signed-in user. Only authorized users can install an app in a specific scope. They can also grant any delegated RSC permissions that the app requests in that specific scope at app installation. For example, if regular members have the permission to install an app inside a team, then they can also grant delegated RSC permission to the app in that specific team.
+* **Delegated context RSC permissions (delegated permission)**: Allows an app to access data only on behalf of a signed-in user. No access is allowed in the absence of a signed-in user. Only authorized users can install an app in a specific scope. They can also grant any delegated RSC permissions that the app requests in that specific scope at app installation. For example, if regular members have the permission to install an app inside a team, then they can also grant delegated RSC permission to the app in that specific team.
### RSC-based data access APIs
Microsoft Graph SDK, Microsoft Bot Framework SDK, and Microsoft TeamsJS client l
|Application| ΓÇó Microsoft Graph <br> ΓÇó Microsoft Bot Framework | >=v1.6 | Teams, chats, and meetings | ΓÇó Microsoft Graph-based controls for chats and meetings <br> ΓÇó Azure Active Directory (Azure AD) portal-based controls for Teams |ΓÇó Team: A team owner <br> ΓÇó Chat: A chat member <br> ΓÇó Meeting: A meeting organizer or presenter | | Delegated | Microsoft Teams Client | >=v1.12 | Teams, chats, meetings, and users | Always on | Any user authorized to install an app in the specific scope. |
+> [!NOTE]
+> The `TeamsActivity.Send` RSC application permission is always enabled at the tenant level. App users don't need admin consent to use the permission.
+ ## Supported RSC permissions The following list provides all the RSC permissions categorized based on resource type. Each table also states which data access modes are available for each permission.
For more information, see [chat resource-specific consent permissions](/graph/pe
### RSC permissions for user access
+> [!NOTE]
+> The `TeamsActivity.Send.User` RSC permission is available only in [public developer preview](../../resources/dev-preview/developer-preview-intro.md).
+ The following table provides RSC permissions for a user and their applicable data access mode: | Permission name | Action | Type: Delegated | Type: Application |
The following table provides RSC permissions for a user and their applicable dat
| `MicrophoneStream.Read.User` | Read the user's microphone stream. |Supported |NA | | `MeetingParticipantReaction.Read.User` | Read the user's reactions while participating in a meeting. |Supported |NA | | `OutgoingVideoStream.Write.User` | Modify the user's outgoing video. |Supported |NA |
+| `TeamsActivity.Send.User` | Send activity notifications to the user. |NA |Supported |
## Next step
platform Cards Loop Component https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/cards-loop-component.md
To turn on the Adaptive Card-based Loop component in Outlook for web, follow the
The Adaptive Card generated by your app is rendered as a Loop component.
+## Code sample
+
+|**Sample name** | **Description** | **Node.js** |
+|-|--|--|
+| Message extension with Adaptive Card-based Loop Component | This sample demonstrates how to create a message extension with Adaptive Card-based Loop component.|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/msgext-unfurling-ac-loop-components/nodejs)|
+ ## See also [Design your Loop component](design-loop-components.md)
platform Manifest Schema Dev Preview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema-dev-preview.md
The version of the manifest schema this manifest is using.
**Required**ΓÇöString
-The version of the specific app. If you update something in your manifest, the version must be incremented as well. This way, when the new manifest is installed, it overwrites the existing one and the user will get the new functionality. If this app was submitted to the store, the new manifest has to be resubmitted and revalidated. Then, users of this app will get the new updated manifest automatically in a few hours, after it's approved.
+The version of the specific app. If you update something in your manifest, the version must be incremented as well. This way, when the new manifest is installed, it overwrites the existing one and the user gets the new functionality. If this app was submitted to the store, the new manifest has to be resubmitted and revalidated. Then, users of this app will get the new updated manifest automatically in a few hours, after it's approved.
If the app requested permissions change, users are prompted to upgrade and re-consent to the app.
The object is an array (maximum of 16 elements) with all elements of the type `o
|Name| Type| Maximum size | Required | Description| |||||| |`entityId`|String|64 characters|✔️|A unique identifier for the entity that the tab displays.|
-|`name`|String|128 characters|✔️|The display name of the tab in the channel interface.|
+|`name`|String|128 characters|✔️|The display name of the tab.|
|`contentUrl`|String|2048 characters|✔️|The https:// URL that points to the entity UI to be displayed in the Teams canvas.| |`contentBotId`| | | | The Microsoft Teams app ID specified for the bot in the Bot Framework portal. | |`websiteUrl`|String|2048 characters||The https:// URL to point at if a user opts to view in a browser.|
-|`scopes`|Array of enum|1|✔️|Static tabs support the `personal`, `team` and `groupChat` scopes, which means it can be provisioned as part of the personal, group chat, and channel meetings experience.|
+|`scopes`|Array of enum|3|✔️|Static tabs support the `personal`, `team` and `groupChat` scopes, which means it can be provisioned as part of the personal, group chat, and channel meetings experience.|
## bots
Define the properties your app uses to post a user activity feed.
|Name| Type| Maximum size | Required | Description| ||||||
-|`type`|string|32 characters|✔️|The notification type. *See below*.|
-|`description`|string|128 characters|✔️|A brief description of the notification. *See below*.|
+|`type`|string|32 characters|✔️|The notification type. |
+|`description`|string|128 characters|✔️|A brief description of the notification. |
|`templateText`|string|128 characters|✔️|Ex: "{actor} created task {taskId} for you"| ```json
platform Manifest Schema https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema.md
The https:// URL referencing the JSON Schema for the manifest.
## manifestVersion
-**Required**ΓÇöstring
+**Required**ΓÇöString
The version of the manifest schema that this manifest is using. Use `1.13` to enable Teams app support in Outlook and Microsoft 365 app; use `1.12` (or earlier) for Teams-only apps. ## version
-**Required**ΓÇöstring
+**Required**ΓÇöString
The version of a specific app. When you update something in your manifest, the version must be incremented too. This way, when the new manifest is installed, it overwrites the existing one and the user receives the new functionality. When this app was submitted to the store, the new manifest must be resubmitted and revalidated. The app users receive the new updated manifest automatically within few hours after the manifest is approved.
The ID stored in Teams Admin Center is the **External App ID** and it's visible
## developer
-**Required**ΓÇöobject
+**Required**ΓÇöObject
Specifies information about your company. For apps submitted to the Teams store, these values must match the information in your store listing. For more information, see the [Teams store publishing guidelines](~/concepts/deploy-and-publish/appsource/publish.md).
Specifies information about your company. For apps submitted to the Teams store,
## name
-**Required**ΓÇöobject
+**Required**ΓÇöObject
The name of your app experience, displayed to users in the Teams experience. For apps submitted to AppSource, these values must match the information in your AppSource entry. The values of `short` and `full` must be different.
The name of your app experience, displayed to users in the Teams experience. For
## description
-**Required**ΓÇöobject
+**Required**ΓÇöObject
Describes your app to users. For apps submitted to AppSource, these values must match the information in your AppSource entry.
Ensure that your description describes your experience and helps potential custo
## localizationInfo
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
Allows the specification of a default language and provides pointers to more language files. For more information, see [localization](~/concepts/build-and-test/apps-localization.md).
An array of objects specifying more language translations.
## icons
-**Required**ΓÇöobject
+**Required**ΓÇöObject
Icons used within the Teams app. The icon files must be included as part of the upload package. For more information, see [Icons](../../concepts/build-and-test/apps-package.md#app-icons).
The value must be a valid HTML color code starting with '#', for example `#4464e
## configurableTabs
-**Optional**ΓÇöarray
+**Optional**ΓÇöArray
Used when your app experience has a team channel tab experience that requires extra configuration before it's added. Configurable tabs are supported only in the `team` and `groupChat` scopes and you can configure the same tabs multiple times. However, you can define it in the manifest only once. |Name| Type| Maximum size | Required | Description| ||||||
-|`configurationUrl`|string|2048 characters|✔️|The https:// URL to use when configuring the tab.|
-|`scopes`|array of enums|2|✔️|Currently, configurable tabs support only the `team` and `groupChat` scopes. |
+|`configurationUrl`|String|2048 characters|✔️|The https:// URL to use when configuring the tab.|
+|`scopes`|Array of enums|2|✔️|Currently, configurable tabs support only the `team` and `groupChat` scopes. |
|`canUpdateConfiguration`|Boolean|||A value indicating whether an instance of the tab's configuration can be updated by the user after creation. Default: **true**.|
-|`meetingSurfaces`|array of enums|2||The set of `meetingSurfaceItem` scopes where a [tab is supported](../../tabs/how-to/access-teams-context.md). Default: **[sidepanel, stage]**. |
-|`context` |array of enums|8||The set of `contextItem` scopes where a [tab is supported](../../tabs/how-to/access-teams-context.md). Accepted value: **[personalTab, channelTab, privateChatTab, meetingChatTab, meetingDetailsTab, meetingSidePanel, meetingStage, callingSidepanel]**.|
-|`sharePointPreviewImage`|string|2048||A relative file path to a tab preview image for use in SharePoint. Size 1024x768. |
-|`supportedSharePointHosts`|array of enums|2||Defines how your tab is made available in SharePoint. Options are `sharePointFullPage` and `sharePointWebPart`. |
+|`meetingSurfaces`|Array of enums|2||The set of `meetingSurfaceItem` scopes where a [tab is supported](../../tabs/how-to/access-teams-context.md). Default: **[sidepanel, stage]**. |
+|`context` |Array of enums|8||The set of `contextItem` scopes where a [tab is supported](../../tabs/how-to/access-teams-context.md). Accepted value: **[personalTab, channelTab, privateChatTab, meetingChatTab, meetingDetailsTab, meetingSidePanel, meetingStage, callingSidepanel]**.|
+|`sharePointPreviewImage`|String|2048||A relative file path to a tab preview image for use in SharePoint. Size 1024x768. |
+|`supportedSharePointHosts`|Array of enums|2||Defines how your tab is made available in SharePoint. Options are `sharePointFullPage` and `sharePointWebPart`. |
## staticTabs
-**Optional**ΓÇöarray
+**Optional**ΓÇöArray
Defines a set of tabs that can be "pinned" by default, without the user adding them manually. Static tabs declared in `personal` scope are always pinned to the app's personal experience. Static tabs declared in the `team` scope are currently not supported.
This item is an array (maximum of 16 elements) with all elements of the type `ob
|Name| Type| Maximum size | Required | Description| ||||||
-|`entityId`|string|64 characters|✔️|A unique identifier for the entity that the tab displays.|
-|`name`|string|128 characters||The display name of the tab in the channel interface.|
-|`contentUrl`|string|2048 characters||The https:// URL that points to the entity UI to be displayed in the Teams canvas.|
-|`contentBotId`|string|128 characters||The Microsoft app ID specified for the bot in the [Bot Framework portal](https://dev.botframework.com/bots).|
-|`websiteUrl`|string|2048 characters||The https:// URL to point to if a user opts to view in a browser.|
-|`searchUrl`|string|2048 characters||The https:// URL to point to for a user's search queries.|
-|`scopes`|array of enums|3|✔️| Currently, static tabs support only the `personal` scope, which means it can be provisioned only as part of the personal experience.|
-|`context` | array of enums| 8|| The set of `contextItem` scopes where a [tab is supported](../../tabs/how-to/access-teams-context.md). Default: **[personalTab, channelTab, privateChatTab, meetingChatTab, meetingDetailsTab, meetingStage, meetingSidepanel, teamLevelApp]**.|
+|`entityId`|String|64 characters|✔️|A unique identifier for the entity that the tab displays.|
+|`name`|String|128 characters||The display name of the tab.|
+|`contentUrl`|String|2048 characters||The https:// URL that points to the entity UI to be displayed in the Teams canvas.|
+|`contentBotId`|String|128 characters||The Microsoft app ID specified for the bot in the [Bot Framework portal](https://dev.botframework.com/bots).|
+|`websiteUrl`|String|2048 characters||The https:// URL to point to if a user opts to view in a browser.|
+|`searchUrl`|String|2048 characters||The https:// URL to point to for a user's search queries.|
+|`scopes`|Array of enums|3|✔️|Accepted values: `team`, `personal`, `groupChat`|
+|`context` | Array of enums| 8|| The set of `contextItem` contexts where a [tab is supported](../../tabs/how-to/access-teams-context.md). </br> Accepted values: `personalTab`, `channelTab`, `privateChatTab`, `meetingChatTab`, `meetingDetailsTab`, `meetingStage`, `meetingSidepanel`, `teamLevelApp`. </br> Default values: `personalTab`, `channelTab`, `privateChatTab`, `meetingChatTab`, `meetingDetailsTab`. |
> [!NOTE]
-> The searchUrl feature is not available for the third-party developers.
-> If your tabs require context-dependent information to display relevant content or for initiating an authentication flow, For more information, see [Get context for your Microsoft Teams tab](../../tabs/how-to/access-teams-context.md).
+>
+> * The `groupChat` and `team` scopes are supported only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+> * The `teamLevelApp` context is dedicated only for Education tenants.
+> * The `searchUrl` feature is not available for the third-party developers.
+> * If your tabs require context-dependent information to display relevant content or for initiating an authentication flow, For more information, see [Get context for your Microsoft Teams tab](../../tabs/how-to/access-teams-context.md).
## bots
-**Optional**ΓÇöarray
+**Optional**ΓÇöArray
Defines a bot solution, along with optional information such as default command properties.
The item is an array (maximum of only one element&mdash;currently only one bot i
|Name| Type| Maximum size | Required | Description| ||||||
-|`botId`|string|128 characters|✔️|The unique Microsoft app ID for the bot as registered with the Bot Framework. The ID can be the same as the overall [app ID](#id).|
-|`scopes`|array of enums|3|✔️|Specifies whether the bot offers an experience in the context of a channel in a `team`, in a group chat (`groupChat`), or an experience scoped to an individual user alone (`personal`). These options are non-exclusive.|
+|`botId`|String|128 characters|✔️|The unique Microsoft app ID for the bot as registered with the Bot Framework. The ID can be the same as the overall [app ID](#id).|
+|`scopes`|Array of enums|3|✔️|Specifies whether the bot offers an experience in the context of a channel in a `team`, in a group chat (`groupChat`), or an experience scoped to an individual user alone (`personal`). These options are non-exclusive.|
|`needsChannelSelector`|Boolean|||Describes whether or not the bot uses a user hint to add the bot to a specific channel. Default: **`false`**| |`isNotificationOnly`|Boolean|||Indicates whether a bot is a one-way, notification-only bot, as opposed to a conversational bot. Default: **`false`**| |`supportsFiles`|Boolean|||Indicates whether the bot supports the ability to upload/download files in personal chat. Default: **`false`**|
A list of commands that your bot can recommend to users. The object is an array
|Name| Type| Maximum size | Required | Description| ||||||
-|`items.scopes`|array of enums|3|✔️|Specifies the scope for which the command list is valid. Options are `team`, `personal`, and `groupChat`.|
-|`items.commands`|array of objects|10|✔️|An array of commands the bot supports:<br>`title`: the bot command name (string, 32)<br>`description`: a simple description or example of the command syntax and its argument (string, 128).|
+|`items.scopes`|Array of enums|3|✔️|Specifies the scope for which the command list is valid. Options are `team`, `personal`, and `groupChat`.|
+|`items.commands`|Array of objects|10|✔️|An array of commands the bot supports:<br>`title`: the bot command name (string, 32)<br>`description`: a simple description or example of the command syntax and its argument (string, 128).|
### bots.commandLists.commands |Name| Type| Maximum size | Required | Description| ||||||
-|title|string|32|✔️|The bot command name.|
-|description|string|128 characters|✔️|A simple text description or an example of the command syntax and its arguments.|
+|title|String|32|✔️|The bot command name.|
+|description|String|128 characters|✔️|A simple text description or an example of the command syntax and its arguments.|
## connectors
-**Optional**ΓÇöarray
+**Optional**ΓÇöArray
The `connectors` block defines a connector card for Microsoft 365 Groups for the app.
The object is an array (maximum of one element) with all elements of type `objec
|Name| Type| Maximum size | Required | Description| ||||||
-|`configurationUrl`|string|2048 characters| |The https:// URL to use when configuring the connector.|
-|`scopes`|array of enums|1|✔️|Specifies whether the Connector offers an experience in the context of a channel in a `team`, or an experience scoped to an individual user alone (`personal`). Currently, only the `team` scope is supported.|
-|`connectorId`|string|64 characters|✔️|A unique identifier for the Connector that matches its ID in the [Connectors Developer Dashboard](https://aka.ms/connectorsdashboard).|
+|`configurationUrl`|String|2048 characters| |The https:// URL to use when configuring the connector.|
+|`scopes`|Array of enums|1|✔️|Specifies whether the Connector offers an experience in the context of a channel in a `team`, or an experience scoped to an individual user alone (`personal`). Currently, only the `team` scope is supported.|
+|`connectorId`|String|64 characters|✔️|A unique identifier for the Connector that matches its ID in the [Connectors Developer Dashboard](https://aka.ms/connectorsdashboard).|
## composeExtensions
-**Optional**ΓÇöarray
+**Optional**ΓÇöArray
Defines a message extension for the app.
The item is an array (maximum of one element) with all elements of type `object`
|Name| Type | Maximum Size | Required | Description| ||||||
-|`botId`|string|128 characters|✔️|The unique Microsoft app ID for the bot that backs the message extension, as registered with the Bot Framework. The ID can be the same as the overall App ID.|
-|`commands`|array of objects|10|✔️|Array of commands the message extension supports.|
+|`botId`|String|128 characters|✔️|The unique Microsoft app ID for the bot that backs the message extension, as registered with the Bot Framework. The ID can be the same as the overall App ID.|
+|`commands`|Array of objects|10|✔️|Array of commands the message extension supports.|
|`canUpdateConfiguration`|Boolean|||A value indicating whether the configuration of a message extension can be updated by the user. Default: **false**.|
-|`messageHandlers`|array of Objects|5||A list of handlers that allow apps to be invoked when certain conditions are met.|
-|`messageHandlers.type`|string|||The type of message handler. Must be `"link"`.|
-|`messageHandlers.value.domains`|array of Strings|2048 characters||Array of domains that the link message handler can register for.|
+|`messageHandlers`|Array of Objects|5||A list of handlers that allow apps to be invoked when certain conditions are met.|
+|`messageHandlers.type`|String|||The type of message handler. Must be `"link"`.|
+|`messageHandlers.value.domains`|Array of Strings|2048 characters||Array of domains that the link message handler can register for.|
|`messageHandlers.value.supportsAnonymizedPayloads`|Boolean||| A boolean value that indicates whether the app's link message handler supports anonymous invoke flow. Default is false.| ### composeExtensions.commands
Each command item is an object with the following structure:
|Name| Type| Maximum size | Required | Description| ||||||
-|`id`|string|64 characters|✔️|The ID for the command.|
-|`title`|string|32 characters|✔️|The user-friendly command name.|
-|`type`|string|||Type of the command. One of `query` or `action`. Default: **query**.|
-|`description`|string|128 characters||The description that appears to users to indicate the purpose of this command.|
+|`id`|String|64 characters|✔️|The ID for the command.|
+|`title`|String|32 characters|✔️|The user-friendly command name.|
+|`type`|String|||Type of the command. One of `query` or `action`. Default: **query**.|
+|`description`|String|128 characters||The description that appears to users to indicate the purpose of this command.|
|`initialRun`|Boolean|||A Boolean value indicates whether the command runs initially with no parameters. Default is **false**.|
-|`context`|array of Strings|3||Defines where the message extension can be invoked from. Any combination of`compose`,`commandBox`,`message`. Default is `["compose","commandBox"]`.|
+|`context`|Array of Strings|3||Defines where the message extension can be invoked from. Any combination of`compose`,`commandBox`,`message`. Default is `["compose","commandBox"]`.|
|`fetchTask`|Boolean|||A Boolean value that indicates if it must fetch the task module dynamically. Default is **false**.|
-|`taskInfo`|object|||Specify the task module to pre-load when using a message extension command.|
-|`taskInfo.title`|string|64 characters||Initial dialog title.|
-|`taskInfo.width`|string|||Dialog width - either a number in pixels or default layout such as 'large', 'medium', or 'small'.|
-|`taskInfo.height`|string|||Dialog height - either a number in pixels or default layout such as 'large', 'medium', or 'small'.|
-|`taskInfo.url`|string|||Initial webview URL.|
-|`parameters`|array of object|5 items|✔️|The list of parameters the command takes. Minimum: 1; maximum: 5.|
-|`parameters.name`|string|64 characters|✔️|The name of the parameter as it appears in the client. The parameter name is included in the user request.|
-|`parameters.title`|string|32 characters|✔️|User-friendly title for the parameter.|
-|`parameters.description`|string|128 characters||User-friendly string that describes this parameterΓÇÖs purpose.|
-|`parameters.value`|string|512 characters||Initial value for the parameter. Currently the value isn't supported|
-|`parameters.inputType`|string|||Defines the type of control displayed on a task module for`fetchTask: false` . Input value can only be one of `text, textarea, number, date, time, toggle, choiceset` .|
-|`parameters.choices`|array of objects|10 items||The choice options for the`choiceset`. Use only when`parameter.inputType` is `choiceset`.|
-|`parameters.choices.title`|string|128 characters|✔️|Title of the choice.|
-|`parameters.choices.value`|string|512 characters|✔️|Value of the choice.|
+|`taskInfo`|Object|||Specify the task module to pre-load when using a message extension command.|
+|`taskInfo.title`|String|64 characters||Initial dialog title.|
+|`taskInfo.width`|String|||Dialog width - either a number in pixels or default layout such as 'large', 'medium', or 'small'.|
+|`taskInfo.height`|String|||Dialog height - either a number in pixels or default layout such as 'large', 'medium', or 'small'.|
+|`taskInfo.url`|String|||Initial webview URL.|
+|`parameters`|Array of object|5 items|✔️|The list of parameters the command takes. Minimum: 1; maximum: 5.|
+|`parameters.name`|String|64 characters|✔️|The name of the parameter as it appears in the client. The parameter name is included in the user request.|
+|`parameters.title`|String|32 characters|✔️|User-friendly title for the parameter.|
+|`parameters.description`|String|128 characters||User-friendly string that describes this parameterΓÇÖs purpose.|
+|`parameters.value`|String|512 characters||Initial value for the parameter. Currently the value isn't supported|
+|`parameters.inputType`|String|||Defines the type of control displayed on a task module for`fetchTask: false` . Input value can only be one of `text, textarea, number, date, time, toggle, choiceset` .|
+|`parameters.choices`|Array of objects|10 items||The choice options for the`choiceset`. Use only when`parameter.inputType` is `choiceset`.|
+|`parameters.choices.title`|String|128 characters|✔️|Title of the choice.|
+|`parameters.choices.value`|String|512 characters|✔️|Value of the choice.|
## permissions
-**Optional**ΓÇöarray of strings
+**Optional**ΓÇöArray of strings
An array of `string`, which specifies which permissions the app requests, which let end users know how the extension does. The following options are non-exclusive:
Changing these permissions during app update, causes your users to repeat the co
## devicePermissions
-**Optional**ΓÇöarray of strings
+**Optional**ΓÇöArray of strings
Provides the native features on a user's device that your app requests access to. Options are:
The object is an array with all elements of the type `string`.
## webApplicationInfo
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
Provide your Azure Active Directory App ID and Microsoft Graph information to help users seamlessly sign into your app. If your app is registered in Microsoft Azure Active Directory (Azure AD), you must provide the App ID. Administrators can easily review permissions and grant consent in Teams admin center. |Name| Type| Maximum size | Required | Description| ||||||
-|`id`|string|128 characters|✔️|Azure AD application ID of the app. This ID must be a GUID.|
-|`resource`|string|2048 characters||Resource URL of app for acquiring auth token for SSO. </br> **NOTE:** If you aren't using SSO, ensure that you enter a dummy string value in this field to your app manifest, for example, `https://example` to avoid an error response. |
+|`id`|String|128 characters|✔️|Azure AD application ID of the app. This ID must be a GUID.|
+|`resource`|String|2048 characters||Resource URL of app for acquiring auth token for SSO. </br> **NOTE:** If you aren't using SSO, ensure that you enter a dummy string value in this field to your app manifest, for example, `https://example` to avoid an error response. |
## graphConnector
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
Specify the app's Graph connector configuration. If this is present, then [webApplicationInfo.id](#webapplicationinfo) must also be specified. |Name| Type| Maximum size | Required | Description| ||||||
-|`notificationUrl`|string|2048 characters|✔️|The url where Graph-connector notifications for the application should be sent.|
+|`notificationUrl`|String|2048 characters|✔️|The url where Graph-connector notifications for the application should be sent.|
## showLoadingIndicator
Indicates if a personal app is rendered without a tab header bar (signifying ful
## activities
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
Define the properties your app uses to post a user activity feed. |Name| Type| Maximum size | Required | Description| ||||||
-|`activityTypes`|array of Objects|128 items| | Provide the types of activities that your app can post to a users activity feed.|
+|`activityTypes`|Array of Objects|128 items| | Provide the types of activities that your app can post to a users activity feed.|
### activities.activityTypes |Name| Type| Maximum size | Required | Description| ||||||
-|`type`|string|32 characters|✔️|The notification type. *See below*.|
-|`description`|string|128 characters|✔️|A brief description of the notification. *See below*.|
-|`templateText`|string|128 characters|✔️|Ex: "{actor} created task {taskId} for you"|
+|`type`|String|32 characters|✔️|The notification type. *See below*.|
+|`description`|String|128 characters|✔️|A brief description of the notification. *See below*.|
+|`templateText`|String|128 characters|✔️|Ex: "{actor} created task {taskId} for you"|
```json {
Define the properties your app uses to post a user activity feed.
## defaultInstallScope
-**Optional**ΓÇöstring
+**Optional**ΓÇöString
Specifies the install scope defined for this app by default. The defined scope is the option displayed on the button when a user tries to add the app. Options are:
Specifies the install scope defined for this app by default. The defined scope i
## defaultGroupCapability
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
When a group install scope is selected, it defines the default capability when the user installs the app. Options are:
When a group install scope is selected, it defines the default capability when t
|Name| Type| Maximum size | Required | Description| ||||||
-|`team`|string|||When the install scope selected is `team`, this field specifies the default capability available. Options: `tab`, `bot`, or `connector`.|
-|`groupChat`|string|||When the install scope selected is `groupChat`, this field specifies the default capability available. Options: `tab`, `bot`, or `connector`.|
-|`meetings`|string|||When the install scope selected is `meetings`, this field specifies the default capability available. Options: `tab`, `bot`, or `connector`.|
+|`team`|String|||When the install scope selected is `team`, this field specifies the default capability available. Options: `tab`, `bot`, or `connector`.|
+|`groupChat`|String|||When the install scope selected is `groupChat`, this field specifies the default capability available. Options: `tab`, `bot`, or `connector`.|
+|`meetings`|String|||When the install scope selected is `meetings`, this field specifies the default capability available. Options: `tab`, `bot`, or `connector`.|
## configurableProperties
-**Optional**ΓÇöarray
+**Optional**ΓÇöArray
The `configurableProperties` block defines the app properties that Teams admins can customize. For more information, see [enable app customization](~/concepts/design/enable-app-customization.md). The app customization feature isn't supported in custom or LOB apps.
You can define any of the following properties:
## supportedChannelTypes
-**Optional**ΓÇöarray
+**Optional**ΓÇöArray
Enables your app in non-standard channels. If your app supports a team scope and this property is defined, Teams enables your app in each channel type accordingly. The supportedChannelTypes property only supports `sharedChannels` and `privateChannels`.
When `defaultBlockUntilAdminAction` property is set to **true**, the app is hidd
## publisherDocsUrl
-**Optional**ΓÇöstring
+**Optional**ΓÇöString
**Maximum size** - 2048 characters
The `publisherDocsUrl` is an HTTPS URL to an information page for admins to get
## subscriptionOffer
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
Specifies the SaaS offer associated with your app.
Specifies the SaaS offer associated with your app.
## meetingExtensionDefinition
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
Specify meeting extension definition. For more information, see [custom Together Mode scenes in Teams](../../apps-in-teams-meetings/teams-together-mode.md).
Specify meeting extension definition. For more information, see [custom Together
|Name| Type|Maximum size|Required |Description| ||||||
-|`id`|string | 128 characters|✔️| The unique identifier for the scene. This id must be a GUID. |
-|`name`| string | 128 characters |✔️| The name of the scene. |
-|`file`|string|2048 characters|✔️| The relative file path to the scenes' metadata json file. |
-|`preview`|string|2048 characters|✔️| The relative file path to the scenes' PNG preview icon. |
-|`maxAudience`| integer | 50 |✔️| The maximum number of audiences supported in the scene. |
-|`seatsReservedForOrganizersOrPresenters`| integer | 50 |✔️| The number of seats reserved for organizers or presenters.|
+|`id`|String | 128 characters|✔️| The unique identifier for the scene. This id must be a GUID. |
+|`name`| String | 128 characters |✔️| The name of the scene. |
+|`file`|String|2048 characters|✔️| The relative file path to the scenes' metadata json file. |
+|`preview`|String|2048 characters|✔️| The relative file path to the scenes' PNG preview icon. |
+|`maxAudience`| Integer | 50 |✔️| The maximum number of audiences supported in the scene. |
+|`seatsReservedForOrganizersOrPresenters`| Integer | 50 |✔️| The number of seats reserved for organizers or presenters.|
## authorization
-**Optional**ΓÇöobject
+**Optional**ΓÇöObject
> [!NOTE] > `authorization` is only supported for manifest version 1.12 or later.
Specify and consolidate authorization related information for the app.
|Name| Type|Maximum size|Required |Description| ||||||
-|`permissions`|NA|NA|NA|List of permissions that the app needs to function.|
+|`permissions`||||List of permissions that the app needs to function.|
### authorization.permissions |Name| Type|Maximum size|Required |Description| ||||||
-|`resourceSpecific`| array of objects|16 items|NA|Permissions that guard data access on resource instance level.|
+|`resourceSpecific`| Array of objects|16 items||Permissions that guard data access on resource instance level.|
### authorization.permissions.resourceSpecific |Name| Type|Maximum size|Required |Description| ||||||
-|`type`|string|NA|✔️| The type of the resource-specific consent (RSC) permission. Options: `Application` and `Delegated`.|
-|`name`|string|128 characters|✔️|The name of the RSC permission. For more information, see [RSC application permissions](#rsc-application-permissions) and [RSC delegated permissions](#rsc-delegated-permissions)|
+|`type`|String||✔️| The type of the resource-specific consent (RSC) permission. Options: `Application` and `Delegated`.|
+|`name`|String|128 characters|✔️|The name of the RSC permission. For more information, see [RSC application permissions](#rsc-application-permissions) and [RSC delegated permissions](#rsc-delegated-permissions)|
#### RSC application permissions
platform Teams Updates https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/teams-updates.md
To ensure a smooth transition, a phased rollout of the new platform is planned a
> [!NOTE] > > * We recommend to test apps, tabs, messaging extensions, bots, and link unfurling after switching from the Classic Teams client to the new Teams client.
-> * Adaptive Card tabs aren't supported in the new Teams client. If your app is using Adaptive Card tabs, we recommend you rebuild the tab as a web-based tab. For more information, see [build tabs for Teams](../tabs/what-are-tabs.md).
+> * [Adaptive Card tabs](../tabs/how-to/build-adaptive-card-tabs.md) aren't supported in the new Teams client. If your app is using Adaptive Card tabs, we recommend you rebuild the tab as a web-based tab. For more information, see [build tabs for Teams](../tabs/what-are-tabs.md).
The following are the Teams features that will be supported soon:
The following are the Teams features that will be supported soon:
* [Sideloading of apps](../concepts/deploy-and-publish/apps-upload.md) isn't supported in the new Teams client. You can sideload an app in the Classic Teams client and use it in new Teams client.
+* [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.
+ 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).
platform Whats New https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/whats-new.md
Teams platform features that are available to all app developers.
**2023 August** * ***August 16, 2023***: [Use Teams Toolkit Visual Studio v17.7 extension with many new app development features to get started with app development for Teams.](toolkit/toolkit-v4/teams-toolkit-fundamentals-vs.md)
-* ***August 10, 2023***: [Send a proactive message using AAD ID](bots/how-to/conversations/send-proactive-messages.md)
+* ***August 10, 2023***: [Send a proactive message using AAD ID](bots/how-to/conversations/send-proactive-messages.md).
:::column-end::: :::row-end:::
Developer preview is a public program that provides early access to unreleased T
**2023 August**
-***August 21, 2023***: [Introduced the new Microsoft Teams client to provide better experience for your apps and users](resources/teams-updates.md).
+* ***August 22, 2023***: [Enable RSC permissions for a user using the Graph APIs](graph-api/rsc/grant-resource-specific-consent.md#configure-consent-settings).
-***August 21, 2023***: [Use Adaptive Card-based Loop components to build collaborative experiences within Teams message extensions that work across Microsoft 365.](m365-apps/design-loop-components.md)
+* ***August 21, 2023***: [Introduced the new Microsoft Teams client to provide better experience for your apps and users](resources/teams-updates.md).
-***August 08, 2023***: [Use callRecording API to fetch meeting recording from all meetings.](graph-api/meeting-transcripts/overview-transcripts.md)
+* ***August 21, 2023***: [Use Adaptive Card-based Loop components to build collaborative experiences within Teams message extensions that work across Microsoft 365.](m365-apps/design-loop-components.md)
+
+* ***August 08, 2023***: [Use callRecording API to fetch meeting recording from all meetings.](graph-api/meeting-transcripts/overview-transcripts.md)
:::column-end::: :::row-end:::