Updates from: 05/28/2022 01:19:51
Service Microsoft Docs article Related commit history on GitHub Change details
platform API References https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/API-references.md
Title: Meeting apps API references
-description: Identify the meeting apps API references with examples and Code samples
+description: Identify the meeting apps API references with examples and Code samples, Teams apps meetings user participant role api user context notification signal query.
ms.localizationpriority: medium
-keywords: teams apps meetings user participant role api user context notification signal query
# Meeting apps API references
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 Teams tab.| MSTC SDK|
-|[**Get participant**](#get-participant-api)| Fetch participant information by meeting ID and participant ID. |MSBF SDK|
-|[**Send in-meeting notification**](#send-an-in-meeting-notification)| Provide meeting signals using the existing conversation notification API for user-bot chat and allows to notify user action that shows an in-meeting notification. |MSBF SDK|
-|[**Get meeting details**](#get-meeting-details-api)| Get a meeting's static metadata. |MSBF SDK |
-|[**Send real-time captions**](#send-real-time-captions-api)| Send real-time captions to an ongoing meeting. |MSTC SDK|
-|[**Share app content to stage**](#share-app-content-to-stage-api)| Share specific parts of the app to meeting stage from the app side panel in a meeting. |MSTC SDK|
-|[**Get app content stage sharing state**](#get-app-content-stage-sharing-state-api)| Fetch information about app's sharing state on the meeting stage. |MSTC SDK|
-|[**Get app content stage sharing capabilities**](#get-app-content-stage-sharing-capabilities-api)| Fetch the app's capabilities for sharing to the meeting stage. |MSTC SDK|
-|[**Get real-time Teams meeting events**](#get-real-time-teams-meeting-events-api)|Fetch real-time meeting events, such as actual start and end time.| MSBF SDK|
+|[**Get user context**](#get-user-context-api)| Get contextual information to display relevant content in a Teams tab.| [MSTC SDK](/microsoftteams/platform/tabs/how-to/access-teams-context#get-context-by-using-the-microsoft-teams-javascript-library) |
+|[**Get participant**](#get-participant-api)| Fetch participant information by meeting ID and participant ID. | [MSBF 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)| Provide meeting signals using the existing conversation notification API for user-bot chat and allows to notify user action that shows an in-meeting notification. | [MSBF 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. | [MSBF 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. | [MSTC SDK](/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**](#share-app-content-to-stage-api)| Share specific parts of the app to meeting stage from the app side panel in a meeting. | [MSTC SDK](/javascript/api/@microsoft/teams-js/microsoftteams.meeting?view=msteams-client-js-latest&preserve-view=true) |
+|[**Get app content stage sharing state**](#get-app-content-stage-sharing-state-api)| Fetch information about app's sharing state on the meeting stage. | [MSTC SDK](/javascript/api/@microsoft/teams-js/microsoftteams.meeting.iappcontentstagesharingstate?view=msteams-client-js-latest&preserve-view=true) |
+|[**Get app content stage sharing capabilities**](#get-app-content-stage-sharing-capabilities-api)| Fetch the app's capabilities for sharing to the meeting stage. | [MSTC SDK](/javascript/api/@microsoft/teams-js/microsoftteams.meeting.iappcontentstagesharingcapabilities?view=msteams-client-js-latest&preserve-view=true) |
+|[**Get real-time Teams meeting events**](#get-real-time-teams-meeting-events-api)|Fetch real-time meeting events, such as actual start and end time.| [MSBF SDK](/dotnet/api/microsoft.bot.builder.teams.teamsactivityhandler.onteamsmeetingstartasync?view=botbuilder-dotnet-stable&preserve-view=true) |
## Get user context API
GET /v1/meetings/{meetingId}/participants/{participantId}?tenantId={tenantId}
+| Property name | Purpose |
+|||
+| **user.id** | ID of the user. |
+| **user.aadObjectId** | Azure Active Directory object ID of the user. |
+| **user.name** | Name of the user. |
+| **user.givenName** | First Name of the user.|
+| **user.surname** | Last Name of the user. |
+| **user.email** | Mail Id of the user. |
+| **user.userPrincipalName** | UPN of the user. |
+| **user.tenantId** | Azure Active Directory tenant ID. |
+| **user.userRole** | Role of the user e.g. 'admin' or 'user'. |
+| **meeting.role** | The participant's role in the meeting. e.g. 'Organizer' or 'Presenter' or 'Attendee'. |
+| **meeting.inMeeting** | The value indicating if the participant is in the meeting. |
+| **conversation.id** | The meeting chat ID. |
+| **conversation.isGroup** | Boolean indicating whether conversation has more than two participants. |
+ ### Response codes The following table provides the response codes:
The following table provides the response codes:
| **403** | Get participant information isn't shared with the app. If the app isn't installed in the meeting, it triggers the error response 403. If the tenant admin disables or blocks the app during live site migration, it triggers the error response 403. | | **200** | The participant information is successfully retrieved.| | **401** | The app responds with an invalid token.|
-| **404** | The meeting has either expired or participants are not available.|
+| **404** | The meeting has either expired or participants aren't available.|
## Send an in-meeting notification
POST /v3/conversations/{conversationId}/activities
+| Property name | Purpose |
+|||
+| **type** | Type of activity. |
+| **text** | The text content of the message. |
+| **summary** | The summary text of the message. |
+| **channelData.notification.alertInMeeting** | Boolean indicating if a notification is to be shown to the user while in a meeting. |
+| **channelData.notification.externalResourceUrl** | The value of the notification's external resource URL.|
+| **replyToId** | The ID of the parent or root message of the thread. |
+ ### Response codes The following table includes the response codes:
The JSON response body for Meeting Details API is as follows:
+| Property name | Purpose |
+|||
+| **details.id** | The meeting's Id, encoded as a BASE64 string. |
+| **details.msGraphResourceId** | The MsGraphResourceId, used specifically for MS Graph API calls. |
+| **details.scheduledStartTime** | The meeting's scheduled start time, in UTC. |
+| **details.scheduledEndTime** | The meeting's scheduled end time, in UTC. |
+| **details.joinUrl** | The URL used to join the meeting. |
+| **details.title** | The title of the meeting. |
+| **details.type** | The meeting's type - e.g. Adhoc, Broadcast, MeetNow, Recurring, Scheduled, Unknown. |
+| **conversation.isGroup** | Boolean indicating whether conversation has more than two participants. |
+| **conversation.conversationType** | The conversation type. |
+| **conversation.id** | The meeting chat ID. |
+| **organizer.id** | The Organizer's user ID. |
+| **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,
+
+**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. Note that the first occurrence of the meeting may not occur on this date if it does not fit the pattern.
+
+**endDate**: Specifies the date to stop applying the pattern. Note that the last occurrence of the meeting may not occur on this date if it does not fit the pattern.
+ ## Send real-time captions API The send real-time captions API exposes a POST endpoint for Microsoft Teams communication access real-time translation (CART) captions, human-typed closed captions. Text content sent to this endpoint appears to end users in a Microsoft Teams meeting when they have captions enabled.
The following table provides the response codes:
|Response code|Description| ||| | **500** | Internal error. |
-| **501** | API is not supported in the current context.|
-| **1000** | App does not have proper permissions to allow share to stage.|
+| **501** | API isn't supported in the current context.|
+| **1000** | App doesn't have proper permissions to allow share to stage.|
## Get app content stage sharing state API
The following table provides the response codes:
|Response code|Description| ||| | **500** | Internal error. |
-| **501** | API is not supported in the current context.|
-| **1000** | App does not have proper permissions to allow share to stage.|
+| **501** | API isn't supported in the current context.|
+| **1000** | App doesn't have proper permissions to allow share to stage.|
## Get app content stage sharing capabilities API
The following table provides the response codes:
|Response code|Description| ||| | **500** | Internal error. |
-| **1000** | App does not have permissions to allow share to stage.|
+| **1000** | App doesn't have permissions to allow share to stage.|
## Get real-time Teams meeting events API
The following code provides an example of meeting end event payload:
} ```
+| Property name | Purpose |
+|||
+| **name** | Name of the user.|
+| **type** | Activity type. |
+| **timestamp** | Local date and time of the message, expressed in ISO-8601 format. |
+| **id** | ID for the activity. |
+| **channelId** | Channel this activity is associated with. |
+| **serviceUrl** | Service URL where responses to this activity should be sent. |
+| **from.id** | ID of the user that sent the request. |
+| **from.aadObjectId** | Azure Active Directory object ID of the user that sent the request. |
+| **conversation.isGroup** | Boolean indicating whether conversation has more than two participants. |
+| **conversation.tenantId** | Azure Active Directory tenant ID of the conversation or meeting. |
+| **conversation.id** | The meeting chat ID. |
+| **recipient.id** | ID of the user that receive the request. |
+| **recipient.name** | Name of the user that receive the request. |
+| **entities.locale** | entity which contains metadata about locale. |
+| **entities.country** | entity which contains metadata about country. |
+| **entities.type** | entity which contains metadata about client. |
+| **channelData.tenant.id** | Azure Active Directory tenant ID. |
+| **channelData.source** | The source name from where event is fired or invoked. |
+| **channelData.meeting.id** | The default ID associated with the meeting. |
+| **value.MeetingType** | The type of meeting. |
+| **value.Title** | The subject of the meeting. |
+| **value.Id** | The default ID associated with the meeting. |
+| **value.JoinUrl** | The join URL of the meeting. |
+| **value.StartTime** | The meeting start time in UTC. |
+| **value.EndTime** | The meeting end time in UTC. |
+| **locale**| The locale of the message set by the client. |
+ ## Code sample |Sample name | Description | C# | Node.js |
platform Teams Live Share Capabilities https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/teams-live-share-capabilities.md
The Live Share SDK supports any [distributed data structure](https://fluidframew
| [SharedSegmentSequence](https://fluidframework.com/docs/data-structures/sequences/) | A list-like data structure for storing a set of items (called segments) at set positions. | | [SharedString](https://fluidframework.com/docs/data-structures/string/) | Distributed-string sequence optimized for editing document text editing. |
-Let's see how `SharedMap` works. In this example, we've used `SharedMap` to build a simple playlist feature.
+Let's see how `SharedMap` works. In this example, we've used `SharedMap` to build a playlist feature.
```javascript import { SharedMap } from "fluid-framework";
platform Teams Live Share Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/teams-live-share-overview.md
> [!Note] > The Live Share SDK is currently available only in [Public Developer Preview](../resources/dev-preview/developer-preview-intro.md). You must be part of the Public Developer Preview for Microsoft Teams to use the Live Share SDK.
-Live Share is an SDK designed to transform Teams apps into collaborative multi-user experiences without writing any dedicated back-end code. The Live Share SDK seamlessly integrates meetings with [Fluid Framework](https://fluidframework.com/). Fluid Framework is a collection of client libraries for distributing and synchronizing shared state. Live Share provides a free, fully managed, and ready to use [Azure Fluid Relay](/azure/azure-relay/relay-what-is-it) backed by the security and global scale of Teams.
+Live Share is an SDK designed to transform Teams apps into collaborative multi-user experiences without writing any dedicated back-end code. The Live Share SDK seamlessly integrates meetings with [Fluid Framework](https://fluidframework.com/). Fluid Framework is a collection of client libraries for distributing and synchronizing shared state. Live Share provides a free, fully managed, and ready to use [Azure Fluid Relay](/azure/azure-fluid-relay/) backed by the security and global scale of Teams.
> [!div class="nextstepaction"] > [Get started](teams-live-share-quick-start.md)
platform Bot Basics https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/bot-basics.md
To organize the conversational logic for your bot, an activity handler is used.
Teams activity handler is derived from Microsoft Bot Framework's activity handler. It routes all Teams activities before allowing any non-Teams specific activities to be handled.
-When a bot for Teams receives an activity, it is routed to the activity handlers. All activities are routed through one base handler called the turn handler. The turn handler calls the required activity handler to manage any activity received. The Teams bot is derived from `TeamsActivityHandler` class, which is derived from the Bot Framework's `ActivityHandler` class.
+When a bot for Teams receives an activity, it's routed to the activity handlers. All activities are routed through one base handler called the turn handler. The turn handler calls the required activity handler to manage any activity received. The Teams bot is derived from `TeamsActivityHandler` class, which is derived from the Bot Framework's `ActivityHandler` class.
# [C#](#tab/csharp)
Bots are created using the Bot Framework. If the bots receive a message activity
In the Teams activity handler class, there are two primary Teams activity handlers, `OnConversationUpdateActivityAsync` and `OnInvokeActivityAsync`. `OnConversationUpdateActivityAsync` routes all conversation update activities and `OnInvokeActivityAsync` routes all Teams invoke activities.
-To implement your logic for Teams specific activity handlers, you must override the methods in your bot as shown in the [bot logic](#bot-logic) section. There is no base implementation for these handlers, therefore, you must add the logic that you want in your override.
+To implement your logic for Teams specific activity handlers, you must override the methods in your bot as shown in the [bot logic](#bot-logic) section. There's no base implementation for these handlers, therefore, you must add the logic that you want in your override.
The code snippets for Teams activity handlers:
Bots are created using the Bot Framework. If the bots receive a message activity
In the Teams activity handler class, there are two primary Teams activity handlers, `dispatchConversationUpdateActivity` and `onInvokeActivity`. `dispatchConversationUpdateActivity` routes all conversation update activities and `onInvokeActivity` routes all Teams invoke activities.
-To implement your logic for Teams specific activity handlers, you must override the methods in your bot as shown in the [bot logic](#bot-logic) section. Define your bot logic for these handlers, then be sure to call `next()` at the end. By calling `next()` you ensure that the next handler runs.
+To implement your logic for Teams specific activity handlers, you must override the methods in your bot as shown in the [bot logic](#bot-logic) section. Define your bot logic for these handlers, then be sure to call `next()` at the end. By calling `next()`, you ensure that the next handler runs.
The code snippets for Teams activity handlers:
Bots are created using the Bot Framework. If the bots receive a message activity
In the Teams activity handler class, there are two primary Teams activity handlers, `on_conversation_update_activity` and `on_invoke_activity`. `on_conversation_update_activity` routes all conversation update activities and `on_invoke_activity` routes all Teams invoke activities.
-To implement your logic for Teams specific activity handlers, you must override the methods in your bot as shown in the [bot logic](#bot-logic) section. There is no base implementation for these handlers, therefore, you must add the logic that you want in your override.
+To implement your logic for Teams specific activity handlers, you must override the methods in your bot as shown in the [bot logic](#bot-logic) section. There's no base implementation for these handlers, therefore, you must add the logic that you want in your override.
## Bot logic
-The bot logic processes incoming activities from one or more of your bot channels and in response generates outgoing activities. This is still true of bots derived from the Teams activity handler class, which first checks for Teams activities. After checking for Teams activities, it passes all other activities to the Bot Framework's activity handler.
+The bot logic processes incoming activities from one or more of your bot channels and in response generates outgoing activities. It's still true of bots derived from the Teams activity handler class, which first checks for Teams activities. After checking for Teams activities, it passes all other activities to the Bot Framework's activity handler.
# [C#](#tab/csharp)
The bot logic processes incoming activities from one or more of your bot channel
Activity handlers are different in context of a team, where a new member is added to the team instead of a message thread.
-The list of handlers defined in `ActivityHandler` include the following:
+The list of handlers defined in `ActivityHandler` includes the following:
| Event | Handler | Description | | :-- | :-- | :-- |
The `TeamsActivityHandler` extends the list of handlers in the core Bot Framewor
#### Teams invoke activities
-The list of Teams activity handlers called from the `OnInvokeActivityAsync` Teams activity handler include the following:
+The list of Teams activity handlers called from the `OnInvokeActivityAsync` Teams activity handler includes the following:
| Invoke types | Handler | Description | | :-- | :-- | :-- |
The list of Teams activity handlers called from the `OnInvokeActivityAsync` Team
| fileConsent/invoke | `OnTeamsFileConsentAcceptAsync` | This method is invoked when a file consent card is accepted by the user. | | fileConsent/invoke | `OnTeamsFileConsentAsync` | This method is invoked when a file consent card activity is received from the connector. | | fileConsent/invoke | `OnTeamsFileConsentDeclineAsync` | This method is invoked when a file consent card is declined by the user. |
-| actionableMessage/executeAction | `OnTeamsO365ConnectorCardActionAsync` | This method is invoked when a Office 365 connector card action activity is received from the connector. |
+| actionableMessage/executeAction | `OnTeamsO365ConnectorCardActionAsync` | This method is invoked when an Office 365 connector card action activity is received from the connector. |
| signin/verifyState | `OnTeamsSigninVerifyStateAsync` | This method is invoked when a signIn verify state activity is received from the connector. | | task/fetch | `OnTeamsTaskModuleFetchAsync` | This method can be overridden in a derived class to provide logic when a task module is fetched. | | task/submit | `OnTeamsTaskModuleSubmitAsync` | This method can be overridden in a derived class to provide logic when a task module is submitted. |
-The invoke activities listed in this section are for conversational bots in Teams. The Bot Framework SDK also supports invoke activities specific to message extensions. For more information, see [what are message extensions](https://aka.ms/azure-bot-what-are-messaging-extensions).
+The Invoke activities listed in this section are for conversational bots in Teams. The Bot Framework SDK also supports invoke activities specific to message extensions. For more information, see [what are message extensions](https://aka.ms/azure-bot-what-are-messaging-extensions).
# [JavaScript](#tab/javascript)
The invoke activities listed in this section are for conversational bots in Team
Activity handlers are different in context of a team, where the new member is added to the team instead of a message thread.
-The list of handlers defined in `ActivityHandler` include the following:
+The list of handlers defined in `ActivityHandler` includes the following:
| Event | Handler | Description | | :-- | :-- | :-- |
The `TeamsActivityHandler` extends the list of handlers in the core Bot Framewor
#### Teams invoke activities
-The list of Teams activity handlers called from the `onInvokeActivity` Teams activity handler include the following:
+The list of Teams activity handlers called from the `onInvokeActivity` Teams activity handler includes the following:
| Invoke types | Handler | Description | | :-- | :-- | :-- |
The list of Teams activity handlers called from the `onInvokeActivity` Teams act
| fileConsent/invoke | `handleTeamsFileConsentAccept` | This method is invoked when a file consent card is accepted by the user. | | fileConsent/invoke | `handleTeamsFileConsent` | This method is invoked when a file consent card activity is received from the connector. | | fileConsent/invoke | `handleTeamsFileConsentDecline` | This method is invoked when a file consent card is declined by the user. |
-| actionableMessage/executeAction | `handleTeamsO365ConnectorCardAction` | This method is invoked when a Office 365 connector card action activity is received from the connector. |
+| actionableMessage/executeAction | `handleTeamsO365ConnectorCardAction` | This method is invoked when an Office 365 connector card action activity is received from the connector. |
| signin/verifyState | `handleTeamsSigninVerifyState` | This method is invoked when a signIn verify state activity is received from the connector. | | task/fetch | `handleTeamsTaskModuleFetch` | This method can be overridden in a derived class to provide logic when a task module is fetched. | | task/submit | `handleTeamsTaskModuleSubmit` | This method can be overridden in a derived class to provide logic when a task module is submitted. |
The invoke activities listed in this section are for conversational bots in Team
Activity handlers are different in context of a team, where the new member is added to the team instead of a message thread.
-The list of handlers defined in `ActivityHandler` include the following:
+The list of handlers defined in `ActivityHandler` includes the following:
| Event | Handler | Description | | :-- | :-- | :-- |
The list of handlers defined in `ActivityHandler` include the following:
| Event activity received | `on_event_activity` | This method calls a handler specific to the type of event. | | Token-response event activity received | `on_token_response_event` | This method can be overridden to handle token response events. | | Non-token-response event activity received | `on_event` | This method can be overridden to handle other types of events. |
-| Other activity types received | `on_unrecognized_activity_type` | This method can be overridden to handle any type of activity that is not handled. |
+| Other activity types received | `on_unrecognized_activity_type` | This method can be overridden to handle any type of activity that isn't handled. |
#### Teams specific activity handlers
The `TeamsActivityHandler` extends the list of handlers from the core Bot Framew
#### Teams invoke activities
-The list of Teams activity handlers called from the `on_invoke_activity` Teams activity handler include the following:
+The list of Teams activity handlers called from the `on_invoke_activity` Teams activity handler includes the following:
| Invoke types | Handler | Description | | :-- | :-- | :-- |
The list of Teams activity handlers called from the `on_invoke_activity` Teams a
| fileConsent/invoke | `on_teams_file_consent_accept` | This method is invoked when a file consent card is accepted by the user. | | fileConsent/invoke | `on_teams_file_consent` | This method is invoked when a file consent card activity is received from the connector. | | fileConsent/invoke | `on_teams_file_consent_decline` | This method is invoked when a file consent card is declined by the user. |
-| actionableMessage/executeAction | `on_teams_o365_connector_card_action` | This method is invoked when a Office 365 connector card action activity is received from the connector. |
+| actionableMessage/executeAction | `on_teams_o365_connector_card_action` | This method is invoked when an Office 365 connector card action activity is received from the connector. |
| signin/verifyState | `on_teams_signin_verify_state` | This method is invoked when a signIn verify state activity is received from the connector. | | task/fetch | `on_teams_task_module_fetch` | This method can be overridden in a derived class to provide logic when a task module is fetched. | | task/submit | `on_teams_task_module_submit` | This method can be overridden in a derived class to provide logic when a task module is submitted. |
The invoke activities listed in this section are for conversational bots in Team
-Now that you have familiarized yourself with bot activity handlers, let us see how bots behave differently depending on the conversation and the messages it receives or sends.
+Now that you've familiarized yourself with bot activity handlers, let us see how bots behave differently depending on the conversation and the messages it receives or sends.
## Next step
platform Bot Features https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/bot-features.md
The [Bot Framework](https://dev.botframework.com/) is a rich SDK used to create
## Bots with webhooks and connectors
-Webhooks and connectors connect your bot to your web services. Using webhooks and connectors, you can create a bot for basic interaction, such as creating a workflow or other simple commands. They are available only in the team where you create them and are intended for simple processes specific to your company's workflow. For more information, see [what are webhooks and connectors](~/webhooks-and-connectors/what-are-webhooks-and-connectors.md).
+Webhooks and connectors connect your bot to your web services. Using webhooks and connectors, you can create a bot for basic interaction, such as creating a workflow or other simple commands. They're available only in the team where you create them and are intended for simple processes specific to your company's workflow. For more information, see [what are webhooks and connectors](~/webhooks-and-connectors/what-are-webhooks-and-connectors.md).
## Azure bot service
Bots in Microsoft Teams can be part of a one-to-one conversation, a group chat,
### In a channel
-Channels contain threaded conversations between multiple people even up to two thousand. This potentially gives your bot massive reach, but individual interactions must be concise. Traditional multi-turn interactions do not work. Instead, you must look to use interactive cards or task modules, or move the conversation to a one-to-one conversation to collect lots of information. Your bot only has access to messages where it is `@mentioned`. You can retrieve additional messages from the conversation using Microsoft Graph and organization-level permissions.
+Channels contain threaded conversations between multiple people even up to two thousand. This potentially gives your bot massive reach, but individual interactions must be concise. Traditional multi-turn interactions don't work. Instead, you must look to use interactive cards or task modules, or move the conversation to a one-to-one conversation to collect lots of information. Your bot only has access to messages where it's `@mentioned`. You can retrieve additional messages from the conversation using Microsoft Graph and organization-level permissions.
Bots work better in a channel in the following cases:
Bots work better in a channel in the following cases:
### In a group chat
-Group chats are non-threaded conversations between three or more people. They tend to have fewer members than a channel and are more transient. Similar to a channel, your bot only has access to messages where it is `@mentioned` directly.
+Group chats are non-threaded conversations between three or more people. They tend to have fewer members than a channel and are more transient. Similar to a channel, your bot only has access to messages where it's `@mentioned` directly.
In the cases where bots work better in a channel also work better in a group chat.
Before creating one-to-one chatbots, consider whether a conversation-based inter
## Disadvantages of bots
-An extensive dialog between your bot and the user is a slow and complex way to get a task completed. A bot that supports excessive commands, especially a broad range of commands, is not successful or viewed positively by users.
+An extensive dialog between your bot and the user is a slow and complex way to get a task completed. A bot that supports excessive commands, especially a broad range of commands, isn't successful or viewed positively by users.
### Have multi-turn experiences in chat
-An extensive dialog requires the developer to maintain state. To exit this state a user must either time-out or select **Cancel**. Also, the process is tedious. For example, see the following conversation scenario:
+An extensive dialog requires the developer to maintain state. To exit this state, a user must either timeout or select **Cancel**. Also, the process is tedious. For example, see the following conversation scenario:
USER: Schedule a meeting with Megan.
As there are only six visible commands in the current bot menu, anything more is
### Maintain a large knowledge base
-One of the disadvantages of bots is that it is difficult to maintain a large retrieval knowledge base with unranked responses. Bots are best suited for short, quick interactions, and not sifting through long lists looking for an answer.
+One of the disadvantages of bots is that it's difficult to maintain a large retrieval knowledge base with unranked responses. Bots are best suited for short, quick interactions, and not sifting through long lists looking for an answer.
## Code snippets
platform Call Notifications https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/call-notifications.md
In [registering a calls and meetings bot for Microsoft Teams](./registering-call
## Protocol determination
-The incoming notification is provided in a legacy format for compatibility with the previous [Skype protocol](/azure/bot-service/dotnet/bot-builder-dotnet-real-time-media-concepts?view=azure-bot-service-3.0&preserve-view=true). In order to convert the call to the Microsoft Graph protocol, your bot must determine whether the notification is in a legacy format and provide the following response:
+The incoming notification is provided in a legacy format for compatibility with the previous [Skype protocol](/azure/bot-service/dotnet/bot-builder-dotnet-real-time-media-concepts?view=azure-bot-service-3.0&preserve-view=true). In order to convert the call to the Microsoft Graph protocol, your bot must determine whether the notification is in a legacy format and provides the following response:
```http HTTP/1.1 204 No Content
The next section provides details on incoming call notifications redirected for
## Redirects for region affinity
-You call your webhook from the data-center hosting the call. The call starts in any data center and does not take into account region affinities. The notification is sent to your deployment depending on the GeoDNS resolution. If your application determines, by inspecting the initial notification payload or otherwise, that it needs to run in a different deployment, the application provides the following response:
+You call your webhook from the data-center hosting the call. The call starts in any data center and doesn't take into account region affinities. The notification is sent to your deployment depending on the GeoDNS resolution. If your application determines, by inspecting the initial notification payload or otherwise, that it needs to run in a different deployment, the application provides the following response:
```http HTTP/1.1 302 Found
The OpenID configuration published at <https://api.aps.skype.com/v1/.well-known/
* `tid` is the tenant id for Contoso.com. * `iss` is the token issuer, `https://api.botframework.com`.
-For your code handling, the webhook must validate the token, ensure it has not expired, and check whether it has been signed by the published OpenID configuration. You must also check whether aud matches your App ID before accepting the callback request.
+For your code handling, the webhook must validate the token, ensure it hasn't expired, and check whether it has been signed by the published OpenID configuration. You must also check whether aud matches your App ID before accepting the callback request.
For more information, see [validate inbound requests](https://github.com/microsoftgraph/microsoft-graph-comms-samples/blob/master/Samples/Common/Sample.Common/Authentication/AuthenticationProvider.cs).
platform Calls Meetings Bots Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/calls-meetings-bots-overview.md
To use these Graph APIs in a Teams app, you create a bot and specify some additi
In addition, the Real-time Media Platform enables bots to interact with Teams calls and meetings using real-time voice, video, and screen sharing. A bot that participates in audio or video calls and online meetings is a regular Microsoft Teams bot with few extra features used to register the bot.
-The Teams app manifest with two additional settings `supportsCalling` and `supportsVideo`, Graph permissions for your bot's Microsoft App ID, and tenant admin consent enable you to register the bot. In registering a calls and meetings bot for Teams, the Webhook URL is mentioned, which is the webhook endpoint for all incoming calls to your bot. An application-hosted media bot requires the Microsoft.Graph.Communications.Calls.Media .NET library to access the audio and video media streams, and the bot must be deployed on a Windows Server machine or Windows Server guest Operating System (OS) in Azure. Bots on Teams supports only a specific set of media formats for audio and video content.
+The Teams app manifest with two additional settings `supportsCalling` and `supportsVideo`, Graph permissions for your bot's Microsoft App ID, and tenant admin consent enable you to register the bot. In registering a calls and meetings bot for Teams, the Webhook URL is mentioned, which is the webhook endpoint for all incoming calls to your bot. An application-hosted media bot requires the Microsoft.Graph.Communications.Calls.Media .NET library to access the audio and video media streams, and the bot must be deployed on a Windows Server machine or Windows Server guest Operating System (OS) in Azure. Bots on Teams support only a specific set of media formats for audio and video content.
Now, you must understand some core concepts, terminology, and conventions.
Calls are either peer-to-peer between a person and your bot, or multiparty betwe
Following are the different call types and permissions required for the call:
-* A user can initiate a peer-to-peer call with your bot or invite your bot into an existing multiparty call. The multiparty call is not enabled yet in the Teams user interface.
+* A user can initiate a peer-to-peer call with your bot or invite your bot into an existing multiparty call. The multiparty call isn't enabled yet in the Teams user interface.
> [!NOTE] > User initiated calls to a bot are currently not supported on Microsoft Teams mobile platform.
-* Graph permissions are not necessary for a user to initiate a peer-to-peer call with your bot. Additional permissions are needed for your bot to participate in a multiparty call, or for your bot to initiate a peer-to-peer call with a user.
-* A call can start as peer-to-peer and eventually become a multiparty call. Your bot can initiate multiparty calls by inviting others, provided your bot has the proper permissions. If your bot does not have permissions to participate in group calls and if a participant adds another participant to the call, your bot is dropped from the call.
+* Graph permissions aren't necessary for a user to initiate a peer-to-peer call with your bot. Additional permissions are needed for your bot to participate in a multiparty call, or for your bot to initiate a peer-to-peer call with a user.
+* A call can start as peer-to-peer and eventually become a multiparty call. Your bot can initiate multiparty calls by inviting others, provided your bot has the proper permissions. If your bot doesn't have permissions to participate in group calls and if a participant adds another participant to the call, your bot is dropped from the call.
### Signals
From a Teams user's perspective, there are two kinds of online meetings, ad hoc
### Real-time media
-When a bot is participating in a call or online meeting, it must deal with audio and video streams. When users talk on a call, show themselves on a webcam, or present their screens in a meeting, to a bot it is shown as audio and video streams. If a bot wants to say something as simple as, **press 0 to reach the operator** in an interactive voice response (IVR) scenario, it requires playing a .WAV file. Collectively, this is referred to as media or real-time media.
+When a bot is participating in a call or online meeting, it must deal with audio and video streams. When users talk on a call, show themselves on a webcam, or present their screens in a meeting, to a bot it's shown as audio and video streams. If a bot wants to say something as simple as, **press 0 to reach the operator** in an interactive voice response (IVR) scenario, it requires playing a .WAV file. Collectively, this is referred to as media or real-time media.
-Real-time media refers to scenarios where media must be processed in real-time, as opposed to playback of previously recorded audio or video. Dealing with media streams, particularly real-time media streams, is extremely complex. Microsoft has created the Real-time Media Platform to handle these scenarios and to offload as much of the traditional heavy lifting of real-time media processing as possible. When the bot answers an incoming call or joins a new or existing call, it needs to tell the Real-time Media Platform how media is handled. If you are building an IVR application, you can offload the expensive audio processing to Microsoft. Alternately, if your bot requires direct access to media streams, that scenario is also supported. There are two types of media processing:
+Real-time media refers to scenarios where media must be processed in real-time, as opposed to playback of previously recorded audio or video. Dealing with media streams, particularly real-time media streams, is complex. Microsoft has created the Real-time Media Platform to handle these scenarios and to offload as much of the traditional heavy lifting of real-time media processing as possible. When the bot answers an incoming call or joins a new or existing call, it needs to tell the Real-time Media Platform how media is handled. If you're building an IVR application, you can offload the expensive audio processing to Microsoft. Alternately, if your bot requires direct access to media streams, that scenario is also supported. There are two types of media processing:
-* **Service-hosted media**: Bots focus on managing application workflow, such as routing calls and offload audio processing to the Microsoft Real-time Media Platform. With service-hosted media, you have several options to implement and host your bot. A service-hosted media bot can be implemented as a stateless service as it does not process media locally. Service-hosted media bots can use the following APIs:
+* **Service-hosted media**: Bots focus on managing application workflow, such as routing calls and offload audio processing to the Microsoft Real-time Media Platform. With service-hosted media, you have several options to implement and host your bot. A service-hosted media bot can be implemented as a stateless service as it doesn't process media locally. Service-hosted media bots can use the following APIs:
* `PlayPrompt` for playing an audio clip. * `Record` for recording audio clips.
platform Debugging Local Testing Calling Meeting Bots https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/debugging-local-testing-calling-meeting-bots.md
Last updated 11/18/2018
# Develop calling and online meeting bots on your local PC
-In [Run and debug your app](../../concepts/build-and-test/debug.md) we explain how to use [ngrok](https://ngrok.com) to create a tunnel between your local computer and the internet. In this topic, learn how you can also use ngrok and your local PC to develop bots that support calls and online meetings.
+In [Run and debug your app](../../concepts/build-and-test/debug.md), we explain how to use [ngrok](https://ngrok.com) to create a tunnel between your local computer and the internet. In this topic, learn how you can also use ngrok and your local PC to develop bots that support calls and online meetings.
Messaging bots use HTTP, but calls and online meeting bots use the lower-level TCP. Ngrok supports TCP tunnels in addition to HTTP tunnels.
Messaging bots use HTTP, but calls and online meeting bots use the lower-level T
Go to [ngrok](https://ngrok.com) and sign up for a free account or log into your existing account. After you've signed in, go to the [dashboard](https://dashboard.ngrok.com) and get your auth token.
-Create an ngrok configuration file `ngrok.yml` and add the following line. For more information on where the file can be located, see [ngrok](https://ngrok.com/docs#config):
+Create a ngrok configuration file `ngrok.yml` and add the following line. For more information on where the file can be located, see [ngrok](https://ngrok.com/docs#config):
`authtoken: <Your-AuthToken>`
tunnels:
Application-hosted media uses certificates and TCP tunnels. The following steps are required:
-1. Ngrok's public TCP endpoints have fixed URLs. They are `0.tcp.ngrok.io`, `1.tcp.ngrok.io`, and so on. You must have a DNS CNAME entry for your service that points to these URLs. For example, let's say `0.bot.contoso.com` refers to `0.tcp.ngrok.io`, `1.bot.contoso.com` refers to `1.tcp.ngrok.io`, and so on.
+1. Ngrok's public TCP endpoints have fixed URLs. They're `0.tcp.ngrok.io`, `1.tcp.ngrok.io`, and so on. You must have a DNS CNAME entry for your service that points to these URLs. For example, let's say `0.bot.contoso.com` refers to `0.tcp.ngrok.io`, `1.bot.contoso.com` refers to `1.tcp.ngrok.io`, and so on.
2. An SSL certificate is required for your URLs. To make it easy, use an SSL certificate issued to a wild card domain. In this case, it would be `*.bot.contoso.com`. This SSL certificate is validated by the media SDK, so it must match your bot's public URL. Note the thumbprint and install it in your machine certificates. 3. Now, set up a TCP tunnel to forward the traffic to localhost. Write the following lines into your ngrok.yml:
Now that the ngrok configuration is ready, launch it:
`ngrok.exe start -all -config <Path to your ngrok.yml>`
-This starts ngrok and defines the public URLs which provide the tunnels to your localhost. Following is an example of the output:
+This starts ngrok and defines the public URLs, which provide the tunnels to your localhost. Following is an example of the output:
```cmd Forwarding http://signal.ngrok.io -> localhost:12345
var mediaPlatform = new MediaPlatformSettings
## Caveats * Ngrok free accounts **don't** provide end-to-end encryption. The HTTPS data ends at the ngrok URL and the data flows unencrypted from ngrok to `localhost`. If you require end-to-end encryption, consider a paid ngrok account. See [TLS tunnels](https://ngrok.com/docs#tls) for steps on setting up secure end-to-end tunnels.
-* Because the bot callback URL is dynamic, incoming call scenarios require you to frequently update your ngrok endpoints. One way to fix this is to use a paid ngrok account which provides fixed subdomains to which you can point your bot and the platform.
+* Because the bot callback URL is dynamic, incoming call scenarios require you to frequently update your ngrok endpoints. One way to fix this is to use a paid ngrok account, which provides fixed subdomains to which you can point your bot and the platform.
* Ngrok tunnels can also be used with [Azure Service Fabric](/azure/service-fabric/service-fabric-overview). For an example of how to do this, see the [HueBot sample app](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot).
platform Requirements Considerations Application Hosted Media Bots https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/requirements-considerations-application-hosted-media-bots.md
An application-hosted media bot requires the following:
* The bot can't be deployed as an Azure web app.
-* The bot must be running on a recent version of the `Microsoft.Graph.Communications.Calls.Media` .NET library. The bot must use either the newest available version of the [NuGet package](https://www.nuget.org/packages/Microsoft.Graph.Communications.Calls.Media/), or a version that isn't more than three months old. Older versions of the library are deprecated and do not work after a few months. Keeping the `Microsoft.Graph.Communications.Calls.Media` library up-to-date ensures the best interoperability between the bot and Microsoft Teams.
+* The bot must be running on a recent version of the `Microsoft.Graph.Communications.Calls.Media` .NET library. The bot must use either the newest available version of the [NuGet package](https://www.nuget.org/packages/Microsoft.Graph.Communications.Calls.Media/), or a version that isn't more than three months old. Older versions of the library are deprecated and don't work after a few months. Keeping the `Microsoft.Graph.Communications.Calls.Media` library up-to-date ensures the best interoperability between the bot and Microsoft Teams.
The next section provides details on where real-time media calls are located.
-## Real-time media calls stay where they are created
+## Real-time media calls stay where they're created
Real-time media calls stay on the computer where they were created. A real-time media call is pinned to the virtual machine (VM) instance that accepted or started the call. Media from a Microsoft Teams call or meeting flows to that VM instance, and media the bot sends back to Microsoft Teams must also originate from that VM. If there are any real-time media calls in progress when the VM is stopped, those calls are abruptly terminated. If the bot has prior knowledge of the pending VM shutdown, it can end the calls.
The next section provides details on scalability and performance considerations
The application-hosted media bots require the following scalability and performance considerations:
-* Application-hosted media bots require more compute and network (bandwidth) capacity than messaging bots and may incur significantly higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot may be able to sustain only one or two concurrent media sessions per CPU core (if using the "raw" RGB24 or NV12 video formats).
+* Application-hosted media bots require more compute and network (bandwidth) capacity than messaging bots and may incur higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot may be able to sustain only one or two concurrent media sessions per CPU core (if using the "raw" RGB24 or NV12 video formats).
* The Real-time Media Platform doesn't currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding/decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot may take advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine. * The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with four virtual CPUs (vCPU) is the minimum size required. Detailed information about Azure VM types is available in the [Azure documentation](/azure/virtual-machines/windows/sizes-general).
Application-hosted media bots samples are as follows:
| **Sample name** | **Description** | **Graph** | ||-|--|
-| Local media sample | Samples that illustrates different local media scenarios. | [View](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples) |
-| Remote media sample | Samples that illustrates different remote media scenarios. | [View](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/RemoteMediaSamples) |
+| Local media sample | Sample that illustrates different local media scenarios. | [View](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples) |
+| Remote media sample | Sample that illustrates different remote media scenarios. | [View](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/RemoteMediaSamples) |
## Next step
Application-hosted media bots samples are as follows:
## See also * [Graph Calling SDK Documentation](https://microsoftgraph.github.io/microsoft-graph-comms-samples/docs/)
-* The bots require more compute and network bandwidth capacity than messaging bots and incur significantly higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot can sustain only one or two concurrent media sessions per CPU core if using the raw RGB24 or NV12 video formats.
-* The Real-time Media Platform does not currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding or decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot takes advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.
+* The bots require more compute and network bandwidth capacity than messaging bots and incur higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot can sustain only one or two concurrent media sessions per CPU core if using the raw RGB24 or NV12 video formats.
+* The Real-time Media Platform doesn't currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding or decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot takes advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.
* The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with 4 virtual CPUs (vCPU) is the minimum size required. For more information about Azure VM types, see [Azure documentation](/azure/virtual-machines/windows/sizes-general). The next section provides samples that illustrate different local media scenarios.
platform Add Authentication https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/authentication/add-authentication.md
keywords: resource group bot registration Azure emulator bot manifest deploy
There are times when you may need to create bots in Microsoft Teams that can access resources on behalf of the user, such as a mail service.
-This article demonstrates how to use Azure Bot Service v4 SDK authentication, based on OAuth 2.0. This makes it easier to develop a bot that can use authentication tokens based on the user's credentials. Key in all this is the use of **identity providers**, as we will see later.
+This article demonstrates how to use Azure Bot Service v4 SDK authentication, based on OAuth 2.0. This makes it easier to develop a bot that can use authentication tokens based on the user's credentials. Key in all this is the use of **identity providers**, as we'll see later.
OAuth 2.0 is an open standard for authentication and authorization used by Microsoft Azure Active Directory (Azure AD) and many other identity providers. A basic understanding of OAuth 2.0 is a prerequisite for working with authentication in Teams.
For more information about how the Azure Bot Service handles authentication, see
In this article you'll learn: - **How to create an authentication-enabled bot**. You'll use [cs-auth-sample][teams-auth-bot-cs] to handle user sign-in credentials and the generating the authentication token.-- **How to deploy the bot to Azure and associate it with an identity provider**. The provider issues a token based on user sign-in credentials. The bot can use the token to access resources, such as a mail service, which require authentication. For more information see [Microsoft Teams authentication flow for bots](auth-flow-bot.md).
+- **How to deploy the bot to Azure and associate it with an identity provider**. The provider issues a token based on user sign-in credentials. The bot can use the token to access resources, such as a mail service, which require authentication. For more information, see [Microsoft Teams authentication flow for bots](auth-flow-bot.md).
- **How to integrate the bot within Microsoft Teams**. Once the bot has been integrated, you can sign in and exchange messages with it in a chat. ## Prerequisites
You use a resource group to create individual resources for the Bot Framework. F
## Create Azure Bot resource registration
-The Azure Bot resource registration registers your web service as a bot with the Bot Framework which provides you a Microsoft App Id and App password (client secret).
+The Azure Bot resource registration registers your web service as a bot with the Bot Framework, which provides you a Microsoft App Id and App password (client secret).
> [!IMPORTANT] > You only need to register your bot if it is not hosted in Azure. If you [created a bot](/azure/bot-service/abs-quickstart?view=azure-bot-service-4.0&viewFallbackFrom=azure-bot-service-3.0&preserve-view=true) through the Azure portal then it is already registered with the service. If you created your bot through the [Bot Framework](https://dev.botframework.com/bots/new) or [Developer Portal](../../../concepts/build-and-test/teams-developer-portal.md) your bot isn't registered in Azure.
To create client secret:
![Microsoft App ID](~/assets/images/adaptive-cards/config-microsoft-app-id.png)
-1. Adjacent to **Microsoft App ID**, select **Manage**.
+1. Next to **Microsoft App ID**, select **Manage**.
![Manage Bot](~/assets/images/adaptive-cards/manage-bot-label.png)
For more information, see [Create a bot for Teams](../create-a-bot-for-teams.md)
## Create the identity provider You need an identity provider that can be used for authentication.
-In this procedure you'll use an Azure AD provider; other Azure AD supported identity providers can also be used.
+In this procedure, you'll use an Azure AD provider; other Azure AD supported identity providers can also be used.
1. In the [**Azure portal**][azure-portal], on the left navigation panel, select **Azure Active Directory**. > [!TIP]
In this procedure you'll use an Azure AD provider; other Azure AD supported iden
1. In the right panel, select the **New registration** tab, in the upper left. 1. You'll be asked to provide the following information: 1. **Name**. Enter the name for the application. An example could be *BotTeamsIdentity*. Remember that the name must be unique.
- 1. Select the **Supported account types** for your application. Select *Accounts in any organizational directory (Any Microsoft Azure Active Directory (Azure AD) - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)*.
+ 1. Select the **Supported account types** for your application. Select *Accounts in any organizational directory (Any Microsoft Azure Active Directory (Azure AD) - Multitenant) and personal Microsoft accounts (for example, Skype, Xbox)*.
1. For the **Redirect URI**:<br/> &#x2713;Select **Web**. <br/> &#x2713; Set the URL to `https://token.botframework.com/.auth/web/redirect`. 1. Select **Register**.
-1. Once it is created, Azure displays the **Overview** page for the app. Copy and save the following information to a file:
+1. Once it's created, Azure displays the **Overview** page for the app. Copy and save the following information to a file:
1. The **Application (client) ID** value. You'll use this value later as the *Client ID* when you register this Azure identity application with your bot. 1. The **Directory (tenant) ID** value. You'll also use this value later as the *Tenant ID* to register this Azure identity application with your bot.
The following image displays the corresponding selection in the resource page:
![SampleAppDemoBot configuration](~/assets/images/authentication/sample-app-demo-bot-configuration.png) 1. Complete the form as follows:
- 1. **Name**. Enter a name for the connection. You'll use this name in your bot in the `appsettings.json` file. For example *BotTeamsAuthADv1*.
+ 1. **Name**. Enter a name for the connection. You'll use this name in your bot in the `appsettings.json` file. For example, *BotTeamsAuthADv1*.
1. **Service Provider**. Select **Microsoft Azure Active Directory (Azure AD)**. Once you select this, the Azure AD-specific fields will be displayed. 1. **Client id**. Enter the Application (client) ID that you recorded for your Azure identity provider app in the steps above. 1. **Client secret**. Enter the secret that you recorded for your Azure identity provider app in the steps above. 1. **Grant Type**. Enter `authorization_code`. 1. **Login URL**. Enter `https://login.microsoftonline.com`.
- 1. **Tenant ID**, enter the **Directory (tenant) ID** that you recorded earlier for your Azure identity app or **common** depending on the supported account type selected when you created the identity provider app. To decide which value to assign follow these criteria:
+ 1. **Tenant ID**, enter the **Directory (tenant) ID** that you recorded earlier for your Azure identity app or **common** depending on the supported account type selected when you created the identity provider app. To decide which value to assign, follow these criteria:
- - If you selected either *Accounts in this organizational directory only (Microsoft only - Single tenant)* or *Accounts in any organizational directory(Microsoft Azure Active Directory (Azure AD) - Multi tenant)* enter the **tenant ID** you recorded earlier for the Microsoft Azure Active Directory (Azure AD) app. This will be the tenant associated with the users who can be authenticated.
+ - If you selected either *Accounts in this organizational directory only (Microsoft only - Single tenant)* or *Accounts in any organizational directory(Microsoft Azure Active Directory (Azure AD) - Multi tenant)*, enter the **tenant ID** you recorded earlier for the Microsoft Azure Active Directory (Azure AD) app. This will be the tenant associated with the users who can be authenticated.
- - If you selected *Accounts in any organizational directory (Any Microsoft Azure Active Directory (Azure AD) - Multi tenant and personal Microsoft accounts e.g. Skype, Xbox, Outlook)* enter the word **common** instead of a tenant ID. Otherwise, the Microsoft Azure Active Directory (Azure AD) app will verify through the tenant whose ID was selected and exclude personal Microsoft accounts.
+ - If you selected *Accounts in any organizational directory (Any Microsoft Azure Active Directory (Azure AD) - Multi tenant and personal Microsoft accounts, for example, Skype, Xbox, Outlook)* enter the word **common** instead of a tenant ID. Otherwise, the Microsoft Azure Active Directory (Azure AD) app will verify through the tenant whose ID was selected and exclude personal Microsoft accounts.
- h. For **Resource URL**, enter `https://graph.microsoft.com/`. This is not used in the current code sample.
+ h. For **Resource URL**, enter `https://graph.microsoft.com/`. This isn't used in the current code sample.
i. Leave **Scopes** blank. The following image is an example: ![teams bots app auth connection string adv1 view](../../../assets/images/authentication/auth-bot-identity-connection-adv1.png)
The following image displays the corresponding selection in the resource page:
1. Complete the form as follows:
- 1. **Name**. Enter a name for the connection. You'll use this name in your bot in the `appsettings.json` file. For example *BotTeamsAuthADv2*.
+ 1. **Name**. Enter a name for the connection. You'll use this name in your bot in the `appsettings.json` file. For example, *BotTeamsAuthADv2*.
1. **Service Provider**. Select **Microsoft Azure Active Directory v2**. Once you select this, the Microsoft Azure Active Directory (Azure AD)-specific fields will be displayed. 1. **Client id**. Enter the Application (client) ID that you recorded for your Azure identity provider app in the steps above. 1. **Client secret**. Enter the secret that you recorded for your Azure identity provider app in the steps above. 1. **Token Exchange URL**. Leave this blank.
- 1. **Tenant ID**, enter the **Directory (tenant) ID** that you recorded earlier for your Azure identity app or **common** depending on the supported account type selected when you created the identity provider app. To decide which value to assign follow these criteria:
+ 1. **Tenant ID**, enter the **Directory (tenant) ID** that you recorded earlier for your Azure identity app or **common** depending on the supported account type selected when you created the identity provider app. To decide which value to assign, follow these criteria:
- - If you selected either *Accounts in this organizational directory only (Microsoft only - Single tenant)* or *Accounts in any organizational directory(Microsoft Azure Active directory - Multi tenant)* enter the **tenant ID** you recorded earlier for the Microsoft Azure Active Directory (Azure AD) app. This will be the tenant associated with the users who can be authenticated.
+ - If you selected either *Accounts in this organizational directory only (Microsoft only - Single tenant)* or *Accounts in any organizational directory(Microsoft Azure Active directory - Multi tenant)*, enter the **tenant ID** you recorded earlier for the Microsoft Azure Active Directory (Azure AD) app. This will be the tenant associated with the users who can be authenticated.
- - If you selected *Accounts in any organizational directory (Any Microsoft Azure Active Directory (Azure AD) - Multi tenant and personal Microsoft accounts e.g. Skype, Xbox, Outlook)* enter the word **common** instead of a tenant ID. Otherwise, the Microsoft Azure Active Directory (Azure AD) app will verify through the tenant whose ID was selected and exclude personal Microsoft accounts.
+ - If you selected *Accounts in any organizational directory (Any Microsoft Azure Active Directory (Azure AD) - Multi tenant and personal Microsoft accounts, for example, Skype, Xbox, Outlook)* enter the word **common** instead of a tenant ID. Otherwise, the Microsoft Azure Active Directory (Azure AD) app will verify through the tenant whose ID was selected and exclude personal Microsoft accounts.
- 1. For **Scopes**, enter a space-delimited list of graph permissions this application requires e.g.: User.Read User.ReadBasic.All Mail.Read
+ 1. For **Scopes**, enter a space-delimited list of graph permissions this application requires for example: User.Read User.ReadBasic.All Mail.Read
1. Select **Save**. ### Test the connection
-1. Select the connection entry to open the connection you just created.
+1. Select the connection entry to open the connection you created.
1. Select **Test Connection** at the top of the **Service Provider Connection Setting** panel. 1. The first time you do this will open a new browser window asking you to select an account. Select the one you want to use. 1. Next, you'll be asked to allow to the identity provider to use your data (credentials). The following image is an example:
With the preliminary settings done, let's focus on the creation of the bot to us
1. Clone [cs-auth-sample][teams-auth-bot-cs]. 1. Launch Visual Studio.
-1. From the toolbar select **File -> Open -> Project/Solution** and open the bot project.
-1. In C# Update **appsettings.json** as follows:
+1. From the toolbar, select **File -> Open -> Project/Solution** and open the bot project.
+1. In C#, Update **appsettings.json** as follows:
- Set `ConnectionName` to the name of the identity provider connection you added to the bot registration. The name we used in this example is *BotTeamsAuthADv1*. - Set `MicrosoftAppId` to the **bot App ID** you saved at the time of the bot registration.
With the preliminary settings done, let's focus on the creation of the bot to us
### Deploy the bot to Azure
-To deploy the bot, follow the steps in the how to [Deploy your bot to Azure](https://aka.ms/azure-bot-deployment-cli).
+To deploy the bot, follow the steps in the How to [Deploy your bot to Azure](https://aka.ms/azure-bot-deployment-cli).
Alternatively, while in Visual Studio, you can follow these steps:
-1. In Visual Studio *Solution Explorer* select and hold (or right-click) the project name.
+1. In Visual Studio *Solution Explorer*, select and hold (or right-click) the project name.
1. In the drop-down menu, select **Publish**. 1. In the displayed window, select the **New** link. 1. In the dialog window, select **App Service** on the left and **Create New** on the right.
Once the user does so, the provider generates a user token and sends it to the b
### Test the bot locally
-After you have configured the authentication mechanism, you can perform the actual bot testing.
+After you've configured the authentication mechanism, you can perform the actual bot testing.
1. Run the bot sample locally on your machine, via Visual Studio for example. 1. Start the Emulator.
After you have configured the authentication mechanism, you can perform the actu
![auth bot login emulator](../../../assets/images/authentication/auth-bot-login-emulator.PNG)
-1. If you select **Yes** when the bot asks *Would you like to view your token?*, you'll get a response similar to the following:
+1. If you select **Yes** when the bot asks *Would you like to view your token?* you'll get a response similar to the following:
![auth bot login emulator token](../../../assets/images/authentication/auth-bot-login-emulator-token.png)
and when for these, and just reference that from here, along with the set of ste
1. A pop-up dialog is displayed to **Confirm Open URL**. This is to allow the bot's user (you) to be authenticated. 1. Select **Confirm**. 1. If asked, select the applicable user's account.
- The following image is an example of the bot UI after you have logged in:
+ The following image is an example of the bot UI after you've logged in:
![auth bot login deployed](../../../assets/images/authentication/auth-bot-login-deployed.PNG).
This launches ngrok to listen on the port you specify. In return, it gives you a
1. Copy the forwarding HTTPS address. It should be similar to the following: `https://dea822bf.ngrok.io/`. 1. Append `/api/messages` to obtain `https://dea822bf.ngrok.io/api/messages`. This is the **messages endpoint** for the bot running locally on your machine and reachable over the web in a chat in Microsoft Teams. 1. One final step to perform is to update the messages endpoint of the deployed bot. In the example, we deployed the bot in Azure. So let's perform these steps:
- 1. In your browser navigate to the [**Azure portal**][azure-portal].
+ 1. In your browser, navigate to the [**Azure portal**][azure-portal].
1. Select your **Bot Registration**. 1. In the left panel, select **Settings**. 1. In the right panel, in the **Messaging endpoint** box, enter the ngrok URL, in our example, `https://dea822bf.ngrok.io/api/messages`.
Within a dialog step, use `beginDialog` to start the OAuth prompt, which asks th
[!code-javascript[AddOAuthPrompt](~/../botbuilder-samples/samples/javascript_nodejs/46.teams-auth/dialogs/mainDialog.js?range=50-52)]
-Within the following dialog step, check for the presence of a token in the result from the previous step. If it is not null, the user successfully signed in.
+Within the following dialog step, check for the presence of a token in the result from the previous step. If it isn't null, then the user successfully signed in.
[!code-javascript[AddOAuthPrompt](~/../botbuilder-samples/samples/javascript_nodejs/46.teams-auth/dialogs/mainDialog.js?range=50-64)]
Within a dialog step, use `begin_dialog` to start the OAuth prompt, which asks t
[!code-python[Add OAuthPrompt](~/../botbuilder-samples/samples/python/46.teams-auth/dialogs/main_dialog.py?range=48-49)]
-Within the following dialog step, check for the presence of a token in the result from the previous step. If it is not null, the user successfully signed in.
+Within the following dialog step, check for the presence of a token in the result from the previous step. If it isn't null, then the user successfully signed in.
[!code-python[Add OAuthPrompt](~/../botbuilder-samples/samples/python/46.teams-auth/dialogs/main_dialog.py?range=51-61)]
platform Auth Flow Bot https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/authentication/auth-flow-bot.md
# Authentication flow for bots in Microsoft Teams
-OAuth 2.0 is an open standard for authentication and authorization used by Azure Active Directory and many other identity providers. A basic understanding of OAuth 2.0 is a prerequisite for working with authentication in Teams; [here's a good overview](https://aaronparecki.com/oauth-2-simplified/) that's easier to follow than the [formal specification](https://oauth.net/2/). Authentication flow for tabs and bots is a little different ΓÇö tabs are very similar to websites so they can use OAuth 2.0 directly, while bots aren't and must do a few things differently ΓÇö but the core concepts are identical.
+OAuth 2.0 is an open standard for authentication and authorization used by Azure Active Directory and many other identity providers. A basic understanding of OAuth 2.0 is a prerequisite for working with authentication in Teams; [here's a good overview](https://aaronparecki.com/oauth-2-simplified/) that's easier to follow than the [formal specification](https://oauth.net/2/). Authentication flow for tabs and bots is a little different ΓÇö tabs are similar to websites so they can use OAuth 2.0 directly, while bots aren't and must do a few things differently, but the core concepts are identical.
See the GitHub repo [Microsoft Teams Authentication Sample](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-auth/nodejs) for an example that demonstrates authentication flow for bots using Node.js and the [OAuth 2.0 authorization code grant type](https://oauth.net/2/grant-types/authorization-code/).
platform Channel And Group Conversations https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/channel-and-group-conversations.md
[!INCLUDE [pre-release-label](~/includes/v4-to-v3-pointer-bots.md)]
-To install the Microsoft Teams bot in a team or group chat, add the `teams` or `groupchat` scope to your bot. This allows all members of the conversation to interact with your bot. After the bot is installed, it has access to metadata about the conversation, such as the list of conversation members. Also, when it is installed in a team, the bot has access to details about that team and the full list of channels.
+To install the Microsoft Teams bot in a team or group chat, add the `teams` or `groupchat` scope to your bot. This allows all members of the conversation to interact with your bot. After the bot is installed, it has access to metadata about the conversation, such as the list of conversation members. Also, when it's installed in a team, the bot has access to details about that team and the full list of channels.
-Bots in a group or channel only receive messages when they are mentioned @botname. They do not receive any other messages sent to the conversation. The bot must be @mentioned directly. Your bot does not receive a message when the team or channel is mentioned, or when someone replies to a message from your bot without @mentioning it.
+Bots in a group or channel only receive messages when they're mentioned @botname. They don't receive any other messages sent to the conversation. The bot must be @mentioned directly. Your bot doesn't receive a message when the team or channel is mentioned, or when someone replies to a message from your bot without @mentioning it.
> [!NOTE] > This feature is currently available in [public developer preview](../../../resources/dev-preview/developer-preview-intro.md) only.
Now, you can create new conversation threads and easily manage different convers
## Create new conversation threads
-When your bot is installed in a team, you must create a new conversation thread rather than reply to an existing one. At times it is difficult to differentiate between two conversations. If the conversation is threaded, it is easier to organize and manage different conversations in channels. This is a form of [proactive messaging](~/bots/how-to/conversations/send-proactive-messages.md).
+When your bot is installed in a team, you must create a new conversation thread rather than reply to an existing one. At times it's difficult to differentiate between two conversations. If the conversation is threaded, it is easier to organize and manage different conversations in channels. This is a form of [proactive messaging](~/bots/how-to/conversations/send-proactive-messages.md).
Next, you can retrieve mentions using the `entities` object and add mentions to your messages using the `Mention` object.
You must also strip out the @mentions from the content of the message your bot r
### Retrieve mentions
-Mentions are returned in the `entities` object in payload and contain both the unique ID of the user and the name of the user mentioned. The text of the message also includes the mention, such as `<at>@John Smith<at>`. However, do not rely on the text in the message to retrieve any information about the user. It is possible for the person sending the message to alter it. Therefore, use the `entities` object.
+Mentions are returned in the `entities` object in payload and contain both the unique ID of the user and the name of the user mentioned. The text of the message also includes the mention, such as `<at>@John Smith<at>`. However, don't rely on the text in the message to retrieve any information about the user. It's possible for the person sending the message to alter it. Therefore, use the `entities` object.
You can retrieve all mentions in the message by calling the `GetMentions` function in the Bot Builder SDK, which returns an array of `Mention` objects.
this.onMessage(async (turnContext, next) => {
# [JSON](#tab/json)
-The `text` field in the object in the `entities` array must match a portion of the message `text` field. If it does not, the mention is ignored.
+The `text` field in the object in the `entities` array must match a portion of the message `text` field. If it doesn't, the mention is ignored.
```json {
When your bot is first added to the group or team, an introduction message must
Send a personal message to each team member when the bot is added. To do this, get the team roster and send each user a direct message.
-Do not send a message in the following cases:
+Don't send a message in the following cases:
* The team is large, for example, larger than 100 members. Your bot can be seen as spam and the person who added it can get complaints. You must clearly communicate your bot's value proposition to everyone who sees the welcome message. * Your bot is first mentioned in a group or channel instead of being first added to a team.
platform Request Headers Of The Bot https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/request-headers-of-the-bot.md
ms.localizationpriority: medium
# Send tenant ID and conversation ID to the request headers of the bot
-The current outgoing requests to the bot do not contain in the header or URL any information that helps bots route the traffic without unpacking the entire payload. The activities are sent to the bot through a URL similar to https://<your_domain>/api/messages. Requests are received to show the conversation ID and tenant ID in the headers.
+The current outgoing requests to the bot don't contain in the header or URL any information that helps bots route the traffic without unpacking the entire payload. The activities are sent to the bot through a URL similar to https://<your_domain>/api/messages. Requests are received to show the conversation ID and tenant ID in the headers.
## Request header fields
Two non-standard request header fields are added to all the requests sent to bot
| x-ms-conversation-id | The conversation ID corresponding to the request activity if applicable and confirmed or verified. | | x-ms-tenant-id | The tenant ID corresponding to the conversation in the request activity. |
-If the tenant or conversation ID is not present in the activity or was not validated on the service side, the value is empty.
+If the tenant or conversation ID isn't present in the activity or wasn't validated on the service side, the value is empty.
![Request header fields](~/assets/images/bots/requestheaderfields.png)
platform Send Proactive Messages https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/send-proactive-messages.md
A proactive message is any message sent by a bot that isn't in response to a req
> * GCCH: `https://smba.infra.gov.teams.microsoft.us/gcch`. For your bot to send a proactive message to a user, group chat, or team, it must have access to send the message. For a group chat or team, the app that contains your bot must be first installed in that location.
-You can [proactively install your app using Microsoft Graph](#proactively-install-your-app-using-graph) in a team, if required, or use an [app policy](/microsoftteams/teams-custom-app-policies-and-settings) to push apps out to teams and users in your tenant. For users, your app either must be installed for the user or your user must be part of a team where your app is installed.
+You can [proactively install your app using Microsoft Graph](#proactively-install-your-app-using-graph) in a team, if necessary, or use an [app policy](/microsoftteams/teams-custom-app-policies-and-settings) to push apps out to teams and users in your tenant. For users, your app either must be installed for the user or your user must be part of a team where your app is installed.
Sending a proactive message is different from sending a regular message. There's no active `turnContext` to use for a reply. You must create the conversation before sending the message. For example, a new one-to-one chat or a new conversation thread in a channel. You can't create a new group chat or a new channel in a team with proactive messaging. To send a proactive message, follow these steps:
-1. [Get the user ID, team ID, or channel ID](#get-the-user-id-team-id-or-channel-id), if required.
-1. [Create the conversation](#create-the-conversation), if required.
+1. [Get the user ID, team ID, or channel ID](#get-the-user-id-team-id-or-channel-id), if necessary.
+1. [Create the conversation](#create-the-conversation), if necessary.
1. [Get the conversation ID](#get-the-conversation-id). 1. [Send the message](#send-the-message).
After you have the user or channel information, you must create the conversation
## Create the conversation
-You must create the conversation if it does not exist or you don't know the `conversationId`. You must only create the conversation once and store the `conversationId` value or `conversationReference` object.
+You must create the conversation if it doesn't exist or you don't know the `conversationId`. You must only create the conversation once and store the `conversationId` value or `conversationReference` object.
After the conversation is created, you must get the conversation ID.
Now that you've sent the proactive message, you must follow these best practices
## Best practices for proactive messaging
-Sending proactive messages to the users is an effective way to communicate with your users. However, from the user's perspective, the message appears unprompted. If there is a welcome message, it will be the first time that theyΓÇÖve interacted with your app. It's important to use this functionality and provide the complete information to the user to understand the purpose of this message.
+Sending proactive messages to the users is an effective way to communicate with your users. However, from the user's perspective, the message appears unprompted. If there's a welcome message, it will be the first time that theyΓÇÖve interacted with your app. It's important to use this functionality and provide the complete information to the user to understand the purpose of this message.
### Welcome messages
-When proactive messaging is used to send a welcome message to a user, there's no context for why the users receive the message. This is also the first time users interact with your app. It is an opportunity to create a good first impression. The best welcome messages must include:
+When proactive messaging is used to send a welcome message to a user, there's no context for why the users receive the message. This is also the first time users interact with your app. It's an opportunity to create a good first impression. The best welcome messages must include:
-* Why a user is receiving the message: It must be very clear to the user why they are receiving the message. If your bot was installed in a channel and you sent a welcome message to all users, let them know what channel it was installed in and who installed it.
-* What do you offer: Users must be able to identify what they can do with your app and what value can you bring to them.
-* What should they do next: Invite users to try out a command, or interact with your app.
-Poor welcome messages can lead the users to block your bot. Write to the point and clear welcome messages. Iterate on the welcome messages if they are not having the desired effect.
+* Why a user is receiving the message? It must be clear to the user why they're receiving the message. If your bot was installed in a channel and you sent a welcome message to all users, then let them know what channel it was installed in and who installed it.
+
+* What do you offer? Users must be able to identify what they can do with your app and what value can you bring to them.
+
+* What should they do next? Invite users to try out a command, or interact with your app.
+Poor welcome messages can lead the users to block your bot. Write to the point and clear welcome messages. Iterate on the welcome messages if they aren't having the desired effect.
### Notification messages To send notifications using proactive messaging, ensure your users have a clear path to take common actions based on your notification. Ensure users have a clear understanding of why they've received a notification. Good notification messages generally include the following:
-* What happened: A clear indication of what happened to cause the notification.
-* What was the result: It must be clear, what item is updated to get the notification.
-* Who or what triggered it: Who or what took action, that caused the notification to be sent.
-* What can users do in response: Make it easy for your users to take actions based on your notifications.
-* How can users opt-out: You must provide a path for users to opt-out of additional notifications.
+* What happened? A clear indication of what happened to cause the notification.
+
+* What was the result? It must be clear, what item is updated to get the notification.
+
+* Who or what triggered it? Who or what took action, that caused the notification to be sent.
+
+* What can users do in response? Make it easy for your users to take actions based on your notifications.
+
+* How can users opt-out? You must provide a path for users to opt-out of additional notifications.
To send messages to a large group of users, for example to your organization, proactively install your app using Graph.
To send messages to a large group of users, for example to your organization, pr
When using proactive messaging to send scheduled messages to users, verify that your time zone is updated to their time zone. This ensures that the messages are delivered to the users at the relevant time. Schedule messages generally include:
-* Why is the user receiving the message: Make it easy for your users to understand the reason for which they're receiving the message.
-* What can user do next: Users can take the required action based on the message content.
+* Why is the user receiving the message? Make it easy for your users to understand the reason for which they're receiving the message.
+
+* What can user do next? Users can take the required action based on the message content.
## Proactively install your app using Graph
Proactively message users that have previously not installed or interacted with
You can only install apps that are in your organizational app catalog or the Teams App Store.
-See [install apps for users](/graph/api/userteamwork-post-installedapps) in the Graph documentation and [proactive bot installation and messaging in Teams with Graph](../../../graph-api/proactive-bots-and-messages/graph-proactive-bots-and-messages.md). There is also a [Microsoft .NET framework sample](https://github.com/microsoftgraph/contoso-airlines-teams-sample/blob/283523d45f5ce416111dfc34b8e49728b5012739/project/Models/GraphService.cs#L176) on the GitHub platform.
+See [install apps for users](/graph/api/userteamwork-post-installedapps) in the Graph documentation and [proactive bot installation and messaging in Teams with Graph](../../../graph-api/proactive-bots-and-messages/graph-proactive-bots-and-messages.md). There's also a [Microsoft .NET framework sample](https://github.com/microsoftgraph/contoso-airlines-teams-sample/blob/283523d45f5ce416111dfc34b8e49728b5012739/project/Models/GraphService.cs#L176) on the GitHub platform.
## Samples
You must supply the user ID and the tenant ID. If the call succeeds, the API ret
## Code sample
-The following table provides a simple code sample that incorporate basic conversation flow into a Teams application and how to create a new conversation thread in a channel in Teams:
+The following table provides a simple code sample that incorporates basic conversation flow into a Teams application and how to create a new conversation thread in a channel in Teams:
| **Sample Name** | **Description** | **.NET** | **Node.js** | **Python** | ||--|--|-|--|
platform Subscribe To Conversation Events https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/subscribe-to-conversation-events.md
async def on_teams_channel_restored(
### Team members added
-The `teamMemberAdded` event is sent to your bot the first time it is added to a conversation. The event is sent to your bot every time a new user is added to a team or group chat where your bot is installed. The user information that is ID, is unique for your bot and can be cached for future use by your service, such as sending a message to a specific user.
+The `teamMemberAdded` event is sent to your bot the first time it's added to a conversation. The event is sent to your bot every time a new user is added to a team or group chat where your bot is installed. The user information that is ID, is unique for your bot and can be cached for future use by your service, such as sending a message to a specific user.
The following code shows an example of team members added event:
async def on_teams_members_added(
### Team members removed
-The `teamMemberRemoved` event is sent to your bot if it is removed from a team. The event is sent to your bot every time any user is removed from a team where your bot is a member. To determine if the new member removed was the bot itself or a user, check the `Activity` object of the `turnContext`. If the `Id` field of the `MembersRemoved` object is the same as the `Id` field of the `Recipient` object, then the member removed is the bot, else it is a user. The bot's `Id` generally is `28:<MicrosoftAppId>`.
+The `teamMemberRemoved` event is sent to your bot if it's removed from a team. The event is sent to your bot every time any user is removed from a team where your bot is a member. To determine if the new member removed was the bot itself or a user, check the `Activity` object of the `turnContext`. If the `Id` field of the `MembersRemoved` object is the same as the `Id` field of the `Recipient` object, then the member removed is the bot, else it's a user. The bot's `Id` generally is `28:<MicrosoftAppId>`.
> [!NOTE] > When a user is permanently deleted from a tenant, `membersRemoved conversationUpdate` event is triggered.
async def on_teams_team_unarchived(
-Now that you have worked with the conversation update events, you can understand the message reaction events that occur for different reactions to a message.
+Now that you've worked with the conversation update events, you can understand the message reaction events that occur for different reactions to a message.
## Message reaction events
-The `messageReaction` event is sent when a user adds or removes reactions to a message which was sent by your bot. The `replyToId` contains the ID of the message, and the `Type` is the type of reaction in text format. The types of reactions include angry, heart, laugh, like, sad, and surprised. This event does not contain the contents of the original message. If processing reactions to your messages is important for your bot, you must store the messages when you send them. The following table provides more information about the event type and payload objects:
+The `messageReaction` event is sent when a user adds or removes reactions to a message, which was sent by your bot. The `replyToId` contains the ID of the message, and the `Type` is the type of reaction in text format. The types of reactions include angry, heart, laugh, like, sad, and surprised. This event doesn't contain the contents of the original message. If processing reactions to your messages is important for your bot, you must store the messages when you send them. The following table provides more information about the event type and payload objects:
| EventType | Payload object | Description | Scope | | | - | -- | -- |
When you use these install and uninstall events, there are some instances where
* You build your bot without the Microsoft Bot Framework SDK, and as a result the bot gives an exception on receiving an unexpected event. * You build your bot with the Microsoft Bot Framework SDK, and you select to alter the default event behavior by overriding the base event handle.
-It is important to know that new events can be added anytime in the future and your bot begins to receive them. So you must design for the possibility of receiving unexpected events. If you are using the Bot Framework SDK, your bot automatically responds with a 200 ΓÇô OK to any events you do not choose to handle.
+It's important to know that new events can be added anytime in the future and your bot begins to receive them. So you must design for the possibility of receiving unexpected events. If you're using the Bot Framework SDK, your bot automatically responds with a 200 ΓÇô OK to any events you don't choose to handle.
## Code sample
platform Create A Bot Commands Menu https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/create-a-bot-commands-menu.md
A prerequisite to create a command menu for your bot is that you must edit an ex
1. Open Teams and select **Apps** from the left pane. In the **Apps** page, search for **App Studio**, and select **Open**. > [!NOTE] > If you don't have **App Studio**, you can download it. For more information, see [installing App Studio](~/concepts/build-and-test/app-studio-overview.md#installing-app-studio).-
- > If you have been using App Studio, we recommend that you'd try the Developer Portal to configure, distribute, and manage your Teams apps. App Studio will be deprecated by June 30, 2022
+
+ > [!WARNING]
+ > If you have been using App Studio, we recommend that you'd try the Developer Portal to configure, distribute, and manage your Teams apps. App Studio will be deprecated by June 30, 2022
:::image type="content" source="/media/AppStudio.png" alt-text="Installing app studio"lightbox="media/AppStudio.png"border="true":::
platform Locally With An Ide https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/debug/locally-with-an-ide.md
# Test and debug your bot locally
-When testing your bot you need to consider both the contexts you want your bot to run in, and any functionality you may have added to your bot that requires data specific to Microsoft Teams. Ensure that the method you choose to test your bot aligns with its functionality.
+When testing your bot, you need to consider both the contexts you want your bot to run in, and any functionality you may have added to your bot that requires data specific to Microsoft Teams. Ensure that the method you choose to test your bot aligns with its functionality.
## Test by uploading to Teams
There are two methods for uploading your app:
If you're hosting your bot locally during development, you need to use a tunneling service like [ngrok](https://ngrok.com/) in order to test your bot. After you download and install ngrok, add `ngrok` to your path, and run the following command to start the tunneling service: ```bash
-ngrok http <port> -host-header=localhost:<port>
+ngrok http <port> --host-header=localhost:<port>
``` Use the https endpoint provided by ngrok in your app manifest.
Use the https endpoint provided by ngrok in your app manifest.
## Test your bot without uploading to Teams
-Occasionally, it's necessary to test your bot without installing it as an app in Teams. We provide two methods for testing the bot. Testing your bot without installing it as an app can be useful to ensure your bot is available and responding, however, it won't allow you to test the full breadth of Microsoft Teams functionality you've added to your bot. If you want to fully test your bot, see [testing by uploading](#test-by-uploading-to-teams).
+Occasionally, it's necessary to test your bot without installing it as an app in Teams. We provide two methods for testing the bot. Testing your bot without installing it as an app can be useful to ensure your bot is available and responding. However, it won't allow you to test the full breadth of Microsoft Teams functionality you've added to your bot. If you want to fully test your bot, see [testing by uploading](#test-by-uploading-to-teams).
### Use the Bot Emulator
For more information, see [complete instructions on the Bot Framework Emulator](
> [!Important] > Talking to your bot by ID is intended for basic testing purposes only. Any Teams-specific functionality you have added to your bot fails to work.
-You can initiate a conversation with your bot by using its ID. When a bot is added through one of these methods, it isn't addressable in channel conversations and you can't take advantage of other Microsoft Teams app capabilities like tabs or message extensions. You can initiate a conversation in one of the following ways:
+Initiate a conversation with your bot by using its ID. When a bot is added through one of these methods, it isn't addressable in channel conversations and you can't take advantage of other Microsoft Teams app capabilities like tabs or message extensions. Initiate a conversation in one of the following ways:
* On the [Bot Dashboard](https://dev.botframework.com/bots) page for your bot, under **Channels**, select **Add to Microsoft Teams**. Microsoft Teams launches a personal chat with your bot.
Your bot receives the `conversationUpdate` event as you add the bots to a team,
## Block a bot in personal chat
-Users can choose to block your bot from sending personal chat messages. They may toggle this by right-clicking your bot in the chat channel and choosing **Block bot conversation**. This means, your bots continues to send messages, however, the user doesn't receive the messages.
+Users can choose to block your bot from sending personal chat messages. They may toggle this by right-clicking your bot in the chat channel and choosing **Block bot conversation**. This means, your bots continue to send messages, however, the user doesn't receive the messages.
![Blocking a bot](~/assets/images/bots/botdisable.png) ## Remove a bot from a team
-Users can delete the bot by choosing the trash-can icon on the bots list in their team's view. This only removes the bot from that team's use, individual users can still interact in personal context. Bots in personal context cannot be disabled or removed by users.
+Users can delete the bot by choosing the trash-can icon on the bots list in their team's view. This only removes the bot from that team's use. Individual users can still interact in personal context. Bots in personal context can't be disabled or removed by users.
## Disable a bot in Teams
platform Get Teams Context https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/get-teams-context.md
keywords: bot context roster user profile channel list
[!INCLUDE [pre-release-label](~/includes/v4-to-v3-pointer-bots.md)]
-A bot can access additional context data about a team or chat where it is installed. This information can be used to enrich the bot's functionality and provide a more personalized experience.
+A bot can access additional context data about a team or chat where it's installed. This information can be used to enrich the bot's functionality and provide a more personalized experience.
## Fetch the roster or user profile
-Your bot can query for the list of members and their basic user profiles, including Teams user IDs and Microsoft Azure Active Directory (Azure AD) information, such as name and objectId. You can use this information to correlate user identities. For example, to check whether a user logged into a tab through Azure AD credentials, is a member of the team. For get conversation members, minimum or maximum page size depends on the implementation. Page size less than 50, are treated as 50, and greater than 500, are capped at 500. Even if you use the non-paged version, it is unreliable in large teams and must not be used. For more information, see [changes to Teams Bot APIs for fetching team or chat members](~/resources/team-chat-member-api-changes.md).
+Your bot can query for the list of members and their basic user profiles, including Teams user IDs and Microsoft Azure Active Directory (Azure AD) information, such as name and objectId. You can use this information to correlate user identities. For example, to check whether a user logged into a tab through Azure AD credentials, is a member of the team. For get conversation members, minimum or maximum page size depends on the implementation. Page size less than 50, are treated as 50, and greater than 500, are capped at 500. Even if you use the non-paged version, it's unreliable in large teams and must not be used. For more information, see [changes to Teams Bot APIs for fetching team or chat members](~/resources/team-chat-member-api-changes.md).
The following sample code uses the paged endpoint for fetching the roster:
platform Rate Limit https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/rate-limit.md
keywords: teams bots rate limiting
# Optimize your bot with rate limiting in Teams
-Rate limiting is a method to limit messages to a certain maximum frequency. As a general principle, your application must limit the number of messages it posts to an individual chat or channel conversation. This ensures an optimal experience and messages do not appear as spam to your users.
+Rate limiting is a method to limit messages to a certain maximum frequency. As a general principle, your application must limit the number of messages it posts to an individual chat or channel conversation. This ensures an optimal experience and messages don't appear as spam to your users.
To protect Microsoft Teams and its users, the bot APIs provide a rate limit for incoming requests. Apps that go over this limit receive an `HTTP 429 Too Many Requests` error status. All requests are subject to the same rate limiting policy, including sending messages, channel enumerations, and roster fetches.
After you handle rate limits for bots, you can handle `HTTP 429` responses using
In general, you must take simple precautions to avoid receiving `HTTP 429` responses. For example, avoid issuing multiple requests to the same personal or channel conversation. Instead, create a batch of the API requests.
-Using an exponential backoff with a random jitter is the recommended way to handle 429s. This ensures that multiple requests do not introduce collisions on retries.
+Using an exponential backoff with a random jitter is the recommended way to handle 429s. This ensures that multiple requests don't introduce collisions on retries.
After you handle `HTTP 429` responses, you can go through the example for detecting transient exceptions.
You can also handle rate limit using the per bot per thread limit.
## Per bot per thread limit
-The per bot per thread limit controls the traffic that a bot is allowed to generate in a single conversation. A conversation is 1:1 between bot and user, a group chat, or a channel in a team. So, if the application sends one bot message to each user, the thread limit does not throttle.
+The per bot per thread limit controls the traffic that a bot is allowed to generate in a single conversation. A conversation is 1:1 between bot and user, a group chat, or a channel in a team. So, if the application sends one bot message to each user, the thread limit doesn't throttle.
>[!NOTE] >
You can also handle rate limit using the per thread limit for all bots.
## Per thread limit for all bots
-The per thread limit for all bots controls the traffic that all bots are allowed to generate across a single conversation. A conversation here is 1:1 between bot and user, a group chat, or a channel in a team.
+The per thread limit for all bots controls the traffic that all bots are allowed to generate across a single conversation. A conversation here's 1:1 between bot and user, a group chat, or a channel in a team.
The following table provides the per thread limit for all bots:
platform Authentication https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/authentication/authentication.md
In Teams, there are two different authentication flows for the app. Perform a tr
Use the web-based authentication flow for [tabs](~/tabs/what-are-tabs.md) and choose to use it with [conversational bots](~/bots/what-are-bots.md) or [message extensions](~/messaging-extensions/what-are-messaging-extensions.md). Use the [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client) in a web content page to enable authentication. After enabling authentication, embed the content page in a tab, a configuration page, or a task module. For more information on web-based authentication flow, see: * [Add authentication to the Teams bot](~/bots/how-to/authentication/add-authentication.md) describes how to use web-based authentication flow with a conversational bot.
-* [Authentication flow in tabs](~/tabs/how-to/authentication/auth-flow-tab.md) describes how tab authentication works in Teams. This shows a typical web-based authentication flow used for tabs.
+* [Authentication flow in tabs](~/tabs/how-to/authentication/auth-flow-tab.md) describes how tab authentication works in Teams, which shows a typical web-based authentication flow used for tabs.
* [Azure AD authentication in tabs](~/tabs/how-to/authentication/auth-tab-AAD.md) describes how to connect to Azure AD from within a tab in the app in Teams. * [Silent authentication Azure AD](~/tabs/how-to/authentication/auth-silent-AAD.md) describes how to reduce sign-in or consent prompts in the app using Azure AD. * [.Net or C#](https://github.com/OfficeDev/microsoft-teams-sample-complete-csharp) or [JavaScript or Node.js](https://github.com/OfficeDev/microsoft-teams-sample-complete-node) provides samples for web-based authentication.
The Azure Bot FrameworkΓÇÖs OAuthPrompt makes authentication easier for apps usi
For more information on using OAuthPrompt, see:
-* [Bot authentication flow overview](~/bots/how-to/authentication/auth-flow-bot.md) describes how authentication works within a bot in the app in Teams. This shows a non-web-based authentication flow used for bots on Teams web, desktop app, and mobile apps.
+* [Bot authentication flow overview](~/bots/how-to/authentication/auth-flow-bot.md) describes how authentication works within a bot in the app in Teams, which shows a non-web-based authentication flow used for bots on Teams web, desktop app, and mobile apps.
* [Bot authentication](~/bots/how-to/authentication/add-authentication.md) describes how to add OAuth authentication to the Teams bot. ## Code sample
provides Bot authentication v3 SDK sample.
| **Sample name** | **Description** | **.NET** | **Node.js** | **Python** | ||||-|| | Bot authentication | This sample shows how to get started with authentication in a bot for Microsoft Teams. | [View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/46.teams-auth) | [View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/46.teams-auth) | [View](https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/python/46.teams-auth) |
-| Tab, Bot and Message Extension (ME) SSO | This sample shows SSO for Tab, Bot and ME - search, action, linkunfurl. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-sso/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-sso/nodejs) | Not available |
+| Tab, Bot and Message Extension (ME) SSO | This sample shows SSO for Tab, Bot and ME - search, action, link unfurl. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-sso/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-sso/nodejs) | Not available |
## Configure the identity provider
For more information, see [configuring an identity provider](~/concepts/authenti
## Third-party cookies on iOS
-After the iOS 14 update, Apple has blocked the [third-party cookie](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) access for all the apps by default. Therefore, the apps that leverage third-party cookies for authentication in their Channel or Chat tabs and Personal apps will not be able to complete their authentication workflows on Teams iOS clients. To conform with Privacy and Security requirements, you must move to a token-based system or use first-party cookies for the user authentication workflows.
+After the iOS 14 update, Apple has blocked the [third-party cookie](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/) access for all the apps by default. Therefore, the apps that leverage third-party cookies for authentication in their Channel or Chat tabs and Personal apps won't be able to complete their authentication workflows on Teams iOS clients. To conform with Privacy and Security requirements, you must move to a token-based system or use first-party cookies for the user authentication workflows.
## See also
platform Configure Identity Provider https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/authentication/configure-identity-provider.md
keywords: teams authentication Azure AD oauth identity provider
## Configuring an application to use Azure AD as an identity provider
-Identity providers supporting OAuth 2.0 will not authenticate requests from unknown applications; applications must be registered ahead of time. To do this with Azure AD, follow these steps:
+Identity providers supporting OAuth 2.0 won't authenticate requests from unknown applications; applications must be registered ahead of time. To do this with Azure AD, follow these steps:
1. Open the [Application Registration Portal](https://ms.portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade).
platform App Studio Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/app-studio-overview.md
# Manage your apps with App Studio for Microsoft Teams
-> [!TIP]
+> [!WARNING]
> **Try the Developer Portal**: App Studio has evolved. Configure, distribute, and manage your Teams apps with the new [Developer Portal](https://dev.teams.microsoft.com/). <br> App Studio will be deprecated by June 30, 2022. App Studio makes it easy to start creating or integrating your own Microsoft Teams apps, whether you develop custom apps for your enterprise or SaaS applications for teams around the world by streamlining the creation of the manifest and package for your app and providing useful tools like the Card Editor and a React control library.
platform Apps Localization https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/apps-localization.md
Consider the following factors to localize your Microsoft Teams app:
## Localize your AppSource listing
-If you're publishing the app to the store, provide metadata (descriptions, screen shots, name) in the languages that you would like your app to be listed in, and explicitly specify these languages on the **Marketplace listings** page in Partner Center. For more information, see [localized Microsoft AppSource fronts](/office/dev/store/prepare-localized-solutions#localized-microsoft-appsource-fronts). To support localized listings in the app store, you can add additional languages to your listing. The default language information you provide in [Partner Center](/office/dev/store/submit-to-appsource-via-partner-center) for your listing appears in the [AppSource website](https://appsource.microsoft.com/marketplace/apps?product=office%3Bteams&page=1 "AppSource is one place for all your team needs. bring everything together including chats, meetings, calls, files, and tools to enable more productive teamwork.") listing for your app. Currently, the default language is English.
+If you're publishing the app to the store, provide metadata (descriptions, screenshots, name) in the languages that you would like your app to be listed in, and explicitly specify these languages on the **Marketplace listings** page in Partner Center. For more information, see [localized Microsoft AppSource fronts](/office/dev/store/prepare-localized-solutions#localized-microsoft-appsource-fronts). To support localized listings in the app store, you can add additional languages to your listing. The default language information you provide in [Partner Center](/office/dev/store/submit-to-appsource-via-partner-center) for your listing appears in the [AppSource website](https://appsource.microsoft.com/marketplace/apps?product=office%3Bteams&page=1 "AppSource is one place for all your team needs. bring everything together including chats, meetings, calls, files, and tools to enable more productive teamwork.") listing for your app. Currently, the default language is English.
### Configure localization
The images that you upload with the English language are used in AppSource.
Use the Microsoft Teams app schema `v1.5` and later to localize your app. You can do this by setting the `$schema` attribute in your manifest.json file to `https://developer.microsoft.com/json-schemas/teams/v1.5/MicrosoftTeams.schema.json` or higher and updating the `manifestVersion` property to `$schema` version (`1.5` in this case).
-Add the `localizationInfo` property with the default language that your application supports. The default language is used as the final fallback language if the user's client settings do not match with any of your additional languages.
+Add the `localizationInfo` property with the default language that your application supports. The default language is used as the final fallback language if the user's client settings don't match with any of your additional languages.
### Example manifest.json change
default language strings -> user's language only strings -> user's language + us
For example, you provide a default language of 'fr' (French, all regions), and additional language files for 'en' (English, all regions) and 'en-gb' (English, Great Britain), the user's language is set to 'en-gb'. The following changes take place based on the language selection:
-1. The Teams client takes the 'fr' strings and overwrite them with the 'en' strings.
+1. The Teams client takes the 'fr' strings and overwrites them with the 'en' strings.
1. Overwrite the 'en' strings with the 'en-gb' strings. If the user's language is set to 'en-ca', the following changes take place based on the language selection:
-1. The Teams client takes the 'fr' strings and overwrite them with the 'en' strings.
+1. The Teams client takes the 'fr' strings and overwrites them with the 'en' strings.
1. Since no 'en-ca' localization is supplied, the 'en` localizations are used.
-If the user's language is set to 'es-es', the Teams client takes the 'fr' strings. The Teams client does not override the strings with any of the language files as no 'es' or 'es-es' translation is provided.
+If the user's language is set to 'es-es', the Teams client takes the 'fr' strings. The Teams client doesn't override the strings with any of the language files as no 'es' or 'es-es' translation is provided.
Therefore, you must provide top level, language only translations in your manifest. For example, `en` instead of `en-us`. You must provide region level overrides only for the few strings that need them.
The `manifest.json` change is shown in the following example:
## Handle localized text submissions from your users
-If your provide localized versions of your application, the users respond with the same language. As Teams does not translate the user submissions back to the default language, your app must handle the localized language responses. For example, if you provide a localized `commandList`, the responses to your bot are the localized text of the command, not the default language. Your app must respond appropriately.
+If you provide localized versions of your application, the users respond with the same language. As Teams doesn't translate the user submissions back to the default language, your app must handle the localized language responses. For example, if you provide a localized `commandList`, the responses to your bot are the localized text of the command, not the default language. Your app must respond appropriately.
## Code sample
platform Debug https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/debug.md
To set up ngrok in preparation to execute your Microsoft Teams app locally, foll
> [!NOTE] > If you stop and restart ngrok, the URL changes.
-To use ngrok in your project based on the capabilities you are using, you must replace all URL references in your code, configuration, and manifest.json file to use this URL endpoint.
+To use ngrok in your project based on the capabilities you're using, you must replace all URL references in your code, configuration, and manifest.json file to use this URL endpoint.
-For bots registered in the Microsoft Bot Framework, update the bot's messaging endpoint to use this new ngrok endpoint. For example, `https://2d1224fb.ngrok.io/api/messages`. You can validate that ngrok is working by testing the bot response in the Bot Framework portal's Test chat window. Again, like the emulator, this test does not permit you to access Teams-specific functionality.
+For bots registered in the Microsoft Bot Framework, update the bot's messaging endpoint to use this new ngrok endpoint. For example, `https://2d1224fb.ngrok.io/api/messages`. You can validate that ngrok is working by testing the bot response in the Bot Framework portal's Test chat window. Again, like the emulator, this test doesn't permit you to access Teams-specific functionality.
> [!NOTE] > * To update the messaging endpoint for a bot, you must use the Bot Framework. Select your bot in [your list of bots in Bot Framework](https://dev.botframework.com/bots). You do not need to migrate your bot to Microsoft Azure. You can also update your messaging endpoint through [App Studio](~/concepts/build-and-test/app-studio-overview.md).+
+> [!WARNING]
> * If you have been using App Studio, we recommend that you'd try the Developer Portal to configure, distribute, and manage your Teams apps. App Studio will be deprecated by June 30, 2022 ## Cloud-hosted
-You can use any externally addressable service to host your development and production code and their HTTPS endpoints. There is no expectation that your capabilities reside on the same service. We require all domains to be accessed from your Microsoft Teams apps listed in the [`validDomains`](~/resources/schem#validdomains) object in the `manifest.json` file.
+You can use any externally addressable service to host your development and production code and their HTTPS endpoints. There's no expectation that your capabilities reside on the same service. We require all domains to be accessed from your Microsoft Teams apps listed in the [`validDomains`](~/resources/schem#validdomains) object in the `manifest.json` file.
> [!NOTE] > To ensure a secure environment, be explicit about the exact domain and subdomains you reference and those domains must be in your control. For example, `*.azurewebsites.net` is not recommended, however `contoso.azurewebsites.net` is recommended.
platform Deep Links https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-links.md
To implement this, add a **copy link** action to each item, in whatever way best
pages.shareDeepLink({ subPageId: <subPageId>, subPageLabel: <subPageLabel>, subPageWebUrl: <subPageWebUrl> }) ```
-You will need to replace the fields with the appropriate information:
+You'll need to replace the fields with the appropriate information:
* `subPageId`: A unique identifier for the item within your page to which you're deep linking. * `subPageLabel`: A label for the item to use for displaying the deep link. * `subPageWebUrl`: A fallback URL to use if the client can't render the page.
-For more information see, [pages.shareDeepLink()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-sharedeeplink&preserve-view=true).
+For more information, see, [pages.shareDeepLink()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-sharedeeplink&preserve-view=true).
# [TeamsJS v1](#tab/teamsjs-v1)
To implement this, you add a **copy link** action to each item, in whatever way
microsoftTeams.shareDeepLink({ subEntityId: <subEntityId>, subEntityLabel: <subEntityLabel>, subEntityWebUrl: <subEntityWebUrl> }) ```
-You will need to replace the fields with the appropriate information:
+You'll need to replace the fields with the appropriate information:
* `subEntityId`: A unique identifier for the item within your tab to which you're deep linking. * `subEntityLabel`: A label for the item to use for displaying the deep link.
Alternatively, you can also generate deep links programmatically, using the form
When navigating to a deep link, Microsoft Teams simply navigates to the tab and provides a mechanism through the Microsoft Teams JavaScript library to retrieve the sub-page ID if it exists.
-The [`app.getContext()`](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-getcontext&preserve-view=true) call (`microsoftTeams.getContext()`) in TeamsJS v1) returns a promise that will resolve with the context that includes the `subPageId` property (subEntityId for TeamsJS v1) if the tab is navigated through a deep link. For more information see [PageInfo interface](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-pageinfo&preserve-view=true).
+The [`app.getContext()`](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-getcontext&preserve-view=true) call (`microsoftTeams.getContext()`) in TeamsJS v1) returns a promise that will resolve with the context that includes the `subPageId` property (subEntityId for TeamsJS v1) if the tab is navigated through a deep link. For more information, see [PageInfo interface](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-pageinfo&preserve-view=true).
### Generate a deep link to your tab
-While it is recommended to use `shareDeepLink()` to generate a deep link to your tab, it is possible to manually create one too.
+While it's recommended to use `shareDeepLink()` to generate a deep link to your tab, it's possible to manually create one too.
> [!NOTE] >
-> * Personal tabs have a `personal` scope, while channel and group tabs use `team` or `group` scopes. The two tab types have a slightly different syntax since only the configurable tab has a `channel` property associated with its context object. See the [manifest](~/resources/schem) reference for more information on tab scopes.
+> * Personal tabs have a `personal` scope, while channel and group tabs use `team` or `group` scopes. The two tab types have a slightly different syntax since only the configurable tab has a `channel` property associated with its context object. For more information on tab scopes, See the [manifest](~/resources/schem) reference.
> * Deep links work properly only if the tab was configured using the v0.4 or later library and because of that has an entity ID. Deep links to tabs without entity IDs still navigate to the tab but cannot provide the sub entity ID to the tab. Use the following format for a deep link that you can use in a bot, connector, or message extension card:
The query parameters are:
You can navigate to content in Teams from your tab using TeamsJS or deep links. This is useful if your tab needs to connect users with other content in Teams, such as to a channel, message, another tab or even to open a scheduling dialog. Formerly, navigation might have required a deep link, but it can now in many instances be accomplished using the SDK. The following sections show both methods, but where possible use of the strongly typed capabilities of the SDK is recommended.
-One of the benefits of using TeamsJS, particularly for Teams apps that might run in other hosts (Outlook and Office), is that it's possible to check that the host supports the capability you're attempting to use. To check a host's support of a capability, you can use the `isSupported()` function associated with the namespace of the API. The TeamsJS SDK organizes APIs into capabilities by way of namespaces. For example, prior to usage of an API in the `pages` namespace you can check the returned boolean value from `pages.isSupported()` and take the appropriate action within the context of your app and apps UI.
+One of the benefits of using TeamsJS, particularly for Teams app that might run in other hosts (Outlook and Office), is that it's possible to check that the host supports the capability you're attempting to use. To check a host's support of a capability, you can use the `isSupported()` function associated with the namespace of the API. The TeamsJS SDK organizes APIs into capabilities by way of namespaces. For example, prior to usage of an API in the `pages` namespace you can check the returned boolean value from `pages.isSupported()` and take the appropriate action within the context of your app and apps UI.
-For additional information about capabilities and the APIs in TeamsJS, see [Building tabs and other hosted experiences with the Microsoft Teams JavaScript client SDK](~/tabs/how-to/using-teams-client-sdk.md#apis-organized-into-capabilities).
+For more information about capabilities and the APIs in TeamsJS, see [Building tabs and other hosted experiences with the Microsoft Teams JavaScript client SDK](~/tabs/how-to/using-teams-client-sdk.md#apis-organized-into-capabilities).
### Navigate within your app
-It is possible to navigate within an app using TeamsJS. The following code demonstrates how to navigate to a specific entity within your Teams app.
+It's possible to navigate within an app using TeamsJS. The following code demonstrates how to navigate to a specific entity within your Teams app.
# [TeamsJS v2](#tab/teamsjs-v2)
-You can trigger a navigation from your tab using the [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-navigatetoapp&preserve-view=true) function as shown in the following code:
+You can trigger navigation from your tab using the [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-navigatetoapp&preserve-view=true) function as shown in the following code:
```javascript if (pages.isSupported()) {
if (pages.isSupported()) {
else { /* handle case where capability isn't supported */ } ```
-For more information about using the pages capability, see [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-navigatetoapp&preserve-view=true) and the [pages](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest&preserve-view=true) namespace for other navigation options. If needed, it is also possible to directly open a deep link using the [app.openLink()](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-openlink&preserve-view=true) function.
+For more information about using the pages capability, see [pages.navigateToApp()](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest#@microsoft-teams-js-pages-navigatetoapp&preserve-view=true) and the [pages](/javascript/api/@microsoft/teams-js/pages?view=msteams-client-js-latest&preserve-view=true) namespace for other navigation options. If needed, it's also possible to directly open a deep link using the [app.openLink()](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-openlink&preserve-view=true) function.
# [TeamsJS v1](#tab/teamsjs-v1)
if(calendar.isSupported()) {
else { /* handle case where capability isn't supported */ } ```
-For more information about working with the calendar see, the [calendar](/javascript/api/@microsoft/teams-js/calendar?view=msteams-client-js-latest&preserve-view=true) namespace in the API reference documentation.
+For more information about working with the calendar, see, the [calendar](/javascript/api/@microsoft/teams-js/calendar?view=msteams-client-js-latest&preserve-view=true) namespace in the API reference documentation.
# [TeamsJS v1](#tab/teamsjs-v1)
microsoftTeams.executeDeepLink("https://teams.microsoft.com/l/meeting/new?subjec
#### Generate a deep link to the scheduling dialog
-While it's recommended to use the strongly typed APIs of TeamsJS, it is possible to manually create deep links to the Teams built-in scheduling dialog. Use the following format for a deep link that you can use in a bot, Connector, or message extension card:
+While it's recommended to use the strongly typed APIs of TeamsJS, it's possible to manually create deep links to the Teams built-in scheduling dialog. Use the following format for a deep link that you can use in a bot, Connector, or message extension card:
`https://teams.microsoft.com/l/meeting/new?subject=<meeting subject>&startTime=<date>&endTime=<date>&content=<content>&attendees=<user1>,<user2>,<user3>,...` Example: `https://teams.microsoft.com/l/meeting/new?subject=test%20subject&attendees=joe@contoso.com,bob@contoso.com&startTime=10%2F24%2F2018%2010%3A30%3A00&endTime=10%2F24%2F2018%2010%3A30%3A00&content=ΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïtest%3AcontentΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇï`
if(appInstallDialog.isSupported()) {
else { /* handle case where capability isn't supported */ } ```
-For more information about the install dialog see the [appInstallDialog.openAppInstallDialog()](/javascript/api/@microsoft/teams-js/appinstalldialog?view=msteams-client-js-latest#@microsoft-teams-js-appinstalldialog-openappinstalldialog&preserve-view=true) function in the API reference documentation.
+For more information about the install dialog, see the [appInstallDialog.openAppInstallDialog()](/javascript/api/@microsoft/teams-js/appinstalldialog?view=msteams-client-js-latest#@microsoft-teams-js-appinstalldialog-openappinstalldialog&preserve-view=true) function in the API reference documentation.
# [TeamsJS v1](#tab/teamsjs-v1)
Example: `https://teams.microsoft.com/l/message/<channelId>/1648741500652?tenant
The query parameters are:
-* `channelId`: Channel ID of the conversation. For example `19:3997a8734ee5432bb9cdedb7c432ae7d@thread.tacv2`.
+* `channelId`: Channel ID of the conversation. For example, `19:3997a8734ee5432bb9cdedb7c432ae7d@thread.tacv2`.
* `tenantId`: Tenant ID such as `0d9b645f-597b-41f0-a2a3-ef103fbd91bb`.
-* `groupId`: Group ID of the file. For example `3606f714-ec2e-41b3-9ad1-6afb331bd35d`.
+* `groupId`: Group ID of the file. For example, `3606f714-ec2e-41b3-9ad1-6afb331bd35d`.
* `parentMessageId`: Parent message Id of the conversation. * `teamName`: Name of the team. * `channelName`: Name of the team's channel.
The query parameters are:
* `objectUrl`: Object URL of the file. The format is `https://{tenantName}.sharepoint.com/sites/{TeamName}/SharedDocuments/{ChannelName}/FileName.ext`. For example, `https://microsoft.sharepoint.com/teams/(filepath)`. * `baseUrl`: Base URL of the file. The format is `https://{tenantName}.sharepoint.com/sites/{TeamName}`. For example, `https://microsoft.sharepoint.com/teams`. * `serviceName`: Name of the service, app ID. For example, `teams`.
-* `threadId`: The threadId is the team ID of the team where the file is stored. It is optional and cannot be set for files stored in a user's OneDrive folder. threadId - 19:f8fbfc4d89e24ef5b3b8692538cebeb7@thread.skype.
-* `groupId`: Group ID of the file. For example `ae063b79-5315-4ddb-ba70-27328ba6c31e`.
+* `threadId`: The threadId is the team ID of the team where the file is stored. It's optional and can't be set for files stored in a user's OneDrive folder. threadId - 19:f8fbfc4d89e24ef5b3b8692538cebeb7@thread.skype.
+* `groupId`: Group ID of the file. For example, `ae063b79-5315-4ddb-ba70-27328ba6c31e`.
> [!NOTE] > You can see `threadId` and `groupId` in the URL from the channel.
Example: `https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee
You can invoke audio only or audio-video calls to a single user or a group of users, by specifying the call type and the participants. Before placing the call, Teams client prompts a confirmation to make the call. In case of group call, you can call a set of VoIP users and a set of PSTN users in the same deep link invocation.
-In case of a video call, the client will ask for confirmation and turn on the caller's video for the call. The receiver of the call has a choice to respond through audio only or audio and video, through the Teams call notification window.
+In a video call, the client will ask for confirmation and turn on the caller's video for the call. The receiver of the call has a choice to respond through audio only or audio and video, through the Teams call notification window.
> [!NOTE] > This method cannot be used for invoking a meeting.
While use of the strongly typed APIs of TeamsJS is recommended, you can also use
Following are the query parameters:
-* `users`: The comma-separated list of user IDs representing the participants of the call. Currently, the User ID field supports the Azure AD UserPrincipalName, typically an email address, or in case of a PSTN call, it supports a pstn mri 4:&lt;phonenumber&gt;.
+* `users`: The comma-separated list of user IDs representing the participants of the call. Currently, the User ID field supports the Azure AD UserPrincipalName, typically an email address, or in a PSTN call, it supports a pstn mri 4:&lt;phonenumber&gt;.
* `withVideo`: This is an optional parameter, which you can use to make a video call. Setting this parameter will only turn on the caller's camera. The receiver of the call has a choice to answer through audio or audio and video call through the Teams call notification window. * `Source`: This is an optional parameter, which informs about the source of the deep link.
platform Share To Teams From Personal App Or Tab https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/share-to-teams-from-personal-app-or-tab.md
The following table provides the response codes:
|Response code|Description| ||| | **100** | API not supported in the current platform. |
-| **404** | The file specified was not found on the given location. |
+| **404** | The file specified wasn't found on the given location. |
| **500** | Internal error encountered while performing the required operation. |
-| **501** | API is not supported in current context. |
+| **501** | API isn't supported in current context. |
| **1000** | Permissions denied by user. | | **2000** | Network issue. | | **3000** | Underlying hardware doesn't support the capability. | | **4000** | One or more arguments are invalid. |
-| **5000** | User is not authorized for this operation. |
-| **6000** | Could not complete the operation due to insufficient resources. |
+| **5000** | User isn't authorized for this operation. |
+| **6000** | Couldn't complete the operation due to insufficient resources. |
| **7000** | Platform throttled the request because of API was invoked too frequently. | | **8000** | User aborted the operation. | | **9000** | Platform code is old and doesn't implement this API. |
-| **10000** | The return value is too big and has exceeded our size boundries. |
+| **10000** | The return value is too big and has exceeded our size boundaries. |
## Limitations
platform Share To Teams From Web Apps https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/share-to-teams-from-web-apps.md
The following image displays the Share to Teams pop-up experience:
</div> ```
-1. If the shared link requires user authentication, and the URL preview from your link to be shared does not render well in Teams, then you can disable the URL preview by adding the `data-preview` attribute set to `false`.
+1. If the shared link requires user authentication, and the URL preview from your link to be shared doesn't render well in Teams, then you can disable the URL preview by adding the `data-preview` attribute set to `false`.
```html <div
When your website is shared to Teams, the card that is inserted into the selecte
To display the preview: * You must include either a **Thumbnail image**, or both a **Title** and **Description**. For best results, include all three.
-* The shared URL does not require authentication. If it requires authentication, you can share it, but the preview is not created.
+* The shared URL doesn't require authentication. If it requires authentication, you can share it, but the preview isn't created.
The following table outlines the necessary tags:
You can use either the HTML default versions or the Open Graph version.
## Share to Teams for Education
-For teachers using the Share to Teams button, there is an additional option to `Create an Assignment`. This enables you to quickly create an assignment in the chosen Team, based on the shared link. The following image displays Share to Teams for education:
+For teachers using the Share to Teams button, there's an additional option to `Create an Assignment` that enables you to quickly create an assignment in the chosen Team, based on the shared link. The following image displays Share to Teams for education:
:::image type="content" source="../../assets/images/share-to-teams-popup-edu.png" alt-text="Share to Teams popup education":::
platform Test Data https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/test-data.md
You can test your Microsoft Teams app with sample data with a Microsoft 365 deve
## Prerequisites
-1. [Join the Microsoft 365 Developer Program](/office/developer-program/office-365-developer-program), if you do not have a test tenant.
+1. [Join the Microsoft 365 Developer Program](/office/developer-program/office-365-developer-program), if you don't have a test tenant.
2. [Set up a Microsoft 365 Developer Subscription](/office/developer-program/office-365-developer-program-get-started). 3. [Use sample data packs with your Microsoft 365 developer subscription to install the Users content pack](/office/developer-program/install-sample-packs). 4. [Install the Teams PowerShell module](https://www.powershellgallery.com/packages/MicrosoftTeams/1.0.2).
By default, only global admins or Teams service admins can upload (sideload) app
</Teams> ```
-2. Save the following snippet as a PowerShell script (.ps1) and note where you have saved it. This script executes the steps to create the team and channel, and add members to them:
+2. Save the following snippet as a PowerShell script (.ps1) and note where you've saved it. This script executes the steps to create the team and channel, and add members to them:
```powershell Param(
By default, only global admins or Teams service admins can upload (sideload) app
} ```
-3. Open a Windows PowerShell session in Administrator mode, and run the script that you just saved.
-4. When you are prompted to provide the credentials, enter the Global Administrator credentials you received when you first signed up for your developer subscription.
+3. Open a Windows PowerShell session in Administrator mode, and run the script that you saved.
+4. When you're prompted to provide the credentials, enter the Global Administrator credentials you received when you first signed up for your developer subscription.
> [!Note] > Do not close your PowerShell session as the script takes several minutes to execute. If you have modified the users in your subscription from what is created in the default content pack, some users may not be added to Teams. As the script executes it displays successful or failed actions.
platform Apps Upload https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/apps-upload.md
You can sideload your app to a team, chat, meeting, or for personal use dependin
a. Select **Add** to add your personal app.</br> b. Use the dropdown menu to add your app to a Team or chat.
- :::image type="content" source="~/assets/videos/app-teams.gif" alt-text="Create a Teams app" border="true":::
+ :::image type="content" source="~/assets/images/publish-app/teams-app-detail.png" alt-text="App description" border="true":::
## Troubleshoot If your app fails to sideload or any issues to upload, check the following options:
-1. Ensure that you have followed all the instructions for [creating your app package](../../concepts/build-and-test/apps-package.md).
+1. Ensure that you've followed all the instructions for [creating your app package](../../concepts/build-and-test/apps-package.md).
1. [Validate your app package](https://dev.teams.microsoft.com/appvalidation.html). 1. Ensure your app manifest matches to the latest [schema](../../resources/schem).
Manage your apps allows users to have a dedicated place to manage, update and re
### Access your app
-To access apps through **Manage your apps** follow the steps:
+To access apps through **Manage your apps**, follow the steps:
1. Go to **Apps** and select **Manage your apps** in Teams to view the installed apps across all your channels or for personal use in a list format.
To access apps through **Manage your apps** follow the steps:
:::image type="content" source="~/assets/images/publish-app/app-scopes.png" alt-text="Access teams app scope" border="true":::
-1. Select the scope of app to go to the app in the channel or personal view. The list of scopes consists of personal scope and teams scope only. Apps installed in group chat scope are not displayed in this view currently.
+1. Select the scope of app to go to the app in the channel or personal view. The list of scopes consists of personal scope and teams scope only. Apps installed in group chat scope aren't displayed in this view currently.
Teams provide several ways to open apps. For more information, see [access your apps in Teams](https://support.microsoft.com/office/access-your-apps-in-teams-0758cb09-9e85-40e7-a974-51df7734646a).
Teams provide several ways to open apps. For more information, see [access your
You don't have to sideload your app again if you make code changes (these are reflected in Teams in real-time). However, you must reinstall if you change any app configurations.
-If an update is available to your app, then the **Update available** option is enabled. To update follow the steps:
+If an update is available to your app, then the **Update available** option is enabled. To update, follow the steps:
1. Select **Update available** to view update.
If an update is available to your app, then the **Update available** option is e
### Remove your app
-To remove app from Teams follow the steps:
+To remove app from Teams, follow the steps:
1. Find the app in **Manage your app**. 1. Select &nbsp;:::image type="content" source="~/assets/images/publish-app/bin-icon.png" alt-text="Remove app in Teams" border="false":::&nbsp; at the scope of the installed app.
platform Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/post-publish/overview.md
Data for newly published apps takes about a week to appear in the report.
> > Previously, the links were copied by selecting ellipses on the app tile. With the updated Teams store experience, you will access the same from the details tab of the apps. This update will be generally available (GA) by March 01, 2022.
-You can submit changes to your app (such as new features or even metadata) in Partner Center. These changes requires a new review process.
+You can submit changes to your app (such as new features or even metadata) in Partner Center. These changes require a new review process.
Ensure the following when publishing updates:
platform Submission Checklist https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/submission-checklist.md
keywords: submission store distribute validate app package guidelines localize + # Prepare your Microsoft Teams store submission You've designed, built, and tested your Microsoft Teams app. Now you're ready to list it so people can discover and start using your app.
Before you submit your app to [Partner Center](/office/dev/store/use-partner-cen
While your app may be working in a test environment, you should check your app package to avoid running into issues during the submission process.
-> [!NOTE]
- > If you have been using App Studio, we recommend that you'd try the Developer Portal[Developer Portal](https://dev.teams.microsoft.com/) to configure, distribute, and manage your Teams apps. App Studio will be deprecated by June 30, 2022.
+> [!WARNING]
+> If you have been using App Studio, we recommend that you'd try the Developer Portal[Developer Portal](https://dev.teams.microsoft.com/) to configure, distribute, and manage your Teams apps. App Studio will be deprecated by June 30, 2022.
The Microsoft Teams app validation tool helps you identify and fix issues before submitting to Partner Center. The tool automatically checks your app's configurations against the same test cases used during store validation.
A store listing may be someone's first impression of your app. Increase installa
### Specify a short name
-Your app's name (specifically, its [*short name*](~/resources/schem#name)) plays a crucial role in how users discover it in the store.
+Your app's name (specifically, its *[short name](~/resources/schem#name)*) plays a crucial role in how users discover it in the store.
:::row:::
- :::column span="3":::
- :::image type="content" source="../../../../assets/images/store-detail-page/AppName-02.png" alt-text="Example screenshot highlights where an app's short name displays in a store listing.":::
- :::column-end:::
- :::column span="1":::
- :::column-end:::
:::row-end:::
A concise summary of your app that should be original, engaging, and directed at
:::row:::
- :::column span="3":::
- :::image type="content" source="~/assets/images/store-detail-page/ShortDescription-02.png" alt-text="Example screenshot highlights where an app's short description displays in a store listing.":::
- :::column-end:::
- :::column span="1":::
- :::column-end:::
:::row-end:::
While this description can be as long as 4,000 characters, most users will only
:::row:::
- :::column span="3":::
- :::image type="content" source="~/assets/images/store-detail-page/LongDescription-02.png" alt-text="Example screenshot highlights where an app's long description displays in a store listing.":::
- :::column-end:::
- :::column span="1":::
- :::column-end:::
:::row-end:::
Screenshots provide a prominent visual preview of your app to complement your ap
:::row:::
- :::column span="3":::
- :::image type="content" source="~/assets/images/store-detail-page/Screenshot-01.png" alt-text="Example screenshot highlights where app screenshots display in a store listing.":::
- :::column-end:::
- :::column span="1":::
- :::column-end:::
:::row-end:::
Partner Center supports [localized store listings](/office/dev/store/prepare-loc
> If you're submitting a new app, you can't officially complete Publisher Attestation until your app is listed on the Teams store. If you're updating a listed app, complete Publisher Attestation before you submit the latest version of the app for validation. ## Next step- > [!div class="nextstepaction"] > [Submit your app](/office/dev/store/add-in-submission-guide)
platform Publish https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/publish.md
When you feel your app is production ready, you can begin the process of getting
* **Deep functional and experience tests**
- Your app is thoroughly reviewed by a validator to ensure compliance with the [Microsoft Commercial Marketplace certification policies](/legal/marketplace/certification-policies) with a focus on deep functional and user experience testing, usability checks, and metadata checks. App validation is performed across desktop, web, and mobile clients. We work hard to provide you a detailed test report in 24 working hours post submission.
+ Your app is thoroughly reviewed by a validator to ensure compliance with the [Microsoft Commercial Marketplace certification policies](/legal/marketplace/certification-policies).
+ There will be a focus on deep functional and user experience testing, usability checks, and metadata checks. App validation is performed across desktop, web, and mobile clients. We work hard to provide you a detailed test report in 24 working hours post submission.
* **Guided app publish through concierge service**
- If there are no issues observed with your app, your app will be approved and published to the Teams store. If there are issues, you'll receive an automated validation report from Partner Center with the failure details. To help you successfully publish your app to the Teams store and guide you through this process, the validation team will send you a personalized email from our concierge service [teamsubm@microsoft.com](mailto:teamsubm@microsoft.com) that includes the following information:
+ If there are no issues observed with your app, then your app will be approved and published to the Teams store. On the other hand, if the issues are present, then you'll receive an automated validation report from Partner Center with the failure details. To help you successfully publish your app to the Teams store and guide you through this process, the validation team will send you a personalized email from our concierge service [teamsubm@microsoft.com](mailto:teamsubm@microsoft.com) that includes the following information:
* Summary of all issues * Details of failures or issues with policy links and categorization:
- * Mandatory fix: These issues must be fixed prior to app approval.
+ * Mandatory fix: Issues must be fixed prior to app approval.
- * Suggested fix: These issues can be fixed post app approval as these are recommendations to improve your appΓÇÖs experience.
+ * Suggested fix: Issues can be fixed post app approval as the issues are recommendations to improve your appΓÇÖs experience.
- * Blocker: These issues prevent the validation team from testing your app functionality further and must be resolved for validation to continue.
+ * Blocker: Issues prevent the validation team from testing your app functionality further and must be resolved for validation to continue.
- * Query: These queries can be shared to get answers to specific questions related to your app.
+ * Query: Queries can be shared to get answers to specific questions related to your app.
* Steps to recreate issues through written instructions or video format.
When you feel your app is production ready, you can begin the process of getting
* **During design phase**
- Review the [store validation guidelines](~/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines.md) early in your app's life cycle (design phase) to ensure that you build your app in alignment with the store requirements. If you build your app in line with these guidelines, this will prevent any rework due to non-adherence to store policies.
+ Review the [store validation guidelines](~/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines.md) early in your app's life cycle (design phase) to ensure that you build your app in alignment with the store requirements. If you build your app in line with these guidelines, then it will prevent any rework due to non-adherence to store policies.
* **Prior to app submission** 1. [Create your Partner Center account](prepare/create-partner-center-dev-account.md) well in advance. If you run into any challenges with your [Partner Center account](prepare/create-partner-center-dev-account.md), create a [support ticket](/azure/marketplace/partner-center-portal/support).
- 1. Review the [store validation guidelines](prepare/teams-store-validation-guidelines.md) again to ensure that your app is in alignment with the store requirements. This helps reduce the number of issues observed in your app and consequently, the time taken to approve your app.
+ 1. Review the [store validation guidelines](prepare/teams-store-validation-guidelines.md) again to ensure that your app is in alignment with the store requirements. This helps reduce the number of issues observed in your app and so, the time taken to approve your app.
1. Test and re-test your app:
When you feel your app is production ready, you can begin the process of getting
1. Test instructions detailing app functionality and supported scenarios.
- 1. Setup instructions if your app requires additional configuration to access app functionality. Alternately, if your app requires complex configuration, you can also provide a [provisioned demo tenant](/office/developer-program/microsoft-365-developer-program-get-started) with admin access so that our validators can skip the configuration steps.
+ 1. Setup instructions if your app requires more configuration to access app functionality. Alternately, if your app requires complex configuration, you can also provide a [provisioned demo tenant](/office/developer-program/microsoft-365-developer-program-get-started) with admin access so that our validators can skip the configuration steps.
1. Link to a demo video recording key user flow for your app. This is highly recommended. * **Post app submission**
- * After youΓÇÖve reviewed the validation report, reply to the email thread with any queries related to the validation report or if you need any additional support to resolve the reported issues.
+ * After youΓÇÖve reviewed the validation report, reply to the email thread with any queries related to the validation report or if you need any extra support to resolve the reported issues.
- * Ensure that you've adequate developer bandwidth to resolve any reported issues till the app is approved.
+ * Ensure that you've adequate developer bandwidth to resolve any reported issues until the app is approved.
- * Ensure that you've [resolved all issues](/microsoftteams/platform/concepts/deploy-and-publish/appsource/resolve-submission-issues) reported to you by the concierge service [teamsubm@microsoft.com](mailto:teamsubm@microsoft.com) before sharing your app package for further testing. This helps reduce the number of iterations required to validate your app and consequently, the time taken to approve your app.
+ * Ensure that you've [resolved all issues](/microsoftteams/platform/concepts/deploy-and-publish/appsource/resolve-submission-issues) reported to you by the concierge service [teamsubm@microsoft.com](mailto:teamsubm@microsoft.com) before sharing your app package for further testing. It helps reduce the number of iterations required to validate your app and so, the time taken to approve your app.
- * Avoid changing app functionality during the validation process. This might lead to discovery of new issues and increase the time it takes to approve your app.
+ * Avoid changing app functionality during the validation process that might lead to discovery of new issues and increase the time it takes to approve your app.
## Additional tips for rapid approval to publish your app linked to a SaaS offer * **During design phase**
- Review the [store validation guidelines specific to apps published with linked SaaS offers](~/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines.md#apps-linked-to-saas-offer) early in your app's life cycle (design phase) to ensure that you build your app in alignment with the store requirements and [Microsoft Commercial Marketplace policies applicable to Teams apps linked to SaaS offers](/legal/marketplace/certification-policies#11405-teams-app-linked-to-software-as-a-service-saas-offers). If you build your app in line with these guidelines, this will prevent any rework due to non-adherence to store policies.
+ Review the [store validation guidelines specific to apps published with linked SaaS offers](~/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines.md#apps-linked-to-saas-offer) early in your app's life cycle (design phase) to ensure that you build your app in alignment with the store requirements and [Microsoft Commercial Marketplace policies applicable to Teams apps linked to SaaS offers](/legal/marketplace/certification-policies#11405-teams-app-linked-to-software-as-a-service-saas-offers). If you build your app in line with these guidelines, then it will prevent any rework due to non-adherence to store policies.
* **Prior to app submission**
When you feel your app is production ready, you can begin the process of getting
1. Your app is linked to a live (already published) SaaS offer on AppSource with at least one plan with pricing information.
- 1. You have correctly mentioned the `subscriptionOffer` details in your app manifest in the format `publisherId.offerId`.
+ 1. You've correctly mentioned the `subscriptionOffer` details in your app manifest in the format `publisherId.offerId`.
1. You must ensure your linked SaaS offer is designed to support licenses assigned on a named [per user model](/azure/marketplace/create-new-saas-offer-plans). Linked SaaS offers that support other pricing models such as flat rate are currently not accepted for publishing to the Teams store.
platform Plan To Monetize https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/design/plan-to-monetize.md
# Plan to monetize your app
-One of the most important objectives for building a Teams app is to solve the problems of your users in a collaborative zone. An app that achieves this goal is fit for being a utility for global consumption. Microsoft Teams app store provides features that let you to monetize your apps and gain customers by engaging with your users.
+One of the most important objectives for building a Teams app is to solve the problems of your users in a collaborative zone. An app that achieves this goal is fit for being a utility for global consumption. Microsoft Teams app store provides features that let you monetize your apps and gain customers by engaging with your users.
Consider publishing your app on Teams store to offer your app the best platform for global visibility. Factors, such as type of app, nature of service, and target customers influence your choice for the best monetization option.
platform Planning Checklist https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/design/planning-checklist.md
Here's a checklist of questions to consider when you plan your app. Use it as a
| # | Consider... | | | | | 1 | What happens when a user first configures your tab in a channel? |
-| 2 | If you are sharing cards with a message extension, does it make sense to add a small link to a learn more page to help introduce users to what else your app can do? |
+| 2 | If you're sharing cards with a message extension, does it make sense to add a small link to a learn more page to help introduce users to what else your app can do? |
| 3 | Do you expect most people to already have some context of what your app is for, or to have already used your services in another context? | | 4 | Are they coming to your app with no prior knowledge? |
Here's a checklist of questions to consider when you plan your app. Use it as a
| # | Consider... | | | | | 1 | Are there one-on-one interactions with the app required for privacy or other reasons? For example, checking leave balance or other private information. |
-| 2 | Is there going to be collaboration among users who might not have any common Teams? For example, finding upcoming organization wide events in a company. |
-| 3 | Are there any personalized notifications or messages that needs to be sent to a user throughout the Teams app experience? |
+| 2 | Are they're going to be collaboration among users who might not have any common Teams? For example, finding upcoming organization wide events in a company. |
+| 3 | Are there any personalized notifications or messages that need to be sent to a user throughout the Teams app experience? |
</details> <br>
Here's a checklist of questions to consider when you plan your app. Use it as a
| # | Consider... | | | | | 1 | Is the information presented by the app, either in tab or through a bot, relevant and useful for most of the members in a Team? For example, Scrum app. |
-| 2 | Could the appΓÇÖs context change depending on the team in which it is added to? For example, PlannerΓÇÖs tasks are different in different teams. |
+| 2 | Could the appΓÇÖs context change depending on the team in which it's added to? For example, PlannerΓÇÖs tasks are different in different teams. |
| 3 | Is it possible that all members in a persona who need to collaborate are a part of a single team? For example, agents working on a ticket. | </details>
platform Browser Device Permissions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/browser-device-permissions.md
# Device permissions for the browser
-Teams app that require device permissions, such as camera or microphone access, now require users to manually grant permission at a per app level in the web browser. Previously, the browser handled how to grant access permissions, but now these permissions are handled in Microsoft Teams. This has implications on how you design your application and if they require these permissions in the browser.
+Teams app that requires device permissions, such as camera or microphone access, now require users to manually grant permission at a per app level in the web browser. Previously, the browser handled how to grant access permissions, but now these permissions are handled in Microsoft Teams. This has implications on how you design your application and if they require these permissions in the browser.
## Enable app's device permissions
A user will need to enable these permissions in the browser for these permission
## Recommendation
-Teams app that require device permissions in the browser must show instructions to users on where to find and enable these permissions in the Teams UI. Depending on the context in which your application is running, you need to ensure that your instructions are pointing the user to correct location to access these permissions, as they differ for personal apps, task module dialogs, tabs in chats, and channels or meetings.
+Teams app that requires device permissions in the browser must show instructions to users on where to find and enable these permissions in the Teams UI. Depending on the context in which your application is running, you need to ensure that your instructions are pointing the user to correct location to access these permissions. The permissions differ for personal apps, task module dialogs, tabs in chats, and channels or meetings.
</br> <img src="../../assets/images/tabs/enable-access.png" alt="Enable camera access" width="800"/>
platform Device Capabilities Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/device-capabilities-overview.md
Title: Device capabilities - Overview
-description: Overview of native device capabilities, such as camera, image, media, microphone, mic, qr code, and more.
+description: Learn how to integrate native device capabilities, such as camera, image, media, microphone, QR code, and more with Microsoft Teams app.
-keywords: camera image media microphone mic qr code qrcode bar code barcode scan scanner location map capabilities native device permissions
ms.localizationpriority: medium
platform Location Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/location-capability.md
The main advantage of integrating location capabilities in your Teams apps is th
Following examples show how the integration of location capabilities is used in different scenarios: * In a factory, the supervisor can track the attendance of workers by asking them to take a selfie in the vicinity of the factory and share it through the specified app. The location data also gets captured and sent along with the image.
-* The location capabilities enables the maintenance staff of a service provider to share authentic health data of cellular towers with the management. The management can compare any mismatch between captured location information and the data submitted by maintenance staff.
+* The location capabilities enable the maintenance staff of a service provider to share authentic health data of cellular towers with the management. The management can compare any mismatch between captured location information and the data submitted by maintenance staff.
To integrate location capabilities, you must update the app manifest file and call the APIs. For effective integration, you must have a good understanding of [code snippets](#code-snippets) for calling the location APIs.
-It is important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
+It's important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
> [!NOTE]
-> Currently, Microsoft Teams support for location capabilities is available for mobile clients only.
+> Currently, Microsoft Teams supports for location capabilities is available for mobile clients only.
## Update manifest
You must ensure to handle these errors appropriately in your Teams app. The foll
|Error code | Error name | Condition| | | | -- |
-| **100** | NOT_SUPPORTED_ON_PLATFORM | API is not supported on the current platform.|
+| **100** | NOT_SUPPORTED_ON_PLATFORM | API isn't supported on the current platform.|
| **500** | INTERNAL_ERROR | Internal error is encountered while performing the required operation.|
-| **1000** | PERMISSION_DENIED |User denied location permissions to the Teams App or the web-app .|
+| **1000** | PERMISSION_DENIED |User denied location permissions to the Teams App or the web-app.|
| **4000** | INVALID_ARGUMENTS | API is invoked with wrong or insufficient mandatory arguments.| | **8000** | USER_ABORT |User cancelled the operation.|
-| **9000** | OLD_PLATFORM | User is on old platform build where implementation of the API is not present. Upgrading the build should resolve the issue.|
+| **9000** | OLD_PLATFORM | User is on old platform build where implementation of the API isn't present. Upgrading the build should resolve the issue.|
### Code sample
platform Mobile Camera Image Permissions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/mobile-camera-image-permissions.md
You can integrate native device capabilities, such as the **camera** and **micro
## Advantage of integrating media capabilities The main advantage of integrating device capabilities in your Teams apps is it leverages native Teams controls to provide a rich and immersive experience to your users.
-To integrate media capabilities you must update the app manifest file and call the media capability APIs.
+To integrate media capabilities, you must update the app manifest file and call the media capability APIs.
For effective integration, you must have a good understanding of [code snippets](#code-snippets) for calling the respective APIs, which allow you to use native media capabilities.
-It is important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
+It's important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
> [!NOTE] >
-> * Currently, Microsoft Teams support for media capabilities is available for mobile clients only.
+> * Currently, Microsoft Teams supports for media capabilities is available for mobile clients only.
> * Currently, Teams does not support device permissions for multi-window apps, tabs, and the meeting side panel. > * Device permissions are different in the browser. For more information, see [browser device permissions](browser-device-permissions.md).
The [selectMedia](/javascript/api/@microsoft/teams-js/microsoftteams.media.media
> [!IMPORTANT] >
-> * The `selectMedia`, `getMedia`, and `viewImages` APIs can be invoked from multiple Teams surfaces, such as task modules, tabs, and personal apps. For more details, see [Entry points for Teams apps](../extensibility-points.md).
+> * The `selectMedia`, `getMedia`, and `viewImages` APIs can be invoked from multiple Teams surfaces, such as task modules, tabs, and personal apps. For more information, see [Entry points for Teams apps](../extensibility-points.md).
> * `selectMedia` API has been extended to support microphone and audio properties. You must use the following set of APIs to enable your device's media capabilities:
You must ensure to handle these errors appropriately in your Teams app. The foll
|Error code | Error name | Condition| | | | -- |
-| **100** | NOT_SUPPORTED_ON_PLATFORM | API is not supported on the current platform.|
-| **404** | FILE_NOT_FOUND | File specified is not found in the given location.|
+| **100** | NOT_SUPPORTED_ON_PLATFORM | API isn't supported on the current platform.|
+| **404** | FILE_NOT_FOUND | File specified isn't found in the given location.|
| **500** | INTERNAL_ERROR | Internal error is encountered while performing the required operation.| | **1000** | PERMISSION_DENIED |Permission is denied by the user.|
-| **3000** | NO_HW_SUPPORT | Underlying hardware does not support the capability.|
+| **3000** | NO_HW_SUPPORT | Underlying hardware doesn't support the capability.|
| **4000**| INVALID_ARGUMENTS | One or more arguments are invalid.| | **8000** | USER_ABORT |User aborts the operation.|
-| **9000**| OLD_PLATFORM | Platform code is outdated and does not implement this API.|
+| **9000**| OLD_PLATFORM | Platform code is outdated and doesn't implement this API.|
| **10000**| SIZE_EXCEEDED | Return value is too big and has exceeded the platform size boundaries.| ## Code snippets
platform Native Device Permissions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/native-device-permissions.md
Title: Request device permissions for your Microsoft Teams app
-keywords: teams apps capabilities permissions device native scan qr barcode image audio video
-description: How to update your app manifest in order to request access to native features that usually require user consent, such as scan qr, barcode, image, audio, video capabilities
+description: Learn how to update your app manifest and request access to native features involving user consent, location, QR code and barcode, image, audio, and video capabilities
ms.localizationpriority: medium
Leverage appropriate HTML5 or Teams API, to display a prompt for getting consent
For example:
-* To prompt the user to access their location you must call `getCurrentPosition()`:
+* To prompt the user to access their location, you must call `getCurrentPosition()`:
```JavaScript navigator.geolocation.getCurrentPosition (function (position) { /*... */ }); ```
-* To prompt the user to access their camera on desktop or web you must call `getUserMedia()`:
+* To prompt the user to access their camera on desktop or web, you must call `getUserMedia()`:
```JavaScript navigator.mediaDevices.getUserMedia({ audio: true, video: true });
For example:
## Permission behavior across login sessions
-Device permissions are stored for every login session. It means that if you sign in to another instance of Teams, for example, on another computer, your device permissions from your previous sessions are not available. Therefore, you must re-consent to device permissions for the new session. It also means, if you sign out of Teams or switch tenants in Teams, your device permissions are deleted from the previous login session.
+Device permissions are stored for every login session. It means that if you sign in to another instance of Teams, for example, on another computer, your device permissions from your previous sessions aren't available. Therefore, you must re-consent to device permissions for the new session. It also means, if you sign out of Teams or switch tenants in Teams, your device permissions are deleted from the previous login session.
> [!NOTE] > When you consent to the native device permissions, it is valid only for your _current_ login session.
platform People Picker Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/people-picker-capability.md
The `selectPeople` API enables you to add Teams People Picker input control to t
* Allows the user to search and select one or more people from the list. * Returns the ID, name, and email address of selected users to the web app.
-In case of a personal app, the control searches for name or email ID across the organization within Teams. If the app is added to a chat or channel, then the search context is configured based on the scenario. The search is restricted within the members of that chat or channel.
+In a personal app, the control searches for name or email ID across the organization within Teams. If the app is added to a chat or channel, then the search context is configured based on the scenario. The search is restricted within the members of that chat or channel.
The `selectPeople` API comes with the following input configurations: |Configuration parameter|Type|Description| Default value| |--||--|| |`title`|String| It's an optional parameter and sets the title for the People Picker control.|`selectPeople`|
-|`setSelected`|String| It's an optional parameter. You must pass Microsoft Azure Active Directory (Azure AD) IDs of the people to be preselected. This parameter preselects people while launching the People Picker input control. In case of a single selection, only the first valid user is pre-populated ignoring the rest.|**Null**|
+|`setSelected`|String| It's an optional parameter. You must pass Microsoft Azure Active Directory (Azure AD) IDs of the people to be preselected. This parameter preselects people while launching the People Picker input control. In a single selection, only the first valid user is pre-populated ignoring the rest.|**Null**|
|`openOrgWideSearchInChatOrChannel`|Boolean| It's an optional parameter and when set to true, it launches the People Picker in organization wide scope even if the app is added to a chat or channel.|**False**| |`singleSelect`|Boolean|It's an optional parameter and when set to true, it launches the People Picker and restricts the selection to only one user.|**False**|
The People Picker control on web or desktop is launched in a modal window on top
The following code snippet displays use of the `selectPeople` API people from a list: ```javascript
- microsoftTeams.people.selectPeople((error: microsoftTeams.SdkError, people: microsoftTeams.people.PeoplePickerResult[]) =>
+microsoftTeams.people.selectPeople((error: microsoftTeams.SdkError, people: microsoftTeams.people.PeoplePickerResult[]) =>
{ if (error) {
The following code snippet displays use of the `selectPeople` API people from a
{ output(" People length: " + people.length + " " + JSON.stringify(people)); }
- });
+ },{ setSelected: ["aad id"], openOrgWideSearchInChatOrChannel: true, singleSelect: false});
``` ## Error handling
The following table lists the error codes and their descriptions:
|Error code | Error name | Description| | | | |
-| **100** | NOT_SUPPORTED_ON_PLATFORM | API is not supported on the current platform.|
+| **100** | NOT_SUPPORTED_ON_PLATFORM | API isn't supported on the current platform.|
| **500** | INTERNAL_ERROR | Internal error encountered while launching People Picker.| | **4000** | INVALID_ARGUMENTS | API is invoked with wrong or insufficient mandatory arguments.| | **8000** | USER_ABORT |User cancelled the operation.|
platform Qr Barcode Scanner Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/qr-barcode-scanner-capability.md
Following are the advantages of integration of QR or barcode scanner capabilitie
* With this feature, the user only needs to align a QR or barcode within a frame at the center of the scanner UI and the code gets scanned automatically. The stored data is shared back with the calling web app. This avoids the inconvenience and human errors of entering lengthy product codes or other relevant information manually. To integrate QR or barcode scanner capability, you must update the app manifest file and call the [scanBarCode](/javascript/api/@microsoft/teams-js/microsoftteams.media?view=msteams-client-js-latest&preserve-view=true#scanBarCode__error__SdkError__decodedText__string_____void__BarCodeConfig_) API. For effective integration, you must have a good understanding of [code snippet](#code-snippet) for calling the [scanBarCode](/javascript/api/@microsoft/teams-js/microsoftteams.media?view=msteams-client-js-latest&preserve-view=true#scanBarCode__error__SdkError__decodedText__string_____void__BarCodeConfig_) API, which allows you to use native QR or barcode scanner capability. The API gives an error for an unsupported barcode standard.
-It is important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
+It's important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
> [!NOTE] > Currently, Microsoft Teams support for QR or barcode scanner capability is only available for mobile clients.
You must ensure to handle these errors appropriately in your Teams app. The foll
|Error code | Error name | Condition| | | | -- |
-| **100** | NOT_SUPPORTED_ON_PLATFORM | API is not supported on the current platform.|
+| **100** | NOT_SUPPORTED_ON_PLATFORM | API isn't supported on the current platform.|
| **500** | INTERNAL_ERROR | Internal error is encountered while performing the required operation.| | **1000** | PERMISSION_DENIED |Permission is denied by the user.|
-| **3000** | NO_HW_SUPPORT | Underlying hardware does not support the capability.|
+| **3000** | NO_HW_SUPPORT | Underlying hardware doesn't support the capability.|
| **4000** | INVALID_ARGUMENTS | One or more arguments are invalid.| | **8000** | USER_ABORT |User aborts the operation.|
-| **8001** | OPERATION_TIMED_OUT | Could not detect the barcode in the given time interval.|
-| **9000** | OLD_PLATFORM | Platform code is outdated and does not implement this API.|
+| **8001** | OPERATION_TIMED_OUT | Couldn't detect the barcode in the given time interval.|
+| **9000** | OLD_PLATFORM | Platform code is outdated and doesn't implement this API.|
## Code snippet
platform Feedback https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/feedback.md
Suggest a feature or vote up existing feature requests.
| **Community channel** | **Contact** | |:-|:|
-| **Features suggestions** | Post feature suggestions on :::image type="icon" source="assets/icons/Teams-icon.png" border="false"::: [Microsoft Teams feedback portal on UserVoice](https://microsoftteams.uservoice.com/forums/555103-public-preview/category/182881-developer-platform). |
+| **Features suggestions** | Post feature suggestions on :::image type="icon" source="assets/icons/Teams-icon.png" border="false"::: [Microsoft Teams feedback portal](https://feedbackportal.microsoft.com/feedback/forum/ad198462-1c1c-ec11-b6e7-0022481f8472). |
| **General questions** | Send general questions about the Microsoft Teams developer platform to [Microsoft Teams Community Help](mailto:microsoftteamsdev@microsoft.com). We encourage posting questions on the channels mentioned here and using email only if no other mode of communication is applicable. | ## See also
platform Get Started Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/get-started/get-started-overview.md
Title: Get started - Overview
-description: Overview to Get started for Microsoft Teams Developer Documentation
+description: With this learning path, get started for Microsoft Teams developer documentation which introduces you to common tools, fundamental concepts, and advanced features.
ms.localizationpriority: high
-keywords: Microsoft Teams developer samples
# Get started
Here's an idea of what you'll learn:
- Get experience with the Toolkit and SDKs. - Configure and build different types of Teams apps.
-Let's take a quick glance at the build environment options you can choose from, and the road-map to building and deploying a Teams app.
+Let's take a quick glance at the build environment options you can choose from, and the road-map to build and deploy a Teams app.
:::image type="content" source="../assets/images/get-started/gs-build-options.png" alt-text="Illustration showing basic steps to build and deploy a Teams app":::
Depending on the capabilities you want for your app, choose an appropriate devel
If you are already familiar with Yeoman workflow, you may prefer using [YoTeams Yeoman Generator](https://github.com/pnp/generator-teams/blob/master/docs/docs/tutorials/build-your-first-microsoft-teams-app.md) to build your apps.
-> [!NOTE]
+> [!WARNING]
> If you have been using App Studio, we recommend that you'd try the Developer Portal to configure, distribute, and manage your Teams apps. <br> App studio will be deprecated by June 30, 2022. ## Build your first Teams app
platform Glossary https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/get-started/glossary.md
Title: Microsoft Teams Developer Documentation - Glossary
-description: Glossary for Microsoft Teams Developer Documentation
+ Title: Microsoft Teams developer documentation - Glossary
+description: Learn about the terms used in Microsoft Teams developer documentation
ms.localizationpriority: high
-keywords: Microsoft Teams developer definition
# Glossary
-Common terms and definitions used in Teams Developer Documentation.
+Common terms and definitions used in Teams developer documentation.
## A
platform Import External Messages To Teams https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/import-messages/import-external-messages-to-teams.md
At a high level, the import process consists of the following:
## Step 1: Create a team
-Since you are migrating existing data, maintaining the original message timestamps, and preventing messaging activity during the migration process are key to recreating the user's existing message flow in Teams. This is achieved as follows:
+Since you're migrating existing data, maintaining the original message timestamps, and preventing messaging activity during the migration process are key to recreating the user's existing message flow in Teams. This is achieved as follows:
> [Create a new team](/graph/api/team-post?view=graph-rest-beta&tabs=http&preserve-view=true) with a back-in-time timestamp using the team resource `createdDateTime` property. Place the new team in `migration mode`, a special state that restricts users from most activities within the team until the migration process is complete. Include the `teamCreationMode` instance attribute with the `migration` value in the POST request to explicitly identify the new team as being created for migration.
POST https://graph.microsoft.com/v1.0/teams/team-id/completeMigration
HTTP/1.1 204 NoContent ```
-Action called on a `team` or `channel` that is not in `migrationMode`.
+Action called on a `team` or `channel` that isn't in `migrationMode`.
## Step five: Add team members
HTTP/1.1 204 No Content
<!-- markdownlint-disable MD001 --> <!-- markdownlint-disable MD026 -->
-* After the `completeMigration` request is made, you cannot import further messages into the team.
+* After the `completeMigration` request is made, you can't import further messages into the team.
* You can only add team members to the new team after the `completeMigration` request has returned a successful response.
platform Graph Proactive Bots And Messages https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/proactive-bots-and-messages/graph-proactive-bots-and-messages.md
Proactive messages are initiated by bots to start conversations with a user. The
## Proactive app installation in Teams
-Before your bot can proactively message a user, it must be installed either as a personal app or in a team where the user is a member. At times, you need to proactively message users that have not installed or previously interacted with your app. For example, the need to message important information to everyone in your organization. For such scenarios, you can use the Microsoft Graph API to proactively install your bot for your users.
+Before your bot can proactively message a user, it must be installed either as a personal app or in a team where the user is a member. At times, you need to proactively message users that haven't installed or previously interacted with your app. For example, If you need to message important information to everyone in your organization, then you can use the Microsoft Graph API to proactively install your bot for your users.
## Permissions
GET https://graph.microsoft.com/v1.0/users/{user-id}/teamwork/installedApps?$exp
The request returns:
-* An empty array if the app is not installed.
+* An empty array if the app isn't installed.
* An array with a single [teamsAppInstallation](/graph/api/resources/teamsappinstallation?view=graph-rest-v1.0&preserve-view=true) object if the app is installed. ### Install your app
When your app is installed for the user, the bot receives a `conversationUpdate`
**Microsoft Graph page reference:** [Get chat](/graph/api/chat-get?view=graph-rest-v1.0&tabs=http&preserve-view=true)
-1. You must have your app's `{teamsAppInstallationId}`. If you do not have it, use the following:
+1. You must have your app's `{teamsAppInstallationId}`. If you don't have it, use the following:
**HTTP GET** request:
When your app is installed for the user, the bot receives a `conversationUpdate`
1. Make the following request to fetch the `chatId`:
- **HTTP GET** request (permission ΓÇö `TeamsAppInstallation.ReadWriteSelfForUser.All`):
+ **HTTP GET** request (permissionΓÇö`TeamsAppInstallation.ReadWriteSelfForUser.All`):
```http GET https://graph.microsoft.com/v1.0/users/{user-id}/teamwork/installedApps/{teamsAppInstallationId}/chat
When your app is installed for the user, the bot receives a `conversationUpdate`
You can also retrieve the `chatId` with the following request but it requires the broader `Chat.Read.All` permission:
- **HTTP GET** request (permission ΓÇö `Chat.Read.All`):
+ **HTTP GET** request (permissionΓÇö`Chat.Read.All`):
```http GET https://graph.microsoft.com/v1.0/users/{user-id}/chats?$filter=installedApps/any(a:a/teamsApp/id eq '{teamsAppId}')
platform Test Resource Specific Consent https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/test-resource-specific-consent.md
To check whether the RSC permissions are being honored by the API request payloa
3. Select the **Collections** tab. 4. Select the chevron **>** next to the **Test RSC** to expand the details view and see the API requests.
-Execute the entire permissions collection for each API call. The permissions that you specified in your app manifest must succeed, while those not specified must fail with an HTTP 403 status code. Check all of the response status codes to confirm that the behavior of the RSC permissions in your app meet expectations.
+Execute the entire permissions collection for each API call. The permissions that you specified in your app manifest must succeed, while those not specified must fail with an HTTP 403 status code. Check all of the response status codes to confirm that the behavior of the RSC permissions in your app meets expectations.
> [!NOTE] > To test specific DELETE and READ API calls, add those instance scenarios to the JSON file.
platform Extend M365 Teams Personal Tab https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-teams-personal-tab.md
Upon first run of local debug to Office or Outlook, you'll be prompted to sign i
Provide feedback and report any issues with the Teams Toolkit debugging experience at [Microsoft Teams Framework (TeamsFx)](https://github.com/OfficeDev/TeamsFx/issues).
-## Next step
-
-Publish your app to be discoverable in Teams, Outlook, and Office:
-
-> [!div class="nextstepaction"]
-> [Publish Teams apps for Outlook and Office](publish.md)
- ## Code sample | **Sample Name** | **Description** | **Node.js** |
Publish your app to be discoverable in Teams, Outlook, and Office:
| Todo List | Editable todo list with SSO built with React and Azure Functions. Works only in Teams (use this sample app to try the upgrade process described in this tutorial). | [View](https://github.com/OfficeDev/TeamsFx-Samples/tree/ga/todo-list-with-Azure-backend) | | Todo List (Microsoft 365) | Editable todo list with SSO built with React and Azure Functions. Works in Teams, Outlook, Office. | [View](https://github.com/OfficeDev/TeamsFx-Samples/tree/ga/todo-list-with-Azure-backend-M365)| | Image Editor (Microsoft 365) | Create, edit, open, and save images using Microsoft Graph API. Works in Teams, Outlook, Office. | [View](https://github.com/OfficeDev/m365-extensibility-image-editor) |+
+## Next step
+
+Publish your app to be discoverable in Teams, Outlook, and Office:
+
+> [!div class="nextstepaction"]
+> [Publish Teams apps for Outlook and Office](publish.md)
platform Define Action Command https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/action-commands/define-action-command.md
The following image displays the locations from where action command is invoked:
In addition to selecting where your command can be invoked from, you must also select how to populate the form in the task module for your users. You have the following three options for creating the form that is rendered inside the task module:
-* **Static list of parameters**: This is the simplest method. You can define a list of parameters in your app manifest the Teams client renders, but cannot control the formatting in this case.
+* **Static list of parameters**: This is the simplest method. You can define a list of parameters in your app manifest the Teams client renders, but can't control the formatting in this case.
* **Adaptive Card**: You can select to use an Adaptive Card, which provides greater control over the UI, but still limits you on the available controls and formatting options. * **Embedded web view**: You can select to embed a custom web view in the task module to have a complete control over the UI and controls.
If you select to create the task module with a static list of parameters and whe
## Select how the final message is sent
-In most cases, the action command results in a card inserted into the compose message box. The user can send it into the channel or chat. In this case, the message comes from the user, and the bot cannot edit or update the card further.
+In most cases, the action command results in a card inserted into the compose message box. The user can send it into the channel or chat. In this case, the message comes from the user, and the bot can't edit or update the card further.
If the message extension is invoked from the compose box or directly from a message, your web service can insert the final response directly into the channel or chat. In this case, the Adaptive Card comes from the bot, the bot updates it, and replies to the conversation thread if needed. You must add the `bot` object to the app manifest using the same ID and defining the appropriate scopes.
To add the action command to the app manifest, you must add a new `composeExtens
You can create an action command using **App Studio** or **Developer Portal**.
-> [!NOTE]
+> [!WARNING]
> If you have been using App Studio, we recommend that you'd try the Developer Portal [Developer Portal](https://dev.teams.microsoft.com/) to configure, distribute, and manage your Teams apps. App Studio will be deprecated by June 30, 2022. # [App Studio](#tab/AS)
You can create an action command using **App Studio** or **Developer Portal**.
**To create an action command** 1. Open **App Studio** from the Microsoft Teams client and select the **Manifest editor** tab.
-1. If you already created your app package in **App Studio**, select it from the list. If you have not created an app package, import an existing one.
+1. If you already created your app package in **App Studio**, select it from the list. If you haven't created an app package, import an existing one.
1. After importing an app package, select **Message extensions** under **Capabilities**. You get a pop-up window to set up the message extension. 1. Select **Set up** in the window to include the message extension in your app experience. The following image displays the message extension set up window:
To manually add your action-based message extension command to your app manifest
| `fetchTask` | This property is set to `true` for an adaptive card or embedded web view for your task module, and`false` for a static list of parameters or when loading the web view by a `taskInfo`. | No | 1.4 | | `context` | This property is an optional array of values that defines where the message extension is invoked from. The possible values are `message`, `compose`, or `commandBox`. The default value is `["compose", "commandBox"]`. | No | 1.5 |
-If you are using a static list of parameters, you must also add the following parameters:
+If you're using a static list of parameters, you must also add the following parameters:
| Property name | Purpose | Is required? | Minimum manifest version | |||||
If you are using a static list of parameters, you must also add the following pa
| `parameter.title` | This property is a short user-friendly parameter title or label. | Yes | 1.0 | | `parameter.inputType` | This property is set to the type of input required. The possible values include `text`, `textarea`, `number`, `date`, `time`, `toggle`. The default value is set to `text`. | No | 1.4 |
-If you are using an embedded web view, you can optionally add the `taskInfo` object to fetch your web view without calling your bot directly. If you select this option, the behavior is similar to that of using a static list of parameters. In that the first interaction with your bot is [responding to the task module submit action](~/messaging-extensions/how-to/action-commands/respond-to-task-module-submit.md). If you are using a `taskInfo` object, you must set the `fetchTask` parameter to `false`.
+If you're using an embedded web view, you can optionally add the `taskInfo` object to fetch your web view without calling your bot directly. If you select this option, the behavior is similar to that of using a static list of parameters. In that the first interaction with your bot is [responding to the task module submit action](~/messaging-extensions/how-to/action-commands/respond-to-task-module-submit.md). If you're using a `taskInfo` object, you must set the `fetchTask` parameter to `false`.
| Property name | Purpose | Is required? | Minimum manifest version | |||||
If you are using an embedded web view, you can optionally add the `taskInfo` obj
#### App manifest example
-The following section is an example of a `composeExtensions` object defining two action commands. It is not an example of the complete manifest. For the complete app manifest schema, see [app manifest schema](~/resources/schem):
+The following section is an example of a `composeExtensions` object defining two action commands. It isn't an example of the complete manifest. For the complete app manifest schema, see [app manifest schema](~/resources/schem):
```json ...
Follow the [step-by-step guide](../../../sbs-meetingextension-action.yml) to bui
## Next step
-If you are using either an Adaptive Card or an embedded web view without a `taskInfo` object, the next step is to:
+If you're using either an Adaptive Card or an embedded web view without a `taskInfo` object, the next step is to:
> [!div class="nextstepaction"] > [Create and respond with a task module](~/messaging-extensions/how-to/action-commands/create-task-module.md)
-If you are using the parameters or an embedded web view with a `taskInfo` object, the next step is to:
+If you're using the parameters or an embedded web view with a `taskInfo` object, the next step is to:
> [!div class="nextstepaction"] > [Respond to task module submit](~/messaging-extensions/how-to/action-commands/respond-to-task-module-submit.md)
platform Respond To Task Module Submit https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/action-commands/respond-to-task-module-submit.md
After a user submits the task module, your web service receives a `composeExtens
You have the following options to respond:
-* No response: Use the submit action to trigger a process in an external system and not provide any feedback to the user. It is useful for long-running processes and to provide feedback alternately. For example, you can give feedback with a [proactive message](~/bots/how-to/conversations/send-proactive-messages.md).
+* No response: Use the submit action to trigger a process in an external system and not provide any feedback to the user. It's useful for long-running processes and to provide feedback alternately. For example, you can give feedback with a [proactive message](~/bots/how-to/conversations/send-proactive-messages.md).
* [Another task module](#respond-with-another-task-module): You can respond with an additional task module as part of a multi-step interaction. * [Card response](#respond-with-a-card-inserted-into-the-compose-message-area): You can respond with a card that the user can interact with or insert into a message. * [Adaptive Card from bot](#bot-response-with-adaptive-card): Insert an Adaptive Card directly into the conversation. * [Request the user to authenticate](~/messaging-extensions/how-to/add-authentication.md). * [Request the user to provide additional configuration](~/get-started/first-message-extension.md).
-For authentication or configuration, after the user completes the process, the original invoke is resent to your web service. The following table shows which types of responses are available based on the invoke location `commandContext` of the message extension:
+For authentication or configuration, after the user completes the process, the original invoke is resent to your web service. The following table shows which types of responses are available, based on the invoke location `commandContext` of the message extension:
|Response Type | Compose | Command bar | Message | |--|:-:|:-:|::|
To configure the poll:
1. The user selects the message extension to invoke the task module. 1. The user configures the poll with the task module. 1. After submitting the task module, the app uses the information provided to build the poll as an Adaptive Card and sends it as a `botMessagePreview` response to the client.
-1. The user can then preview the Adaptive Card message before the bot inserts it into the channel. If the app is not a member of the channel, select `Send` to add it.
+1. The user can then preview the Adaptive Card message before the bot inserts it into the channel. If the app isn't a member of the channel, select `Send` to add it.
> [!NOTE] > > * The users can also select to `Edit` the message, which returns them to the original task module. > * Interaction with the Adaptive Card changes the message before sending it. >
-1. After the user selects `Send` the bot posts the message to the channel.
+1. After the user selects `Send`, the bot posts the message to the channel.
## Respond to initial submit action
-Your task module must respond to the initial `composeExtension/submitAction` message with a preview of the card that the bot sends to the channel. The user can verify the card before sending, and try to install your bot in the conversation if the bot is not already installed.
+Your task module must respond to the initial `composeExtension/submitAction` message with a preview of the card that the bot sends to the channel. The user can verify the card before sending, and try to install your bot in the conversation if the bot is already installed.
# [C#/.NET](#tab/dotnet)
platform Enable SSO Auth Me https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/enable-SSO-auth-me.md
To enable SSO:
> [!NOTE] > We do not support other handlers SSO, except `OnTeamsMessagingExtensionQueryAsync` and `OnTeamsAppBasedLinkQueryAsync` from the TeamsMessagingExtensionsSearchAuthConfigBot.cs file.
-4. You receive the token in `OnTeamsMessagingExtensionQueryAsync` handler in the `turnContext.Activity.Value` payload or in the `OnTeamsAppBasedLinkQueryAsync`, depending on which scenario you are enabling the SSO for:
+4. You receive the token in `OnTeamsMessagingExtensionQueryAsync` handler in the `turnContext.Activity.Value` payload or in the `OnTeamsAppBasedLinkQueryAsync`, depending on which scenario you're enabling the SSO for:
```json JObject valueObject=JObject.FromObject(turnContext.Activity.Value);
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 search command is invoked from any one or both of the following locations:
* Compose message area: The buttons at the bottom of the compose message area. * Command box: By @mentioning in the command box.
- When search command is invoked from the compose message area, the user sends the results to the conversation. When it is invoked from the command box, the user interacts with the resulting card, or copies it for use elsewhere.
+ When search command is invoked from the compose message area, the user sends the results to the conversation. When it's invoked from the command box, the user interacts with the resulting card, or copies it for use elsewhere.
The following image displays the invoke locations of the search command:
The prerequisite to create a search command is that you must already have create
To create a search command: 1. Open **App Studio** from the Microsoft Teams client, and select the **Manifest Editor** tab.
-1. If you already created your app package in **App Studio**, select from the list. If you have not created an app package, import an existing one.
+1. If you already created your app package in **App Studio**, select from the list. If you haven't created an app package, import an existing one.
1. After importing app package, select **Message extensions** under **Capabilities**. You get a pop-up window to set up the message extension. 1. Select **Set up** in the window to include the message extension in your app experience. The following image displays the message extension set up page:
To create a search command:
:::image type="content" source="~/assets/images/messaging-extension/use-existing-bot.png" alt-text="Use existing bot for messaging extension":::
-1. Select **Add** in the **Command section** of the message extensions page to include the commands which decides the behaviour of message extension.
+1. Select **Add** in the **Command section** of the message extensions page to include the commands, which decide the behaviour of message extension.
The following image displays command addition for message extension: :::image type="content" source="~/assets/images/messaging-extension/include-command.png" alt-text="Include command":::
platform Overview Explore https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/overview-explore.md
Title: Exploring Teams as a platform for building apps
-description: Overview of exploring Microsoft Teams platform features.
+description: Learn the overview of exploring Microsoft Teams platform features for your app on desktop and mobile.
ms.localizationpriority: high
platform Overview Solution https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/overview-solution.md
Title: Teams solution for building apps
-description: Overview of Teams solution for building apps
+description: Learn the overview of Teams solution for building apps and provide support from planning your app to distributing it.
ms.localizationpriority: high
platform Overview Story https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/overview-story.md
Title: Overview - User story for Microsoft Teams platform
-description: Overview user story of how app idea fits
+description: Learn the overview user story of how app idea fits user requirements for Microsoft Teams platform.
ms.localizationpriority: high
platform Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/overview.md
Title: Build apps for the Microsoft Teams platform
-description: Get an overview of how developers can extend Microsoft Teams features with custom apps.
+description: Learn to get an overview of how developers can extend Microsoft Teams features with custom apps.
ms.localizationpriority: high
platform Auth Flow Bot https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bot-authentication/auth-flow-bot.md
Last updated 03/01/2018
[!include[v3-to-v4-SDK-pointer](~/includes/v3-to-v4-pointer-bots.md)]
-OAuth 2.0 is an open standard for authentication and authorization used by Azure AD and many other identity providers. A basic understanding of OAuth 2.0 is a prerequisite for working with authentication in Teams; [here's a good overview](https://aaronparecki.com/oauth-2-simplified/) that's easier to follow than the [formal specification](https://oauth.net/2/). Authentication flow for tabs and bots are a little different because tabs are very similar to websites so they can use OAuth 2.0 directly, and bots are not and must do a few things differently, but the core concepts are identical.
+OAuth 2.0 is an open standard for authentication and authorization used by Azure AD and many other identity providers. A basic understanding of OAuth 2.0 is a prerequisite for working with authentication in Teams; [here's a good overview](https://aaronparecki.com/oauth-2-simplified/) that's easier to follow than the [formal specification](https://oauth.net/2/). Authentication flow for tabs and bots are different because tabs are similar to websites so they can use OAuth 2.0 directly, and bots are not and must do a few things differently, but the core concepts are identical.
See the GitHub repo [Microsoft Teams Authentication Sample](https://github.com/OfficeDev/microsoft-teams-sample-auth-node) for an example that demonstrates authentication flow for bots using Node using the [OAuth 2.0 authorization code grant type](https://oauth.net/2/grant-types/authorization-code/).
for an example that demonstrates authentication flow for bots using Node using t
* In this example, the bot stores the access token in its user data store. It asks the user to log in if it doesn't have a validated token for the selected identity provider. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/utils/AuthenticationUtils.ts#L58-L76)) 3. The bot constructs the URL to the start page of the authentication flow, and sends a card to the user with a `signin` action. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/dialogs/BaseIdentityDialog.ts#L160-L190)) * Like other application auth flows in Teams, the start page must be on a domain that's in your `validDomains` list, and on the same domain as the post-login redirect page.
- * **IMPORTANT**: The OAuth 2.0 authorization code grant flow calls for a `state` parameter in the authentication request which contains a unique session token to prevent a [cross-site request forgery attack](https://en.wikipedia.org/wiki/Cross-site_request_forgery). The example uses a randomly-generated GUID.
-4. When the user clicks on the *signin* button, Teams opens a popup window and navigates it to the start page.
+ * **IMPORTANT**: The OAuth 2.0 authorization code grant flow calls for a `state` parameter in the authentication request, that contains a unique session token to prevent a [cross-site request forgery attack](https://en.wikipedia.org/wiki/Cross-site_request_forgery). The example uses a randomly-generated GUID.
+4. When the user selects the *signin* button, Teams opens a popup window and navigates it to the start page.
5. The start page redirects the user to the identity provider's `authorize` endpoint. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/public/html/auth-start.html#L51-L56)) 6. On the provider's site, the user signs in and grants access to the bot. 7. The provider takes the user to the bot's OAuth redirect page, with an authorization code.
for an example that demonstrates authentication flow for bots using Node using t
## Samples
-For sample code showing the bot authentication process see:
+For sample code showing the bot authentication process, see:
* [Microsoft Teams bot authentication sample (Node)](https://github.com/OfficeDev/microsoft-teams-sample-auth-node) ## More details
-For detailed implementation walkthroughs for bot authentication targeting Azure Active Directory see:
+For detailed implementation walkthroughs for bot authentication targeting Azure Active Directory, see:
* [Authenticate a user in a Microsoft Teams bot](~/resources/bot-v3/bot-authentication/auth-bot-AAD.md)
platform Bots Create https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-create.md
For more information, see [Bot Framework Documentation](/azure/bot-service/?view
> * If you register your bot using Microsoft Azure, your bot code does not need to be *hosted* on Microsoft Azure. > * If you do register a bot using Azure portal, you must have a Microsoft Azure account. You can [create one for free](https://azure.microsoft.com/free/). To verify your identity when you create one, you must provide a credit card, but it won't be charged; it's always free to create and use bots with Microsoft Teams. > * You can now use App Studio to register/update app and bot information directly within Microsoft Teams. You'll only have to use the Azure portal for adding or configuring other Bot Framework channels such as Direct Line, Web Chat, Skype, and Facebook Messenger.+
+> [!WARNING]
>* If you have been using App Studio, we recommend that you'd try the Developer Portal to configure, distribute, and manage your Teams apps. App Studio will be deprecated by June 30, 2022 ## See also
platform Bots Files https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-files.md
Uploading a file to a user involves the following steps:
This desktop message contains a simple attachment object requesting user permission to upload the file:
-![Screenshot of consent card requesting user permission to upload file](../../assets/images/bots/bot-file-consent-card.png)
This mobile message contains an attachment object requesting user permission to upload the file:
platform Bots Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-overview.md
Build and connect intelligent bots to interact with Microsoft Teams users natura
> [!IMPORTANT] > Currently, bots are available in Government Community Cloud (GCC) and GCC-High but not available in Department of Defense (DOD).
-![Example of a bot assisting a user](~/assets/images/bot_example.png)
## What you need to know: Bots
platform Bots Test https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-test.md
You can also initiate a conversation with your bot by using its ID. Two methods
2. Directly reference your bot's app ID from within Microsoft Teams: * On the [Bot Dashboard](https://dev.botframework.com/bots) page for your bot, under **Details**, copy the **Microsoft App ID** for your bot.
- ![Getting the AppID for the bot](~/assets/images/bots_appid_botframework.png)
+ :::image type="content" source="../../assets/images/bots_appid_botframework.png" alt-text="Bot Dashboard":::
* From within Microsoft Teams, on the **Chat** pane, select the **Add chat** icon. For **To:**, paste your bot's Microsoft App ID.
- ![Uploading the AppID for the bot](~/assets/images/bots_uploading.png)
+ :::image type="content" source="../../assets/images/bots_uploading.png" alt-text="Uploading the AppID for the bot"border="true":::
The app ID should resolve to your bot name.
Your bot will receive the `conversationUpdate` event just like bots added to a t
Note that users can choose to block your bot from sending personal chat messages. They may toggle this by right-clicking your bot in the chat channel and choosing **Block bot conversation**. This means your bots will continue to send messages but the user won't receive those messages.
-![Blocking a bot](~/assets/images/bots/botdisable.png)
+ :::image type="content" source="../../assets/images/bots/botdisable.png" alt-text="Blocking a bot"border="true":::
## Removing a bot from a team
platform Developer Preview Intro https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/dev-preview/developer-preview-intro.md
keywords: teams preview developer features
>[!NOTE] >Features included in preview may not be complete, and may undergo changes before becoming available in the public release. They are provided for testing and exploration purposes only. They should not be used in production applications.
-Developer Preview is a public program for developers which provides early access to unreleased features in Microsoft Teams. This allows you to explore and test upcoming features for potential inclusion in your Microsoft Teams app. We also welcome [feedback](~/feedback.md) on any feature in developer preview. Developer preview is enabled per Microsoft Teams client, so you don't need to worry about affecting your entire organization.
+Developer Preview is a public program for developers, which provides early access to unreleased features in Microsoft Teams. This allows you to explore and test upcoming features for potential inclusion in your Microsoft Teams app. We also welcome [feedback](~/feedback.md) on any feature in developer preview. Developer preview is enabled per Microsoft Teams client, so you don't need to worry about affecting your entire organization.
## Developer preview app manifest
-Many features enabled in developer preview will require alterations to your app manifest JSON file. To do so, you'll need to use the [developer preview manifest schema](~/resources/schem) to make these changes, nor will you be able to use it to upload your app for testing. To upload your app you'll need to click the `More apps` icon on the app bar, then select the `Upload a custom app link`. Using this method you can only upload a zipped version of your app package.
+Many features enabled in developer preview will require alterations to your app manifest JSON file. To do so, you'll need to use the [developer preview manifest schema](~/resources/schem) to make these changes, nor will you be able to use it to upload your app for testing. To upload your app you'll need to select the `More apps` icon on the app bar, then select the `Upload a custom app link`. Using this method you can only upload a zipped version of your app package.
-You may find it useful to use App Studio to create the non-developer preview portions of your app package, then export that package and manually edit the `manifest.json` file to add the developer preview features you wish to use. Once you've added developer preview features to the `manifest.json` file you won't be able to re-import the package into App Studio.
+You may find it useful to use App Studio to create the non-developer preview portions of your app package, then export that package and manually edit the `manifest.json` file to add the developer preview features you wish to use. Once you've added developer preview features to the `manifest.json` file, you won't be able to re-import the package into App Studio.
## Enable developer preview Developer preview is enabled on a per-client basis, but the option to turn on developer preview is controlled at the organization level. To enable the option to turn on developer preview for an individual, you must ensure that they have the ability to upload custom apps. See [setting up your tenant](~/concepts/build-and-test/prepare-your-o365-tenant.md) for additional information.
-Using an app that contains developer preview features may cause clients that haven't enabled developer preview to behave unexpectedly. If you don't see an entry for developer preview the most likely reason is your organization isn't configured for app uploading.
+Using an app that contains developer preview features may cause clients that haven't enabled developer preview to behave unexpectedly. If you don't see an entry for developer preview, the most likely reason is your organization isn't configured for app uploading.
### On a desktop or web client
To enable the public developer preview on a mobile client:
## Disable developer preview
-Use the same menu item under About → Developer preview, and click on it to turn it off.
+Use the same menu item under About → Developer preview, and select it to turn it off.
## See also
platform Faqs https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/faqs.md
Each team course instance must have an owner, and the synchronization sets the f
The users have multiple sign in options from the Moodle login page.
-* To sign in exclusively using Microsoft 365 credentials enable the **Force redirect** configuration settings for the **auth_oidc plugin**. If the service is enabled, user can see the Microsoft sign in page.
+* To sign in exclusively using Microsoft 365 credentials, enable the **Force redirect** configuration settings for the **auth_oidc plugin**. If the service is enabled, user can see the Microsoft sign in page.
* To sign in manually to the Moodle portal see [Moodle](https://moodle.org/login/index.php). <br>
The following table provides the actions and dependencies to be performed and ch
| Stable version| Verify that the version of Moodle is listed as a **stable**.| For more information, see [Version support](https://docs.moodle.org/dev/Releases#Version_support).| |Permissions| Verify that the Azure application has the necessary permissions to run the synchronization.| For more information, see [Microsoft permissions](https://docs.moodle.org/311/en/Microsoft_365#Permissions).| | Full sync| Verify that **Perform a full sync each run** is enabled, and review the **Task Logs** for **Sync users with Azure AD**.| For more information, see [Enable full sync](https://docs.moodle.org/311/en/local_o365)</br>For more information, see [Check task logs](https://docs.moodle.org/311/en/local_o365#Sync_users_with_Azure_AD). |
-|Token refresh|Clean the **User sync delta token** in the local_o365 plugin.| For more information see, [Token refresh](https://docs.moodle.org/38/en/Office365).|
+|Token refresh|Clean the **User sync delta token** in the local_o365 plugin.| For more information, see, [Token refresh](https://docs.moodle.org/38/en/Office365).|
<!-- |Token refresh|Clean the **User sync delta token** in the local_o365 plugin| {moodle_url}\local_o365\acp.php?Mode=maintenance_cleandeltatoken| --> <br>
The reason for inconsistencies with users being able unable to sign using their
<summary><b>All users are unable to sign in using their Microsoft 365 credentials. What can we do to resolve this?</b></summary>
-Users who were unable to sign in at the start need to report the issue and verify that the application **Client secret** has not expired.
+Users who were unable to sign in at the start need to report the issue and verify that the application **Client secret** hasn't expired.
The following image shows the error message received when user sign using their Microsoft 365 credentials:
For more information on editing Atto toolbar, see:
<summary><b>Do the meetings scheduled through Microsoft integration appear in Outlook or in Teams calendars? What is the standard timeline for the meetings to be displayed?</b></summary>
-The meetings scheduled through the app don't appear in the schedulerΓÇÖs Outlook or Teams calendar as they are similar to Channel Meetings. All the members in the course channel can attend the meeting directly from the embedded channel link. For more information, see [Channel meetings](https://www.knowledgewave.com/blog/benefits-of-channel-meetings-in-microsoft-teams).
+The meetings scheduled through the app don't appear in the schedulerΓÇÖs Outlook or Teams calendar as they're similar to Channel Meetings. All the members in the course channel can attend the meeting directly from the embedded channel link. For more information, see [Channel meetings](https://www.knowledgewave.com/blog/benefits-of-channel-meetings-in-microsoft-teams).
However, you can access the invite and manually add participant names to the **Required** or **Optional** fields of the meeting invitation to display the remote meeting on their calendars. The standard timelines are based on the date the user specifies when the meeting is created. For more information, see [Limits and specifications for Teams](/microsoftteams/limits-specifications-teams).
platform Media Formats https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/media-formats.md
Title: Supported media formats for bots
-description: Bots on Microsoft Teams supports only the following media formats for audio and video content.
+description: Bots on Microsoft Teams support only the following media formats for audio and video content.
ms.localizationpriority: medium keywords: teams bots media formats # Supported media formats for bots
-Bots on Microsoft Teams supports only the following media formats for audio and video content:
+Bots on Microsoft Teams support only the following media formats for audio and video content:
| Format | More information | | | |
platform Moodle Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/moodle-overview.md
Moodle LMS helps users access the following apps:
* **Microsoft 365 plugins**: The Microsoft 365 plugins are designed to ensure integration between Moodle sites and Microsoft Teams. These plugins can be used independently, or in partnership to achieve distinct user requirements. For more information, see [Microsoft 365 plugins](m365-plugins/m365-plugins-overview.md).
-* **Partner apps for Moodle**: All the partner set of apps for Moodle and Teams are available in Microsoft Store. For more information see [Partner apps for Moodle](partner-apps-for-moodle.md).
+* **Partner apps for Moodle**: All the partner set of apps for Moodle and Teams are available in Microsoft Store. For more information, see [Partner apps for Moodle](partner-apps-for-moodle.md).
## User requirement scenarios The following scenarios describe the accelerated learning potential combining Microsoft's cloud services with Moodle's courses:
-* **Facilitate hybrid remote meetings**: Teams meetings and extensibility services allows faculty to present in-person and remotely with students. For students it's mandatory to have access to shared views, apps, and polls for remote meetings. The follow-up tasks provides for multi-language transcription and audio or video course recordings. Teams and Moodle work together to share roosters, activities, and tasks.
+* **Facilitate hybrid remote meetings**: Teams meetings and extensibility services allow faculty to present in-person and remotely with students. For students it's mandatory to have access to shared views, apps, and polls for remote meetings. The follow-up tasks provide for multi-language transcription and audio or video course recordings. Teams and Moodle work together to share roosters, activities, and tasks.
-* **Personalize meeting panels**: Create unique collaborative learning experiences using Teams Graph API endpoints. For other additional plans or projects, users can interview all new recruits and categorize the results using custom polls. There is facility to share quizzes directly in Teams while pushing updates to the Moodle site asynchronously.
+* **Personalize meeting panels**: Create unique collaborative learning experiences using Teams Graph API endpoints. For other additional plans or projects, users can interview all new recruits and categorize the results using custom polls. There's facility to share quizzes directly in Teams while pushing updates to the Moodle site asynchronously.
* **Automate facility**: To set up automated facilities for institutions when a new student joins, the user can add Moodle course, send an Adaptive Card to the student with relevant links and suggest key reading course materials. Teams custom connector for Moodle helps to create Moodle calendar event each time a course meeting is scheduled.
platform Partner Apps For Moodle https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/partner-apps-for-moodle.md
# Partner apps for Moodle
-Microsoft Store provides all the certified partner apps for Moodle, which validates Softwares as Service (SaaS) offerings. mConnect a partner app for Microsoft integrates Moodle courses with Teams.
+Microsoft Store provides all the certified partner apps for Moodle, which validates Software as Service (SaaS) offerings. mConnect a partner app for Microsoft integrates Moodle courses with Teams.
## Key benefits of partner apps for Moodle
The following table shows the advantages of using partner apps:
## mConnect
-The mConnect app integrates Moodle courses and activities into Teams to enhance users learning experience. Skooler, a trusted Microsoft Gold partner in education, has developed the mConnect app and provides the necessary support. mConnect allows Moodle administrators to automatically set up Teams for Moodle course and to make all features available for each course in Moodle.
+The mConnect app integrates Moodle courses and activities into Teams to enhance users learning experience.
+
+Skooler, a trusted Microsoft Gold partner in education, has developed the mConnect app and provides the necessary support.
+
+mConnect allows Moodle administrators to automatically set up Teams for Moodle course and to make all features available for each course in Moodle.
>[!NOTE] >This app is available in Microsoft Store for users who have a pre-existing account with Skooler, and requires administrator access rights to configure it directly from the Moodle site.
platform Removing Tab Margins https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/removing-tab-margins.md
You can build apps that look more native to Teams by removing the margins around
## Guidelines
-Tab margins removal affects your Teams apps that use tabs. In such cases, you can add margins around your tab designs where it is required. App designs in production has an extra padding effect, that is, margins provided by Teams and margins provided by the tab. However, the extra padding is only temporary and goes away in a few weeks, leaving only the app's provided padding.
+Tab margins removal affects your Teams apps that use tabs. In such cases, you can add margins around your tab designs where it's required. App designs in production have an extra padding effect, that is, margins provided by Teams and margins provided by the tab. However, the extra padding is only temporary and goes away in a few weeks, leaving only the app's provided padding.
## FAQ
Yes, this is fine and Teams encourages such design. It helps the app to feel nat
**Is it OK for app content, such as text, logos, and images, to touch the left and right edges of our designs?**
-No, you must provide your own padding or margins to the left and right of all app content to ensure that it doesn't touch the edges of your UI. You can also add margins at the top of your tab, if required.
+No, you must provide your own padding or margins to the left and right of all app content to ensure that it doesn't touch the edges of your UI. You can also add margins at the top of your tab, if necessary.
**What's the size of the tab margins that Teams applied previously?**
-* Left and right: 20px
-* Top: 16px
-* Bottom: 0px
+* Left and right: 20 px
+* Top: 16 px
+* Bottom: 0 px
> [!IMPORTANT] >
platform Samesite Cookie Update https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/samesite-cookie-update.md
# SameSite cookie attribute
-Cookies are text strings sent from websites and stored on a computer by the web browser. They are used for authentication and personalization. For example, cookies are used to recall stateful information, preserve user settings, record browsing activity, and display relevant ads. Cookies are always linked to a particular domain and are installed by various parties.
+Cookies are text strings sent from websites and stored on a computer by the web browser. They're used for authentication and personalization. For example, cookies are used to recall stateful information, preserve user settings, record browsing activity, and display relevant ads. Cookies are always linked to a particular domain and are installed by various parties.
## Types of cookies
The cookie types and their corresponding scopes are as follows:
|Cookie|Scope| | | |
-|First party cookie|A first party cookie is created by websites that a user visits. It is used to save data, such as shopping cart items, sign in credentials. For example, authentication cookies, and other analytics.|
+|First party cookie|A first party cookie is created by websites that a user visits. It's used to save data, such as shopping cart items, sign in credentials. For example, authentication cookies, and other analytics.|
|Second party cookie|A second party cookie is technically the same as a first party cookie. The difference is that data is shared with a second party through a data partnership agreement. For example, [Microsoft Teams analytics and reporting](/microsoftteams/teams-analytics-and-reports/teams-reporting-reference). |
-|Third party cookie|A third party cookie is installed by a domain other than the one the user explicitly visited and is mainly used for tracking. For example, **Like** buttons, ad serving, and live chats.|
+|Third party cookie|A third party cookie is installed by a domain other than the one the user explicitly visited and is used for tracking. For example, **Like** buttons, ad serving, and live chats.|
## Cookies and HTTP requests
SameSite cookie attributes are as follows:
| -- | -- | --|--| | **Lax** | Cookies are sent automatically only in a **first party** context and with HTTP GET requests. SameSite cookies are withheld on cross site sub requests, such as calls to load images or iframes. They sent when a user navigates to the URL from an external site, for example, by following a link.| **Default** |`Set-Cookie: key=value; SameSite=Lax`| | **Strict** |The browser only sends cookies for first party context requests. These are requests originating from the site that set the cookie. If the request originated from a different URL than that of the current location, none of the cookies tagged with the `Strict` attribute are sent.| Optional |`Set-Cookie: key=value; SameSite=Strict`|
-| **None** | Cookies are sent in both first party context and cross origin requests; however, the value must be explicitly set to **`None`** and all browser requests **must follow the HTTPS protocol** and include the **`Secure`** attribute which requires an encrypted connection. Cookies that do not adhere to that requirement are **rejected**. <br/>**Both attributes are required together**. If **`None`** is specified without **`Secure`** or if the HTTPS protocol is not used, then the third party cookies are rejected.| Optional, but, if set, the HTTPS protocol is required. |`Set-Cookie: key=value; SameSite=None; Secure` |
+| **None** | Cookies are sent in both first party context and cross origin requests; however, the value must be explicitly set to **`None`** and all browser requests **must follow the HTTPS protocol** and include the **`Secure`** attribute, which requires an encrypted connection. Cookies that don't adhere to that requirement are **rejected**. <br/>**Both attributes are required together**. If **`None`** is specified without **`Secure`** or if the HTTPS protocol isn't used, then the third party cookies are rejected.| Optional, but, if set, the HTTPS protocol is required. |`Set-Cookie: key=value; SameSite=None; Secure` |
## Teams implications and adjustments
You must use the web based authentication flow for the following:
* Configuration page, task module, and message extension. * Conversational bot with a task module.
-According to the updated SameSite restrictions, a browser does not add a cookie to an already authenticated web site if the link derives from an external site. You must ensure your authentication cookies are marked for cross site usage `SameSite=None; Secure` or ensure that a fallback is in place.
+According to the updated SameSite restrictions, a browser doesn't add a cookie to an already authenticated web site if the link derives from an external site. You must ensure your authentication cookies are marked for cross site usage `SameSite=None; Secure` or ensure that a fallback is in place.
## Android System WebView
-Android WebView is a Chrome system component that allows Android apps to display the web content. While the new restrictions are default, starting with Chrome 80, they are not immediately enforced on WebViews. They will be applied in the future. To prepare, Android allows native apps to set cookies directly through the [CookieManager API](https://developer.android.com/reference/android/webkit/CookieManager).
+Android WebView is a Chrome system component that allows Android apps to display the web content. While the new restrictions are default, starting with Chrome 80, they aren't immediately enforced on WebViews. They'll be applied in the future. To prepare, Android allows native apps to set cookies directly through the [CookieManager API](https://developer.android.com/reference/android/webkit/CookieManager).
> [!NOTE] >
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** &ndash; 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 will overwrite the existing one and the user will get the new functionality. If this app was submitted to the store, the new manifest will have to be re-submitted and re-validated. Then, users of this app will get the new updated manifest automatically in a few hours, after it is 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 will overwrite the existing one and the user will get the new functionality. If this app was submitted to the store, the new manifest will have to be re-submitted and re-validated. 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 will be prompted to upgrade and re-consent to the app.
This version string must follow the [semver](http://semver.org/) standard (MAJOR
**Required** &ndash; Microsoft app ID
-The unique Microsoft-generated identifier for this app. If you have registered a bot via the Microsoft Bot Framework, or your tab's web app already signs in with Microsoft, you should already have an ID and should enter it here. Otherwise, you should generate a new ID at the Microsoft Application Registration Portal ([My Applications](https://apps.dev.microsoft.com)), enter it here, and then reuse it when you [add a bot](~/bots/how-to/create-a-bot-for-teams.md).
+The unique Microsoft-generated identifier for this app. If you've registered a bot via the Microsoft Bot Framework, or your tab's web app already signs in with Microsoft, then you should already have an ID and must enter it here. Otherwise, you must generate a new ID at the Microsoft Application Registration Portal ([My Applications](https://apps.dev.microsoft.com)), enter it here, and then reuse it when you [add a bot](~/bots/how-to/create-a-bot-for-teams.md).
## packageName
Specifies information about your company. For apps submitted to AppSource (forme
Optional:
-Allows the specification of a default language, as well as pointers to additional language files. See [localization](~/concepts/build-and-test/apps-localization.md).
+Allows the specification of a default language, and pointers to additional language files. See [localization](~/concepts/build-and-test/apps-localization.md).
|Name| Maximum size | Required | Description| |||||
An array of objects specifying additional language translations.
|Name| Maximum size | Required | Description| ||||| |`languageTag`|4 characters|Γ£ö|The language tag of the strings in the provided file.|
-|`file`|4 characters|Γ£ö|A relative file path to a the .json file containing the translated strings.|
+|`file`|4 characters|Γ£ö|A relative file path to the .json file containing the translated strings.|
## name Required:
-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` should not be the same.
+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` shouldn't be the same.
|Name| Maximum size | Required | Description| |||||
Required:
Describes your app to users. For apps submitted to AppSource, these values must match the information in your AppSource entry.
-Ensure that your description accurately describes your experience and provides information to help potential customers understand what your experience does. You should also note, in the full description, if an external account is required for use. The values of `short` and `full` should not be the same. Your short description must not be repeated within the long description and must not include any other app name.
+Ensure that your description accurately describes your experience and provides information to help potential customers understand what your experience does. You should also note, in the full description, if an external account is required for use. The values of `short` and `full` shouldn't be the same. Your short description must not be repeated within the long description and must not include any other app name.
|Name| Maximum size | Required | Description| |||||
Icons used within the Teams app. The icon files must be included as part of the
**Required** &ndash; String
-A color to use in conjunction with and as a background for your outline icons.
+A color to use with and as a background for your outline icons.
The value must be a valid HTML color code starting with '#', for example `#4464ee`.
The value must be a valid HTML color code starting with '#', for example `#4464e
Optional:
-Used when your app experience has a team channel tab experience that requires extra configuration before it is added. Configurable tabs are supported only in the teams scope, and currently only one tab per app is supported.
+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 teams scope, and currently only one tab per app is supported.
The object is an array with all elements of the type `object`. This block is required only for solutions that provide a configurable channel tab solution.
The object is an array (maximum of 1 element) with all elements of type `object`
### composeExtensions.commands
-Your message extension should declare one or more commands. Each command appears in Microsoft Teams as a potential interaction from the UI-based entry point. There is a maximum of 10 commands.
+Your message extension should declare one or more commands. Each command appears in Microsoft Teams as a potential interaction from the UI-based entry point. There's a maximum of 10 commands.
Each command item is an object with the following structure:
Each command item is an object with the following structure:
Optional:
-An array of `string` which specifies which permissions the app requests, which lets end users know how the extension will perform. The following options are non-exclusive:
+An array of `string`, which specifies which permissions the app requests, which let end users know how the extension will perform. The following options are non-exclusive:
* `identity` &emsp; Requires user identity information. * `messageTeamMembers` &emsp; Requires permission to send direct messages to team members.
Specifies the native features on a user's device that your app may request acces
A list of valid domains from which the app expects to load any content. Domain listings can include wildcards, for example `*.example.com`. This matches exactly one segment of the domain; if you need to match `a.b.example.com` then use `*.*.example.com`. If your tab configuration or content UI needs to navigate to any other domain besides the one use for tab configuration, that domain must be specified here.
-It is **not** necessary to include the domains of identity providers you want to support in your app, however. For example, to authenticate using a Google ID, it's necessary to redirect to accounts.google.com, but you should not include accounts.google.com in `validDomains[]`.
+It is **not** necessary to include the domains of identity providers you want to support in your app, however. For example, to authenticate using a Google ID, it's necessary to redirect to accounts.google.com, but you shouldn't include accounts.google.com in `validDomains[]`.
> [!IMPORTANT] > Do not add domains that are outside your control, either directly or via wildcards. For example, `yourapp.onmicrosoft.com` is valid, but `*.onmicrosoft.com` is not valid.
The object is an array with all elements of the type `string`.
Optional:
-Specify your Microsoft Azure Active Directory (Azure AD) App ID and Graph information to help users seamlessly sign into your Auzre AD app.
+Specify your Microsoft Azure Active Directory (Azure AD) App ID and Graph information to help users seamlessly sign into your Azure AD app.
|Name| Type| Maximum size | Required | Description| ||||||
You can define any of the following properties:
* `longDescription`: The app's detailed description. * `smallImageUrl`: The app's outline icon. * `largeImageUrl`: The app's color icon.
-* `accentColor`: The color to use in conjunction with and as a background for your outline icons.
+* `accentColor`: The color to use with and as a background for your outline icons.
* `developerUrl`: The HTTPS URL of the developer's website. * `privacyUrl`: The HTTPS URL of the developer's privacy policy. * `termsOfUseUrl`: The HTTPS URL of the developer's terms of use.
Specify meeting extension definition. For more information, see [custom Together
## authorization
-**Optional** ΓÇö object
+**Optional** - object
Specify and consolidate authorization related information for the app.
platform Manifest Schema https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema.md
The Microsoft Teams app manifest describes how your app integrates into the Micr
For more information on the changes made in each version, see [manifest change log](https://github.com/OfficeDev/microsoft-teams-app-schema/releases). > [!Important]
-> Version `1.13` of the Microsoft Teams app manifest schema enables support for [extending Teams apps to Outlook and Office](../../m365-apps/overview.md). For Teams-only apps, use version `1.12` (or earlier). The 1.12 and 1.13 schemas are otherwise the same. Refer to [Teams JavaScript client SDK](../../m365-apps/overview.md) overview for further guidance.
+> Version `1.13` of the Microsoft Teams app manifest schema enables support for [extending Teams apps to Outlook and Office](../../m365-apps/overview.md). For Teams-only apps, use version `1.12` (or earlier). The 1.12 and 1.13 schemas are otherwise the same. Refer to [Teams JavaScript client SDK](/microsoftteams/platform/tabs/how-to/using-teams-client-sdk?tabs=javascript%2Cmanifest-teams-toolkit) overview for further guidance.
The following schema sample shows all extensibility options:
platform Team Chat Member Api Changes https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/team-chat-member-api-changes.md
Currently, if you want to retrieve information for one or more members of a chat
These APIs have the following shortcomings:
-* For large teams, performance is poor and timeouts are more likely: The maximum team size has grown considerably since Teams was released in early 2017. As `GetMembersAsync` or `getMembers` returns the entire member list, it takes a long time for the API call to return for large teams, and it is common for the call to time out and you have to try again.
-* Getting profile details for a single user is difficult: To get the profile information for a single user, you have to retrieve the entire member list and then search for the one you want. There is a helper function in the Bot Framework SDK to make it simpler, but it is not efficient.
+* For large teams, performance is poor and timeouts are more likely: The maximum team size has grown considerably since Teams was released in early 2017. As `GetMembersAsync` or `getMembers` returns the entire member list, it takes a long time for the API call to return for large teams, and it's common for the call to time out and you have to try again.
+* Getting profile details for a single user is difficult: To get the profile information for a single user, you have to retrieve the entire member list and then search for the one you want. There's a helper function in the Bot Framework SDK to make it simpler, but it isn't efficient.
-With the introduction of organization wide teams, there is a requirement to better align these APIs with Office 365 privacy controls. Bots used in large teams are able to retrieve basic profile information similar to the `User.ReadBasic.All` Microsoft Graph permission. Tenant administrators have a great deal of control over which apps and bots can be used in their tenant, but these settings are different from Microsoft Graph.
+With the introduction of organization wide teams, there's a requirement to better align these APIs with Office 365 privacy controls. Bots used in large teams are able to retrieve basic profile information similar to the `User.ReadBasic.All` Microsoft Graph permission. Tenant administrators have a great deal of control over which apps and bots can be used in their tenant, but these settings are different from Microsoft Graph.
The following code provides a sample JSON representation of what is returned by Teams bot APIs:
Following are the upcoming API changes:
> `objectId` is changed to `aadObjectId` to match what is called in the `Activity` object of a Bot Framework message. The new API is available with version 4.8 or later of the Bot Framework SDK. It is also available in the Teams SDK extension Bot Framework 3.x. Meanwhile, you can use the [REST](/microsoftteams/platform/bots/how-to/get-teams-context?tabs=json#get-single-member-details) endpoint. * `TeamsInfo.GetMembersAsync` in C# and `TeamsInfo.getMembers` in TypeScript or Node.js is formally deprecated. Once the new API is available, you must update your bots to use it. This also applies to the [underlying REST API that these APIs use](/microsoftteams/platform/bots/how-to/get-teams-context?tabs=json#tabpanel_CeZOj-G++Q_json).
-* By late 2022, bots can't proactively retrieve the `userPrincipalName` or `email` properties for members of a chat or team. Bots must use the Graph APIs to retrieve the required imformation. The new `GetConversationPagedMembers` API can't return the `userPrincipalName` and `email` properties from late 2022. Bots must use Graph API with an access token to retrieve information.
+* By late 2022, bots can't proactively retrieve the `userPrincipalName` or `email` properties for members of a chat or team. Bots must use the Graph APIs to retrieve the required information. The new `GetConversationPagedMembers` API can't return the `userPrincipalName` and `email` properties from late 2022. Bots must use Graph API with an access token to retrieve information.
platform Teams Contributor Reference https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/teams-contributor-reference.md
The contributors guide provides direction to create, publish, and update technic
* **[Microsoft Writing Style Guide](/style-guide/welcome)**: Microsoft Writing Style Guide is a comprehensive resource for technical writing and reflects Microsoft's modern approach to voice and style. For easy reference, add this online guide to your browser's **Favorites** menu.
-* **[Writing developer content](/style-guide/developer-content/)**: Teams specific content is aimed at a developer audience with a fundamental understanding of programming concepts and processes. It is important that you must provide clear, technically accurate information in a compelling manner while maintaining Microsoft's tone and style.
+* **[Writing developer content](/style-guide/developer-content/)**: Teams specific content is aimed at a developer audience with a fundamental understanding of programming concepts and processes. It's important that you must provide clear, technically accurate information in a compelling manner while maintaining Microsoft's tone and style.
* **[Writing step-by-step instructions](/style-guide/procedures-instructions/writing-step-by-step-instructions)**: Applied and interactive experiences are a great way for developers to learn about Microsoft products and technologies. Presenting complex or simple procedures in a progressive format is natural and user friendly.
The contributors guide provides direction to create, publish, and update technic
## File Paths
-When using relative paths and creating links to other docsets, it is important to set a valid file path for hyperlinks in your documentation. Your build succeeds on GitHub only if the file path is correct or valid.
+When using relative paths and creating links to other docsets, it's important to set a valid file path for hyperlinks in your documentation. Your build succeeds on GitHub only if the file path is correct or valid.
For more information on hyperlinks and file paths, see [use links in documentation](/contribute/how-to-write-links).
platform App Templates https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/app-templates.md
All app templates are provided under the [MIT License](https://github.com/Office
The key benefits of using App templates are:
-* **Deploy directly to the cloud:** All app templates include deployment scripts that allows you to host all required services in Microsoft Azure or the Power Platform.
+* **Deploy directly to the cloud:** All app templates include deployment scripts that allow you to host all required services in Microsoft Azure or the Power Platform.
* **Recommended sample code:** The app templates conform to recommended best practices around security and infrastructure. All community submitted changes to the app templates are reviewed to ensure conformance. * **Customizable and extensible:** While all app templates are deployed with minimal configuration, the entire code base and deployment scripts are provided, so that you can easily customize or extend them to fit your unique needs. * **Detailed documentation:** All app templates are accompanied by end-to-end documentation on solution architecture, deployment, and configuration steps.
Using the co-worker appreciation template in Microsoft Teams, users can recogniz
## FAQ Plus
-Conversational Q&A bots are an easy way to provide answers to frequently asked questions by users. But, most bots fail to engage with users in meaningful way because there is no human in the loop when the bot fails. FAQ bot is a friendly Q&A bot that brings a human in the loop when it is unable to help. One can ask the bot a question and the bot responds with an answer if it is contained in the knowledge base. If not, the bot allows the user to submit a query which then gets posted to a pre-configured team of experts who help to provide support by acting upon the notifications from within the team itself.
+Conversational Q&A bots are an easy way to provide answers to frequently asked questions by users. But, most bots fail to engage with users in meaningful way because there's no human in the loop when the bot fails. FAQ bot is a friendly Q&A bot that brings a human in the loop when it's unable to help. One can ask the bot a question and the bot responds with an answer if it's contained in the knowledge base. If not, the bot allows the user to submit a query, which then gets posted to a pre-configured team of experts who help to provide support by acting upon the notifications from within the team itself.
> [!NOTE] > The latest release of **FAQ Plus** supports improved Q&A resolutions by enabling a team of experts to complete the following:
The following table describes App template code samples:
|Name|Scenario|GitHub link| ||||-|
-|Adoption Bot |Adoption Bot is a user care chat bot built with Power Virtual Agent for Teams PVA. It is considered as the PVA version of FAQ Plus. Adoption Bot answers 100+ common questions about Microsoft 365 and Teams. You can edit the existing topics, add your own topics, and ingest existing FAQs. If users need additional help, Adoption Bot can connect them to experts or even be extended to open service tickets with premium flow connectors. This bot is self-installed or built into a custom app, such as the [Adoption Hub](https://github.com/akporzondek/adoption_hub). | [Adoption Bot](https://github.com/OfficeDev/microsoft-teams-apps-adopt-bot) |
-| Appointment Manager | Appointment Manager is a Teams app template to help businesses create, manage, and conduct virtual appointments with consumers through Teams. New appointment requests from consumers are visible in Teams channels, where they are quickly assigned and reassigned to staff in a team. Appointment requests are viewed at team or personal levels through custom tabs. Every appointment is associated with a Teams online meeting, hence the staff and consumers can easily join the meeting at the scheduled time. The app template integrates with Microsoft Bookings for easy appointment management. Scheduled appointments automatically appear on assigned staff members' calendars, and consumers receive customizable email notifications and reminders with embedded meeting links.| [Appointment Manager](https://github.com/OfficeDev/microsoft-teams-apps-appointment-manager) |
+|Adoption Bot |Adoption Bot is a user care chat bot built with Power Virtual Agent for Teams PVA. It's considered as the PVA version of FAQ Plus. Adoption Bot answers 100+ common questions about Microsoft 365 and Teams. You can edit the existing topics, add your own topics, and ingest existing FAQs. If users need additional help, Adoption Bot can connect them to experts or even be extended to open service tickets with premium flow connectors. This bot is self-installed or built into a custom app, such as the [Adoption Hub](https://github.com/akporzondek/adoption_hub). | [Adoption Bot](https://github.com/OfficeDev/microsoft-teams-apps-adopt-bot) |
+| Appointment Manager | Appointment Manager is a Teams app template to help businesses create, manage, and conduct virtual appointments with consumers through Teams. New appointment requests from consumers are visible in Teams channels, where they're quickly assigned and reassigned to staff in a team. Appointment requests are viewed at team or personal levels through custom tabs. Every appointment is associated with a Teams online meeting, hence the staff and consumers can easily join the meeting at the scheduled time. The app template integrates with Microsoft Bookings for easy appointment management. Scheduled appointments automatically appear on assigned staff members' calendars, and consumers receive customizable email notifications and reminders with embedded meeting links.| [Appointment Manager](https://github.com/OfficeDev/microsoft-teams-apps-appointment-manager) |
| Ask Away | Ask Away is a [Microsoft Teams bot](../bots/what-are-bots.md) that enables users to conduct Question and Answer, called Q&A sessions within Teams. Using the Ask Away bot, team members can submit and up-vote questions shared by colleagues allowing Q&A hosts to easily gather top-of-mind questions within a channel or chat. The bot is used to conduct a real-time Q&A session in a Teams meeting and allows attendees to submit questions live through chat. | [Ask Away](https://github.com/OfficeDev/microsoft-teams-apps-askaway) | | Associate Insights |Associate Insights is a [Power Apps](/powerapps/maker/canvas-apps/embed-teams-app) template that empowers firstline workers to directly capture and submit customer opinion, sentiment, and perception. Firstline workers are often the first company representative to engage with customers in a one-to-one point-of contact. The collected data are shared and used collaboratively by business teams, such as through a Power BI Teams tab, for product improvement and enhancing the customer experience. | [Associate Insights](https://github.com/OfficeDev/microsoft-teams-apps-associateinsights) |
-| Attendance | The Attendance app is a [Power Apps](/powerapps/maker/canvas-apps/embed-teams-app) tab that are pinned in a team. It is designed to record presence in settings, such as learning and training environments. Users can mark or edit attendance for up to 30 days in the past and view summarized attendance reports for an entire group or individual attendees. | [Attendance](https://github.com/OfficeDev/microsoft-teams-apps-attendance) |
+| Attendance | The Attendance app is a [Power Apps](/powerapps/maker/canvas-apps/embed-teams-app) tab that is pinned in a team. It's designed to record presence in settings, such as learning and training environments. Users can mark or edit attendance for up to 30 days in the past and view summarized attendance reports for an entire group or individual attendees. | [Attendance](https://github.com/OfficeDev/microsoft-teams-apps-attendance) |
|Book-a-room | Book-a-room is a [Microsoft Teams bot](../bots/what-are-bots.md) 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.| [Book-a-room](https://github.com/OfficeDev/microsoft-teams-apps-bookaroom) | | Building Access | Building Access is a Microsoft [Power Platform](https://powerapps.microsoft.com/blog/now-in-preview-customize-teams-with-built-in-power-platform-capabilities/) based app that supports the administration of building occupancy thresholds and social distancing norms by enabling facilities directors to manage, track, and report employee on-site presence. The app, built using Microsoft [Power Apps](/powerapps/powerapps-overview), and [Power Automate](/power-automate/getting-started), deeply integrates with Microsoft Teams and enables organizations to determine building readiness, establish eligibility criteria for on-site access, and gather insights for future planning. | [Building Access](https://github.com/OfficeDev/microsoft-teams-apps-buildingaccess) |
-| Celebrations |Celebrations is a Teams app that helps team members to celebrate each others' birthdays, anniversaries, and other recurring events. It remembers special occasions of all the team members and sends a friendly message in all the teams selected at the time of event creation, to make the team members feel special on their day. The app provides an easy interface for all the team members to personally add and view their events and also allows the user to select the teams in which the events gets shared. | [Celebrations](https://github.com/OfficeDev/microsoft-teams-celebrations-app) |
+| Celebrations |Celebrations is a Teams app that helps team members to celebrate each others' birthdays, anniversaries, and other recurring events. It remembers special occasions of all the team members and sends a friendly message in all the teams selected at the time of event creation, to make the team members feel special on their day. The app provides an easy interface for all the team members to personally add and view their events and also allows the user to select the teams in which the events get shared. | [Celebrations](https://github.com/OfficeDev/microsoft-teams-celebrations-app) |
| Checklist | Checklist is a custom Microsoft Teams [message extension](../messaging-extensions/what-are-messaging-extensions.md) app that enables you to collaborate with your team by creating a shared checklist in a chat or channel. The app is supported across all Teams platform clients, such as desktop browser, iOS, and Android. The app is ready for deployment as part of your Microsoft 365 subscription. | [Checklist](https://github.com/OfficeDev/microsoft-teams-checklist-app)| | Classroom Drop-in | Classroom Drop-in is a Microsoft [Power Platform](https://powerapps.microsoft.com/blog/now-in-preview-customize-teams-with-built-in-power-platform-capabilities/)-based app that enables system leaders to find class teams, means virtual classrooms and add themselves or others to these class teams for a specified drop-in period, as needed. The app built using Microsoft [Power Apps](/powerapps/powerapps-overview) and [Power Automate](/power-automate/getting-started), deeply integrates with Microsoft Teams to ensure educational institutes can optimize their operations in a hybrid learning environment by providing access to relevant stakeholders for class teams per business requirements.| [Classroom Drop-in](https://github.com/OfficeDev/microsoft-teams-apps-classroom-dropin) | | Contact Group Lookup |The Contact Group Lookup app provides a convenient and useful approach to creating, accessing, and managing your organization's contact groups, formerly known as distribution lists or communication groups. Users can quickly view and chat with group members, view member status, and create a group chat with selected members in the contact group, all within the Teams environment.| [Contact Group Lookup](https://github.com/OfficeDev/microsoft-teams-app-contactgrouplookup)|
The following table describes App template code samples:
|Group Activities | Group Activities is a Microsoft Teams app that makes it easy for team owners to quickly create activity groups and manage collaboration workflows within the context of Microsoft Teams. Activity authors are enabled to create activities, randomly distribute team members in groups, and optionally have the bot send reminders until activities are complete.|[Group Activities](https://github.com/OfficeDev/microsoft-teams-apps-groupactivities) | |Group Connect |Group Connect is a Microsoft Teams app that helps organization members discover employee groups and find information relevant to employee groups. The app comes built-in with rich capabilities for organization leaders to communicate with their employees regarding groups, events, and resources. The Group Connect app also matches group members with each other at their desired frequency to encourage networking and cohesion within a group. For more information on how you can leverage the Group Connect app to help employee groups foster within your organization, see the app on GitHub. |[Group Connect](https://github.com/OfficeDev/microsoft-teams-apps-groupconnect) | |Grow Your Skills | The Grow Your Skills app supports professional growth and development by enabling employees to contribute to supplemental projects for your organization while simultaneously learning new skills. Employees can use the app to locate opportunities that meet their interests, enjoy meaningful collaboration with peers, and acquire new levels of expertise and capabilities, all within the Teams environment.|[Grow Your Skills](https://github.com/OfficeDev/microsoft-teams-apps-growyourskills) |
-| HR Support|HR Support bot is a friendly Q&A bot that brings a support professional or expert from the HR team in the loop when it is unable to help. One can ask the bot a question and the bot responds with an answer if it is contained in the knowledge base. If not, the bot allows the user to submit a query which then gets posted in a pre-configured team of experts who are help to provide support by acting upon the notifications from within their team itself. Additionally, the bot suggests links to recommended HR policies or questions by searching for pre-configured tags in the question. These tiles are found in the associated tab as a quick reference. HR Support works well for light weight Q&A and to provide quick support when launching new projects or initiatives in the organization. |[HR Support](https://github.com/OfficeDev/microsoft-teams-hrsupport-app) |
+| HR Support|HR Support bot is a friendly Q&A bot that brings a support professional or expert from the HR team in the loop when it's unable to help. One can ask the bot a question and the bot responds with an answer if it's contained in the knowledge base. If not, the bot allows the user to submit a query, which then gets posted in a pre-configured team of experts who are help to provide support by acting upon the notifications from within their team itself. Additionally, the bot suggests links to recommended HR policies or questions by searching for pre-configured tags in the question. These tiles are found in the associated tab as a quick reference. HR Support works well for light weight Q&A and to provide quick support when launching new projects or initiatives in the organization. |[HR Support](https://github.com/OfficeDev/microsoft-teams-hrsupport-app) |
|Incentives | Incentives is a [Power Apps](/powerapps/maker/canvas-apps/embed-teams-app) template that manages and tracks incentivized employee participation in designated activities, such as trainings and change management initiatives. Admins use the app to establish designated activities, assign points for completion, and specify required eligibility point levels for rewards. Employees use the app to view their accumulated points and, upon reaching eligibility, request and claim redeemable rewards.|[Incentives](https://github.com/OfficeDev/microsoft-teams-apps-incentives) | |Incident Reporter | Incident Reporter is a [Microsoft Teams bot](../bots/what-are-bots.md) that optimizes the management of incidents in your organization. The bot facilitates automated incident data collection, customized incident reports, relevant stakeholder notifications, and end-to-end incident tracking.|[Incident Reporter](https://github.com/OfficeDev/microsoft-teams-apps-incidentreport) | | Inspection|Inspection is a Microsoft Teams app that enables front line workers to inspect anything from locations to assets and equipments. For example, a retail store, manufacturing plant, or vehicles and machines. There are two apps in this solution, each intended for different types of users. The app empowers the front line workers to inspect an asset or area, to manage quality of products and services, or maintain safety at workplace. It facilitates communication between team members to address issues found during inspection. The app provides simple reports for managers to expedite issue resolution and highlight trends. |[Inspection](https://github.com/OfficeDev/microsoft-teams-apps-inspection) |
The following table describes App template code samples:
|Scrums for Channels |Scrums for Channels is a scrum assistant app that enables users to schedule and run scrums in channels within Microsoft Teams. The app is great for remote teams and teams comprised of members from varied geographical locations and time zones to share daily updates and ensure participation in scrum stand-up meetings.|[Scrums for Channels](https://github.com/OfficeDev/microsoft-teams-apps-scrumsforchannels) | | Scrums for Group Chat| The Scrums Status app template is updated and called as Scrums for Group Chat. Scrums for Group Chat is a supportive scrum assistant that enables group chat members to run asynchronous stand-up meetings and easily share their daily updates. It allows all members of the group chat to contribute to the scrum and view the updates made by others in the running scrum. |[Scrums for Group Chat](https://github.com/OfficeDev/microsoft-teams-apps-scrumsforgroupchat) | |Share Now |The Share Now app promotes the positive exchange of information between colleagues by enabling your users to easily share content within the Teams environment. Users engage the app to share items of interest with team members, discover new shared content, set preferences, and bookmark favorites for later reading. |[Share Now](https://github.com/OfficeDev/microsoft-teams-apps-sharenow) |
-|SharePoint List Search |Collaboration in Microsoft Teams quite often references information contained within items in a SharePoint list. Paste a link to the item in question forces everyone to switch context away from the conversation, find the needed information, then return to Teams to continue the conversation. As the conversation continues people have to switch back to the reference item multiple times to verify new comments and refresh their memories of the information contained within the item. This context switching creates a barrier to smooth collaboration. To resolve this problem, the List Search app template is used. Many users use SharePoint to power some of the core workflows in their organizations. However, collaborating around lists is difficult. Using the List Search app template in Microsoft Teams, users can insert information from SharePoint list items directly within a chat conversation to alleviate the context-switching caused when simply inserting a link into a chat. The information is inserted as an easy-to-read auto-formatted card, helping the users stay engaged in the conversation. |[SharePoint List Search](https://github.com/OfficeDev/microsoft-teams-list-search-app) |
+|SharePoint List Search |Collaboration in Microsoft Teams often references information contained within items in a SharePoint list. Paste a link to the item in question forces everyone to switch context away from the conversation, find the needed information, then return to Teams to continue the conversation. As the conversation continues people have to switch back to the reference item multiple times to verify new comments and refresh their memories of the information contained within the item. This context switching creates a barrier to smooth collaboration. To resolve this problem, the List Search app template is used. Many users use SharePoint to power some of the core workflows in their organizations. However, collaborating around lists is difficult. Using the List Search app template in Microsoft Teams, users can insert information from SharePoint list items directly within a chat conversation to alleviate the context-switching caused when simply inserting a link into a chat. The information is inserted as an easy-to-read auto-formatted card, helping the users stay engaged in the conversation. |[SharePoint List Search](https://github.com/OfficeDev/microsoft-teams-list-search-app) |
|Staff Check-ins | Staff Check-ins is a [Power Apps](/powerapps/powerapps-overview) based app that enables oversight communication between your business and field personnel. Staff can easily provide time-critical information and status updates on either a scheduled or ad-hoc basis directly from Teams. The app supports real-time location, photos, notes, reminder notifications, and automated workflows.|[Staff Check-ins](https://github.com/OfficeDev/microsoft-teams-apps-staffcheckins) | | Survey|Survey is a custom Microsoft Teams [message extension](../messaging-extensions/what-are-messaging-extensions.md) app that enables you to create a survey in a chat or a channel to gather data and gain actionable insight. The app is supported across all Teams platform clients, such as desktop, browser, iOS, and Android and is ready for deployment as part of your Microsoft 365 subscription. |[Survey](https://github.com/OfficeDev/Microsoft-Teams-Survey-app) |
-|Time Tally |A project can include multiple tasks, and various projects can be assigned to employees. Managers are required to understand the project progress through the time spent by the employees on these tasks. This can be a cumbersome activity, as the employees need to fill in the timesheets. Time Tally app enables employees to fill their timesheets quickly, using the mobile device, and managers do not have to follow up with employees on the timesheet entry. Managers get to view the project utilization based on resources, and they can approve or reject the entries. Reminder notifications are sent to ensure timesheet compliance. Also, historical data and utilizations are available for analytics. |[Time Tally](https://github.com/OfficeDev/microsoft-teams-apps-timetally) |
+|Time Tally |A project can include multiple tasks, and various projects can be assigned to employees. Managers are required to understand the project progress through the time spent by the employees on these tasks. This can be a cumbersome activity, as the employees need to fill in the timesheets. Time Tally app enables employees to fill their timesheets quickly, using the mobile device, and managers don't have to follow up with employees on the timesheet entry. Managers get to view the project utilization based on resources, and they can approve or reject the entries. Reminder notifications are sent to ensure timesheet compliance. Also, historical data and utilizations are available for analytics. |[Time Tally](https://github.com/OfficeDev/microsoft-teams-apps-timetally) |
| Training | Training is a custom [Teams message extension](../messaging-extensions/what-are-messaging-extensions.md) app that enables users to publish a training within a chat or a channel for offline knowledge sharing and upskilling. The app is supported across multiple Teams platform clients, such as desktop, browser, iOS, and Android. This app is ready for deployment as part of your Microsoft 365 subscription.|[Training](https://github.com/OfficeDev/microsoft-teams-apps-training) | |Virtual Rounding | Hospital and emergency room providers make many **rounds** per day. These quick check-ins on patients are intended to provide a status check on how the patient is doing and ensure that the patient’s concerns are addressed. While rounding is an essential practice to ensure patients are being monitored by multiple types of providers, they represent a huge drain on PPE, because for each visit, from each provider, a new mask, and new set of gloves are used. With this app templates, medical workers can easily conduct rounds virtually, through a Microsoft Teams meeting between the provider and the patient. The Virtual Rounding solution is also referenced in the Microsoft Health and Life Sciences [blog post](https://aka.ms/teamsvirtualrounding).|[Virtual Rounding](https://github.com/SmartterHealth/Virtual-Rounding) | |Visitor Management | The Visitor Management app enables your organization and employees to easily and efficiently manage the on-site visitor process, directly from Microsoft Teams. The app enables employees to create visitor requests, centrally track a request status through the visitor dashboard, and receive real-time notifications when a visitor arrives.|[Visitor Management](https://github.com/OfficeDev/microsoft-teams-app-visitormanagement) |
-|Water Cooler |Water Cooler is a custom Teams app that enables corporate teams to create, invite, and join casual conversations among teammates, such as those that take place by the Water Cooler or break room. Use this template for multiple scenarios, such as new non project related announcements, topics of interest, current events, or conversations about hobbies. The app provides an easy interface for anyone to find an existing conversation or start a new one. It is a foundation for building custom targeted communication capabilities, promoting interaction amongst coworkers who may otherwise not get a chance to socialize during breaks. Key features are: <br/> **Water Cooler Home Page**: You can browse existing rooms where team members are interacting in existing conversations with certain people or topics of interest. Active conversations on the **Home Page** show a room name, short description, call duration, and room image. <br/>**Join room**: Use the **Join room** feature to join an ongoing conversation immediately. Select **Join** from active conversations to join the room.<br/>**Room creation**: Use the **Room creation** feature to create a Teams call or chat for all attendees to interact. Create rooms easily by specifying the room name, short description, up to five colleagues as an initial group and selecting from the provided set of room images. <br/>**Find room**: Use the **Find room** feature to search keyword which matches with the topic or short descriptions of ongoing conversations.<br/>**Attendee invitation**: Use the **Attendee invitation** feature to invite additional users after room creation. This is similar to Teams call.<br/>**App badge**: The **Water Cooler** icon on the left menu shows a badge with the number of active conversations visible from Teams while using any app. |[Water Cooler](https://github.com/microsoft/csapps-msteams-watercooler) |
+|Water Cooler |Water Cooler is a custom Teams app that enables corporate teams to create, invite, and join casual conversations among teammates, such as those that take place by the Water Cooler or break room. Use this template for multiple scenarios, such as new non project related announcements, topics of interest, current events, or conversations about hobbies. The app provides an easy interface for anyone to find an existing conversation or start a new one. It's a foundation for building custom targeted communication capabilities, promoting interaction amongst coworkers who may otherwise not get a chance to socialize during breaks. Key features are: <br/> **Water Cooler Home Page**: You can browse existing rooms where team members are interacting in existing conversations with certain people or topics of interest. Active conversations on the **Home Page** show a room name, short description, call duration, and room image. <br/>**Join room**: Use the **Join room** feature to join an ongoing conversation immediately. Select **Join** from active conversations to join the room.<br/>**Room creation**: Use the **Room creation** feature to create a Teams call or chat for all attendees to interact. Create rooms easily by specifying the room name, short description, up to five colleagues as an initial group and selecting from the provided set of room images. <br/>**Find room**: Use the **Find room** feature to search keyword, which matches with the topic or short descriptions of ongoing conversations.<br/>**Attendee invitation**: Use the **Attendee invitation** feature to invite additional users after room creation. This is similar to Teams call.<br/>**App badge**: The **Water Cooler** icon on the left menu shows a badge with the number of active conversations visible from Teams while using any app. |[Water Cooler](https://github.com/microsoft/csapps-msteams-watercooler) |
| Workplace Awards| Workplace Awards is a Teams app template that provides a positive framework to foster recognition and encourage the culture of employee appreciation in the modern workplace. The app enables you to setup and manage an employee rewards and recognition, called R&R program where employees can easily nominate and endorse colleagues and your R&R leader can view submitted nominations, grant awards, and announce recipients.|[Workplace Awards](https://github.com/OfficeDev/microsoft-teams-apps-workplaceawards) | To provide feedback, see [App template feedback](https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2_7qFm_lcZAr4eqEhnLsZ9UMVZGT1lCT0FXUDdZMUM0RkpBS1BESTAwWC4u).
platform Integrate Web Apps Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/integrate-web-apps-overview.md
Microsoft Power platform combines four robust Microsoft technologies, such as Po
### Power Apps
-With Power Apps, you can build business apps that connect to your business data and are tailored to your organization's needs. Power Apps enable a wide range of app scenarios to solve business challenges through canvas apps. After building the app, you can export it from the Power Apps maker portal and embed in Microsoft Teams.
+With Power Apps, you can build business apps that connect to your business data and are tailored to your organization's needs. Power Apps enables a wide range of app scenarios to solve business challenges through canvas apps. After building the app, you can export it from the Power Apps maker portal and embed in Microsoft Teams.
### Power Virtual Agents
-Power Virtual Agent is a no code, guided graphical interface solution. It is built on the Microsoft Power Platform and the Bot Framework. It empowers every member of your team to create and maintain rich conversational chatbots that easily integrate with the Teams platform. You can design, develop, and publish intelligent virtual agents for Teams without having to setup a development environment, create a web service, or directly register with the Bot Framework.
+Power Virtual Agent is a no code, guided graphical interface solution. It's built on the Microsoft Power Platform and the Bot Framework. It empowers every member of your team to create and maintain rich conversational chatbots that easily integrate with the Teams platform. You can design, develop, and publish intelligent virtual agents for Teams without having to setup a development environment, create a web service, or directly register with the Bot Framework.
### Create Virtual Assistant
You can use app template to create custom made apps to suit your organizational
## Install Moodle LMS
-Moodle is a popular open-source Learning Management System (LMS). It is now integrated with Microsoft Teams. This integration helps educators and teachers to collaborate around Moodle courses, ask questions about grades and assignments, and stay updated with notifications directly within Teams.
+Moodle is a popular open-source Learning Management System (LMS). It's now integrated with Microsoft Teams. This integration helps educators and teachers to collaborate around Moodle courses, ask questions about grades and assignments, and stay updated with notifications directly within Teams.
## Create a Share-to-Teams button for your website
platform Integrating Web Apps https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/integrating-web-apps.md
Title: Considerations for Teams integration
You can make web apps suitable with Teams' social and collaborative features, by properly integrating them with Teams.
-The different types of apps which you can integrate with Teams are as follows:
+The different types of apps, which you can integrate with Teams are as follows:
* **Standalone apps**: A stand alone app is a single-page or large, and complex app. The user can use some aspects of it in Teams. * **Collaboration apps**: An app already built for the social and collaborative features inherent to Teams.
This document gives an overview of Teams capabilities, share-point requirements
***Integration scenarios**: Standalone apps, collaboration apps, SharePoint*
-Your Teams app must include required and expected collaborative features. To work with app integration, it is important to familiarize with Teams development terminology.
+Your Teams app must include required and expected collaborative features. To work with app integration, it's important to familiarize with Teams development terminology.
|Common app features |Teams platform capabilities | |-|--|
The following are the prerequisites to integrate your app with Teams.
To integrate an existing [SharePoint page](/sharepoint/dev/general-development/overview-of-the-sharepoint-page-model) as a Teams tab, you must consider the following: * It must be a *modern* SharePoint online page.
-* Only personal tabs are supported. You cannot integrate your page as a channel tab.
+* Only personal tabs are supported. You can't integrate your page as a channel tab.
Alternatively, you can build a Teams tab [using the SharePoint Framework](/sharepoint/dev/spfx/integrate-with-teams-introduction).
Teams has single sign-on (SSO) mechanisms with Azure AD for third-party apps. It
> [!IMPORTANT] > Currently, third-party apps are available in Government Community Cloud (GCC) but are not available for GCC-High and Department of Defense (DOD). Third-party apps are turned off by default for GCC. To turn on third-party apps for GCC, see [manage app permission policies](/microsoftteams/teams-app-permission-policies) and [manage apps](/microsoftteams/manage-apps).
-For SharePoint pages, you can only use SSO and cannot add another Azure AD ID if you want SSO to work for another app as the ID is the SharePoint app.
+For SharePoint pages, you can only use SSO and can't add another Azure AD ID if you want SSO to work for another app as the ID is the SharePoint app.
Learn more about [authentication in Teams](../concepts/authentication/authentication.md).
Learn more about [authentication in Teams](../concepts/authentication/authentica
***Integration scenarios**: Standalone apps, collaboration apps*
-Ensure to follow [Teams design guidelines](../concepts/design/understand-use-cases.md) to make your app native to Teams. You cannot migrate an existing app content to a Teams tab. For more information on app design, see [Fluent Design System](https://fluentsite.z22.web.core.windows.net/).
+Ensure to follow [Teams design guidelines](../concepts/design/understand-use-cases.md) to make your app native to Teams. You can't migrate an existing app content to a Teams tab. For more information on app design, see [Fluent Design System](https://fluentsite.z22.web.core.windows.net/).
## Maximize deep linking
You can create links to information and features within Teams. Use [deep links](
Use a [bot](../bots/what-are-bots.md) in your Teams app for multi-threaded conversation, as it offers more flexibility than a [webhook](../webhooks-and-connectors/what-are-webhooks-and-connectors.md).
-Bots also allow you to send **proactive messages** to individual users or channels. The proactive messages are unprompted messages triggered by an outside event and not a message sent to a bot. For example, your bot sends a welcome message when it is installed or a new user joins a channel.
+Bots also allow you to send **proactive messages** to individual users or channels. The proactive messages are unprompted messages triggered by an outside event and not a message sent to a bot. For example, your bot sends a welcome message when it's installed or a new user joins a channel.
Sending proactive messages requires Teams-specific identifiers. You can capture the information by [fetching roster or user profile data](../bots/how-to/get-teams-context.md#fetch-the-roster-or-user-profile), [subscribing to conversation events](../bots/how-to/conversations/subscribe-to-conversation-events.md), or using [Microsoft Graph](/microsoftteams/platform/graph-api/proactive-bots-and-messages/graph-proactive-bots-and-messages?context=graph/context#proactive-messaging-in-teams).
-Do not spam users with excessive messages. If the Teams capability supports it, the users can configure notification settings for your app.
+Don't spam users with excessive messages. If the Teams capability supports it, the users can configure notification settings for your app.
Following is an example of a notification message: **Don't send me unprompted messages**.
platform Shifts Wfm Connectors https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/shifts-wfm-connectors.md
# Production-ready Shifts Connectors
-Teams Shifts Workforce management (WFM) connectors are production-ready, open-source, and community-driven integrations, useful for first-line workers. They offer a seamless experience and quick process for the digital transformation of first-line workers with Teams Shifts.
+Teams Shifts Workforce management (WFM) connectors are production-ready, open-source, and community-driven integrations, useful for Firstline Workers. They offer a seamless experience and quick process for the digital transformation of Firstline Workers with Teams Shifts.
Each connector provides detailed guidance for deployment and integration to your organization. The complete source code is available in GitHub repository. You can explore in detail or fork, and customize to meet your specific needs.
Following are the key benefits of Teams Shifts WFM connectors:
* **Detailed documentation & support:** All Shifts WFM connectors are accompanied by end-to-end documentation for solution architecture, deployment, and configuration steps. The connector repositories are monitored, so that you can report any issues, challenges or difficulties you encounter through the repo's GitHub Issues tracker.
-* **Seamless integration:** The integration between WFM solutions and Teams Shifts allows first-line workers to use the Teams Shifts app to view or manage their schedules and shift times, and use all the other rich collaboration features provided in Teams right from their mobile device or desktop without having to switch context to another app.
+* **Seamless integration:** The integration between WFM solutions and Teams Shifts allows Firstline Workers to use the Teams Shifts app to view or manage their schedules and shift times, and use all the other rich collaboration features provided in Teams right from their mobile device or desktop without having to switch context to another app.
Open shifts view in Teams:
platform Virtual Assistant https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-assistant.md
The following image displays the business functions of Virtual Assistant:
## Create a Teams-focused Virtual Assistant
-Microsoft has published a [Microsoft Visual Studio template](https://marketplace.visualstudio.com/items?itemName=BotBuilder.VirtualAssistantTemplate) for building Virtual Assistants and skills. With the Visual Studio template, you can create a Virtual Assistant, powered by a text based experience with support for limited rich cards with actions. We have enhanced the Visual Studio base template to include Microsoft Teams platform capabilities and power great Teams app experiences. A few of the capabilities include support for rich Adaptive Cards, task modules, teams or group chats, and message extensions. For more information on extending Virtual Assistant to Microsoft Teams, see [Tutorial: Extend Your Virtual Assistant to Microsoft Teams](https://microsoft.github.io/botframework-solutions/clients-and-channels/tutorials/enable-teams/1-intro/).
+Microsoft has published a [Microsoft Visual Studio template](https://marketplace.visualstudio.com/items?itemName=BotBuilder.VirtualAssistantTemplate) for building Virtual Assistants and skills. With the Visual Studio template, you can create a Virtual Assistant, powered by a text based experience with support for limited rich cards with actions. We've enhanced the Visual Studio base template to include Microsoft Teams platform capabilities and power great Teams app experiences. A few of the capabilities include support for rich Adaptive Cards, task modules, teams or group chats, and message extensions. For more information on extending Virtual Assistant to Microsoft Teams, see [Tutorial: Extend Your Virtual Assistant to Microsoft Teams](https://microsoft.github.io/botframework-solutions/clients-and-channels/tutorials/enable-teams/1-intro/).
The following image displays the high level diagram of a Virtual Assistant solution: ![High-level diagram of a Virtual Assistant solution](../assets/images/bots/virtual-assistant/high-level-diagram.png) ### Add Adaptive Cards to your Virtual Assistant
-To dispatch requests properly, your Virtual Assistant must identify the correct LUIS model and corresponding skill associated with it. However, the dispatching mechanism cannot be used for card action activities, as the LUIS model associated with a skill, is trained for card action texts. The card action texts are fixed, pre-defined keywords, and not commented from a user.
+To dispatch requests properly, your Virtual Assistant must identify the correct LUIS model and corresponding skill associated with it. However, the dispatching mechanism can't be used for card action activities, as the LUIS model associated with a skill, is trained for card action texts. The card action texts are fixed, pre-defined keywords, and not commented from a user.
This drawback is resolved by embedding skill information in the card action payload. Every skill should embed `skillId` in the `value` field of card actions. You must ensure that each card action activity carries the relevant skill information, and Virtual Assistant can utilize this information for dispatching.
Virtual Assistant can handle interruptions in cases where a user tries to invoke
To add task module capabilities to a Virtual Assistant, two additional methods are included in the Virtual Assistant activity handler: `OnTeamsTaskModuleFetchAsync` and `OnTeamsTaskModuleSubmitAsync`. These methods listen to task module-related activities from Virtual Assistant, identify the skill associated with the request, and forward the request to the identified skill.
-Request forwarding is done through the [SkillHttpClient](/dotnet/api/microsoft.bot.builder.integration.aspnet.core.skills.skillhttpclient?view=botbuilder-dotnet-stable&preserve-view=true), `PostActivityAsync` method. It returns the response as `InvokeResponse` which is parsed and converted to `TaskModuleResponse` .
+Request forwarding is done through the [SkillHttpClient](/dotnet/api/microsoft.bot.builder.integration.aspnet.core.skills.skillhttpclient?view=botbuilder-dotnet-stable&preserve-view=true), `PostActivityAsync` method. It returns the response as `InvokeResponse`, which is parsed and converted to `TaskModuleResponse` .
```csharp public static TaskModuleResponse GetTaskModuleRespose(this InvokeResponse invokeResponse)
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 code snippets for `OnTeamsTaskModuleFetchAsync` and `OnTeamsTaskModuleSubmitAsync` methods are given in the following section:
```csharp // Invoked when a "task/fetch" event is received to invoke task module.
Additionally, you must include all skill domains in the `validDomains` section i
### Handle collaborative app scopes
-Teams apps can exist in multiple scopes including 1:1 chat, group chat, and channels. The core Virtual Assistant template is designed for 1:1 chats. As part of the onboarding experience Virtual Assistant prompts users for name and maintains user state. Since the onboarding experience is not suited for group chat or channel scopes, it has been removed.
+Teams apps can exist in multiple scopes including 1:1 chat, group chat, and channels. The core Virtual Assistant template is designed for 1:1 chats. As part of the onboarding experience Virtual Assistant prompts users for name and maintains user state. Since the onboarding experience isn't suited for group chat or channel scopes, it has been removed.
-Skills should handle activities in multiple scopes, such as 1:1 chat, group chat, and channel conversation. If any of these scopes are not supported, skills must respond with an appropriate message.
+Skills should handle activities in multiple scopes, such as 1:1 chat, group chat, and channel conversation. If any of these scopes aren't supported, skills must respond with an appropriate message.
The following processing functions have been added to Virtual Assistant core:
Once the commands are invoked by a user, the Virtual Assistant can identify an a
} ```
-Some message extension activities do not include the command ID. For example, `composeExtension/selectItem` contains only the value of the invoke tap action. To identify the associated skill, `skillId` is attached to each item card while forming a response for `OnTeamsMessagingExtensionQueryAsync`. This is similar to the approach for [adding adaptive cards to your Virtual Assistant](#add-adaptive-cards-to-your-virtual-assistant).
+Some message extension activities don't include the command ID. For example, `composeExtension/selectItem` contains only the value of the invoke tap action. To identify the associated skill, `skillId` is attached to each item card while forming a response for `OnTeamsMessagingExtensionQueryAsync`. This is similar to the approach for [adding adaptive cards to your Virtual Assistant](#add-adaptive-cards-to-your-virtual-assistant).
```csharp // Invoked when a 'composeExtension/selectItem' invoke activity is received for compose extension query command.
The following image displays a Virtual Assistant with a **book a room** skill:
![Virtual Assistant with a "book a room" skill](../assets/images/bots/virtual-assistant/book-a-room-skill.png)
-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.
+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.
### Skill manifest
-A skill manifest is a JSON file that exposes a skill's messaging endpoint, ID, name, and other relevant metadata. This manifest is different than the manifest used for sideloading an app in Microsoft Teams. A Virtual Assistant requires a path to this file as an input to attach a skill. We have added the following manifest to the bot's wwwroot folder.
+A skill manifest is a JSON file that exposes a skill's messaging endpoint, ID, name, and other relevant metadata. This manifest is different than the manifest used for sideloading an app in Microsoft Teams. A Virtual Assistant requires a path to this file as an input to attach a skill. We've added the following manifest to the bot's wwwroot folder.
```bash botskills connect --remoteManifest "<url to skill's manifest>" ..
The corresponding `.lu` file is shown in the following section:
``` With this approach, any command issued by a user to Virtual Assistant related to `book room` or `manage favorites` are identified as a command associated with `Book-a-room` bot and is forwarded to this skill.
-On the other hand, `Book-a-room room` bot needs to use LUIS model to understand these commands if they are not typed full. For example: `I want to manage my favorite rooms`.
+On the other hand, `Book-a-room room` bot needs to use LUIS model to understand these commands if they aren't typed full. For example: `I want to manage my favorite rooms`.
### Multi-Language support
To modify `languages` parameter, update botskills 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 does not 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
-We have added [claimsValidator](https://github.com/nebhagat/msteams-virtual-assistant-dotnet/blob/master/msteams-virtual-assistant-dotnet/Authentication/AllowedCallersClaimsValidator.cs) to restrict callers to the skill. To allow a Virtual Assistant to call this skill, populate `AllowedCallers` array from `appsettings` with that particular Virtual Assistant's app ID.
+We've added [claimsValidator](https://github.com/nebhagat/msteams-virtual-assistant-dotnet/blob/master/msteams-virtual-assistant-dotnet/Authentication/AllowedCallersClaimsValidator.cs) to restrict callers to the skill. To allow a Virtual Assistant to call this skill, populate `AllowedCallers` array from `appsettings` with that particular Virtual Assistant's app ID.
``` "AllowedCallers": [ "<caller_VA1_appId>", "<caller_VA2_appId>" ],
For more information on adding claims validation to a skill, see [add claims val
### Limitation of card refresh
-Updating activity, such as card refresh is not supported yet through Virtual Assistant ([github issue](https://github.com/microsoft/botbuilder-dotnet/issues/3686)). Hence, we have replaced all card refresh calls `UpdateActivityAsync` with posting new card calls `SendActivityAsync`.
+Updating activity, such as card refresh isn't supported yet through Virtual Assistant ([github issue](https://github.com/microsoft/botbuilder-dotnet/issues/3686)). Hence, we've replaced all card refresh calls `UpdateActivityAsync` with posting new card calls `SendActivityAsync`.
### Card actions and task module flows To forward card action or task module activities to an associated skill, the skill must embed `skillId` to it. `Book-a-room` bot card action, task module fetch and submit action payloads are modified to contain `skillId` as a parameter.
-For more information refer [this](/microsoftteams/platform/samples/virtual-assistant#add-adaptive-cards-to-your-virtual-assistant) section from this documentation.
+For more information, refer [this](/microsoftteams/platform/samples/virtual-assistant#add-adaptive-cards-to-your-virtual-assistant) section from this documentation.
### Handle activities from group chat or channel scope
You can also leverage existing skills from [Bot Framework Solutions repository](
## Limitations of Virtual Assistant
-* **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 is no clear state where conversation is ended. Hence we have not 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 is not yet supported through Virtual Assistant.
+* **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 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.
- * Configuration of message extensions is not scoped to individual commands but for the entire extension itself. This limits configuration for each individual skill through Virtual Assistant.
+ * 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 Access Teams Context https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/access-teams-context.md
Your tab requires contextual information to display relevant content:
Context about the user, team, or company can be especially useful when: * You create or associate resources in your app with the specified user or team.
-* You initiate an authentication flow from Microsoft Azure Active Directory (Azure AD) or other identity provider, and you do not require the user to enter their username again.
+* You initiate an authentication flow from Microsoft Azure Active Directory (Azure AD) or other identity provider, and you don't require the user to enter their username again.
For more information, see [authenticate a user in your Microsoft Teams](~/concepts/authentication/authentication.md).
For example, in your tab manifest you set the `configURL` attribute to `"https:/
* Their username is **user@example.com**. * Their company tenant ID is **e2653c-etc**.
-* They are a member of the Office 365 group with id **00209384-etc**.
+* They're a member of the Office 365 group with id **00209384-etc**.
* The user has set their Teams theme to **dark**. When they configure the tab, Teams calls the following URL:
When they configure the tab, Teams calls the following URL:
### Get context by using the Microsoft Teams JavaScript library
+git-issue-clarify-the-full-set-of-values-any-context-object-property-can-take
+You can also retrieve the information listed above using the [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client) by calling `microsoftTeams.getContext(function(context) { /* ... */ })`.
+
+The following code provides an example of context variable:
+
+```json
+{
+ "teamId": "The Microsoft Teams ID in the format 19:[id]@thread.skype",
+ "teamName": "The name of the current team",
+ "channelId": "The channel ID in the format 19:[id]@thread.skype",
+ "channelName": "The name of the current channel",
+ "chatId": "The chat ID in the format 19:[id]@thread.skype",
+ "locale": "The current locale of the user formatted as languageId-countryId (for example, en-us)",
+ "entityId": "The developer-defined unique ID for the entity this content points to",
+ "subEntityId": "The developer-defined unique ID for the sub-entity this content points to",
+ "loginHint": "A value suitable as a login hint for Azure AD. This is usually the login name of the current user, in their home tenant",
+ "userPrincipalName": "The principal name of the current user, in the current tenant",
+ "userObjectId": "The Azure AD object id of the current user, in the current tenant",
+ "tid": "The Azure AD tenant ID of the current user",
+ "groupId": "Guid identifying the current Office 365 Group ID",
+ "theme": "The current UI theme: default | dark | contrast",
+ "isFullScreen": "Indicates if the tab is in full-screen",
+ "teamType": "The type of team",
+ "teamSiteUrl": "The root SharePoint site associated with the team",
+ "teamSiteDomain": "The domain of the root SharePoint site associated with the team",
+ "teamSitePath": "The relative path to the SharePoint site associated with the team",
+ "channelRelativeUrl": "The relative path to the SharePoint folder associated with the channel",
+ "sessionId": "The unique ID for the current Teams session for use in correlating telemetry data",
+ "userTeamRole": "The user's role in the team",
+ "isTeamArchived": "Indicates if team is archived",
+ "hostClientType": "The type of host client. Possible values are android, ios, web, desktop, surfaceHub, teamsRoomsAndroid, teamsPhones, teamsDisplays rigel (deprecated, use teamsRoomsWindows instead)",
+ "frameContext": "The context where tab URL is loaded (for example, content, task, setting, remove, sidePanel)",
+ "sharepoint": "The SharePoint context is available only when hosted in SharePoint",
+ "tenantSKU": "The license type for the current user tenant. Possible values are enterprise, free, edu, unknown",
+ "userLicenseType": "The license type for the current user. Possible values are E1, E3, and E5 enterprise plans",
+ "parentMessageId": "The parent message ID from which this task module is launched",
+ "ringId": "The current ring ID",
+ "appSessionId": "The unique ID for the current session used for correlating telemetry data",
+ "isCallingAllowed": "Indicates if calling is allowed for the current logged in user",
+ "isPSTNCallingAllowed": "Indicates if PSTN calling is allowed for the current logged in user",
+ "meetingId": "The meeting ID used by tab when running in meeting context",
+ "defaultOneNoteSectionId": "The OneNote section ID that is linked to the channel",
+ "isMultiWindow": "The indication whether the tab is in a pop out window"
+}
+```
+ You can also retrieve the information listed above using the [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client) by calling the `app.getContext()` function. For additional information, see the properties of the [Context interface](/javascript/api/@microsoft/teams-js/app.context?view=msteams-client-js-latest&preserve-view=true). + ## Retrieve context in private channels When your content page is loaded in a private channel, the data you receive from the `getContext` call is obfuscated to protect the privacy of the channel.
The following fields are changed when your content page is in a shared channel:
* `teamSitePath`: Set to the path of a distinct, unique SharePoint site for the shared channel. * `teamSiteDomain`: Set to the domain of a distinct, unique SharePoint site domain for the shared channel.
-In addition to these field changes, there are two new fields available for shared channels:
+In addition to these field changes, there're two new fields available for shared channels:
* `hostTeamGroupId`: Set to the `groupId` associated with the hosting team, or the team that created the shared channel. The property can make Microsoft Graph API calls retrieve membership of the shared channel. * `hostTeamTenantId`: Set to the `tenantId` associated with the hosting team, or the team that created the shared channel. The property can be cross referenced with the current user's tenant ID found in the `tid` field of `getContext` to determine if the user is internal or external to the hosting team's tenant. If your page makes use of any of these values, the value of `channelType` field must be `Shared` to determine if your page is loaded in a shared channel and can respond appropriately.
+> [!NOTE]
+> Every time a user restarts or reloads the Teams desktop or web client, a new sessionID is created, which is tracked by Teams session, whereas, when a user exits the Teams apps and reloads it in Teams platform a new app sessionID is created, which is tracked by app session.
+ ## Handle theme change You can register your app to be informed if the theme changes by calling `app.registerOnThemeChangeHandler(function(theme) { /* ... */ })`.
platform Auth Flow Tab https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/authentication/auth-flow-tab.md
For example, the authentication flow for tabs and bots using Node and the [OAuth
![Tab authentication sequence diagram](~/assets/images/authentication/tab_auth_sequence_diagram.png) 1. The user interacts with the content on the tab configuration or content page, commonly a **Sign in** or **Log in** button.
-2. The tab constructs the URL for its auth start page. Optionally, it uses information from URL placeholders or calls `microsoftTeams.getContext()` Teams client SDK method to streamline the authentication experience for the user. For example, when authenticating with A Azure AD, if the `login_hint` parameter is set to the user's email address, the user does not have to sign in if they have done so recently. This is because Azure AD uses the user's cached credentials. The pop-up window is shown briefly and then disappears.
+2. The tab constructs the URL for its auth start page. Optionally, it uses information from URL placeholders or calls `microsoftTeams.getContext()` Teams client SDK method to streamline the authentication experience for the user. For example, when authenticating with A Azure AD, if the `login_hint` parameter is set to the user's email address, the user doesn't have to sign in if they've done so recently. This is because Azure AD uses the user's cached credentials. The pop-up window is shown briefly and then disappears.
3. The tab then calls the `microsoftTeams.authentication.authenticate()` method and registers the `successCallback` and `failureCallback` functions. 4. Teams opens the start page in an iframe in a pop-up window. The start page generates random `state` data, saves it for future validation, and redirects to the identity provider's `/authorize` endpoint, such as `https://login.microsoftonline.com/<tenant ID>/oauth2/authorize` for Azure AD. Replace `<tenant id>` with your own tenant id that is context.tid. Similar to other application auth flows in Teams, the start page must be on a domain that is in its `validDomains` list, and on the same domain as the post sign in redirect page.
Similar to other application auth flows in Teams, the start page must be on a do
## Treat tab context as hints
-Although the tab context provides helpful information regarding the user, do not use this information to authenticate the user. Do authenticate the user even if you get the information as URL parameters to your tab content URL or by calling the `microsoftTeams.getContext()` function in the Microsoft Teams client SDK. A malicious actor can invoke your tab content URL with its own parameters. The actor can also invoke a web page impersonating Microsoft Teams to load your tab content URL in an iframe and return its own data to the `getContext()` function. You must treat the identity-related information in the tab context as a hint and validate it before using. Refer to the notes in [navigate to the authorization page from your pop-up page](~/tabs/how-to/authentication/auth-tab-aad.md#navigate-to-the-authorization-page-from-your-pop-up-page).
+Although the tab context provides helpful information regarding the user, don't use this information to authenticate the user. Do authenticate the user even if you get the information as URL parameters to your tab content URL or by calling the `microsoftTeams.getContext()` function in the Microsoft Teams client SDK. A malicious actor can invoke your tab content URL with its own parameters. The actor can also invoke a web page impersonating Microsoft Teams to load your tab content URL in an iframe and return its own data to the `getContext()` function. You must treat the identity-related information in the tab context as a hint and validate it before using. Refer to the notes in [navigate to the authorization page from your pop-up page](~/tabs/how-to/authentication/auth-tab-aad.md#navigate-to-the-authorization-page-from-your-pop-up-page).
## Code sample
platform Auth Tab Aad https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/authentication/auth-tab-aad.md
keywords: teams authentication tabs Microsoft Azure Active Directory (Azure AD)
> [!Note] > For authentication to work for your tab on mobile clients, you need to ensure that you're using version 1.4.1 or later of the Teams JavaScript SDK.
-There are many services that you may want to consume inside your Teams app, and most of those services require authentication and authorization to get access to the service. Services include Facebook, Twitter, and Teams. Teams user profile information is stored in Azure AD using Microsoft Graph and this article will focus on authentication using Azure AD to get access to this information.
+There are many services that you may want to consume inside your Teams app, and most of those services require authentication and authorization to get access to the service. Services includes Facebook, Twitter, and Teams.
+Teams user profile information is stored in Azure AD using Microsoft Graph and this article will focus on authentication using Azure AD to get access to this information.
OAuth 2.0 is an open standard for authentication used by Azure AD and many other service providers. Understanding OAuth 2.0 is a prerequisite for working with authentication in Teams and Azure AD. The examples below use the OAuth 2.0 Implicit Grant flow with the goal of eventually reading the user's profile information from Azure AD and Microsoft Graph.
-The code in this article comes from the Teams sample app [Microsoft Teams tab authentication sample (Node)](https://github.com/OfficeDev/microsoft-teams-sample-complete-node). It contains a static tab that requests an access token for Microsoft Graph and shows the current user's basic profile information from Azure AD.
+The code in the article comes from the Teams sample app [Microsoft Teams tab authentication sample (Node)](https://github.com/OfficeDev/microsoft-teams-sample-complete-node). It contains a static tab that requests an access token for Microsoft Graph and shows the current user's basic profile information from Azure AD.
For general overview of authentication flow for tabs, see [Authentication flow in tabs](~/tabs/how-to/authentication/auth-flow-tab.md).
See the topic [Configure identity providers](~/concepts/authentication/configure
## Initiate authentication flow
-Authentication flow should be triggered by a user action. You should not open the authentication pop-up automatically because this is likely to trigger the browser's pop-up blocker as well as confuse the user.
+Authentication flow should be triggered by a user action. You shouldn't open the authentication pop-up automatically because this is likely to trigger the browser's pop-up blocker and confuse the user.
Add a button to your configuration or content page to enable the user to sign in when needed. This can be done in the tab [configuration](~/tabs/how-to/create-tab-pages/configuration-page.md) page or any [content](~/tabs/how-to/create-tab-pages/content-page.md) page.
-Azure AD, like most identity providers, does not allow its content to be placed in an iframe. This means that you will need to add a pop-up page to host the identity provider. In the following example this page is `/tab-auth/simple-start`. Use the `microsoftTeams.authenticate()` function of the Microsoft Teams client SDK to launch this page when your button is selected.
+Azure AD, like most identity providers, doesn't allow its content to be placed in an iframe. This means that you'll need to add a pop-up page to host the identity provider. In the following example, this page is `/tab-auth/simple-start`. Use the `microsoftTeams.authenticate()` function of the Microsoft Teams client SDK to launch this page when your button is selected.
```javascript microsoftTeams.authentication.authenticate({
microsoftTeams.authentication.authenticate({
## Navigate to the authorization page from your pop-up page
-When your pop-up page (`/tab-auth/simple-start`) is displayed the following code is run. The main goal of this page is to redirect to your identity provider so the user can sign in. This redirection could be done on the server side using HTTP 302, but in this case it is done on the client side using with a call to `window.location.assign()`. This also allows `microsoftTeams.getContext()` to be used to retrieve hinting information, which can be passed to Azure AD.
+When your pop-up page (`/tab-auth/simple-start`) is displayed, the following code is run. The main goal of this page is to redirect to your identity provider so the user can sign in. This redirection could be done on the server side using HTTP 302, but in this case it's done on the client side using with a call to `window.location.assign()`. This also allows `microsoftTeams.getContext()` to be used to retrieve hinting information, which can be passed to Azure AD.
```javascript microsoftTeams.getContext(function (context) {
After the user completes authorization, the user is redirected to the callback p
### Notes
-* See [get user context information](~/tabs/how-to/access-teams-context.md) for help building authentication requests and URLs. For example, you can use the user's login name as the `login_hint` value for Azure AD sign in, which means the user might need to type less. Remember that you should not use this context directly as proof of identity since an attacker could load your page in a malicious browser and provide it with any information they want.
+* See [get user context information](~/tabs/how-to/access-teams-context.md) for help building authentication requests and URLs. For example, you can use the user's login name as the `login_hint` value for Azure AD sign in, which means the user might need to type less. Remember that you shouldn't use this context directly as proof of identity since an attacker could load your page in a malicious browser and provide it with any information they want.
* Although the tab context provides useful information regarding the user, don't use this information to authenticate the user whether you get it as URL parameters to your tab content URL or by calling the `microsoftTeams.getContext()` function in the Microsoft Teams client SDK. A malicious actor could invoke your tab content URL with its own parameters, and a web page impersonating Microsoft Teams could load your tab content URL in an iframe and return its own data to the `getContext()` function. You should treat the identity-related information in the tab context simply as hints and validate them before use.
-* The `state` parameter is used to confirm that the service calling the callback URI is the service you called. If the `state` parameter in the callback does not match the parameter you sent during the call the return call is not verified and should be terminated.
-* It is not necessary to include the identity provider's domain in the `validDomains` list in the app's manifest.json file.
+* The `state` parameter is used to confirm that the service calling the callback URI is the service you called. If the `state` parameter in the callback doesn't match the parameter you sent during the call, then the return call isn't verified and should be terminated.
+* It isn't necessary to include the identity provider's domain in the `validDomains` list in the app's manifest.json file.
## The callback page
-In the last section you called the Azure AD authorization service and passed in user and app information so that Azure AD could present the user with its own monolithic authorization experience. Your app has no control over what happens in this experience. All it knows is what is returned when Azure AD calls the callback page that you provided (`/tab-auth/simple-end`).
+In the last section, you called the Azure AD authorization service and passed in user and app information so that Azure AD could present the user with its own monolithic authorization experience. Your app has no control over what happens in this experience. All it knows is what is returned when Azure AD calls the callback page that you provided (`/tab-auth/simple-end`).
-In this page you need to determine success or failure based on the information returned by Azure AD and call `microsoftTeams.authentication.notifySuccess()` or `microsoftTeams.authentication.notifyFailure()`. If the login was successful you will have access to service resources.
+In this page, you need to determine success or failure based on the information returned by Azure AD and call `microsoftTeams.authentication.notifySuccess()` or `microsoftTeams.authentication.notifyFailure()`. If the login was successful, you'll have access to service resources.
````javascript // Split the key-value pairs passed from Azure AD
This code parses the key-value pairs received from Azure AD in `window.location.
`NotifyFailure()` has the following predefined failure reasons: * `CancelledByUser` the user closed the pop-up window before completing the authentication flow.
-* `FailedToOpenWindow` the pop-up window could not be opened. When running Microsoft Teams in a browser, this typically means that the window was blocked by a pop-up blocker.
+* `FailedToOpenWindow` the pop-up window couldn't be opened. When running Microsoft Teams in a browser, this typically means that the window was blocked by a pop-up blocker.
If successful, you can refresh or reload the page and show content relevant to the now-authenticated user. If authentication fails, it displays an error message.
Your app can set its own session cookie so that the user need not sign in again
> * Chrome 80, scheduled for release in early 2020, introduces new cookie values and imposes cookie policies by default. It's recommended that you set the intended use for your cookies rather than rely on default browser behavior. *See* [SameSite cookie attribute (2020 update)](../../../resources/samesite-cookie-update.md). > * To get the correct token for Microsoft Teams Free and guest users, it is important that the apps use tenant specific endpoint `https://login.microsoftonline.com/**{tenantId}**`. You can get tenantId from the bot message or tab context. If the apps use `https://login.microsoftonline.com/common`, the users will get incorrect tokens and will log on to the "home" tenant instead of the tenant that they are currently signed into.
-For more information on Single Sign-On (SSO) see the article [Silent authentication](~/tabs/how-to/authentication/auth-silent-AAD.md).
+For more information on Single Sign-On (SSO), see the article [Silent authentication](~/tabs/how-to/authentication/auth-silent-AAD.md).
## Code sample
platform Content Page https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/create-tab-pages/content-page.md
# Create a content page for your tab
-A content page is a webpage that is rendered within the Teams client. These are part of:
+A content page is a webpage that is rendered within the Teams client, which is a part of:
* A personal-scoped custom tab: In this case, the content page is the first page the user encounters. * A channel or group custom tab: The content page is displayed after the user pins and configures the tab in the appropriate context. * A [task module](~/task-modules-and-cards/what-are-task-modules.md): You can create a content page and embed it as a webview inside a task module. The page is rendered inside the modal pop-up.
-This article is specific to using content pages as tabs; however the majority of the guidance here applies regardless of how the content page is presented to the user.
+This article is specific to using content pages as tabs; however most of the guidance here applies regardless of how the content page is presented to the user.
[!INCLUDE [sdk-include](~/includes/sdk-include.md)] ## Tab content and design guidelines
-Your tab's overall objective is to provide access to meaningful and engaging content that has practical value and an evident purpose. You must focus on making your tab design clean, navigation intuitive, and content immersive.
+Your tab's overall objective is to provide access to the meaningful and engaging content that has a practical value and an evident purpose.
-For more information, see [tab design guidelines](~/tabs/design/tabs.md) and [Microsoft Teams store validation guidelines](~/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines.md).
+You need to focus on making your tab design clean, navigation intuitive, and content immersive.For more information, see [tab design guidelines](~/tabs/design/tabs.md) and [Microsoft Teams store validation guidelines](~/concepts/deploy-and-publish/appsource/prepare/teams-store-validation-guidelines.md).
## Integrate your code with Teams
The [Teams client JavaScript SDK](~/tabs/how-to/using-teams-client-sdk.md) provi
### Deep links
-You can create deep links to entities in Teams. These are used to create links that navigate to content and information within your tab. For more information, see [create deep links to content and features in Teams](~/concepts/build-and-test/deep-links.md).
+You can create deep links to entities in Teams. They're used to create links that navigate to content and information within your tab. For more information, see [create deep links to content and features in Teams](~/concepts/build-and-test/deep-links.md).
### Task modules
-A task module is a modal pop-up experience that you can trigger from your tab. In a content page, you can use task modules to present forms for gathering additional information, displaying the details of an item in a list, or presenting the user with additional information. The task modules themselves can be additional content pages, or created completely using Adaptive Cards. For more information, see [using task modules in tabs](~/task-modules-and-cards/task-modules/task-modules-tabs.md).
+A task module is a modal pop-up experience that you can trigger from your tab. In a content page, use task modules to present forms for gathering additional information, displaying the details of an item in a list, or presenting the user with additional information. The task modules themselves can be additional content pages, or created completely using Adaptive Cards. For more information, see [using task modules in tabs](~/task-modules-and-cards/task-modules/task-modules-tabs.md).
### Valid domains
Starting with [manifest schema v1.7](../../../resources/schema/manifest-schema.m
> [!NOTE] >
-> * The behavior on mobile clients is not configurable through the native loading indicator property. Mobile clients show this indicator by default across content pages and iframe-based task modules. This indicator on mobile is shown when a request is made to fetch content and gets dismissed as soon as the request gets completed.
+> * The behavior on mobile clients isn't configurable through the native loading indicator property. Mobile clients show this indicator by default across content pages and iframe-based task modules. This indicator on mobile is shown when a request is made to fetch content and gets dismissed as soon as the request gets completed.
If you indicate `showLoadingIndicator : true` in your app manifest, then all tab configuration, content, removal pages, and all iframe-based task modules must follow these steps:
To show the loading indicator:
1. Add `"showLoadingIndicator": true` to your manifest. 1. Call `app.initialize();`.
-1. As a **mandatory** step, call `app.notifySuccess()` to notify Teams that your app has successfully loaded. Then, Teams hides the loading indicator, if applicable. If `notifySuccess` is not called within 30 seconds, Teams assumes that that your app timed out, and displays an error screen with a retry option.
-1. **Optionally**, if you're ready to print to the screen and wish to lazy load the rest of your application's content, you can hide the loading indicator manually by calling `app.notifyAppLoaded();`.
+1. As a **mandatory** step, call `app.notifySuccess()` to notify Teams that your app has successfully loaded. Then, Teams hides the loading indicator, if applicable. If `notifySuccess` is not called within 30 seconds, Teams assumes that your app timed out, and displays an error screen with a retry option.
+1. **Optionally**, if you're ready to print to the screen and wish to lazy load the rest of your application's content, you can hide the loading indicator manually by calling `app.notifyAppLoaded();`.
1. If your application doesn't load, you can call `app.notifyFailure({reason: app.FailedReason.Timeout, message: "failure message"});` to let Teams know about the failure and, optionally, provide a failure message. An error screen is shown to the user. The following code shows the enumeration that defines the possible reasons you can indicate for the application's failure to load: ```typescript
platform Removal Page https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/create-tab-pages/removal-page.md
You can extend and enhance the user experience by supporting removal and modific
## Enable your tab to be reconfigured after installation
-Your `manifest.json` defines your tab's features and capabilities. The tab instance `canUpdateConfiguration` property takes a Boolean value that indicates whether a user can modify or reconfigure the tab after it is created. The following table provides the property details:
+Your `manifest.json` defines your tab's features and capabilities. The tab instance `canUpdateConfiguration` property takes a Boolean value that indicates whether a user can modify or reconfigure the tab after it's created. The following table provides the property details:
|Name| Type| Maximum size | Required | Description| ||||||
When your tab is uploaded to a channel or group chat, Teams adds a right-click d
| -- | :-: | -- | -- | | Settings | √ | |The `configurationUrl` page is reloaded in an IFrame allowing the user to reconfigure the tab. | | Rename | √ | √ | The user can change the tab name as it appears in the tab bar. |
-| Remove | √ | √ | If the `removeURL` property and value are included in the **configuration page**, the **removal page** is loaded into an IFrame and presented to the user. If a removal page is not included, the user is presented with a confirm dialog box. |
+| Remove | √ | √ | If the `removeURL` property and value are included in the **configuration page**, the **removal page** is loaded into an IFrame and presented to the user. If a removal page isn't included, the user is presented with a confirm dialog box. |
## Create a tab removal page for your application
The `RemoveEvent` interface describes an object with two methods:
* The `notifySuccess()` function is required. It indicates that the removal of the underlying resource succeeded and its content can be removed.
-* The `notifyFailure(string)` function is optional. It indicates that removal of the underlying resource failed and its content cannot be removed. The optional string parameter specifies a reason for the failure. If provided, this string is displayed to the user; else a generic error is displayed.
+* The `notifyFailure(string)` function is optional. It indicates that removal of the underlying resource failed and its content can't be removed. The optional string parameter specifies a reason for the failure. If provided, this string is displayed to the user; else a generic error is displayed.
#### Use the `getConfig()` function
platform Developer Tools https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/developer-tools.md
keywords: devtools debug mobile chrome desktop client developer tools tab
# DevTools for Microsoft Teams tabs
-When Teams is running in a browser, it is easy to access the browser's DevTools: F12 on Windows or Command-Option-I on MacOS. The DevTools gives you access to:
+When Teams is running in a browser, it's easy to access the browser's DevTools: F12 on Windows or Command-Option-I on MacOS. The DevTools gives you access to:
1. View console logs. 1. View or modify HTML, CSS, and network requests during runtime.
platform Tabs In Sharepoint https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/tabs-in-sharepoint.md
You can also implement your Microsoft Teams tabs using SharePoint Framework. Sha
## Introduction
-The tab used here is already hosted on Azure, to focus on the required integration work.
+The tab used here's already hosted on Azure, to focus on the required integration work.
-The sample app that is being used is a Talent Management application. It manages the hiring process of candidates for open positions in a team. Build a sample Teams app and load it into Teams. Do not create a real talent management application.
+The sample app that is being used is a Talent Management application. It manages the hiring process of candidates for open positions in a team. Build a sample Teams app and load it into Teams. Don't create a real talent management application.
### Benefits of this approach
Download the [sample app manifest](https://github.com/MicrosoftDocs/msteams-docs
![upload a custom app](~/assets/images/tabs/tabs-in-sharepoint/upload-custom-app.png)
-1. The file to upload is located in your **Downloads** folder. It is called TalentMgmt-Azure.zip. The following image displays the corresponding screen:
+1. The file to upload is located in your **Downloads** folder. It's called TalentMgmt-Azure.zip. The following image displays the corresponding screen:
![TalentMgmt in Azure](~/assets/images/tabs/tabs-in-sharepoint/talentmgmt-azure.png)
The following image displays the corresponding screen:
1. You can see the SharePoint pages authoring experience. Name your page as **My Teams Tab**.
-1. Open the web part toolbox by selecting the `+` button, and select your Teams Tab, named **Contoso HR**. Web parts are sorted alphabetically. If it is a long list, you can use the search bar to find it. This creates a web part in the canvas that contains your Teams tab. The following image displays the tab view:
+1. Open the web part toolbox by selecting the `+` button, and select your Teams Tab, named **Contoso HR**. Web parts are sorted alphabetically. If it's a long list, you can use the search bar to find it. This creates a web part in the canvas that contains your Teams tab. The following image displays the tab view:
![Tab view](~/assets/images/tabs/tabs-in-sharepoint/image071.png)
platform Using Teams Client Sdk https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/using-teams-client-sdk.md
The Microsoft Teams JavaScript client SDK can help you create hosted experiences
* [Tabs](../../tabs/what-are-tabs.md) * [Dialogs (Task modules)](../../task-modules-and-cards/what-are-task-modules.md)
-Starting with version `2.0.0`, the existing Teams client SDK (`@microsoft/teams-js`, or simply `TeamsJS`) has been refactored to enable [Teams apps to run in Outlook and Office](/m365-apps/overview.md), in addition to Microsoft Teams. From a functional perspective, the latest version of TeamsJS supports all existing (v.1.x.x) Teams app functionality while adding the optional ability to host Teams apps in Outlook and Office.
+Starting with version `2.0.0`, the existing Teams client SDK (`@microsoft/teams-js`, or simply `TeamsJS`) has been refactored to enable [Teams apps to run in Outlook and Office](/microsoftteams/platform/m365-apps/overview), in addition to Microsoft Teams. From a functional perspective, the latest version of TeamsJS supports all existing (v.1.x.x) Teams app functionality while adding the optional ability to host Teams apps in Outlook and Office.
Here's the current versioning guidance for various app scenarios:
platform Tabs Link Unfurling https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/tabs-link-unfurling.md
ms.localizationpriority: medium
# Tabs link unfurling and Stage View
-Stage View is a new user interface (UI) component, which allows you to render the content that is opened in full screen in Teams and pinned as a tab.
+Stage View is a new user interface (UI) component. It allows you to render the content that is opened in full screen in Teams and pinned as a tab.
## Stage View
-Stage View is a full screen UI component that you can invoke to surface your web content. The existing link unfurling service is updated so that it is used to turn URLs into a tab using an Adaptive Card and Chat Services. When a user sends a URL in a chat or channel, the URL is unfurled to an Adaptive Card. The user can select **View** in the card, and pin the content as a tab directly from Stage View.
+Stage View is a full screen UI component that you can invoke to surface your web content. The existing link unfurling service is updated so that it's used to turn URLs into a tab using an Adaptive Card and Chat Services. When a user sends a URL in a chat or channel, the URL is unfurled to an Adaptive Card. The user can select **View** in the card, and pin the content as a tab directly from Stage View.
## Advantage of Stage View
https://teams.microsoft.com/l/stage/{appId}/0?context={"contentUrl":"contentUrl"
### Examples
-When a user enters a URL, it is unfurled into an Adaptive card.
+When a user enters a URL, it's unfurled into an Adaptive card.
Following are the deep link examples to invoke Stage View:
Following are the deep link examples to invoke Stage View:
Unencoded URL:
-https://teams.microsoft.com/l/stage/be411542-2bd5-46fb-8deb-a3d5f85156f6/0?context={"contentUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191","websiteUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191?standalone=true","title":"Quotes:Miscellaneous","threadId":"19:9UryYW9rjwnq-vwmBcexGjN1zQSNX0Y4oEAgtUC7WI81@thread.tacv2"}
+https://teams.microsoft.com/l/stage/be411542-2bd5-46fb-8deb-a3d5f85156f6/0?context={"contentUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191","websiteUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191?standalone=true","title":"Quotes: Miscellaneous","threadId":"19:9UryYW9rjwnq-vwmBcexGjN1zQSNX0Y4oEAgtUC7WI81@thread.tacv2"}
Encoded URL:
https://teams.microsoft.com/l/stage/be411542-2bd5-46fb-8deb-a3d5f85156f6/0?conte
Unencoded URL:
-https://teams.microsoft.com/l/stage/43f56af0-8615-49e6-9635-7bea3b5802c2/0?context={"contentUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191","websiteUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191?standalone=true","title":"Quotes:Miscellaneous"}
+https://teams.microsoft.com/l/stage/43f56af0-8615-49e6-9635-7bea3b5802c2/0?context={"contentUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191","websiteUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191?standalone=true","title":"Quotes: Miscellaneous"}
Encoded
platform Cards And Task Modules https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards-and-task-modules.md
You can add and respond to card actions that:
* Send messages and payload to the bot * Initiate OAuth flow
-You can provide [dynamic search](~/task-modules-and-cards/cards/dynamic-search.md) experience within a large dataset using type ahead control in Adaptive Cards and perform type-ahead static search within limited number of choices. You can invoke the task modules in channel or personal tabs, bots, or deep links. Your user's experience for any workflows that requires data input can be improved by adding a task module to the user's tab. You can invoke task modules from Teams bots using buttons on Adaptive Cards and Bot Framework cards.
+You can provide [dynamic search](~/task-modules-and-cards/cards/dynamic-search.md) experience within a large dataset using type ahead control in Adaptive Cards and perform type-ahead static search within limited number of choices. Invoke the task modules in channel or personal tabs, bots, or deep links. Your user's experience for any workflows that requires data input can be improved by adding a task module to the user's tab. You can invoke task modules from Teams bots using buttons on Adaptive Cards and Bot Framework cards.
## See also
platform Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/Universal-actions-for-adaptive-cards/Overview.md
ms.localizationpriority: medium
# Universal Actions for Adaptive Cards
-Universal Actions for Adaptive Cards evolved from developer feedback that even though layout and rendering for Adaptive Cards was universal, action handling was not. Even if a developer wanted to send the same card to different places, they have to handle actions differently.
+Universal Actions for Adaptive Cards evolved from developer feedback that even though layout and rendering for Adaptive Cards was universal, action handling wasn't. Even if a developer wanted to send the same card to different places, they have to handle actions differently.
-Universal Actions for Adaptive Cards brings the bot as the common backend for handling actions and introduces a new action type, `Action.Execute`, which works across apps, such as Teams and Outlook.
+Universal Actions for Adaptive Cards bring the bot as the common backend for handling actions and introduces a new action type, `Action.Execute`, which works across apps, such as Teams and Outlook.
This document helps you to understand how you can use Universal Actions model to enhance user experience of interacting with Adaptive Cards across platforms and applications.
This document helps you to understand how you can use Universal Actions model to
## Enhance user experiences with Universal Actions for Adaptive Cards
-Universal Actions for Adaptive Cards enhances user experience by enabling the following scenarios:
+Universal Actions for Adaptive Cards enhance user experience by enabling the following scenarios:
* [Universal Actions](#universal-actions) * [User Specific Views](#user-specific-views)
The following image depicts the Universal Actions for Adaptive Cards for both Te
### User Specific Views
-Today every user in the Teams chat or channel sees the exact same view and button actions on the Adaptive Card. However, in certain scenarios there is a requirement for certain users to act differently and have access to different information within the same chat or channel.
+Today every user in the Teams chat or channel sees the exact same view and button actions on the Adaptive Card. However, in certain scenarios there's a requirement for certain users to act differently and have access to different information within the same chat or channel.
For example, if you send an incident reporting card in a chat or channel, only the user who is assigned the incident must see a **Resolve** button. On the other hand, the incident creator must see an **Edit** button and all other users must only be able to view details of the incident. This is made possible by User Specific Views that is enabled by the `refresh` property.
For more information, see [sample for Sequential Workflow](Sequential-Workflows.
### Up to date views
-You can create Adaptive Cards that update automatically. For example, it can be an approval request sent by a user. After approval, the card must automatically display details about the request approval time and who approved the request. The refresh model enables you to provide such up to date views. The following image shows a multi-step approval flow and how the views for different users is shown.
+You can create Adaptive Cards that update automatically. For example, it can be an approval request sent by a user. After approval, the card must automatically display details about the request approval time and who approved the request. The refresh model enables you to provide such up to date views. The following image shows a multi-step approval flow and how the views for different users are shown.
:::image type="content" source="~/assets/images/adaptive-cards/universal-bots-up-to-date-views.png" alt-text="Up to date User Specific Views" lightbox="../../../assets/images/adaptive-cards/universal-bots-up-to-date-views.png":::
Now, you can understand how Adaptive Cards can be transformed with the new Unive
## Adaptive Cards and the new Universal Actions model
-Adaptive Cards are a combination of content, such as text and graphics, and actions that can be performed by a user. For more information, see [Adaptive Cards](http://adaptivecards.io/). The new Universal Actions for Adaptive Cards enables a common handling of the Adaptive Card actions across platforms and applications. For more information, see [Universal Action Model](/adaptive-cards/authoring-cards/universal-action-model).
+Adaptive Cards are a combination of content, such as text and graphics, and actions that can be performed by a user. For more information, see [Adaptive Cards](http://adaptivecards.io/). The new Universal Actions for Adaptive Cards enable a common handling of the Adaptive Card actions across platforms and applications. For more information, see [Universal Action Model](/adaptive-cards/authoring-cards/universal-action-model).
You can get started by updating scenarios using the [quick start guide](Work-with-universal-actions-for-adaptive-cards.md) and leverage Universal Actions.
platform Cards Actions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/cards-actions.md
Cards used by bots and message extensions in Teams support the following activit
| `openUrl` | Opens a URL in the default browser. | | `messageBack` | Sends a message and payload to the bot from the user who selected the button or tapped the card. Sends a separate message to the chat stream. | | `imBack`| Sends a message to the bot from the user who selected the button or tapped the card. This message from user to bot is visible to all conversation participants. |
-| `invoke` | Sends a message and payload to the bot from the user who selected the button or tapped the card. This message is not visible. |
+| `invoke` | Sends a message and payload to the bot from the user who selected the button or tapped the card. This message isn't visible. |
| `signin` | Initiates OAuth flow, allowing bots to connect with secure services. | > [!NOTE]
With `messageBack`, you can create a fully customized action with the following
| Property | Description | | | | | `title` | Appears as the button label. |
-| `displayText` | Optional. Used by the user in the chat stream when the action is performed. This text is not sent to your bot. |
+| `displayText` | Optional. Used by the user in the chat stream when the action is performed. This text isn't sent to your bot. |
| `value` | Sent to your bot when the action is performed. You can encode context for the action, such as unique identifiers or a JSON object. | | `text` | Sent to your bot when the action is performed. Use this property to simplify bot development. Your code can check a single top-level property to dispatch bot logic. |
-The flexibility of `messageBack` means that your code cannot leave a visible user message in the history simply by not using `displayText`.
+The flexibility of `messageBack` means that your code can't leave a visible user message in the history simply by not using `displayText`.
# [JSON](#tab/json)
Adaptive Cards support four action types:
* [Action.ShowCard](http://adaptivecards.io/explorer/Action.ShowCard.html) * [Action.Execute](/adaptive-cards/authoring-cards/universal-action-model#actionexecute)
-You can also modify the Adaptive Card `Action.Submit` payload to support existing Bot Framework actions using an `msteams` property in the `data` object of `Action.Submit`. The next section provide details on how to use existing Bot Framework actions with Adaptive Cards.
+You can also modify the Adaptive Card `Action.Submit` payload to support existing Bot Framework actions using an `msteams` property in the `data` object of `Action.Submit`. The next section provides details on how to use existing Bot Framework actions with Adaptive Cards.
> [!NOTE] > Adding `msteams` to data with a Bot Framework action does not work with an Adaptive Card task module.
To include a `messageBack` action with an Adaptive Card include the following de
| Property | Description | | | | | `type` | Set to `messageBack`. |
-| `displayText` | Optional. Used by the user in the chat stream when the action is performed. This text is not sent to your bot. |
+| `displayText` | Optional. Used by the user in the chat stream when the action is performed. This text isn't sent to your bot. |
| `value` | Sent to your bot when the action is performed. You can encode context for the action, such as unique identifiers or a JSON object. | | `text` | Sent to your bot when the action is performed. Use this property to simplify bot development. Your code can check a single top-level property to dispatch bot logic. |
platform Cards Reference https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/cards-reference.md
# Types of cards
-Adaptive, hero, list, Office 365 Connector, receipt, signin, and thumbnail cards and card collections are supported in bots for Microsoft Teams. They are based on cards defined by the Bot Framework, but Teams does not support all Bot Framework cards and has added some of its own.
+Adaptive, hero, list, Office 365 Connector, receipt, signin, and thumbnail cards and card collections are supported in bots for Microsoft Teams. They're based on cards defined by the Bot Framework, but Teams doesn't support all Bot Framework cards and has added some of its own.
Before you identify the different card types, understand how to create a hero card, thumbnail card, or Adaptive Card.
You can go through some common properties that are applicable to all cards.
### Inline card images
-The card can contain an inline image by including a link to the publicly available image. For performance purposes, it is highly recommended you host the image on a public Content Delivery Network (CDN).
+The card can contain an inline image by including a link to the publicly available image. For performance purposes, it's highly recommended you host the image on a public Content Delivery Network (CDN).
Images are scaled up or down in size to maintain the aspect ratio for covering the image area. Images are then cropped from center to achieve the appropriate aspect ratio for the card.
-Images must be at most 1024×1024 and in PNG, JPEG, or GIF format. Animated GIF is not supported.
+Images must be at most 1024×1024 and in PNG, JPEG, or GIF format. Animated GIF isn't supported.
The following table provides the properties of inline card images:
The following table provides the properties of inline card images:
### Buttons
-Buttons are shown stacked at the bottom of the card. Button text is always on a single line and is truncated if the text exceeds the button width. Any additional buttons beyond the maximum number supported by the card are not shown.
+Buttons are shown stacked at the bottom of the card. Button text is always on a single line and is truncated if the text exceeds the button width. Any additional buttons beyond the maximum number supported by the card aren't shown.
For more information, see [card actions](~/task-modules-and-cards/cards/cards-actions.md).
To specify the rendering style for `activityImage`, you can set `activityImageTy
| `avatar` | Default, `activityImage` is cropped as a circle. | | `article` | `activityImage` is displayed as a rectangle and retains its aspect ratio. |
-For all other details about connector card properties, see [actionable message card reference](/outlook/actionable-messages/card-reference). The only connector card properties that Teams does not currently support are as follows:
+For all other details about connector card properties, see [actionable message card reference](/outlook/actionable-messages/card-reference). The only connector card properties that Teams doesn't currently support are as follows:
* `heroImage` * `hideOriginalBody`
The following code shows an example of an Office 365 Connector card:
## Receipt card
-Teams supports receipt card. It is a card that enables a bot to provide a receipt to the user. It typically contains the list of items to include on the receipt, such as tax and total information.
+Teams supports receipt card, which enables a bot to provide a receipt to the user. It typically contains the list of items to include on the receipt, such as tax and total information.
### Support for receipt cards
A list can display a maximum of ten cards per message.
## Cards not supported in Teams
-The following cards are implemented by the Bot Framework, but are not supported by Teams:
+The following cards are implemented by the Bot Framework, but aren't supported by Teams:
* Animation cards * Audio cards
platform Invoking Task Modules https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/task-modules/invoking-task-modules.md
ms.localizationpriority: medium
# Invoke and dismiss task modules
-Task modules can be invoked from tabs, bots, or deep links. The response can be either in HTML, JavaScript, or as an Adaptive Card. There is a lot of flexibility in terms of how task modules are invoked and how to deal with the response of the user's interaction. The following table summarizes how this works:
+Task modules can be invoked from tabs, bots, or deep links. The response can be either in HTML, JavaScript, or as an Adaptive Card. There's a numerous flexibilities in terms of how task modules are invoked and how to deal with the response of the user's interaction. The following table summarizes how this works:
| Invoked using | Task module with HTML or JavaScript | Task module with Adaptive Card | | | | | | JavaScript in a tab | 1. Use the Teams client SDK function `tasks.startTask()` with an optional `submitHandler(err, result)` callback function. <br/><br/> 2. In the task module code, when the user has performed the actions, call the Teams SDK function `tasks.submitTask()` with a `result` object as a parameter. If a `submitHandler` callback was specified in `tasks.startTask()`, Teams calls it with `result` as a parameter. If there was an error when invoking `tasks.startTask()`, the `submitHandler` function is called with an `err` string instead. <br/><br/> 3. You can also specify a `completionBotId` when calling `teams.startTask()`. Then the `result` is sent to the bot instead. | 1. Call the Teams client SDK function `tasks.startTask()` with a [TaskInfo object](#the-taskinfo-object) and `TaskInfo.card` containing the JSON for the Adaptive Card to show in the task module pop-up. <br/><br/> 2. If a `submitHandler` callback was specified in `tasks.startTask()`, Teams calls it with an `err` string, if there was an error when invoking `tasks.startTask()` or if the user closes the task module pop-up using the X at the upper right. <br/><br/> 3. If the user presses an `Action.Submit` button then its `data` object is returned as the value of `result`. |
-| Bot card button | 1. Bot card buttons, depending on the type of button, can invoke task modules in two ways, a deep link URL or by sending a `task/fetch` message. <br/><br/> 2. If the button's action `type` is `task/fetch` that is `Action.Submit` button type for Adaptive Cards, a `task/fetch invoke` event that is an HTTP POST is sent to the bot. The bot responds to the POST with HTTP 200 and the response body containing a wrapper around the [TaskInfo object](#the-taskinfo-object). For more information, see [invoking a task module using `task/fetch`](~/task-modules-and-cards/task-modules/task-modules-bots.md#invoke-a-task-module-using-taskfetch). Teams displays the task module. <br/><br/> 3. After the user has performed the actions, call the Teams SDK function `tasks.submitTask()` with a `result` object as a parameter. The bot receives a `task/submit invoke` message that contains the `result` object. <br/><br/> 4. You have three different ways to respond to the `task/submit` message, by doing nothing that is the task completed successfully, by displaying a message to the user in a pop-up window, or by invoking another task module window. For more information, see [detailed discussion on `task/submit`](~/task-modules-and-cards/task-modules/task-modules-bots.md#the-flexibility-of-tasksubmit). | <ul><li> Like buttons on Bot Framework cards, buttons on Adaptive Cards support two ways of invoking task modules, deep link URLs with `Action.openUrl` buttons, and `task/fetch` using `Action.Submit` buttons. </li></ul> <br/><br/> <ul><li> Task modules with Adaptive Cards work very similarly to the HTML or JavaScript case. The major difference is that since there is no JavaScript when you are using Adaptive Cards, there is no way to call `tasks.submitTask()`. Instead, Teams takes the `data` object from `Action.Submit` and returns it as the payload of the `task/submit` event. For more information, see [flexibility of `task/submit`](~/task-modules-and-cards/task-modules/task-modules-bots.md#the-flexibility-of-tasksubmit). </li></ul> |
-| Deep link URL <br/>[URL syntax](#task-module-deep-link-syntax) | 1. Teams invokes the task module that is the URL that appears inside the `<iframe>` specified in the `url` parameter of the deep link. There is no `submitHandler` callback. <br/><br/> 2. Within the JavaScript of the page in the task module, call `tasks.submitTask()` to close it with a `result` object as a parameter, the same as when invoking it from a tab or a bot card button. However, completion logic is slightly different. If your completion logic resides on the client that is if there is no bot, there is no `submitHandler` callback, so any completion logic must be in the code preceding the call to `tasks.submitTask()`. Invocation errors are only reported through the console. If you have a bot, then you can specify a `completionBotId` parameter in the deep link to send the `result` object through a `task/submit` event. | 1. Teams invokes the task module that is the JSON card body of the Adaptive Card that is specified as a URL-encoded value of the `card` parameter of the deep link. <br/><br/> 2. The user closes the task module by selecting the X at the upper right of the task module or by pressing an `Action.Submit` button on the card. Since there is no `submitHandler` to call, the user must have a bot to send the value of the Adaptive Card fields. The user must use the `completionBotId` parameter in the deep link to specify the bot to send the data to using a `task/submit invoke` event. |
+| Bot card button | 1. Bot card buttons, depending on the type of button, can invoke task modules in two ways, a deep link URL or by sending a `task/fetch` message. <br/><br/> 2. If the button's action `type` is `task/fetch` that is `Action.Submit` button type for Adaptive Cards, a `task/fetch invoke` event that is an HTTP POST is sent to the bot. The bot responds to the POST with HTTP 200 and the response body containing a wrapper around the [TaskInfo object](#the-taskinfo-object). For more information, see [invoking a task module using `task/fetch`](~/task-modules-and-cards/task-modules/task-modules-bots.md#invoke-a-task-module-using-taskfetch). Teams displays the task module. <br/><br/> 3. After the user has performed the actions, call the Teams SDK function `tasks.submitTask()` with a `result` object as a parameter. The bot receives a `task/submit invoke` message that contains the `result` object. <br/><br/> 4. You have three different ways to respond to the `task/submit` message, by doing nothing that is the task completed successfully, by displaying a message to the user in a pop-up window, or by invoking another task module window. For more information, see [detailed discussion on `task/submit`](~/task-modules-and-cards/task-modules/task-modules-bots.md#the-flexibility-of-tasksubmit). | <ul><li> Like buttons on Bot Framework cards, buttons on Adaptive Cards support two ways of invoking task modules, deep link URLs with `Action.openUrl` buttons, and `task/fetch` using `Action.Submit` buttons. </li></ul> <br/><br/> <ul><li> Task modules with Adaptive Cards work similarly to the HTML or JavaScript case. The major difference is that since there's no JavaScript when you're using Adaptive Cards, there's no way to call `tasks.submitTask()`. Instead, Teams takes the `data` object from `Action.Submit` and returns it as the payload of the `task/submit` event. For more information, see [flexibility of `task/submit`](~/task-modules-and-cards/task-modules/task-modules-bots.md#the-flexibility-of-tasksubmit). </li></ul> |
+| Deep link URL <br/>[URL syntax](#task-module-deep-link-syntax) | 1. Teams invokes the task module that is the URL that appears inside the `<iframe>` specified in the `url` parameter of the deep link. There's no `submitHandler` callback. <br/><br/> 2. Within the JavaScript of the page in the task module, call `tasks.submitTask()` to close it with a `result` object as a parameter, the same as when invoking it from a tab or a bot card button. However, completion logic is slightly different. If your completion logic resides on the client that is if there's no bot, there's no `submitHandler` callback, so any completion logic must be in the code preceding the call to `tasks.submitTask()`. Invocation errors are only reported through the console. If you have a bot, then you can specify a `completionBotId` parameter in the deep link to send the `result` object through a `task/submit` event. | 1. Teams invokes the task module that is the JSON card body of the Adaptive Card that is specified as a URL-encoded value of the `card` parameter of the deep link. <br/><br/> 2. The user closes the task module by selecting the X at the upper right of the task module or by pressing an `Action.Submit` button on the card. Since there's no `submitHandler` to call, the user must have a bot to send the value of the Adaptive Card fields. The user must use the `completionBotId` parameter in the deep link to specify the bot to send the data to using a `task/submit invoke` event. |
The next section specifies the `TaskInfo` object that defines certain attributes for a task module.
The `TaskInfo` object contains the metadata for a task module. Define the `url`
| `width` | number or string | This attribute can be a number representing the task module's width in pixels, or `small`, `medium`, or `large`. For more information, see [task module sizing](#task-module-sizing). | | `url` | string | This attribute is the URL of the page loaded as an `<iframe>` inside the task module. The URL's domain must be in the app's [validDomains array](~/resources/schem#validdomains) in your app's manifest. | | `card` | Adaptive Card or Adaptive Card bot card attachment | This attribute is the JSON for the Adaptive Card to appear in the task module. If the user is invoking from a bot, use the Adaptive Card JSON in a Bot Framework `attachment` object. From a tab, the user must use an Adaptive Card. For more information, see [Adaptive Card or Adaptive Card bot card attachment](#adaptive-card-or-adaptive-card-bot-card-attachment) |
-| `fallbackUrl` | string | This attribute opens the URL in a browser tab, if a client does not support the task module feature. |
+| `fallbackUrl` | string | This attribute opens the URL in a browser tab, if a client doesn't support the task module feature. |
| `completionBotId` | string | This attribute specifies a bot App ID to send the result of the user's interaction with the task module. If specified, the bot receives a `task/submit invoke` event with a JSON object in the event payload. | > [!NOTE]
The next section specifies task module sizing that enables the user to set the h
## Task module sizing
-Using integers for `TaskInfo.width` and `TaskInfo.height`, sets the height and width of the task module in pixels. However, depending on the size of the Team's window and screen resolution they are reduced proportionally while maintaining the aspect ratio that is width or height.
+Using integers for `TaskInfo.width` and `TaskInfo.height`, sets the height and width of the task module in pixels. However, depending on the size of the Team's window and screen resolution they're reduced proportionally while maintaining the aspect ratio that is width or height.
If `TaskInfo.width` and `TaskInfo.height` are `"small"`, `"medium"`, or `"large"`, the size of the red rectangle in the following image is a proportion of the available space, 20%, 50%, and 60% for `width` and 20%, 50%, and 66% for `height`:
HTML or JavaScript-based task modules have access to the entire area of the task
### Example 1: YouTube video
-YouTube offers the ability to embed videos on web pages. It is easy to embed videos on web pages in a task module using a simple stub web page.
+YouTube offers the ability to embed videos on web pages. It's easy to embed videos on web pages in a task module using a simple stub web page.
:::image type="content" source="../../assets/images/task-module/youtube-example.png" alt-text="Youtube example":::
The next section provides details on invoking your card using Adaptive Card or A
## Adaptive Card or Adaptive Card bot card attachment
-Depending on how you are invoking your `card`, you must use either an Adaptive Card or an Adaptive Card bot card attachment, which is an Adaptive Card wrapped in an attachment object.
+Depending on how you're invoking your `card`, you must use either an Adaptive Card or an Adaptive Card bot card attachment, which is an Adaptive Card wrapped in an attachment object.
-When you are invoking from a tab, the user must use an Adaptive Card.
+When you're invoking from a tab, the user must use an Adaptive Card.
The following code provides an example of an Adaptive Card:
The following code provides an example of an Adaptive Card:
} ```
-The following code provides an example of an Adaptive Card bot card attachment when you are invoking from a bot:
+The following code provides an example of an Adaptive Card bot card attachment when you're invoking from a bot:
```json {
The following table provides information on `APP_ID` and `BOT_APP_ID`:
| Value | Type | Required | Description | | | | | |
-| `APP_ID` | string | Yes | The [ID](~/resources/schem#validdomains) in the manifest for `APP_ID` must contain the domain for `url` if `url` is in the URL. The app ID is already known when a task module is invoked from a tab or a bot, which is why it is not included in `TaskInfo`. |
-| `BOT_APP_ID` | string | No | If a value for `completionBotId` is specified, the `result` object is sent using a `task/submit invoke` message to the specified bot. `BOT_APP_ID` must be specified as a bot in the app's manifest, that is you cannot send it to any bot. |
+| `APP_ID` | string | Yes | The [ID](~/resources/schem#validdomains) in the manifest for `APP_ID` must contain the domain for `url` if `url` is in the URL. The app ID is already known when a task module is invoked from a tab or a bot, which is why it isn't included in `TaskInfo`. |
+| `BOT_APP_ID` | string | No | If a value for `completionBotId` is specified, the `result` object is sent using a `task/submit invoke` message to the specified bot. `BOT_APP_ID` must be specified as a bot in the app's manifest, that is you can't send it to any bot. |
> [!NOTE] > `APP_ID` and `BOT_APP_ID` can be the same in many cases, if an app has a recommended bot to use as an app's ID if there is one.
platform Task Modules Bots https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/task-modules/task-modules-bots.md
keywords: task modules teams bots deep links adaptive card
# Use task modules from bots
-Task modules can be invoked from Microsoft Teams bots using buttons on Adaptive Cards and Bot Framework cards that is hero, thumbnail, and Office 365 Connector. Task modules are often a better user experience than multiple conversation steps. Keep track of bot state and allow the user to interrupt or cancel the sequence.
+Task modules can be invoked from Microsoft Teams bots using buttons on Adaptive Cards and Bot Framework cards that are hero, thumbnail, and Office 365 Connector. Task modules are often a better user experience than multiple conversation steps. Keep track of bot state and allow the user to interrupt or cancel the sequence.
There are two ways of invoking task modules:
-* A new kind of invoke message `task/fetch`: Using the `invoke` [card action](~/task-modules-and-cards/cards/cards-actions.md#action-type-invoke) for Bot Framework cards, or the `Action.Submit` [card action](~/task-modules-and-cards/cards/cards-actions.md#adaptive-cards-actions) for Adaptive cards, with `task/fetch`, task module either a URL or an Adaptive Card, is fetched dynamically from your bot.
+* A new invoke message `task/fetch`: Using the `invoke` [card action](~/task-modules-and-cards/cards/cards-actions.md#action-type-invoke) for Bot Framework cards, or the `Action.Submit` [card action](~/task-modules-and-cards/cards/cards-actions.md#adaptive-cards-actions) for Adaptive cards, with `task/fetch`, task module either a URL or an Adaptive Card, is fetched dynamically from your bot.
* Deep link URLs: Using the [deep link syntax for task modules](~/task-modules-and-cards/task-modules/invoking-task-modules.md#task-module-deep-link-syntax), you can use the `openUrl` [card action](~/task-modules-and-cards/cards/cards-actions.md#action-type-openurl) for Bot Framework cards or the `Action.OpenUrl` [card action](~/task-modules-and-cards/cards/cards-actions.md#adaptive-cards-actions) for Adaptive Cards, respectively. With deep link URLs, the task module URL or Adaptive Card body is already known to avoid a server round-trip relative to `task/fetch`. > [!IMPORTANT]
The next section provides details on invoking a task module using `task/fetch`.
## Invoke a task module using task/fetch
-When the `value` object of the `invoke` card action or `Action.Submit` is initialized and when a user selects the button, an `invoke` message is sent to the bot. In the HTTP response to the `invoke` message, there is a [TaskInfo object](~/task-modules-and-cards/task-modules/invoking-task-modules.md#the-taskinfo-object) embedded in a wrapper object, which Teams uses to display the task module.
+When the `value` object of the `invoke` card action or `Action.Submit` is initialized and when a user selects the button, an `invoke` message is sent to the bot. In the HTTP response to the `invoke` message, there's a [TaskInfo object](~/task-modules-and-cards/task-modules/invoking-task-modules.md#the-taskinfo-object) embedded in a wrapper object, which Teams uses to display the task module.
:::image type="content" source="../../assets/images/task-module/task-module-invoke-request-response.png" alt-text="task/fetch request or response":::
-The following steps provides the invoke task module using task/fetch:
+The following steps provide the invoke task module using task/fetch:
1. This image shows a Bot Framework hero card with a **Buy** `invoke` [card action](~/task-modules-and-cards/cards/cards-actions.md#action-type-invoke). The value of the `type` property is `task/fetch` and the rest of the `value` object can be of your choice. 1. The bot receives the `invoke` HTTP POST message.
The next section provides details on submitting the result of a task module.
When the user is finished with the task module, submitting the result back to the bot is similar to the way it works with tabs. For more information, see [example of submitting the result of a task module](~/task-modules-and-cards/task-modules/task-modules-tabs.md#example-of-submitting-the-result-of-a-task-module). There are a few differences as follows:
-* HTML or JavaScript that is `TaskInfo.url`: Once you have validated what the user has entered, you call the `microsoftTeams.tasks.submitTask()` SDK function referred to hereafter as `submitTask()` for readability purposes. You can call `submitTask()` without any parameters if you want Teams to close the task module, but you must pass an object or a string to your `submitHandler`. Pass it as the first parameter, `result`. Teams invokes `submitHandler`, `err` is `null`, and `result` is the object or string you passed to `submitTask()`. If you call `submitTask()` with a `result` parameter, you must pass an `appId` or an array of `appId` strings. This allows Teams to validate that the app sending the result is the same one which invoked the task module. Your bot receives a `task/submit` message including `result`. For more information, see [payload of `task/fetch` and `task/submit` messages](#payload-of-taskfetch-and-tasksubmit-messages).
+* HTML or JavaScript that is `TaskInfo.url`: Once you've validated what the user has entered, you call the `microsoftTeams.tasks.submitTask()` SDK function referred to hereafter as `submitTask()` for readability purposes. You can call `submitTask()` without any parameters if you want Teams to close the task module, but you must pass an object or a string to your `submitHandler`. Pass it as the first parameter, `result`. Teams invokes `submitHandler`, `err` is `null`, and `result` is the object or string you passed to `submitTask()`. If you call `submitTask()` with a `result` parameter, you must pass an `appId` or an array of `appId` strings. This allows Teams to validate that the app sending the result is the same one, which invoked the task module. Your bot receives a `task/submit` message including `result`. For more information, see [payload of `task/fetch` and `task/submit` messages](#payload-of-taskfetch-and-tasksubmit-messages).
* Adaptive Card that is `TaskInfo.card`: The Adaptive Card body as filled in by the user is sent to the bot through a `task/submit` message when the user selects any `Action.Submit` button. The next section provides details on the flexibility of `task/submit`.
When the user finishes with a task module invoked from a bot, the bot always rec
| HTTP body response | Scenario | | | |
-| None ignore the `task/submit` message | The simplest response is no response at all. Your bot is not required to respond when the user is finished with the task module. |
+| None ignore the `task/submit` message | The simplest response is no response at all. Your bot isn't required to respond when the user is finished with the task module. |
| <pre>{<br/> "task": {<br/> "type": "message",<br/> "value": "Message text"<br/> }<br/>}</pre> | Teams displays the value of `value` in a pop-up message box. | | <pre>{<br/> "task": {<br/> "type": "continue",<br/> "value": &lt;TaskInfo object&gt;<br/> }<br/>}</pre> | Allows you to chain sequences of Adaptive Cards together in a wizard or multi-step experience. |
This section defines the schema of what your bot receives when it receives a `ta
| -- | | | `type` | Is always `invoke`. | | `name` | Is either `task/fetch` or `task/submit`. |
-| `value` | Is the developer-defined payload. The structure of the `value` object is the same as what is sent from Teams. In this case, however, it is different. It requires support for dynamic fetch that is `task/fetch` from both Bot Framework, which is `value` and Adaptive Card `Action.Submit` actions, which is `data`. A way to communicate Teams `context` to the bot is required in addition to what is included in `value` or `data`.<br/><br/>Combine 'value' and 'data' into a parent object:<br/><br/><pre>{<br/> "context": {<br/> "theme": "default" &vert; "dark" &vert; "contrast",<br/> },<br/> "data": [value field from Bot Framework card] &vert; [data field from Adaptive Card] <br/>}</pre> |
+| `value` | Is the developer-defined payload. The structure of the `value` object is the same as what is sent from Teams. In this case, however, it's different. It requires support for dynamic fetch that is `task/fetch` from both Bot Framework, which is `value` and Adaptive Card `Action.Submit` actions, which is `data`. A way to communicate Teams `context` to the bot is required in addition to what is included in `value` or `data`.<br/><br/>Combine 'value' and 'data' into a parent object:<br/><br/><pre>{<br/> "context": {<br/> "theme": "default" &vert; "dark" &vert; "contrast",<br/> },<br/> "data": [value field from Bot Framework card] &vert; [data field from Adaptive Card] <br/>}</pre> |
The next section provides an example of receiving and responding to `task/fetch` and `task/submit` invoke messages in Node.js.
private static void SetTaskInfo(TaskModuleTaskInfo taskInfo, UISettings uIConsta
### Bot Framework card actions vs. Adaptive Card Action.Submit actions
-The schema for Bot Framework card actions is different from Adaptive Card `Action.Submit` actions and the way to invoke task modules is also different. The `data` object in `Action.Submit` contains an `msteams` object so it does not interfere with other properties in the card. The following table shows an example of each card action:
+The schema for Bot Framework card actions is different from Adaptive Card `Action.Submit` actions and the way to invoke task modules is also different. The `data` object in `Action.Submit` contains an `msteams` object so it doesn't interfere with other properties in the card. The following table shows an example of each card action:
| Bot Framework card action | Adaptive Card Action.Submit action | | | |
platform Task Modules Tabs https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/task-modules/task-modules-tabs.md
You can see how invoking a task module from a tab and submitting the result of a
To invoke a task module from a tab use `microsoftTeams.tasks.startTask()` passing a [TaskInfo object](~/task-modules-and-cards/task-modules/invoking-task-modules.md#the-taskinfo-object) and an optional `submitHandler` callback function. There are two cases to consider:
-* The value of `TaskInfo.url` is set to a URL. The task module window appears and `TaskModule.url` is loaded as an `<iframe>` inside it. JavaScript on that page calls `microsoftTeams.initialize()`. If there is a `submitHandler` function on the page and there is an error when invoking `microsoftTeams.tasks.startTask()`, then `submitHandler` is invoked with `err` set to the error string indicating the same. For more information, see [task module invocation errors](#task-module-invocation-errors).
-* The value of `taskInfo.card` is the [JSON for an Adaptive Card](~/task-modules-and-cards/task-modules/invoking-task-modules.md#adaptive-card-or-adaptive-card-bot-card-attachment). There is no JavaScript `submitHandler` function to call when the user closes or presses a button on the Adaptive Card. The only way to receive what the user entered is by passing the result to a bot. To use an Adaptive Card task module from a tab, your app must include a bot to get any response from the user.
+* The value of `TaskInfo.url` is set to a URL. The task module window appears and `TaskModule.url` is loaded as an `<iframe>` inside it. JavaScript on that page calls `microsoftTeams.initialize()`. If there's a `submitHandler` function on the page and there's an error when invoking `microsoftTeams.tasks.startTask()`, then `submitHandler` is invoked with `err` set to the error string indicating the same. For more information, see [task module invocation errors](#task-module-invocation-errors).
+* The value of `taskInfo.card` is the [JSON for an Adaptive Card](~/task-modules-and-cards/task-modules/invoking-task-modules.md#adaptive-card-or-adaptive-card-bot-card-attachment). There's no JavaScript `submitHandler` function to call when the user closes or presses a button on the Adaptive Card. The only way to receive what the user entered is by passing the result to a bot. To use an Adaptive Card task module from a tab, your app must include a bot to get any response from the user.
The next section gives an example of invoking a task module.
submitHandler = (err, result) => {
microsoftTeams.tasks.startTask(taskInfo, submitHandler); ```
-The `submitHandler` is very simple and it echoes the value of `err` or `result` to the console.
+The `submitHandler` is simple and it echoes the value of `err` or `result` to the console.
## Submit the result of a task module
-The `submitHandler` function resides in the `TaskInfo.url` web page and is used with `TaskInfo.url`. If there is an error when invoking the task module, your `submitHandler` function is immediately invoked with an `err` string indicating what [error occurred](#task-module-invocation-errors). The `submitHandler` function is also called with an `err` string when the user selects X at the upper right of the task module to close it.
+The `submitHandler` function resides in the `TaskInfo.url` web page and is used with `TaskInfo.url`. If there's an error when invoking the task module, your `submitHandler` function is immediately invoked with an `err` string indicating what [error occurred](#task-module-invocation-errors). The `submitHandler` function is also called with an `err` string when the user selects X at the upper right of the task module to close it.
-If there is no invocation error and the user does not select X to dismiss it, the user chooses a button when finished. Depending on whether it is a URL or an Adaptive Card in the task module, the next sections provide details on what occurs.
+If there's no invocation error and the user doesn't select X to dismiss it, the user chooses a button when finished. Depending on whether it's a URL or an Adaptive Card in the task module, the next sections provide details on what occurs.
### HTML or JavaScript `TaskInfo.url`
Pass your result as the first parameter. Teams invokes `submitHandler` where `er
### Adaptive Card `TaskInfo.card`
-When you invoke the task module with a `submitHandler` and the user selects an `Action.Submit` button, the values in the card are returned as the value of `result`. If the user selects the Esc key or X at the top right, `err` is returned instead. If your app contains a bot in addition to a tab, you can simply include the `appId` of the bot as the value of `completionBotId` in the `TaskInfo` object. The Adaptive Card body as filled in by the user is sent to the bot using a `task/submit invoke` message when the user selects an `Action.Submit` button. The schema for the object you receive is very similar to [the schema you receive for task/fetch and task/submit messages](~/task-modules-and-cards/task-modules/task-modules-bots.md#payload-of-taskfetch-and-tasksubmit-messages). The only difference is that the schema of the JSON object is an Adaptive Card object as opposed to an object containing an Adaptive Card object as [when Adaptive cards are used with bots](~/task-modules-and-cards/task-modules/task-modules-bots.md#payload-of-taskfetch-and-tasksubmit-messages).
+When you invoke the task module with a `submitHandler` and the user selects an `Action.Submit` button, the values in the card are returned as the value of `result`. If the user selects the Esc key or X at the top right, `err` is returned instead. If your app contains a bot in addition to a tab, you can include the `appId` of the bot as the value of `completionBotId` in the `TaskInfo` object. The Adaptive Card body as filled in by the user is sent to the bot using a `task/submit invoke` message when the user selects an `Action.Submit` button. The schema for the object you receive is similar to [the schema you receive for task/fetch and task/submit messages](~/task-modules-and-cards/task-modules/task-modules-bots.md#payload-of-taskfetch-and-tasksubmit-messages). The only difference is that the schema of the JSON object is an Adaptive Card object as opposed to an object containing an Adaptive Card object as [when Adaptive cards are used with bots](~/task-modules-and-cards/task-modules/task-modules-bots.md#payload-of-taskfetch-and-tasksubmit-messages).
The next section gives an example of submitting the result of a task module.
platform What Are Cards https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/what-are-cards.md
Title: Cards
-description: Describes cards and how they are used in bots, connectors, and message extensions
+description: Describes cards and how they're used in bots, connectors, and message extensions
ms.localizationpriority: high keywords: connectors bots cards messaging
All cards used by Teams are listed in [types of cards](~/task-modules-and-cards/
## Adaptive Cards
-[Adaptive Cards](~/task-modules-and-cards/cards/cards-reference.md#adaptive-card) are a new cross product specification for cards in Microsoft products including bots, Cortana, Outlook, and Windows. They are the recommended card type for new Teams development. For general information from the Adaptive Cards team, see [Adaptive Cards overview](/adaptive-cards). You can use Adaptive Cards anywhere you use existing hero cards, Office 365 cards, and thumbnail cards.
+[Adaptive Cards](~/task-modules-and-cards/cards/cards-reference.md#adaptive-card) are a new cross product specification for cards in Microsoft products including bots, Cortana, Outlook, and Windows. They're the recommended card type for new Teams development. For general information from the Adaptive Cards team, see [Adaptive Cards overview](/adaptive-cards). You can use Adaptive Cards anywhere you use existing hero cards, Office 365 cards, and thumbnail cards.
In addition to Adaptive Cards, Teams supports two other types of cards:
Type ahead search added as an input control in Adaptive Cards enable [dynamic se
> * All native Adaptive Card schema elements, except `Action.Submit`, are fully supported. > * The supported actions are [**Action.OpenURL**](https://adaptivecards.io/explorer/Action.OpenUrl.html), [**Action.ShowCard**](https://adaptivecards.io/explorer/Action.ShowCard.html), [**Action.ToggleVisibility**](https://adaptivecards.io/explorer/Action.ToggleVisibility.html), and [**Action.Execute**](/adaptive-cards/authoring-cards/universal-action-model#actionexecute).
-Adaptive Cards with Incoming Webhooks enables you to use the rich and flexible capabilities of Adaptive Cards. It sends data using Incoming Webhooks in Teams from their web service.
+Adaptive Cards with Incoming Webhooks enable you to use the rich and flexible capabilities of Adaptive Cards. It sends data using Incoming Webhooks in Teams from their web service.
## Support for Azure AD Object ID and UPN in user mention
platform What Are Task Modules https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/what-are-task-modules.md
Task modules permit you to create modal pop-up experiences in your Teams applica
Task modules are useful for initiating and completing tasks or displaying rich information, such as videos or Power Business Intelligence (BI) dashboards. A pop-up experience is often more natural for users initiating and completing tasks compared to a tab or a conversation-based bot experience.
-Task modules build on the foundation of Microsoft Teams tabs. They are essentially a tab inside a pop-up window. They use the same SDK, so if you have built a tab you are already familiar with creating a task module.
+Task modules build on the foundation of Microsoft Teams tabs. They're essentially a tab inside a pop-up window. They use the same SDK, so if you have built a tab you're already familiar with creating a task module.
Task modules can be invoked in three ways: * Channel or personal tabs: Using the Microsoft Teams Tabs SDK, you can invoke task modules from buttons, links, or menus on your tab. For more information, see [using task modules in tabs](~/task-modules-and-cards/task-modules/task-modules-tabs.md).
-* Bots: Using buttons on [cards](~/task-modules-and-cards/cards/cards-reference.md) sent from your bot. This is useful when you do not require everyone in a channel to see what you are doing with a bot. For example, when having users respond to a poll in a channel it is not useful to see a record of that poll being created. For more information, see [using task modules from Teams bots](~/task-modules-and-cards/task-modules/task-modules-bots.md).
+* Bots: Using buttons on [cards](~/task-modules-and-cards/cards/cards-reference.md) sent from your bot. This is useful when you don't require everyone in a channel to see what you are doing with a bot. For example, when having users respond to a poll in a channel it isn't useful to see a record of that poll being created. For more information, see [using task modules from Teams bots](~/task-modules-and-cards/task-modules/task-modules-bots.md).
* Outside of Teams from a deep link: You can also create URLs to invoke a task module from anywhere. For more information, see [task module deep link syntax](~/task-modules-and-cards/task-modules/invoking-task-modules.md#task-module-deep-link-syntax). ## Components of a task module
-Here is what a task module looks like when invoked from a bot:
+Here's what a task module looks like when invoked from a bot:
:::image type="content" source="../assets/images/task-module/task-module-example.png" alt-text="task module example":::
A task module includes the following as shown in the previous image:
> [!NOTE] > It is currently not possible to detect the `err` event when a task module is invoked from a bot.
-5. The blue rectangle is where your web page appears if you are loading your own web page using the `url` property of the [TaskInfo object](~/task-modules-and-cards/task-modules/invoking-task-modules.md#the-taskinfo-object). For more information, see [task module sizing](~/task-modules-and-cards/task-modules/invoking-task-modules.md#task-module-sizing).
-6. If you are displaying an Adaptive Card using the `card` property of the [TaskInfo object](~/task-modules-and-cards/task-modules/invoking-task-modules.md#the-taskinfo-object) the padding is added for you. For more information, see [task module CSS for HTML or JavaScript task modules](~/task-modules-and-cards/task-modules/invoking-task-modules.md#task-module-css-for-html-or-javascript-task-modules).
+5. The blue rectangle is where your web page appears if you're loading your own web page using the `url` property of the [TaskInfo object](~/task-modules-and-cards/task-modules/invoking-task-modules.md#the-taskinfo-object). For more information, see [task module sizing](~/task-modules-and-cards/task-modules/invoking-task-modules.md#task-module-sizing).
+6. If you're displaying an Adaptive Card using the `card` property of the [TaskInfo object](~/task-modules-and-cards/task-modules/invoking-task-modules.md#the-taskinfo-object) the padding is added for you. For more information, see [task module CSS for HTML or JavaScript task modules](~/task-modules-and-cards/task-modules/invoking-task-modules.md#task-module-css-for-html-or-javascript-task-modules).
7. Adaptive Card buttons render after you select **Sign up**. When using your own page, create your own buttons. ## Next step
platform AAD Manifest Customization https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/AAD-manifest-customization.md
You need to interact with Azure AD application during various stages of your Tea
Teams Toolkit performs the following functions during local development (known as F5):
- * Read the `state.local.json` file to find an existing Azure AD application. If an Azure AD application already exists, Teams Toolkit re-uses the existing Azure AD application otherwise you need to create a new application using the `aad.template.json` file
+ * Read the `state.local.json` file to find an existing Azure AD application. If an Azure AD application already exists, Teams Toolkit re-uses the existing Azure AD application otherwise you need to create a new application using the `aad.template.json` file.
* Initially ignores some properties in the manifest file that requires additional context (such as replyUrls property that requires a local debug endpoint) during the creation of a new Azure AD application with the manifest file.
- * After the local dev environment startup successfully, the Azure AD application's identifierUris, replyUrls, and other properties that are not available during creation stage are updated accordingly
+ * After the local dev environment startup successfully, the Azure AD application's identifierUris, replyUrls, and other properties that are not available during creation stage are updated accordingly.
- * The changes you have done to your Azure AD application are loaded during next local debug session. You can see [Azure AD application changes](https://github.com/OfficeDev/TeamsFx/wiki/) to apply changes manually Azure AD application changes
+ * The changes you have done to your Azure AD application are loaded during next local debug session. You can see [Azure AD application changes](https://github.com/OfficeDev/TeamsFx/wiki/) to apply changes manually Azure AD application changes.
4. **To provision for cloud resources** You need to provision cloud resources and deploy your application while moving your application to the cloud. At the stages, like local development, Teams Toolkit will:
- * Read the `state.{env}.json` file to find an existing Azure AD application. If an Azure AD application already exists, Teams Toolkit re-uses the existing Azure AD application otherwise you need to create a new application using the `aad.template.json` file
+ * Read the `state.{env}.json` file to find an existing Azure AD application. If an Azure AD application already exists, Teams Toolkit re-uses the existing Azure AD application otherwise you need to create a new application using the `aad.template.json` file.
- * Initially ignores some properties in the manifest file that requires additional context (such as replyUrls property requires frontend or bot endpoint) during the creation of a new Azure AD application with the manifest file
+ * Initially ignores some properties in the manifest file that requires additional context (such as replyUrls property requires frontend or bot endpoint) during the creation of a new Azure AD application with the manifest file.
- * After other resources provision completes, the Azure AD application's identifierUris and replyUrls are updated accordingly to the correct endpoints
+ * After other resources provision completes, the Azure AD application's identifierUris and replyUrls are updated accordingly to the correct endpoints.
5. **To build application**
- * Deploy to the cloud command deploys your application to the provisioned resources. It doesn't include deploying Azure AD application changes you made
+ * Deploy to the cloud command deploys your application to the provisioned resources. It doesn't include deploying Azure AD application changes you made.
- * You can see, [Deploy Azure AD application changes for remote environment](#deploy-azure-ad-application-changes-for-remote-environment) to deploy Azure AD application changes for remote environment
+ * You can see, [Deploy Azure AD application changes for remote environment](#deploy-azure-ad-application-changes-for-remote-environment) to deploy Azure AD application changes for remote environment.
- * Teams Toolkit updates the Azure AD application according to the Azure AD manifest template file
+ * Teams Toolkit updates the Azure AD application according to the Azure AD manifest template file.
## Limitations
You need to interact with Azure AD application during various stages of your Tea
2. Currently `requiredResourceAccess` property can use user readable resource application name or permission name strings only for `Microsoft Graph` and `Office 365 SharePoint Online` APIs. For other APIs, you need to use UUID instead. You can follow these steps to retrieve IDs from Azure portal:
- * Register a new Azure AD application on [Azure portal](https://ms.portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps)
- * Select `API permissions` from the Azure AD application page
- * Select `add a permission` to add the permission you want
- * Select `Manifest`, from the `requiredResourceAccess` property, you can find the IDs of API and permissions
+ * Register a new Azure AD application on [Azure portal](https://ms.portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps).
+ * Select `API permissions` from the Azure AD application page.
+ * Select `add a permission` to add the permission you want.
+ * Select `Manifest`, from the `requiredResourceAccess` property, you can find the IDs of API and permissions.
## See also
platform Teamsfx Multi Env https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-multi-env.md
After creating a new project, Teams Toolkit by default creates:
1. Select the **Teams** icon in the sidebar 2. Select **+Teams: Create new environment** under the Environment section as shown in the following image:
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/create new env.png" alt-text="create":::
-If you have more than one environments, you need to select an existing environment to create the same. The command copies the file contents of `config.<newEnv>.json` and `azure.parameters.<newEnv>.json` from the existing environment you selected to the new environment created.
+ If you have more than one environments, you need to select an existing environment to create the same. The command copies the file contents of `config.<newEnv>.json` and `azure.parameters.<newEnv>.json` from the existing environment you selected to the new environment created.
## Select target environment
As the Teams app manifest template is shared across all environments, we can upd
}, ... }
- ```
-3. Run the provision command against **all** environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit)
+
+ ```
+
+3. Run the provision command against **all** environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit).
+ <br></details> <br>+ <details> <br><summary><b>Scenario 4: customize Azure resources for different environment</b></summary> You can customize Azure resources for each environment, for example specify Azure Function name, by editing the environment corresponding to
fx/configs/azure.parameters.{env}.json. file.
For more information on Bicep template and parameter files, see [provision cloud resources](provision.md) </details>
-<br
--
+</br>
## See also * [Provision cloud resources](provision.md) * [Add more cloud resources](add-resource.md)
-* [Collaborate with other developers on Teams project](TeamsFx-collaboration.md)
+* [Collaborate with other developers on Teams project](TeamsFx-collaboration.md)
platform Teamsfx Preview And Customize App Manifest https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-preview-and-customize-app-manifest.md
The preview local appears as shown in the image:
**To preview manifest file in remote environment**
-* Select **Provision in the cloud** under **DEVELOPMENT** in Teams Toolkit extension or
+* Select **Provision in the cloud** under **DEVELOPMENT** in Teams Toolkit extension or
* Trigger **Teams: Provision in the cloud** from command palette. It generates configuration for remote Teams app, and builds package and preview manifest under `build/appPackage` folder.
You can also preview manifest file in remote environment by following steps:
After previewing the manifest file, you can sync your local changes to Dev Portal by the following ways:
-1. Deploy Teams app manifest
+1. Deploy Teams app manifest.
You can deploy Teams app manifest in any of the following ways:
- * Go to `manifest.template.json` file, and right-click to select `Deploy Teams app manifest` from context menu
+ * Go to `manifest.template.json` file, and right-click to select `Deploy Teams app manifest` from context menu.
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/deploy-manifest.png" alt-text="Deploy manifest":::
- * Trigger `Teams: Deploy Teams app manifest` from command palette
+ * Trigger `Teams: Deploy Teams app manifest` from command palette.
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/deploy-command.png" alt-text="Deploy from command palette":::
-2. Update to Teams platform
+2. Update to Teams platform.
You can update to Teams platform in any of the following ways:
- * Select **Update to Teams platform** on the upper left-corner of `manifest.{env}.json`
+ * Select **Update to Teams platform** on the upper left-corner of `manifest.{env}.json`.
- * Trigger **Teams: Update manifest to Teams platform** on the menu bar of `manifest.{env}.json`
+ * Trigger **Teams: Update manifest to Teams platform** on the menu bar of `manifest.{env}.json`.
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/update-to-teams.png" alt-text="Update to teams":::
You can also trigger **Teams: Update manifest to Teams platform** from the comma
If the manifest file is outdated due to configuration file change or template change, select any one of the following action:
-* **Preview only**: Local manifest file is overwritten according to current configuration
-* **Preview and update**: Local manifest file is overwritten according to current configuration and also updated to Teams platform
-* **Cancel**: No action is taken
+* **Preview only**: Local manifest file is overwritten according to current configuration.
+* **Preview and update**: Local manifest file is overwritten according to current configuration and also updated to Teams platform.
+* **Cancel**: No action is taken.
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/manifest preview -3.png" alt-text="pre" border="true"::: - ## Customize Teams app manifest Teams Toolkit consists of the following manifest template files under `manifest.template.json` folder across local and remote environments:
In `manifest.template.json`, you can navigate to codelens to preview the values
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/codelens.png" alt-text="Preview values":::
-> [!NOTE]
-> Provision the environment or execute local debug to generate values for placeholders.
+> [!NOTE]
+> Provision the environment or execute local debug to generate values for placeholders.
You can navigate to state file or configuration file by selecting the codelens, which provides a drop-down list with all the environment names. After selecting one environment, the corresponding state file or configuration file opens.
To preview values for all the environments, you can hover over the placeholder.
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/hover.png" alt-text="Preview all values"::: - ## See also * [Manage multiple environments](TeamsFx-multi-env.md)
platform Accounts https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/accounts.md
If you want to host your application related resources or access resources withi
:::image type="content" source="../assets/images/teams-toolkit-v2/upload.png" alt-text="Upload a custom app" border="true":::
- If you are unable to view the option Upload a custom app,** then, it indicates that you don't have the required permission for sideloading.
+ If you are unable to view the option **Upload a custom app,** then it indicates that you don't have the required permission for sideloading.
* For a tenant admin, enable the sideloading setting for your tenant or organization in the Teams admin center. * If you aren't a tenant admin, you'll need to contact your tenant admin to enable sideloading.
platform Debug Background Process https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/debug-background-process.md
Last updated 03/03/2022
The local debug workflow involves the `.vscode/launch.json` and `.vscode/tasks.json` files to configure the debugger in VS Code, then the VS Code launches the debuggers, and Microsoft Edge or Chrome debugger launches a new browser instance as follows:
-1. The `launch.json` file configures the debugger in VS Code
+1. The `launch.json` file configures the debugger in VS Code.
-2. VS Code runs the compound **preLaunchTask**, **Pre Debug Check & Start All** in `.vscode/tasks.json` file
+2. VS Code runs the compound **preLaunchTask**, **Pre Debug Check & Start All** in `.vscode/tasks.json` file.
-3. VS Code then launches the debuggers specified in the compound configurations, such as **Attach to Bot**, **Attach to Backend**, **Attach to Frontend**, and **Launch Bot**
+3. VS Code then launches the debuggers specified in the compound configurations, such as **Attach to Bot**, **Attach to Backend**, **Attach to Frontend**, and **Launch Bot**.
-4. Microsoft Edge or Chrome debugger launches a new browser instance and opens a web page to load Teams client
+4. Microsoft Edge or Chrome debugger launches a new browser instance and opens a web page to load Teams client.
## Prerequisites
Teams Toolkit checks the following prerequisites during the debug process:
|Bot | 14, 16 (recommended)| |Message extension | 14, 16 (recommended) |
-
-* Microsoft 365 account with valid credentials, the Teams toolkit prompts you to sign in to Microsoft 365 account, if you haven't signed in
+* Microsoft 365 account with valid credentials, the Teams toolkit prompts you to sign in to Microsoft 365 account, if you haven't signed in.
-* Custom app uploading or sideloading for your developer tenant is turned on, if not then the local debug terminates
+* Custom app uploading or sideloading for your developer tenant is turned on, if not then the local debug terminates.
-* Ngrok binary version 2.3 is applicable for bot and message extension, if Ngrok isn't installed or the version doesn't match the requirement, the Teams toolkit installs Ngrok NPM package `ngrok@4.2.2` in `~/.fx/bin/ngrok`. The Ngrok binary is managed by Ngrok NPM package in `/.fx/bin/ngrok/node modules/ngrok/bin`
+* Ngrok binary version 2.3 is applicable for bot and message extension, if Ngrok isn't installed or the version doesn't match the requirement, the Teams toolkit installs Ngrok NPM package `ngrok@4.2.2` in `~/.fx/bin/ngrok`. The Ngrok binary is managed by Ngrok NPM package in `/.fx/bin/ngrok/node modules/ngrok/bin`.
-* Azure Functions Core Tools version 4, if Azure Functions Core Tools is'nt installed or the version doesn't match the requirement, the Teams Toolkit installs Azure Functions Core Tools NPM package, azure-functions-core-tools@3 for **Windows** and for **macOs** in `~/.fx/bin/func`. The Azure Functions Core Tools NPM package in `~/.fx/bin/func/node_modules/azure-functions-core-tools/bin` manages Azure Functions Core Tools binary. For Linux, the local debug terminates
+* Azure Functions Core Tools version 4, if Azure Functions Core Tools isn't installed or the version doesn't match the requirement, the Teams Toolkit installs Azure Functions Core Tools NPM package, azure-functions-core-tools@3 for **Windows** and for **MacOs** in `~/.fx/bin/func`. The Azure Functions Core Tools NPM package in `~/.fx/bin/func/node_modules/azure-functions-core-tools/bin` manages Azure Functions Core Tools binary. For Linux, the local debug terminates.
-* .NET Core SDK version applicable for Azure Functions, if .NET Core SDK is'nt installed or the version doesn't match the requirement, the Teams Toolkit installs .NET Core SDK for Windows and MacOS in `~/.fx/bin/dotnet`. For Linux, the local debug terminates
+* .NET Core SDK version applicable for Azure Functions, if .NET Core SDK isn't installed or the version doesn't match the requirement, the Teams Toolkit installs .NET Core SDK for Windows and MacOS in `~/.fx/bin/dotnet`. For Linux, the local debug terminates.
The following table lists the .NET Core versions:
Teams Toolkit checks the following prerequisites during the debug process:
|Windows, macOs (x64), and Linux | **3.1 (recommended)**, 5.0, 6.0 | |macOs (arm64) |6.0 |
-* Development certificate, if the development certificate for localhost is'nt installed for tab in Windows or macOS, the Teams toolkit prompts you to install it
+* Development certificate, if the development certificate for localhost isn't installed for tab in Windows or MacOS, the Teams toolkit prompts you to install it.
-* Azure Functions binding extensions defined in `api/extensions.csproj`, if Azure Functions binding extensions is not installed, the Teams Toolkit installs Azure Functions binding extensions
+* Azure Functions binding extensions defined in `api/extensions.csproj`, if Azure Functions binding extensions isn't installed, the Teams Toolkit installs Azure Functions binding extensions.
-* NPM packages, applicable for tab app, bot app, message extension app, and Azure Functions. If NPM is'nt installed, the Teams Toolkit installs all NPM packages
+* NPM packages, applicable for tab app, bot app, message extension app, and Azure Functions. If NPM isn't installed, the Teams Toolkit installs all NPM packages.
-* Bot and message extension, the Teams Toolkit starts Ngrok to create an HTTP tunnel for bot and message extension
+* Bot and message extension, the Teams Toolkit starts Ngrok to create an HTTP tunnel for bot and message extension.
-* Ports available, if tab, bot, message extension, and Azure Functions ports are unavailable, the local debug terminates
+* Ports available, if tab, bot, message extension, and Azure Functions ports are unavailable, the local debug terminates.
The following table lists the ports available for components:
Teams Toolkit checks the following prerequisites during the debug process:
| Azure Functions | 7071 | | Node inspector for Azure Functions | 9229 | - <!-- The following table lists the limitations if the required software is unavailable for debugging: |Project type|Installation| Limitation|
Use the following .NET Core versions:
|Windows, macOs (x64), Linux | **3.1 (recommended)**, 5.0, 6.0 | |macOs (arm64) |6.0 | - > [!NOTE]
-> If the development certificate for localhost isn't installed for tab in Windows or macOS, the Teams toolkit prompts you to install it.</br> -->
-
+> If the development certificate for localhost isn't installed for tab in Windows or MacOS, the Teams toolkit prompts you to install it.</br> -->
When you select **Start Debugging (F5)**, the Teams Toolkit output channel displays the progress and result after checking the prerequisites.
When you select **Start Debugging (F5)**, the Teams Toolkit output channel displ
## Register and configure your Teams app
-In the set up process, Teams Toolkit prepares the following registrations and configurations for your Teams app:
+In the set-up process, Teams Toolkit prepares the following registrations and configurations for your Teams app:
-1. [Registers and configures Azure AD application](#registers-and-configures-azure-ad-application): Teams Toolkit registers and configures your Azure AD application
+1. [Registers and configures Azure AD application](#registers-and-configures-azure-ad-application): Teams Toolkit registers and configures your Azure AD application.
-1. [Registers and configures bot](#registers-and-configures-bot): Teams Toolkit registers and configures your bot for tab or message extension app
+1. [Registers and configures bot](#registers-and-configures-bot): Teams Toolkit registers and configures your bot for tab or message extension app.
-1. [Registers and configures Teams app](#registers-and-configures-teams-app): Teams Toolkit registers and configures your Teams app
+1. [Registers and configures Teams app](#registers-and-configures-teams-app): Teams Toolkit registers and configures your Teams app.
### Registers and configures Azure AD application
-1. Registers an Azure AD application
-
-1. Creates a Client Secret
+1. Registers an Azure AD application.
-1. Exposes an API
+1. Creates a Client Secret.
- a. Configures Application ID URI. For tab, `api://localhost/{appId}`. For bot or message extension, `api://botid-{botid}`
+1. Exposes an API.
- b. Adds a scope named `access_as_user`. Enables it for **Admin and users**
+ a. Configures Application ID URI. For tab, `api://localhost/{appId}`. For bot or message extension, `api://botid-{botid}`.
+ b. Adds a scope named `access_as_user`. Enables it for **Admin and users**.
-4. Configures API permissions. Adds Microsoft Graph permission to **User.Read**
+4. Configures API permissions. Adds Microsoft Graph permission to **User.Read**.
- The following table lists the configuration of the authentication as follows:
+ The following table lists the configuration of the authentication:
| Project type | Redirect URIs for web | Redirect URIs for single-page application | | | | |
In the set up process, Teams Toolkit prepares the following registrations and co
| Outlook Web Access | 00000002-0000-0ff1-ce00-000000000000 | | Outlook Web Access | bc59ab01-8403-45c6-8796-ac3ef710b3e3 |
-### Registers and configures bot
+### Registers and configures bot
For tab app or message extension app:
-1. Registers an Azure AD application
+1. Registers an Azure AD application.
-1. Creates a Client Secret for the Azure AD application
+1. Creates a Client Secret for the Azure AD application.
-1. Registers a bot in [Microsoft Bot Framework](https://dev.botframework.com/) using the Azure AD application
+1. Registers a bot in [Microsoft Bot Framework](https://dev.botframework.com/) using the Azure AD application.
-1. Adds Microsoft Teams channel
+1. Adds Microsoft Teams channel.
-1. Configures messaging endpoint as `https://{ngrokTunnelId}.ngrok.io/api/messages`
+1. Configures messaging endpoint as `https://{ngrokTunnelId}.ngrok.io/api/messages`.
### Registers and configures Teams app
platform Debug Local https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/debug-local.md
Toolkit launches a new Edge or Chrome browser instance depending on your selecti
<details> <summary><b>macOS</b></summary>
-1. Select **Debug Edge** or **Debug Chrome** from the **Run and Debug** in the activity bar
+1. Select **Debug Edge** or **Debug Chrome** from the **Run and Debug** in the activity bar.
:::image type="content" source="../assets/images/teams-toolkit-v2/debug/debug-run.png" alt-text="Browser lists" border="false":::
-1. Select **Start Debugging (F5)** or **Run** to run your Teams app in debug mode
+1. Select **Start Debugging (F5)** or **Run** to run your Teams app in debug mode.
:::image type="content" source="../assets/images/teams-toolkit-v2/debug/start-debugging.png" alt-text="Debug your app" border="false":::
-3. Select **Sign in** to Microsoft 365 account
+3. Select **Sign in** to Microsoft 365 account.
:::image type="content" source="../assets/images/teams-toolkit-v2/debug/microsoft365-signin.png" alt-text="Sign into M365 account" border="true"::: > [!TIP] > You can select **Read more** to learn about Microsoft 365 Developer Program. Your default web browser opens to let you sign in to your Microsoft 365 account using your credentials.
-4. Select **Install** to install the development certificate for localhost
+4. Select **Install** to install the development certificate for localhost.
:::image type="content" source="../assets/images/teams-toolkit-v2/debug/install-certificate.png" alt-text="certificate" border="true":::
Toolkit launches a new Edge or Chrome browser instance depending on your selecti
:::image type="content" source="../assets/images/teams-toolkit-v2/debug/mac-settings.png" alt-text="mac sign in" border="true":::
-Toolkit launches a new Edge or Chrome browser instance depending on your selection and opens a web page to load Teams client.
+Toolkit launches a new Edge or Chrome browser instance depending on your selection and opens a web page to load Teams client.
</details> - #### 2. Debug your app After the initial set up process, the Teams Toolkit starts the following processes: a. [Starts app services](#starts-app-services) </br> b. [Launches debuggers](#launches-debuggers) </br>
- c. [Sideloads the Teams app](#sideloads-the-teams-app)
+c. [Sideloads the Teams app](#sideloads-the-teams-app)
#### Starts app services
Teams Toolkit allows you to customize the debug settings to create your tab or b
<details> <summary><b>Use your bot endpoint</b></summary>
-1. In Visual Studio Code settings, clear **Ensure Ngrok is installed and started (ngrok)**
+1. In Visual Studio Code settings, clear **Ensure Ngrok is installed and started (ngrok)**.
-1. Set siteEndpoint configuration in `.fx/configs/config.local.json` to your endpoint
+1. Set siteEndpoint configuration in `.fx/configs/config.local.json` to your endpoint.
```json {
Teams Toolkit allows you to customize the debug settings to create your tab or b
<details> <summary><b>Use your development certificate</b></summary>
-1. In Visual Studio Code settings, clear **Ensure development certificate is trusted (devCert)**
+1. In Visual Studio Code settings, clear **Ensure development certificate is trusted (devCert)**.
-1. Set `sslCertFile` and `sslKeyFile` configuration in `.fx/configs/config.local.json` to your certificate file path and key file path
+1. Set `sslCertFile` and `sslKeyFile` configuration in `.fx/configs/config.local.json` to your certificate file path and key file path.
```json {
Teams Toolkit allows you to customize the debug settings to create your tab or b
<details> <summary><b>Use your start scripts to start app services</b></summary>
-1. For tab, update `dev:teamsfx` script in `tabs/package.json`
+1. For tab, update `dev:teamsfx` script in `tabs/package.json`.
-1. For bot or message extension, update `dev:teamsfx` script in `bot/package.json`
+1. For bot or message extension, update `dev:teamsfx` script in `bot/package.json`.
-1. For Azure Functions, update `dev:teamsfx` script in `api/package.json` and for TypeScript update `watch:teamsfx` script
+1. For Azure Functions, update `dev:teamsfx` script in `api/package.json` and for TypeScript update `watch:teamsfx` script.
> [!NOTE] > Currently, the tab, bot, message extension apps, and Azure Functions ports don't support customization.
You can add environment variables to `.env.teamsfx.local` file for tab, bot, mes
Teams Toolkit utilizes Visual Studio Code multi-target debugging to debug tab, bot, message extension, and Azure Functions at the same time. You can update `.vscode/launch.json` and `.vscode/tasks.json` to debug partial component. If you want to debug tab only in a tab plus bot with Azure Functions project, use the following steps:
-1. Comment **Attach to Bot** and **Attach to Backend** from debug compound in `.vscode/launch.json`
+1. Comment **Attach to Bot** and **Attach to Backend** from debug compound in `.vscode/launch.json`.
```json {
Teams Toolkit utilizes Visual Studio Code multi-target debugging to debug tab, b
} ```
-2. Comment **Start Backend** and Start Bot from Start All task in .vscode/tasks.json
+2. Comment **Start Backend** and Start Bot from Start All task in .vscode/tasks.json.
```json {
Teams Toolkit utilizes Visual Studio Code multi-target debugging to debug tab, b
</details> - ## Next step > [!div class="nextstepaction"]
platform Provision https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/provision.md
TeamsFx integrates with Azure and Microsoft 365 cloud, which allows you to place
* Account prerequisites To provision cloud resources, you must have the following accounts:
- * Microsoft 365 account with valid subscription
- * Azure with valid subscription
+ * Microsoft 365 account with valid subscription.
+ * Azure with valid subscription.
For more information, see [how to prepare accounts for building Teams app](accounts.md). * [Install Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) version v3.0.0+.
Provision is performed with single command in Teams Toolkit for Visual Studio Co
When you trigger provision command in Teams Toolkit or TeamsFx CLI, you can get the following resources:
-* Microsoft Azure Active Directory (Azure AD) application under your Microsoft 365 tenant
-* Teams app registration under your Microsoft 365 tenant's Teams platform
-* Azure resources under your selected Azure subscription
+* Microsoft Azure Active Directory (Azure AD) application under your Microsoft 365 tenant.
+* Teams app registration under your Microsoft 365 tenant's Teams platform.
+* Azure resources under your selected Azure subscription.
When you create a new project, you can use all the Azure resources. The ARM template defines all the Azure resources and helps to create required Azure resources during provision. When you [add new capability resource](./add-resource.md) to an existing project, the updated ARM template reflects the latest change.
The following steps are:
1. Open `.fx/configs/azure.parameters.{env}.json` for your current environment. 2. Add a new property `functionAppName` to the value of parameter `provisionParameters`.
-3. Enter `contosoteamsappapi` as value of `functionAppName`
+3. Enter `contosoteamsappapi` as value of `functionAppName`.
4. Final parameter file is shown in the following snippet: ```json
If you get errors with Teams Toolkit in Visual Studio Code, you can select **Get
<summary><b>How can I change resource group while provisioning?</b></summary>
-Before provision, the tool will ask you if you want to create a new resource group or use an existing one. You can provide a new resource group name or choose an existing one in this step.
+Before provision, the tool asks you if you want to create a new resource group or use an existing one. You can provide a new resource group name or choose an existing one in this step.
<br>
platform Publish https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/publish.md
Title: Publish Teams apps using Teams Toolkit description: publish Teams apps- ms.localizationpriority: medium Last updated 11/29/2021
After you publish the app, the publishing status changes to published and the st
You can distribute your app directly to the store inside Microsoft Teams and reach millions of users around the world. If your app is also featured in the store, you can instantly reach potential customers. The apps published to the Teams store also automatically list on Microsoft AppSource, which is the official marketplace for Microsoft 365 apps and solutions.
-For more information, see [publish to microsoft Teams store]([Publish your app to the Microsoft Teams store](../concepts/deploy-and-publish/appsource/publish.md#publish-your-app-to-the-microsoft-teams-store))
+For more information, see ([Publish your app to the Microsoft Teams store](../concepts/deploy-and-publish/appsource/publish.md#publish-your-app-to-the-microsoft-teams-store)).
## See also
platform Teams Toolkit Fundamentals https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/teams-toolkit-fundamentals.md
description: Overview of Teams Toolkit, Installation of Teams Toolkit, and Tour
ms.localizationpriority: medium Previously updated : 05/17/2022 Last updated : 05/24/2022 # Teams Toolkit Overview
platform Visual Studio Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/visual-studio-overview.md
Teams Toolkit's extension for Visual Studio makes it easy to create new projects
5. On the right, expand the **ASP.NET and web development** section and select **Microsoft Teams development tools** in the Optional list of components. 6. Select **Install** or **Modify** in the Visual Studio Installer to complete the installation process.
-![Selecting the Microsoft Teams development tools in the Visual Studio installer.) installed.](images/teams-development-tools-vs-installer.png)
+ ![Selecting the Microsoft Teams development tools in the Visual Studio installer.) installed.](images/teams-development-tools-vs-installer.png)
## Get started quickly with a new project
The Microsoft Teams App project template allows you to specify a Microsoft 365 a
1. In the **Configure your new project** window, type or enter _HelloTeams_ in the **Project name** box. Then, select **Create**. 1. In the **Create a new Teams application** window, choose or sign in to a Microsoft 365 account using the **Choose an account** selector. Then, select **Create**.
-![Creating a new Microsoft Teams App project in Visual Studio.](images/teams-toolkit-vs-new-project.png)
+ ![Creating a new Microsoft Teams App project in Visual Studio.](images/teams-toolkit-vs-new-project.png)
Visual Studio will open up your new project and Teams Toolkit will setup you new project in Teams Developer Portal. The project will be added for the Teams organization linked to the Microsoft 365 account you chose in the steps above and create a new Azure Active Directory registration. This is required for the app to run in Teams.
platform Connectors Creating https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/webhooks-and-connectors/how-to/connectors-creating.md
Follow the [step-by-step guide](../../sbs-teams-connectors.yml) to create and te
## Distribute webhook and connector 1. [Set up an Incoming Webhook](~/webhooks-and-connectors/how-to/add-incoming-webhook.md#create-an-incoming-webhook) directly for your team.+ 1. Add a [configuration page](~/webhooks-and-connectors/how-to/connectors-creating.md?#integrate-the-configuration-experience) and publish your Incoming Webhook in a Office 365 Connector.+ 1. Package and publish your connector as part of your [AppSource](~/concepts/deploy-and-publish/office-store-guidance.md) submission. ## Code sample
platform Whats New https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/whats-new.md
Title: What's new
-description: Describes all the new or latest developer features in Microsoft Teams
+ Title: What is new for developers in Teams
+description: Learn about the new developer features and enhancements to those features in Microsoft Teams.
ms.localizationpriority: high
-keywords: teams what's new latest updates or developer preview and features
# What's new for developers in Microsoft Teams