Updates from: 07/27/2023 05:05:09
Service Microsoft Docs article Related commit history on GitHub Change details
platform Conversation Messages https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/conversation-messages.md
Your bot receives messages from Teams using the `Text` property and it sends sin
For more information, see [user attribution for bot messages](/microsoftteams/platform/messaging-extensions/how-to/action-commands/respond-to-task-module-submit?tabs=dotnet%2Cdotnet-1#user-attribution-for-bots-messages).
-## Receive a message
+The following table lists the activity that your bot can receive and take action on:
+
+| Type | Payload object | Scope |
+| - | | |
+| [Receive a message activity](#receive-a-message-activity) | Message activity | All |
+| [Receive edit message activity](#get-edit-message-activity) | Message edit activity | All |
+| [Receive undelete message activity](#get-undelete-message-activity) | Message undelete activity | All |
+| [Receive soft delete message activity](#get-soft-delete-message-activity) | Message soft delete activity | All |
+
+## Receive a message activity
To receive a text message, use the `Text` property of an `Activity` object. In the bot's activity handler, use the turn context object's `Activity` to read a single message request.
POST {Service URL of your bot}/v3/conversations
Messages sent between users and bots include internal channel data within the message. This data allows the bot to communicate properly on that channel. The Bot Builder SDK allows you to modify the message structure.
-## Get edit message event
+## Get edit message activity
-When you edit a message in a chat, the bot gets a notification of the edit message event.
+When you edit a message, the bot gets a notification of the edit message activity.
-To get an edit message event notification in a bot, you can override `OnTeamsMessageEditAsync` handler.
-
-> [!NOTE]
-> The `OnTeamsMessageEditAsync` handler isnΓÇÖt supported in group chat and Teams channel scopes.
+To get an edit message activity notification in a bot, you can override `OnTeamsMessageEditAsync` handler.
-Following is an example of an edit message event notification using `OnTeamsMessageEditAsync` when a sent message is edited:
+Following is an example of an edit message activity notification using `OnTeamsMessageEditAsync` when a sent message is edited:
# [C#](#tab/dotnet3)
await turnContext.SendActivityAsync(replyActivity, cancellationToken);
# [JavaScript](#tab/javascript3)
-You can either use **ΓÇïevent function registration** or **ΓÇïmethod override** method to get event notifications to handle the message updates using the Bot SDK:
+You can either use **ΓÇïevent function registration** or **ΓÇïmethod override** method to get activity notifications to handle the message updates using the Bot SDK:
**ΓÇïEvent function registration**:
PUT {Service URL of your bot}/v3/conversations/{conversationId}/activities/{acti
-## Get undelete message event
+## Get undelete message activity
-When you undelete a message in a chat, the bot gets a notification of the undelete message event.
+When you undelete a message, the bot gets a notification of the undelete message activity.
-To get an undelete message event notification in a bot, you can override `OnTeamsMessageUndeleteAsync` handler.
+To get an undelete message activity notification in a bot, you can override `OnTeamsMessageUndeleteAsync` handler.
-> [!NOTE]
-> The `OnTeamsMessageUndeleteAsync` handler isnΓÇÖt supported in group chat and Teams channel scopes.
-
-The following is an example of an undelete message event notification using `OnTeamsMessageUndeleteAsync` when a deleted message is restored:
+The following is an example of an undelete message activity notification using `OnTeamsMessageUndeleteAsync` when a deleted message is restored:
# [C#](#tab/dotnet4)
await turnContext.SendActivityAsync(replyActivity, cancellationToken);
# [JavaScript](#tab/javascript4)
-You can either use **ΓÇïevent function registration** or **ΓÇïmethod override** method to get event notifications to handle the message updates using the Bot SDK:
+You can either use **ΓÇïevent function registration** or **ΓÇïmethod override** method to get activity notifications to handle the message updates using the Bot SDK:
**ΓÇïEvent function registration**:
PUT {Service URL of your bot}/v3/conversations/{conversationId}/activities/{acti
-## Get soft delete message event
+## Get soft delete message activity
-When you soft delete a message in a chat, the bot gets a notification of the soft delete message event.
+When you soft delete a message, the bot gets a notification of the soft delete message activity.
-To get a soft delete message event notification in a bot, you can override `OnTeamsMessageSoftDeleteAsync` handler.
-
-> [!NOTE]
-> The `OnTeamsMessageSoftDeleteAsync` handler isnΓÇÖt supported in group chat and Teams channel scopes.
+To get a soft delete message activity notification in a bot, you can override `OnTeamsMessageSoftDeleteAsync` handler.
-Following is an example of a soft delete message event notification using `OnTeamsMessageSoftDeleteAsync` when a message is soft deleted:
+Following is an example of a soft delete message activity notification using `OnTeamsMessageSoftDeleteAsync` when a message is soft deleted:
# [C#](#tab/dotnet5)
await turnContext.SendActivityAsync(replyActivity, cancellationToken);
# [JavaScript](#tab/javascript5)
-You can either use **ΓÇïevent function registration** or **ΓÇïmethod override** method to get event notifications to handle the message updates using the Bot SDK:
+You can either use **ΓÇïevent function registration** or **ΓÇïmethod override** method to get activity notifications to handle the message updates using the Bot SDK:
**ΓÇïEvent function registration**:
platform Notification Bot In Teams https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/notification-bot-in-teams.md
The app template is built using the TeamsFx SDK, which provides a simple set of
:::image type="content" source="../../../assets/images/notification-bot/notification-new-scenario-diagram.png" alt-text="weather forecast sample notification scenario" lightbox="../../../assets/images/notification-bot/notification-new-scenario-diagram.png":::
-You can create notification bot in other scenarios, such as a notification can be sent in teams DevOps channel if there's a build failure.
+You can create notification bot in other scenarios, such as a notification can be sent in Teams DevOps channel if there's a build failure.
+
+You can send a bot notification in the following scenarios:
+
+* You want to notify everyone in a channel or chat about the same or related contentΓÇï.
+
+* Highly customizable UI in a CardΓÇï
+
+* Need quick response, include media content, or action buttonsΓÇï.
+
+* Send scheduled notificationsΓÇï
+
+* Light up double badges on both Activity and Chat, Channel or AppΓÇï
+
+* Add template in source codeΓÇï.
+
+* Handling localization manually.
**Advantages**
You can create notification bot in other scenarios, such as a notification can b
* Enhances user experience by customizing notification with an Adaptive Card. * Provides multiple mechanisms to trigger notifications such as HTTP and schedule timer trigger with Azure Functions.
+* A notification card easily integrates with a bot and provides a consistent user experience within the Bot app.ΓÇï
+ > [!NOTE] > Bot application needs to be installed with the corresponding scope before sending notification.
You can customize the following triggers:
* `Restify` based notification:
- * When a HTTP request is sent to `src/index.js` entry point, the default implementation sends an Adaptive Card to Teams. You can customize this event by modifying `src/index.js`. A typical implementation can call an API to retrieve events, data, or both that can send an Adaptive Card as required. You can perform the following to add more triggers:
+ * When an HTTP request is sent to `src/index.js` entry point, the default implementation sends an Adaptive Card to Teams. You can customize this event by modifying `src/index.js`. A typical implementation can call an API to retrieve events, data, or both that can send an Adaptive Card as required. You can perform the following to add more triggers:
* Create a new routing: `server.post("/api/new-trigger", ...)`. * Add timer trigger(s) from widely used npm packages, such as [cron](https://www.npmjs.com/package/cron), [node-schedule](https://www.npmjs.com/package/node-schedule), or from other packages.
TeamsFx provides you with an [Incoming Webhook notification sample](https://gith
[Back to top](#notification-bot-in-teams) +
+### Send activity feed notifications
+
+If you want to send activity feed notifications for your app, you can use the activity feed notification APIs in Microsoft Graph. For more information, see [Send activity feed notifications to users in Microsoft Teams](../../../tabs/send-activity-feed-notification.md).
+ ## FAQ <br>
Notification target connections are stored in the persistence storage. If you're
<summary><b>Why Bad Request or Bad Argument error occurs when sending notification?</b></summary>
-If the notification installation doesn't match the bot ID or password, you can get a **Failed to decrypt conversation ID** error. One possible cause for this error is that the bot ID or password is changed due to cleaning local state or re-provisioning.
+If the notification installation doesn't match the bot ID or password, you can get a **Failed to decrypt conversation ID** error. One possible cause for this error is that the bot ID or password is changed due to cleaning local state or reprovisioning.
You can resolve this issue by cleaning your notification storage. After cleaning, notify in Teams to reinstall your bot, and ensure that the new installation is up to date. Each stored notification installation is bound with one bot. If you're able to check your notification storage, its bot field should match the bot you're running such as the bot ID with the same GUID.
platform Deep Link Application https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-link-application.md
Last updated 05/04/2023
# Deep link to an application
-Application can open the profile dialog through deep links and help users to learn more about the application, permissions, and more. You can create a deep link for the app after the app is listed in the Teams store. To create a link to launch Teams, append the app ID to the URL, `https://teams.microsoft.com/l/app/<appId>`. A dialog appears to install or open the app.
+You can configure deep links to a tab, to open an app install dialog, to browse within the app, and more. Use deep links in [bot](~/bots/what-are-bots.md) and [connector](~/webhooks-and-connectors/what-are-webhooks-and-connectors.md) messages that inform users about changes to your tab, or to items within it. Deep links to custom apps are supported, however, if there's an app in the Teams store with the same app ID as the custom app ID specified in its custom app manifest, then deep link opens the app from the Teams store instead of the custom app.
-If your app is approved for mobile platform, you can deep link to an app on mobile. Apple App Store Connect Team ID is required additionally for the deep link to work on Teams-iOS. For more information, see [how to update Apple App Store Connect Team ID](../deploy-and-publish/appsource/prepare/update-apple-store-team-connect-id.md).
+If your app is approved for Teams mobile platform, you can create a deep link to the app on mobile. If you want the deep link to work on Teams iOS, you need the Apple App Store Connect Team ID for the deep link to work. For more information, see [how to update Apple App Store Connect Team ID](../deploy-and-publish/appsource/prepare/update-apple-store-team-connect-id.md).
-Deep link to an app isn't supported for custom apps.
+Deep links allow users to know more about an app and install it in different scopes. You can also create deep links for your app users to go to specific pages within your app. In this article, learn how to create a deep link:
+
+- [To open application install dialog](#deep-link-to-open-application-install-dialog)
+- [To browse within your app](#deep-link-to-browse-within-your-app)
+- [To go to a chat with the application](#deep-link-to-a-chat-with-the-application)
+- [Share deep link for a tab](#share-deep-link-for-a-tab)
+- [To open a task module](#deep-link-to-open-a-task-module)
[!INCLUDE [sdk-include](~/includes/sdk-include.md)]
-## Open the application profile dialog
+## Deep link to open application install dialog
+
+You can use deep links to allow app user to open an app install dialog to know more information about the app or install it in other contexts. You can create a deep link in the following ways:
+
+* [Configure deep link manually using your app ID](#configure-deep-link-manually-using-your-app-id).
+* [Configure deep link using TeamsJS library](#configure-deep-link-using-teamsjs-library).
+
+#### Configure deep link manually using your app ID
+
+Following is the deep link format to open an app install dialog from your Teams client:
-You can open an app install dialog from your Teams app and also can install the app in other contexts. Use the following deep link format to open an app install dialog from your Teams:
+`https://teams.microsoft.com/l/app/<your-app-id>&tenantId=<tenantId>`
-`https://teams.microsoft.com/l/app/<appId>`, where `<appId>` is the application ID.
+Where `<your-app-id>` is your application ID (f46ad259-0fe5-4f12-872d-c737b174bcb4). To know more about different app IDs see, [app ID used for different apps](#app-id-used-for-different-apps).
-Applications can use the TeamsJS library to open the dialog without manually generating the deep link. Following is an example to open the app install dialog using TeamsJS:
+##### App ID used for different apps
+
+Following are the different app IDs that are used for deep links:
+
+* Side loaded apps: Manifest ID
+* Apps submitted to org catalog: Org catalog ID
+* Apps submitted to Teams app store: Store ID
+
+#### Configure deep link using TeamsJS library
+
+Applications can use the TeamsJS library to open the app install dialog without manually generating the deep link. Following is an example to open the app install dialog using TeamsJS at the trigger of your choice in the app:
# [TeamsJS v2](#tab/teamsjs-v2)
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 app 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)
microsoftTeams.executeDeepLink("https://teams.microsoft.com/l/app/<appId>");
-## Navigate within your app
+## Deep link to browse within your app
+
+App users can browse through content in Teams from your tab using TeamsJS library. This is useful if your tab needs to connect users with other content in Teams, such as to a channel, message, another tab, or to open a scheduling dialog. In few instances navigation can also be accomplished using the TeamsJS library and it's recommended to use typed capabilities of the TeamsJS library wherever possible.
+
+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 if 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 library 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 app's UI.
+
+For more information about capabilities and the APIs in the TeamsJS library, see [Building tabs and other hosted experiences with the TeamsJS library](~/tabs/how-to/using-teams-client-sdk.md#apis-organized-into-capabilities).
+
+You can configure deep links to browse within your app in the following ways:
+
+* [Configure deep link to browse within your app manually](#configure-deep-link-to-browse-within-your-app-manually)
+* [Configure deep link to a tab using TeamsJS library](#configure-deep-link-to-a-tab-using-teamsjs-library)
+
+#### Configure deep link to browse within your app manually
+
+Use the following format for a deep link in a bot, connector, or message extension card:
+
+`https://teams.microsoft.com/l/entity/<appId>/<entityId>?tenantId=<tenantId>&webUrl=<entityWebUrl>&label=<entityLabel>&context=<context>&openInMeeting=false`
+
+* If the bot sends a message containing a `TextBlock` with a deep link, then a new browser tab is opened when the user selects the link. This happens in Chrome and in the Teams desktop app, when they're running on Linux.
+
+* If the bot sends the same deep link URL into an `Action.OpenUrl`, then the Teams tab opens in the current browser tab when the user selects the link.
+
+The query parameters are:
+
+| Parameter name | Description | Example |
+|:|:--|:|
+| `appId`&emsp; | The ID from Microsoft Teams admin center. |fe4a8eba-2a31-4737-8e33-e5fae6fee194|
+| `entityId`&emsp; | The ID of the tab, which you provided when [configuring the tab](~/tabs/how-to/create-tab-pages/configuration-page.md). When generating a URL for deep linking, continue to use entity ID as a parameter name in the URL. When configuring the tab, the context object refers to the entityID as {page.id}. |Tasklist123|
+| `entityWebUrl` or `subEntityWebUrl`&emsp; | An optional field with a fallback URL to use if the client doesn't support rendering the tab. | `https://tasklist.example.com/123` or `https://tasklist.example.com/list123/task456` |
+| `entityLabel` or `subEntityLabel`&emsp; | A label for the item in your tab to use when displaying the deep link. | Task List 123 or Task 456 |
+| `context.subEntityId`&emsp; | An ID for the item within the tab. When generating a URL for deep linking, continue to use subEntityId as the parameter name in the URL. When configuring the tab, the context object refers to the subEntityID as subPageID. |Task456 |
+| `context.channelId`&emsp; | Microsoft Teams channel ID that is available from the tab [context](~/tabs/how-to/access-teams-context.md). This property is available only in configurable tabs with a scope of **team**. It isn't available in static tabs, which has a **personal** scope.| 19:cbe3683f25094106b826c9cada3afbe0@thread.skype |
+| `context.chatId`&emsp; | Chat ID that is available from the tab [context](~/tabs/how-to/access-teams-context.md) for group and meeting chat. | 17:b42de192376346a7906a7dd5cb84b673@thread.v2 |
+| `context.contextType`&emsp; | Chat is the only supported contextType for meetings. | chat |
+|`&openInMeeting=false`| `openInMeeting` is used to control the user experience when the target tab is associated with a meeting. If user interacts with the deep link in an ongoing meeting experience, by default Teams opens the app in the in-meeting side panel. Set this value to `false` to always open the app in the meeting chat tab rather than the side panel, regardless of the meeting status. Teams ignores any value other than `false`. | `false` |
+
+> [!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. For more information on tab scopes, see the [app manifest](~/resources/schem).
+> * Deep links work properly only if the tab was configured using the library v0.4 or later as it has an entity ID. Deep links to tabs without entity IDs still go to the tab but can't provide the subentity ID to the tab.
+
+**Examples**:
+
+* Link to a static (personal) tab itself:
+
+ >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123&label=Task List 123`
+
+* Link to a task item within the static (personal) tab:
+
+ >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123/456&label=Task 456&context={"subEntityId": "task456"}`
+
+* Link to a configurable tab itself:
+
+ >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123&label=Task List 123&context={"channelId": "19:cbe3683f25094106b826c9cada3afbe0@thread.skype"}`
+
+* Link to a task item within the configurable tab:
+
+ >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123/456&label=Task 456&context={"subEntityId": "task456","channelId": "19:cbe3683f25094106b826c9cada3afbe0@thread.skype"}`
+
+* Link to a tab app added to a meeting or group chat:
+
+ >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123/456&label=Task 456?context={"chatId": "17:b42de192376346a7906a7dd5cb84b673@thread.v2","contextType":"chat"}`
+
+> [!IMPORTANT]
+> Ensure that all the query parameters and the white spaces are properly URI encoded. You must follow the preceding examples using the last example:
+>
+> ```javascript
+> var encodedWebUrl = encodeURIComponent('https://tasklist.example.com/123/456&label=Task 456');
+> var encodedContext = encodeURIComponent(JSON.stringify({"subEntityId": "task456"}));
+> var taskItemUrl = 'https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=' + encodedWebUrl + '&context=' + encodedContext;
+> ```
+
+#### Configure deep link to a tab using TeamsJS library
-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.
+You can configure deep links in your app through the TeamsJS library to allow the app users browse different pages within your app. The following code demonstrates how to navigate to a specific entity within your Teams app:
# [TeamsJS v2](#tab/teamsjs-v2)
The navigation behavior of a Teams app extended across Microsoft 365 Office is d
1. The target that the deep link points to. 1. The host where the Teams app is running.
-If the Teams app is running within the host where the deep link is targeted, your app will open directly within the host. However, if the Teams app is running in a different host from where the deep link is targeted, the app will first open in the browser.
+If the Teams app is running within the host where the deep link is targeted, your app opens directly within the host. However, if the Teams app is running in a different host from where the deep link is targeted, the app will first open in the browser.
-## Navigate to a chat with the application
+## Deep link to a chat with the application
-You can navigate a user to a personal chat with the application by preparing the link manually using the following format:
+You can allow app users browse to a personal chat with the application by configuring the deep link manually using the following format:
-`https://teams.microsoft.com/l/entity/<appId>/conversations`, where `appId` is your application ID and following lists `appId` for different apps:
+`https://teams.microsoft.com/l/entity/<appId>/conversations?tenantId=<tenantId>`, where `appId` is your application ID. To know about different app IDs used see, [app ID used for different apps](#app-id-used-for-different-apps).
-* Side loaded apps: Manifest ID
-* Apps submitted to org catalog: Org catalog ID
-* Apps submitted to Teams app store: Store ID
-
-## Navigate to a tab
+## Share deep link for a tab
-You can create deep links to entities in Teams apps. This method is used to create links that navigate to content and information within your tab. For example, if your tab contains a task list, team members can create and share links to individual tasks. When you select the link, it navigates to your tab that focuses on the specific item.
+You can share deep links to entities in Teams apps to navigate to the content and information within your tab app. For example, if your tab app contains a task list, team members can create and share links to individual tasks. When the app user selects the link, it navigates to your tab that focuses on the specific item.
# [TeamsJS v2](#tab/teamsjs-v2)
To implement, add a **copy link** action to each item, in whatever way best suit
pages.shareDeepLink({ subPageId: <subPageId>, subPageLabel: <subPageLabel>, subPageWebUrl: <subPageWebUrl> }) ```
-You'll need to replace the fields with the appropriate information:
+You need to replace the following parameters 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.
To implement this, add a **copy link** action to each item, in whatever way best
microsoftTeams.shareDeepLink({ subEntityId: <subEntityId>, subEntityLabel: <subEntityLabel>, subEntityWebUrl: <subEntityWebUrl> }) ```
-You'll need to replace the fields with the appropriate information:
+You need to replace the following parameters 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.
-* `subEntityWebUrl`: An optional field with a fallback URL to use if the client doesn't support rendering the tab.
+* `subEntityWebUrl`: An optional parameter with a fallback URL to use if the client doesn't support rendering the tab.
-Alternatively, you can also generate deep links programmatically using the format specified later in this article. You can use deep links in [bot](~/bots/what-are-bots.md) and [connector](~/webhooks-and-connectors/what-are-webhooks-and-connectors.md) messages that inform users about changes to your tab, or to items within it.
- > [!NOTE] >
-> * This deep link is different from the links provided by the **Copy link to tab** menu item, which just generates a deep link that points to this tab.
-> * Currently, `shareDeepLink` doesn't work on mobile platforms.
-
-## Generate a deep link to your tab
-
-While it's recommended to use `shareDeepLink()` to generate a deep link to your tab, it's also possible to create one manually.
-
-> [!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. 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 as it has an entity ID. Deep links to tabs without entity IDs still go to the tab but can't provide the subentity ID to the tab.
-
-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/entity/<appId>/<entityId>?webUrl=<entityWebUrl>&label=<entityLabel>&context=<context>&openInMeeting=false`
-
-> [!NOTE]
->
-> * If the bot sends a message containing a `TextBlock` with a deep link, then a new browser tab is opened when the user selects the link. This happens in Chrome and in the Teams desktop app, both running on Linux.
-> * If the bot sends the same deep link URL into an `Action.OpenUrl`, then the Teams tab opens in the current browser tab when the user selects the link.
-
-The query parameters are:
-
-| Parameter name | Description | Example |
-|:|:--|:|
-| `appId`&emsp; | The ID from Microsoft Teams admin center. |fe4a8eba-2a31-4737-8e33-e5fae6fee194|
-| `entityId`&emsp; | The ID for the item in the tab, which you provided when [configuring the tab](~/tabs/how-to/create-tab-pages/configuration-page.md). When generating a URL for deep linking, continue to use entity ID as a parameter name in the URL. When configuring the tab, the context object refers to the entityID as {page.id}. |Tasklist123|
-| `entityWebUrl` or `subEntityWebUrl`&emsp; | An optional field with a fallback URL to use if the client doesn't support rendering the tab. | `https://tasklist.example.com/123` or `https://tasklist.example.com/list123/task456` |
-| `entityLabel` or `subEntityLabel`&emsp; | A label for the item in your tab to use when displaying the deep link. | Task List 123 or Task 456 |
-| `context.subEntityId`&emsp; | An ID for the item within the tab. When generating a URL for deep linking, continue to use subEntityId as the parameter name in the URL. When configuring the tab, the context object refers to the subEntityID as subPageID. |Task456 |
-| `context.channelId`&emsp; | Microsoft Teams channel ID that is available from the tab [context](~/tabs/how-to/access-teams-context.md). This property is only available in configurable tabs with a scope of **team**. It isn't available in static tabs, which have a scope of **personal**.| 19:cbe3683f25094106b826c9cada3afbe0@thread.skype |
-| `context.chatId`&emsp; | Chat ID that is available from the tab [context](~/tabs/how-to/access-teams-context.md) for group and meeting chat. | 17:b42de192376346a7906a7dd5cb84b673@thread.v2 |
-| `context.contextType`&emsp; | Chat is the only supported contextType for meetings. | chat |
-| `openInMeeting`&emsp; | `openInMeeting` is used to control the user experience when the target tab is associated with a meeting. If user interacts with the deep link in an ongoing meeting experience, by default Teams opens the app in the in-meeting side panel. Set this value to `false` to always open the app in the meeting chat tab rather than the side panel, regardless of the meeting status. Teams ignore any value other than `false`. | `false` |
-
-**Examples**:
-
-* Link to a static (personal) tab itself:
-
- >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123&label=Task List 123`
-
-* Link to a task item within the static (personal) tab:
-
- >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123/456&label=Task 456&context={"subEntityId": "task456"}`
-
-* Link to a configurable tab itself:
-
- >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123&label=Task List 123&context={"channelId": "19:cbe3683f25094106b826c9cada3afbe0@thread.skype"}`
-
-* Link to a task item within the configurable tab:
-
- >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123/456&label=Task 456&context={"subEntityId": "task456","channelId": "19:cbe3683f25094106b826c9cada3afbe0@thread.skype"}`
-
-* Link to a tab app added to a meeting or group chat:
-
- >`https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123/456&label=Task 456?context={"chatId": "17:b42de192376346a7906a7dd5cb84b673@thread.v2","contextType":"chat"}`
-
-> [!IMPORTANT]
-> Ensure that all the query parameters and the white spaces are properly URI encoded. You must follow the preceding examples using the last example:
->
-> ```javascript
-> var encodedWebUrl = encodeURIComponent(JSON.stringify('https://tasklist.example.com/123/456&label=Task 456'));
-> var encodedContext = encodeURIComponent(JSON.stringify({"subEntityId": "task456"}));
-> var taskItemUrl = 'https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=' + encodedWebUrl + '&context=' + encodedContext;
-> ```
-
-### Navigation from your tab
-
-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 to open a scheduling dialog. Formerly, navigation might have required a deep link, but it can now in many instances be accomplished using the TeamsJS library. But where possible use of the typed capabilities of the TeamsJS library is recommended.
-
-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 if 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 library 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 more information about capabilities and the APIs in the TeamsJS library, see [Building tabs and other hosted experiences with the TeamsJS library](~/tabs/how-to/using-teams-client-sdk.md#apis-organized-into-capabilities).
+> * This deep link is different from the links provided by the **Copy link to tab** menu item, which only generates a deep link that points to this tab.
+> * `shareDeepLink` doesn't work on Teams mobile platforms.
-### Deep link for SharePoint Framework tabs
+## Deep link for SharePoint Framework tabs
You can use the following deep link format in a bot, connector, or message extension card: `https://teams.microsoft.com/l/entity/<appId>/<EntityId>?webUrl=<entityWebUrl>/<EntityName>`. > [!NOTE] >
-> * When a bot sends a TextBlock message with a deep link, a new browser tab opens when users select the link. This happens in Chrome and Microsoft Teams desktop app running on Linux.
+> * When a bot sends a `TextBlock` message with a deep link, a new browser tab opens when users select the link. This happens in Chrome and Microsoft Teams desktop app running on Linux.
> * If the bot sends the same deep link URL in an `Action.OpenUrl`, the Teams tab opens in the current browser when the user selects the link. No new browser tab is opened. The query parameters are:
The query parameters are:
* `appID`: Your manifest ID, for example `fe4a8eba-2a31-4737-8e33-e5fae6fee194`. * `entityID`: The item ID that you provided when [configuring the tab](~/tabs/how-to/create-tab-pages/configuration-page.md). For example, `tasklist123`.
-* `entityWebUrl`: An optional field with a fallback URL to use if the client doesn't support rendering of the tab - `https://tasklist.example.com/123` or `https://tasklist.example.com/list123/task456`.
+* `entityWebUrl`: An optional parameter with a fallback URL to use if the client doesn't support rendering of the tab - `https://tasklist.example.com/123` or `https://tasklist.example.com/list123/task456`.
* `entityName`: A label for the item in your tab to use when displaying the deep link, `Task List 123` or `Task 456`. Example: `https://teams.microsoft.com/l/entity/fe4a8eba-2a31-4737-8e33-e5fae6fee194/tasklist123?webUrl=https://tasklist.example.com/123&TaskList`
The following table provides information on `APP_ID` and `BOT_APP_ID`:
| Value | Type | Required | Description | | | | | |
-| `APP_ID` | string | Yes | For third-party apps, use the app `id` from manifest or the `APP_ID` from Teams admin center as they are identical. For Line of business (LOB) or custom apps, use the `APP_ID` from Teams admin center or use the [Graph API](/graph/api/application-list). The [validDomains array](~/resources/schem#validdomains) in the manifest for `APP_ID` must contain the domain for `url` if `url` is present in the deep-link 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. |
+| `APP_ID` | string | Yes | For third-party apps, use the app `id` from manifest or the `APP_ID` from Teams admin center as they're identical. For Line of business (LOB) or custom apps, use the `APP_ID` from Teams admin center or use the [Graph API](/graph/api/application-list). The [validDomains array](~/resources/schem#validdomains) in the manifest for `APP_ID` must contain the domain for `url` if `url` is present in the deep-link 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, which 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 and if there is one.
By default, a deep link opens in a meeting side panel. To open a deep link direc
`https://teams.microsoft.com/l/entity/<appId>/<entityId>?webUrl=<entityWebUrl>&label=<entityLabel>&context=<context>&openInMeeting=false`
-For more information, see [deep link to a tab](~/concepts/build-and-test/deep-link-application.md#generate-a-deep-link-to-your-tab).
+For more information, see [deep link to a tab](#configure-deep-link-to-browse-within-your-app-manually).
Deep link doesn't open in the meeting side panel in the following scenarios:
-* If there is no active meeting.
+* If there's no active meeting.
* If the app doesn't have `sidePanel` context declared in the app manifest. * If `openInMeeting=false` is set in the deep link. * If deep link is selected outside of the meeting window or component.
Deep link doesn't open in the meeting side panel in the following scenarios:
| Sample name | Description | .NET |Node.js| |-|-||-|
-|Deep link consuming Subentity ID | This sample shows how to use deep-link from bot chat to tab consuming Subentity ID. It also shows deeplinks for navigate to app, navigate to chat, open profile dialog and open scheduling dialog.|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-deeplink/csharp)|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-deeplink/nodejs)|
+|Deep link consuming Subentity ID | This sample shows how to use deep-link from bot chat to tab consuming Subentity ID. It also shows deep links for navigate to app, navigate to chat, open profile dialog and open scheduling dialog.|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-deeplink/csharp)|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-deeplink/nodejs)|
platform Deep Link Teams https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-link-teams.md
Last updated 01/31/2023
# Deep link to Teams chat
-You can navigate to or create private chats between users with the Microsoft Teams JavaScript client library (TeamsJS) by specifying the set of participants. If a chat doesnΓÇÖt exist with the specified participants, the user is navigated to an empty new chat. New chats are created in draft state until the user sends the first message. Otherwise, you can specify the name of the chat if it doesnΓÇÖt already exist, along with text that should be inserted into the user's compose box. You can think of this feature as a shortcut for the user taking the manual action of navigating to or creating the chat, and then typing out the message.
+You can create a deep link to a Teams chat, such as to start a new chat, browse to a channel conversation, and to a file in a channel.
-As a use-case example, if youΓÇÖre returning a Microsoft 365 user profile from your bot as a card, this deep link can allow the user to easily chat with that person. The following example demonstrates how to open a chat message to a group of participants with an initial message.
+In this article, youΓÇÖll learn to create a deep link:
+* [To start a new chat](#deep-link-to-start-a-new-chat)
+* [To navigate to channel conversation](#deep-links-to-navigate-to-channel-conversation)
+* [To navigate to chat messages](#deep-link-to-teams-chat)
+* [To file in a channel](#generate-deep-links-to-file-in-a-channel)
+
+## Deep link to start a new chat
+
+You can navigate to or create private chats between users with the Microsoft Teams JavaScript client library (TeamsJS) by specifying the set of participants. If a chat doesnΓÇÖt exist with the specified participants, the user is navigated to an empty new chat.
+
+When a user creates a new chat using a deep link, Teams creates the new chat in the draft state until the user sends the first message. You can also provide the name of the chat if it doesnΓÇÖt already exist, along with text that should be inserted into the user's compose box. You can think of this as a shortcut for the user taking the manual action of navigating to or creating the chat, and then typing out the message.
+
+As a use-case example, if youΓÇÖre retrieving a Microsoft 365 user profile information from your bot as a card, this deep link can allow the app user to easily chat with that person.
+
+You can configure deep links to start a new chat in one of the following two ways:
+
+* [Configure deep link to start a chat manually](#configure-deep-link-to-start-a-chat-manually)
+* [Configure deep link to start a chat using TeamsJS library](#configure-deep-link-to-start-a-chat-using-teamsjs-library)
+
+#### Configure deep link to start a chat manually
+
+While use of the typed APIs is recommended, you can alternatively use the following format for a manually created deep link that you can use in a bot, connector, or message extension card. To use this deep link with your bot, specify this as the URL target in your card's button or tap action through the `openUrl` action type.
+
+`https://teams.microsoft.com/l/chat/0/0?tenantId=<tenantId>&users=<user1>,<user2>,...&topicName=<chat name>&message=<precanned text>`
+
+The query parameters are:
+
+* `users`: A comma-separated list of user IDs representing the participants of the chat. The user that performs the action is always included as a participant. Currently, the User ID parameter supports the Microsoft Azure Active Directory (Azure AD) `UserPrincipalName`, such as an email address only.
+* `topicName`: An optional parameter for chat's display name if a chat has three or more users. If this field isn't specified, the chat's display name is based on the names of the participants.
+* `message`: An optional field for the message text that you want to insert into the current app user's compose box while the chat is in the draft state.
+
+Example: `https://teams.microsoft.com/l/chat/0/0?users=joe@contoso.com,bob@contoso.com&topicName=Prep%20For%20Meeting%20Tomorrow&message=Hi%20folks%2C%20kicking%20off%20a%20chat%20about%20our%20meeting%20tomorrow`
++
+#### Configure deep link to start a chat using TeamsJS library
+
+The following example demonstrates how to open a chat message to a group of participants with an initial message. You can target the deep link to an existing or a new chat. If a chat already exists, the deep link opens in that chat.
```javascript if(chat.isSupported()) {
if(chat.isSupported()) {
else { /* handle case where capability isn't supported */ } ```
-While use of the typed APIs is recommended, you can alternatively use the following format for a manually created deep link that you can use in a bot, connector, or message extension card:
-
-`https://teams.microsoft.com/l/chat/0/0?users=<user1>,<user2>,...&topicName=<chat name>&message=<precanned text>`
-
-Example: `https://teams.microsoft.com/l/chat/0/0?users=joe@contoso.com,bob@contoso.com&topicName=Prep%20For%20Meeting%20Tomorrow&message=Hi%20folks%2C%20kicking%20off%20a%20chat%20about%20our%20meeting%20tomorrow`
-
-The query parameters are:
-
-* `users`: The comma-separated list of user IDs representing the participants of the chat. The user that performs the action is always included as a participant. Currently, the User ID field supports the Microsoft Azure Active Directory (Azure AD) UserPrincipalName, such as an email address only.
-* `topicName`: An optional field for chat's display name if a chat has three or more users. If this field isn't specified, the chat's display name is based on the names of the participants.
-* `message`: An optional field for the message text that you want to insert into the current user's compose box while the chat is in a draft state.
-
-To use this deep link with your bot, specify this as the URL target in your card's button or tap action through the `openUrl` action type.
- ## Deep links to navigate to channel conversation
-Use the following deep link format to go to a particular conversation within channel thread:
+You can use the following deep link format to go to a particular conversation within channel thread:
`https://teams.microsoft.com/l/message/<channelId>/<parentMessageId>?tenantId=<tenantId>&groupId=<groupId>&parentMessageId=<parentMessageId>&teamName=<teamName>&channelName=<channelName>&createdTime=<createdTime>`
-Example: `https://teams.microsoft.com/l/message/<channelId>/1648741500652?tenantId=<tenantId>&groupId=<groupId>&parentMessageId=1648741500652&teamName=<teamName>&channelName=<channelName>&createdTime=1648741500652`
- The query parameters are: * `channelId`: Channel ID of the conversation. For example, `19:3997a8734ee5432bb9cdedb7c432ae7d@thread.tacv2`.
-* `tenantId`: Tenant ID such as `0d9b645f-597b-41f0-a2a3-ef103fbd91bb`.
+* `tenantId`: Tenant ID, such as `0d9b645f-597b-41f0-a2a3-ef103fbd91bb`.
* `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.
The query parameters are:
> [!NOTE] > You can see `channelId` and `groupId` in the URL from the channel.
+Example: `https://teams.microsoft.com/l/message/<channelId>/1648741500652?tenantId=<tenantId>&groupId=<groupId>&parentMessageId=1648741500652&teamName=<teamName>&channelName=<channelName>&createdTime=1648741500652`
+ ## Deep links to navigate to chat messages Use the following deep link format to navigate a user to a message in a personal or group chat in Teams:
-`https://teams.microsoft.com/l/message/{chatId}/{messageId}?context={"contextType":"chat"}`
+`https://teams.microsoft.com/l/message/{chatId}/{messageId}?tenantId=<tenantId>?context={"contextType":"chat"}`
Example: `https://teams.microsoft.com/l/message/19:253f5895-9a62-4362-8d38-43f0205c702c_f1b94dcf-0aa3-4989-bcdf-ef4a5ed00f86@unq.gbl.spaces/1563480968434?context=%7B%22contextType%22:%22chat%22%7D` The query parameters are: * `chatId`: ChatID of the conversation. The supported format for `chatId` is 19:xxx. For example, `19:253f5895-9a62-4362-8d38-43f0205c702c_f1b94dcf-0aa3-4989-bcdf-ef4a5ed00f86@unq.gbl.spaces`.- Apps can read a chat ID through app context in Teams, incoming payload to bot, or through [Microsoft Graph APIs](/graph/api/chat-get?view=graph-rest-1.0&tabs=http&preserve-view=true).- > [!NOTE] > For one-on-one chats with bot, the incoming payload to bot contains the conversation ID in a:xxx format.-
-* `messageId`: Each message in a chat has a unique ID. When a bot posts a message in chat, the `messageId` is returned. You can also get the `messageId` through [Microsoft Graph APIs](/graph/api/message-get?view=graph-rest-1.0&tabs=http&preserve-view=true). For example, `1563480968434`.
-
+* `messageId`: Unique message ID of each message in a chat. When a bot posts a message in chat, the `messageId` is returned. You can also get the `messageId` through [Microsoft Graph APIs](/graph/api/message-get?view=graph-rest-1.0&tabs=http&preserve-view=true). For example, `1563480968434`.
* `context`: Specify the contextType as chat.
+Example: `http://teams.microsoft.com/l/message/19:253f5895-9a62-4362-8d38-43f0205c702c_f1b94dcf-0aa3-4989-bcdf-ef4a5ed00f86@unq.gbl.spaces/1563480968434?context=%7B%22contextType%22:%22chat%22%7D`
+ ## Generate deep links to file in a channel
-The following deep link format can be used in a bot, connector, or message extension card:
+Use the following deep link format can be used in a bot, connector, or message extension card for configuring a deep link to connect to a file in a channel:
`https://teams.microsoft.com/l/file/<fileId>?tenantId=<tenantId>&fileType=<fileType>&objectURL=<objectURL>&baseUrl=<baseURL>&serviceName=<Name>&threadId=<threadId>&groupId=<groupId>` The query parameters are: * `fileId`: Unique file ID from Sharepoint Online, also known as `sourcedoc`. For example, `1FA202A5-3762-4F10-B550-C04F81F6ACBD`.
-* `tenantId`: Tenant ID such as `0d9b645f-597b-41f0-a2a3-ef103fbd91bb`.
+* `tenantId`: Tenant ID, such as `0d9b645f-597b-41f0-a2a3-ef103fbd91bb`.
* `fileType`: Supported file type, such as .docx, .pptx, .xlsx, and .pdf. * `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`.
The query parameters are:
> [!NOTE] > You can see `threadId` and `groupId` in the URL from the channel.
-The following deep link format is used in a bot, connector, or message extension card:
-
-`https://teams.microsoft.com/l/file/<fileId>?tenantId=<tenantId>&fileType=<fileType>&objectURL=<objectURL>&baseUrl=<baseURL>&serviceName=<Name>&threadId=<threadId>&groupId=<groupId>`
- The following example format illustrates the deep link to files: `https://teams.microsoft.com/l/file/5E0154FC-F2B4-4DA5-8CDA-F096E72C0A80?tenantId=0d9b645f-597b-41f0-a2a3-ef103fbd91bb&fileType=pptx&objectUrl=https%3A%2F%2Fmicrosoft.sharepoint.com%2Fteams%2FActionPlatform%2FShared%20Documents%2FFC7-%20Bot%20and%20Action%20Infra%2FKaizala%20Actions%20in%20Adaptive%20Cards%20-%20Deck.pptx&baseUrl=https%3A%2F%2Fmicrosoft.sharepoint.com%2Fteams%2FActionPlatform&serviceName=teams&threadId=19:f8fbfc4d89e24ef5b3b8692538cebeb7@thread.skype&groupId=ae063b79-5315-4ddb-ba70-27328ba6c31e`
platform Deep Link Workflow https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-link-workflow.md
Last updated 01/31/2023
You can create a deep link to perform a specific task in Teams, such as to create a new chat, open a scheduling dialog, and navigate to audio-video call.
+In this article, youΓÇÖll learn to create a deep link:
+
+* [To start a new chat](#deep-link-to-start-a-new-chat)
+* [To open a meeting scheduling dialog](#deep-link-to-open-a-meeting-scheduling-dialog)
+* [To start an audio-video call](#deep-link-to-start-an-audio-video-call-with-users)
+* [To share content to stage in meetings](#generate-a-deep-link-to-share-content-to-stage-in-meetings)
+* [To meeting side panel](#deep-link-to-meeting-side-panel)
+* [To join a meeting](#deep-link-to-join-a-meeting)
+* [Invoke Stage View through deep link](#invoke-stage-view-through-deep-link)
+ ## Deep link to start a new chat Applications can start a new chat with a list of users and provide additional information such as chat name and draft message by using the following format:
else { /* handle case where capability isn't supported */ }
## Deep link to open a meeting scheduling dialog
-Applications can open a meeting scheduling dialog and provide information such as meeting title and participants. While it's recommended to use the 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:
+You can create deep link in your Teams apps to open a meeting scheduling dialog and provide information, such as meeting title and participants. To do this, use one of the following methods:
-`https://teams.microsoft.com/l/meeting/new?subject=<meeting subject>&startTime=<date>&endTime=<date>&content=<content>&attendees=<user1>,<user2>,<user3>,...`
+* [Configure deep link manually to open a meeting scheduling dialog](#configure-deep-link-manually-to-open-a-meeting-scheduling-dialog)
+* [Configure deep link using TeamsJS library to open a meeting scheduling dialog](#configure-deep-link-using-teamsjs-library-to-open-a-meeting-scheduling-dialog)
-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ΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇï`
+While it's recommended to use the typed APIs of TeamsJS, it's possible to manually create deep links to the Teams built-in scheduling dialog.
+
+#### Configure deep link manually to open a meeting scheduling dialog
+
+Use the following format for configuring 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>,...`
> [!NOTE] > The search parameters don't support `+` signal in place of whitespace (``). Ensure your URI encoding code returns `%20` for spaces. For example, `?subject=test%20subject` is good, but `?subject=test+subject` is bad. The query parameters are:
-* `attendees`: The optional comma-separated list of user IDs representing the attendees of the meeting. The user performing the action is the meeting organizer. Currently, the user ID field supports only the Azure AD UserPrincipalName, typically an email address.
-* `startTime`: The optional start time of the event. Start time should be in [long ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601), for example *2018-03-12T23:55:25+02:00*.
-* `endTime`: The optional end time of the event, also in ISO 8601 format.
-* `subject`: An optional field for the meeting subject.
-* `content`: An optional field for the meeting details field.
+* `attendees`: An optional comma-separated list of user IDs representing the attendees of the meeting. The user performing the action is the meeting organizer. The user ID field supports only the Azure AD `UserPrincipalName`, typically an email address.
+* `startTime`: The optional parameter for start time of the event. Start time should be in [long ISO 8601 format](https://en.wikipedia.org/wiki/ISO_8601), for example *2018-03-12T23:55:25+02:00*.
+* `endTime`: An optional parameter for end time of the event, also in ISO 8601 format.
+* `subject`: An optional parameter for the meeting subject.
+* `content`: An optional parameter for the meeting details field.
> [!NOTE]
-> Currently, specifying the location isn't supported. You must specify the UTC offset, it means time zones, when generating your start and end times.
+> You can't specify the location as it isn't supported. You must specify the UTC offset, which includes time zones, when generating the start and end times.
To use this deep link with your bot, you can specify the deep link as the URL target in your card's button or as a tap action through the `openUrl` action type.
-Applications can also use TeamsJS library 2.0 to open the meeting scheduling dialog without having to manually prepare the link. Refer to the following code sample, provided a note:
+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ΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇïΓÇï`
+
+#### Configure deep link using TeamsJS library to open a meeting scheduling dialog
+
+You can also use TeamsJS library 2.0 in your Teams app to open the meeting scheduling dialog without having to manually prepare the link. In order to open the scheduling dialog in Teams, you must continue using the original deep-link URL based method, as Teams doesn't support the calendar capability yet:
# [TeamsJS v2](#tab/teamsjs-v2)
microsoftTeams.executeDeepLink("https://teams.microsoft.com/l/meeting/new?subjec
-> [!NOTE]
-> In order to open the scheduling dialog in Teams, the developers need to continue using the original deep-link URL based method, since Teams doesn't support the calendar capability yet.
- For more information about working with the calendar, see [calendar](/javascript/api/@microsoft/teams-js/calendar?view=msteams-client-js-latest&preserve-view=true) namespace in the API reference documentation. ## Deep link to start an audio-video call with users
-Applications can prepare a deep link for users to start one-on-one or a group audio or video call. 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. If there's a group call, you can call a set of VoIP users and a set of PSTN users in the same deep link invocation.
+You can configure your Teams apps to prepare a deep link for users to start one-on-one call, a group call, or video call. 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 for a confirmation to make the call. If there's a group call, you can call a set of VoIP users and a set of PSTN users in the same deep link invocation.
-In a video call, the client asks for confirmation and turns 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 Teams client asks for confirmation before turning 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.
+> This method can't be used for invoking a meeting.
+
+You can configure deep links in one of the following two ways:
+
+* [Configure deep link manually to start audio-video call with users](#configure-deep-link-manually-to-start-audio-video-call-with-users)
+* [Configure deep link using TeamsJS library to start audio-video call with users](#configure-deep-link-using-teamsjs-library-to-start-audio-video-call-with-users)
-While the use of the typed APIs of TeamsJS is recommended, you can also use a manually created deep link to start a call. Refer to the following formats:
+#### Configure deep link manually to start audio-video call with users
+
+While the use of the typed APIs of TeamsJS library is recommended, you can also use a manually configured deep link to start a call. Refer to the following formats:
| Deep link | Format | Example | |--|--||
While the use of the typed APIs of TeamsJS is recommended, you can also use a ma
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 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 only turns on the caller's camera. The receiver of the call has a choice to answer through an audio or an 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.
+* `users`: A comma-separated list of user IDs representing the participants of the call. 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`: An optional parameter, which you can use to make a video call. Setting this parameter only turns on the caller's camera. The receiver of the call has a choice to answer through an audio or an audio and video call through the Teams call notification window.
+* `Source`: An optional parameter, which informs about the source of the deep link.
+
+#### Configure deep link using TeamsJS library to start audio-video call with users
Applications can also use TeamsJS library 2.0 to start calls without having to manually prepare these deep links. The following code demonstrates using the TeamsJS library to start a call:
else { /* handle case where capability isn't supported */ }
## Generate a deep link to share content to stage in meetings
-You can also generate a deep link to [share the app to stage](~/apps-in-teams-meetings/enable-and-configure-your-app-for-teams-meetings.md#share-entire-app-to-stage) and start or join a meeting.
+You can generate a deep link to [share the app to stage](~/apps-in-teams-meetings/enable-and-configure-your-app-for-teams-meetings.md#share-entire-app-to-stage) and to start or join a meeting.
For deep links to share content to stage, see [deep link to share content to stage in meetings](~/concepts/build-and-test/share-in-meeting.md#generate-a-deep-link-to-share-content-to-stage-in-meetings).
By default, a deep link opens in a meeting side panel. To open a deep link direc
`https://teams.microsoft.com/l/entity/<appId>/<entityId>?webUrl=<entityWebUrl>&label=<entityLabel>&context=<context>&openInMeeting=false`
-For more information, see [deep link to a tab](~/concepts/build-and-test/deep-link-application.md#generate-a-deep-link-to-your-tab).
+For more information, see [deep link to a tab](~/concepts/build-and-test/deep-link-application.md#configure-deep-link-to-browse-within-your-app-manually).
Deep link doesn't open in the meeting side panel in the following scenarios:
Deep link doesn't open in the meeting side panel in the following scenarios:
## Deep link to join a meeting
-Application can read, join a meeting URL through Graph APIs. This deep link brings up the UI for the user to join that meeting.
+Teams app can read the URL for joining a meeting URL through Graph APIs. This deep link brings up the UI for the user to join the meeting. For more information see, [Get `onlineMeeting`](/graph/api/onlinemeeting-get#response-1) and [Get meeting details](~/apps-in-teams-meetings/meeting-apps-apis.md#get-meeting-details-api)
+
+## Invoke Stage View through deep link
+
+To invoke the Stage View through deep link from your tab, you must wrap the deep link URL in the `app.openLink(url)` API. The deep link can also be passed through an `OpenURL` action in the card. For more information see, [Stage View](~/tabs/tabs-link-unfurling.md#invoke-stage-view-through-deep-link).
## Code Sample
platform Deep Links Execution Handling https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-links-execution-handling.md
+
+ Title: Execution and handling of deep links
+
+description: Learn how to execute and handle deep links in your Microsoft Teams.
++
+ms.localizationpriority: high
++
+# Configuration and handling of deep links
+
+You can configure your Teams app to execute deep links from different contexts such as personal tab, shared tab, chat message, and bot.
+
+## Personal or Shared tab
+
+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. Apps can execute a deep link using the TeamsJS library. To execute a deep link, call the following API:
+
+# [TeamsJS v2](#tab/teamsjs-v2)
+
+You can trigger the 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()) {
+ const navPromise = pages.navigateToApp({ appId: <appId>, pageId: <pageId>, webUrl: <webUrl>, subPageId: <subPageId>, channelId:<channelId>});
+ navPromise.
+ then((result) => {/*Successful navigation*/}).
+ catch((error) => {/*Failed navigation*/});
+}
+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'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)
+
+To trigger a deep link from your tab, call:
+
+```javascript
+microsoftTeams.executeDeepLink(/*deepLink*/);
+```
+++
+## Chat message
+
+You can configure your app to post messages to a chat and add deep links to them. The following are different ways you can include a deep link in a message:
+
+### Hyperlink text message
+
+When you add a deep link to a hyperlinked markdown text message, it's triggered and opened within Teams. Following is an example:
+
+Example: `[App](https://teams.microsoft.com/l/app/{appId})`, where `appId` is your application ID. To know more about different app IDs used see, [app ID used for different apps](~/concepts/build-and-test/deep-link-application.md#app-id-used-for-different-apps).
+
+For more information, see [use Markdown formatting in Teams](https://support.microsoft.com/en-us/office/use-markdown-formatting-in-teams-4d10bd65-55e2-4b2d-a1f3-2bebdcd2c772).
+
+### Raw link text message
+
+When you add a deep link to a raw text message, it's triggered and opened within Teams. Following is an example:
+
+Example: `https://teams.microsoft.com/l/app/{appId}`, where `appId` is your application ID. To know more about different app IDs used see, [app ID used for different apps](~/concepts/build-and-test/deep-link-application.md#app-id-used-for-different-apps).
++
+### Adaptive Card
+
+You can include an `openURL` action in an Adaptive Card and add a deep link to it. The deep link is executed within Teams. As raw links or hyperlinks in an Adaptive Card open in the browser, it's recommended that you use `openURL` action. For more information, see [Action.OpenUrl](https://adaptivecards.io/explorer/Action.OpenUrl.html).
+
+Following is an example Adaptive Card payload:
+
+```json
+
+{
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "type": "AdaptiveCard",
+ "version": "1.5",
+ "body": [
+ {
+ "type": "TextBlock",
+ "text": "This card's action will open a URL"
+ }
+ ],
+ "actions": [
+ {
+ "type": "Action.OpenUrl",
+ "title": "Action.OpenUrl",
+ "url": "https://teams.microsoft.com/l/app/{appId}"
+ }
+ ]
+}
+
+```
+
+## Handle deep links
+
+When a deep link to a tab app is triggered, ensure that all parameters are set in that link for the tab context. It allows the tab context to identify the page, subpage, or label configured in the deep link and open the specific section. For more information, see [Get context for your tab.](~/tabs/how-to/access-teams-context.md)
+
+## Consume a deep link from a tab
+
+When Teams navigates to the tab through a deep link, Teams verifies if the subpage ID exists and retrieves it through the TeamsJS library.
+
+If the tab is navigated through a deep link, the [`app.getContext()`](/javascript/api/@microsoft/teams-js/app?view=msteams-client-js-latest#@microsoft-teams-js-app-getcontext&preserve-view=true) calls `microsoftTeams.getContext()` to verify if the subpage ID exists. In TeamsJS v1 library subpage ID is named as `subPageId` and in v2 it's `SubEntityId`. 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).
platform Deep Links https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-links.md
ms.localizationpriority: high
Last updated 04/13/2023
-# Create deep links
+# Configure deep links
-Deep links are a navigation mechanism that helps users to connect with features and information within Teams and Teams app. Some scenarios where creating deep links can be useful are as follows:
+Deep links are a navigation mechanism that helps users to connect with features and information within Teams and Teams apps. The following are few scenarios where deep links are useful:
-* Navigating the user to the content within one of your app's tabs. For instance, your app can have a bot that sends messages notifying the user of an important activity. When the user selects an action button on the Adaptive Card sent by the bot, the deep link navigates to the tab to show more details about the activity.
-* Your app automates or simplifies certain user tasks. You can create a chat or schedule a meeting by pre-populating the deep links with required parameters. Avoids the need for users to manually enter information.
+* App users can browse through the contents within a tab. For instance, your app can have a bot that sends messages notifying the user of an important activity. When the user selects the notification, the deep link navigates to the tab where the user can view more details about the activity.
-The Microsoft Teams JavaScript client library (TeamsJS) simplifies the process of navigation. For many scenarios, such as navigating to content and information within your tab or launching a chat dialog. TeamsJS provides typed APIs that provide improved experience and can replace the usage of deep links. These APIs are recommended for Teams apps that might be run in other hosts (Outlook, Microsoft 365 app), as they also provide a way to check that the capability being used is supported by that host.
+ :::image type="content" source="~/assets/images/deeplink-tasks.gif" alt-text="Graphical representation shows the user experience of deep links in tab app.":::
+* App users can enjoy enhanced app experience by using simplified or automated user tasks, such as creating a new chat and scheduling a meeting by prepopulating the deep links with required parameters.
+
+ :::image type="content" source="~/assets/images/deeplink-schedule.gif" alt-text="Graphical representation shows the user experience of deep links to launch a meeting scheduling dialog.":::
+
+Deep links can be categorized as follows:
:::image type="content" source="~/assets/images/deep-links.png" alt-text="Diagram that shows different scenarios for deep links.":::
-You can open the application profile dialog, navigate within your app, and generate a deep link and navigate to your tab through [deep link to an application](~/concepts/build-and-test/deep-link-application.md).
+* **Deep link to an app**: You can open the app install dialog, navigate within your app, and generate a deep link and navigate to your tab through [deep link to an app](~/concepts/build-and-test/deep-link-application.md).
-You can navigate to a channel conversation, chat messages, and to file in a channel through [deep links to a chat](~/concepts/build-and-test/deep-link-teams.md).
+* **Deep link to a chat**: You can navigate to a channel conversation, chat messages, and to file in a channel through [deep link to a chat](~/concepts/build-and-test/deep-link-teams.md).
-You can create a [deep link to perform a specific task](~/concepts/build-and-test/deep-link-workflow.md) in Teams, such as to create a new chat, open a scheduling dialog, and navigate to audio-video call.
+* **Deep link to a workflow**: You can create a deep link to perform a specific task in Teams, such as to create a new chat, open a scheduling dialog, and navigate to audio-video call through [deep link to a workflow](~/concepts/build-and-test/deep-link-workflow.md).
-> [!NOTE]
-> The behavior of deep links is dependent on a number of factors. The following list outlines the behavior of deep links on Teams entities.
->
-> **Tab**:
-> Γ£ö Directly navigates to the deep link URL.
->
-> **Bot**:
-> Γ£ö Deep link in card body: Opens in browser first.
-> Γ£ö Deep link added to OpenURL action in Adaptive Card: Directly navigates to the deep link url.
-> Γ£ö Hyperlink markdown text in the card: Opens in browser first.
->
-> **Chat**:
-> Γ£ö Text message hyperlink markdown: Directly navigates to deep link url.
-> Γ£ö Link pasted in general chat conversation: Directly navigates to deep link url.
->
->
->The navigation behavior of a Teams app extended across Microsoft 365 (Outlook/Microsoft 365 app) is dependent on two factors:
->
-> * The target that the deep link points to.
-> * The host where the Teams app is running.
->
-> If the Teams app is running within the host where the deep link is targeted, your app opens directly within the host. However, if the Teams app is running in a different host from where the deep link is targeted, the app opens in a browser first.
+The Microsoft Teams JavaScript client library (TeamsJS) can be used for navigation. For scenarios, such as navigating to content and information within your tab or launching a chat dialog, TeamsJS typed APIs provide improved experience. These APIs are recommended for Teams apps that might be run in other hosts (Outlook, Microsoft 365 app), as they also provide a way to check that the capability used is supported by the host.
<! TBD: Edit this article. * Admonitions/alerts seem to be overused.
platform Submission Checklist https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/submission-checklist.md
During submission, you're asked to categorize your app. You can categorize your
| Maps and feeds | | Other |
-Distribute your app to specific countries or regions.
+### Distribute your app to specific countries or regions
If you want to cater your app to a specific audience, you can select from the available list of countries or regions and communicate whatΓÇÖs great about your app in ways that are relevant to users. This is known as Geo-filtering. Geo-filtering is applicable only for apps listed in the Teams store. For example, a Contoso US app, which sells gift cards that are valid within the US and Canada is only visible in the Teams store for the users in the US and Canada.
platform Teamsjs Support M365 https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/teamsjs-support-m365.md
The following table lists host application support for TeamsJS capabilities that
<td></td> <td></td> </tr>
+ <th><a href="#secondarybrowser">secondaryBrowser</a><img src="./images/preview-badge.png" alt="Badge indicating this capability is in preview" /></th>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td></td>
+ <td>&#x2713;*</td>
+ <td></td>
+ <td></td>
+ <td></td>
+ </tr>
</tbody> </table>
The following table lists support for TeamsJS capabilities that run only in the
## Preview capabilities awaiting host support
-Some capabilities in the source are in early preview and still awaiting initial support in one or more host applications that include [**barCode**](#barcode), [**media**](#media), [**meeting**](#meeting), [**search**](#search), and [**secondaryBrowser**](#secondarybrowser).
+Some capabilities in the source are in early preview and still awaiting initial support in one or more host applications that include [**barCode**](#barcode), [**media**](#media), [**meeting**](#meeting), and [**search**](#search).
Later in this article, you can find more information on each capability of the Teams JavaScript client library.
Preview. Namespace supporting in-app browser experiences of the host app. For ex
<td></td> <td></td> <td></td>
- <td></td>
+ <td>&#x2713;*</td>
<td></td> <td></td> <td></td>
platform Tab Navigation https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/tab-navigation.md
if (pages.currentApp.isSupported()) {
else {/*Handle situation where capability isn't supported*/} ```
-You can use the `pages.navigateToApp()` function. You can also use deep links for tab navigation as shown in [create deep links](~/concepts/build-and-test/deep-link-application.md#navigate-within-your-app).
+You can use the `pages.navigateToApp()` function. You can also use deep links for tab navigation as shown in [create deep links](~/concepts/build-and-test/deep-link-application.md#configure-deep-link-to-a-tab-using-teamsjs-library).
## Configure back button navigation
platform Send Activity Feed Notification https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/send-activity-feed-notification.md
+
+ Title: Send activity feed notifications
+description: Learn to send activity feed notification to help keep users up to date with changes in the tools and workflows.
+
+ms.localizationpriority: medium
+++
+# Send activity feed notifications to users in Microsoft Teams
+
+The Microsoft Teams activity feed enables users to triage items that require attention by notifying them of changes. You can use the activity feed notification APIs in Microsoft Graph to extend this functionality to your apps. This allows your apps to provide richer experiences and better engage users by helping to keep them up-to-date with changes in the tools and workflows they use.
+
+## Use cases of activity feed notifications
+
+* **News**: Helps users to stay updated with the latest information like new assignment or new post.
+* **Collaboration**: When you share a file or @ mention a user in a comment, users can see a text preview in the notification banner.
+* **Reminders**: A notification to let you know about an event or a task. For example, you have a training due date today, and the app sends you a reminder notification to help you remember the task or event.
+* **Alerts**: Notifications, which require urgent or immediate attention. For example, a training's due date has passed, or an admin has sent a request to fix a bug with the highest priority.
+
+## Advantages of activity feed notifications
+
+* Activity feed notification is a native Teams integration that brings user seamlessly into the Tab app, bringing additional user engagement from *Activity* to your app.
+* Activity feed notification comes with an OS notification in Teams desktop and mobile clients, so that user attention is grabbed from the system pop-up and sound.
+* Notification content is highly customizable, allowing users to preview the summary of the notified events.
+* You can deep link your app to a notification so that when a user selects the notification it increases user app engagement.
+* You can send activity feed notification to various recipients. For example, sending a personal notification or sending batch notifications to a group of users.
+* Teams manifest localization supports the templated text in activity feed notifications.
+
+## Understand the basics of activity feed notifications
+
+In Microsoft Teams, activity feed notifications consist of multiple bits of information displayed together, as shown in the following image:
++
+The components include:
+
+|Counter|Description|
+|-|--|
+|1|**Avatar**: Shows who initiated the activity.|
+|2|**Activity type or app icon**: The activity type or app icon depicts the type of activity. For app notifications, the line icon gets replaced with an app icon. |
+|3|**Title: Actor + reason**: *Actor*: Name of the user or app that initiated the activity. *Reason*: Describes the activity.|
+|4|**Timestamp**: Shows when the activity happened.|
+|5|**Text preview**: Shows a truncated line from the start of the notification.|
+|6|**Location**: Shows where the activity happened in Teams.|
+
+The following example shows the components together provide the details about a notification.
++
+### Types of activity feed notification cards
+
+The following variants show the kinds of activity feed notification cards you can display. The app logo replaces the user avatar for app-generated notifications:
+
+# [Desktop](#tab/desktop)
++
+ |Counter |Description |
+ |||
+ |1 | Teams custom |
+ |2 | Windows |
+ |3 | Mac |
+
+# [Mobile](#tab/mobile)
++
+ |Counter |Description |
+ |||
+ |1 | Android |
+ |2 | iOS |
+++
+## Requirements for using the activity feed notification APIs
+
+Activity feed APIs work with a Teams app. The following are the requirements for sending activity feed notifications:
+
+* The Teams app manifest must have the Azure AD app ID added to the webApplicationInfo section. For more information, see [manifest schema](../resources/schem#webapplicationinfo).
+* Activity types must be declared in the activities section. For more information, see [manifest schema](../resources/schem#activities).
+* The Teams app must be installed for the recipient, either personally, or in a team or chat they're part of.
+
+### Teams app manifest changes
+
+This section describes the changes that need to be added to Teams app manifest. Ensure that you use the [Teams app manifest](/microsoftteams/platform/resources/schema/manifest-schema) version `1.7` or greater.
+
+```json
+"$schema": "https://developer.microsoft.com/json-schemas/teams/v1.7/MicrosoftTeams.schema.json",
+"manifestVersion": "1.7",
+```
+
+#### webApplicationInfo section changes
+
+```json
+"webApplicationInfo":
+{
+ "id": "a3111f15-658e-457c-9689-fd20fe907330",
+ "resource": "https://contosoapp.com"
+}
+```
+
+|Parameter|Type|Description|
+|:|:|:|
+|`id`|string|Azure AD app ID (client ID).|
+|`resource`|string|Resource associated with the Azure AD app. Also known as reply or redirect URL in the Microsoft Azure Portal.|
+
+> [!NOTE]
+> You might get an error if multiple Teams apps in the same scope (team, chat, or user) are using the same Azure AD app. Make sure that you're using unique Azure AD apps.
+
+#### Activities section changes
+
+```json
+"activities":
+{
+ "activityTypes": [
+ {
+ "type": "taskCreated",
+ "description": "Task Created Activity",
+ "templateText": "{actor} created task {taskId} for you"
+ },
+ {
+ "type": "approvalRequired",
+ "description": "Deployment requires your approval",
+ "templateText": "{actor} created a new deployment {deploymentId}"
+ }
+ ]
+}
+```
+
+|Parameter|Type|Description|
+|:|:|:|
+|type|string|Type of activity. This needs to be unique in a specific manifest.|
+|description|string|Human-readable short description. This is visible on the Microsoft Teams client.|
+|templateText|string|Template text for the activity notification. You can declare your parameters by encapsulating parameters in `{}`.|
+
+> [!NOTE]
+> `actor` is a special parameter that always takes the name of the caller. In delegated calls, `actor` is the user's name. In application-only calls, it takes the name of the Teams app.
+
+### Install the Teams app
+
+Teams apps must be installed in a team, chat, or for a user in personal scope for users to receive activity feed notifications. For details, see [Teams app distribution methods](/microsoftteams/platform/concepts/deploy-and-publish/overview). For development purposes, we prefer [sideloading](/microsoftteams/platform/concepts/deploy-and-publish/apps-upload). After development, you can choose the right distribution method based on whether you want to distribute to one tenant or to all tenants.
+
+You can also use [Teams app installation](/graph/api/resources/teamsappinstallation) APIs to manage Teams app installations.
+
+## Send activity feed notifications to users
+
+Because a Teams app can be installed for a user, in a team, or in a chat, it can also send notifications in the following three contexts:
+
+* [Send notification to user in a chat](/graph/api/chat-sendactivitynotification)
+* [Send notification to user in a team](/graph/api/team-sendactivitynotification)
+* [Send notification to user](/graph/api/userteamwork-sendactivitynotification)
+
+Additionally, you can send notifications in bulk to up to 100 users at a time:
+
+* [Send notifications to multiple users in bulk](/graph/api/teamwork-sendactivitynotificationtorecipients)
+
+To find details about the supported topics for each scenario, refer to the specific APIs. Custom text-based topics are supported for all scenarios.
+
+You can use Activity feed notification in the following scenarios:
+
+* Notify individuals about customized content that requires their attention.
+* Show rich content in Tab app or URLΓÇï.
+* Support complex user interactionsΓÇï.
+* Send delegated notifications from the user who initiated the notificationΓÇï.
+* Put template in the manifestΓÇï.
+* Teams handles localization for notifications.
+
+> [!NOTE]
+> The activity icon is based on the context the request is made in. If the request is made with delegated permissions, the user's photo appears as the avatar, while the Teams app icon appears as the activity icon. In an application-only context, the Teams app icon is used as the avatar and the activity icon is omitted.
+
+## Customize the notifications
+
+Microsoft Teams users can customize the notifications they see in their feed or as a banner. Notifications generated through activity feed APIs can also be customized. Users can choose how they're notified via settings in Microsoft Teams. Teams apps appear in the list for the user to choose from, as shown in the following screenshot.
++
+Users can select **Edit** next to an app and customize the notifications. The Teams app manifest displays the `description` field.
++
+## Examples
+
+For examples on how to send an activity feed notification, see [send activity feed notification examples](/graph/teams-send-activityfeednotifications?tabs=http#example-1-notify-a-user-about-a-task-created-in-a-chat).
+
+## Step-by-step guide
+
+Follow the [step-by-step guide](../sbs-graphactivity-feedbroadcast.yml) to send activity feed notifications in Teams.
+
+## See also
+
+* [Notification bot in Teams](../bots/how-to/conversations/notification-bot-in-teams.md)
+* [Designing activity feed notifications for your Microsoft Teams app](../concepts/design/activity-feed-notifications.md)
platform Cards Format https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/cards-format.md
The following table describes the newly supported user mention IDs:
|IDs | Supporting capabilities | Description | Example | |-|--||| | Azure AD Object ID | Bot, Connector | Azure AD userΓÇÖs Object ID | 49c4641c-ab91-4248-aebb-6a7de286397b |
-| UPN | Bot, Connector | Azure AD userΓÇÖs UPN | john.smith@microsoft.com |
+| UPN | Bot, Connector | Azure AD userΓÇÖs UPN | `john.smith@microsoft.com` |
#### User mention in bots with Adaptive Cards
Following image illustrates user mention in Incoming Webhook:
:::image type="content" source="../../assets/images/authentication/user-mention-in-incoming-webhook.png" alt-text="User mention in Incoming Webhook":::
+### People icon in an Adaptive Card
+
+People icon helps users to view the images of users in an Adaptive Card. You can insert an image and apply all the properties supported on images.
+
+There are two types of people icons that are supported in an Adaptive Card:
+
+* Persona: If you want to show a single user in an Adaptive Card, the Adaptive Card displays the people icon and the name of the user.
+
+ The following is a JSON example of a Persona card:
+
+ ```json
+ {
+ "$schema": "https://adaptivecards.io/schemas/adaptive-card.json",
+ "type": "AdaptiveCard",
+ "version": "1.0.0",
+ "body": [
+ {
+ "type": "TextBlock",
+ "text": "Persona",
+ "weight": "bolder"
+ },
+ {
+ "type": "Component",
+ "name": "graph.microsoft.com/user",
+ "view": "compact",
+ "properties": {
+ "id": "65f50003-e15d-434a-9e14-0fcfeb3d7817",
+ "displayName": "Daniela Mandera",
+ "userPrincipalName": "damandera@microsoft.com"
+ }
+ }
+ ]
+ }
+ ```
+
+* Persona Set: If you want to show multiple users in an Adaptive Card, the Adaptive Card displays only the people icon of the users.
+
+ The following is a JSON example of a Persona Set:
+
+ ```json
+ {
+ "$schema": "https://adaptivecards.io/schemas/adaptive-card.json",
+ "type": "AdaptiveCard",
+ "version": "1.0.0",
+ "body": [
+ {
+ "type": "TextBlock",
+ "text": "Persona Set",
+ "weight": "bolder"
+ },
+ {
+ "type": "Component",
+ "name": "graph.microsoft.com/users",
+ "view": "compact",
+ "properties": {
+ "users": [
+ {
+ "id": "65f50003-e15d-434a-9e14-0fcfeb3d7817",
+ "displayName": "Daniela Mandera",
+ "userPrincipalName": "damandera@microsoft.com"
+ },
+ {
+ "id": "65f50003-e15d-434a-9e14-0fcfeb3d7817",
+ "displayName": "Daniela Mandera",
+ "userPrincipalName": "damandera@microsoft.com"
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ```
+
+ > [!NOTE]
+ > You can't customize the style of the Persona and Persona Set in an Adaptive Card.
+
+The following image is an example of the people icon in an Adaptive Card:
++
+#### Query parameters
+
+The following table lists the query parameters:
+
+|Property name |description |
+|||
+|`type` | `component` |
+|`name` | `graph.microsoft.com/users`. Search all members across the organization. |
+|`view` | `compact` |
+|`properties`|Passed to the component template|
+|`id` | User's MRI |
+|`displayName` | Name of the user |
+|`userPrincipalName`|The user's principal name of the account in Azure AD|
+
+Adaptive Components are high-level components powered by [templating](/adaptive-cards/templating/) and native Adaptive Card elements. The type `component` can be used anywhere inside the card body and the component data is defined in the `properties` attribute. The component data under `properties` is passed directly to the component. The `properties` property defines the format for Persona and Persona Set and all other properties under `properties` is ignored by `component` type in the Adaptive Card schema.
+
+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`, `id` and `userPrincipalName`. For more information, see [Fetch the roster or user profile](../../bots/how-to/get-teams-context.md#fetch-the-roster-or-user-profile).
+
+The following is an example of the people icon in an Adaptive Card on Teams desktop and mobile clients:
+
+**Desktop client**:
++
+When a user hovers on a people icon, the people card of that user is displayed.
+
+**Mobile client**
++
+ :::image type="content" source="../../assets/images/adaptive-cards/people-icon-mobile-1.png" alt-text="Screenshot shows an example of people icon in a persona and persona set in Teams mobile client.":::
+ :::image type="content" source="../../assets/images/adaptive-cards/people-icon-mobile-2.png" alt-text="Screenshot shows an example of people icon in a persona and persona set in Teams mobile.":::
++
+When a user selects a people icon, it displays the people card of that user.
+ ### Information masking in Adaptive Cards Use the information masking property to mask specific information, such as password or sensitive information from users within the Adaptive Card [`Input.Text`](https://adaptivecards.io/explorer/Input.Text.html) input element.
platform People Picker https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/people-picker.md
The following image illustrates People Picker in Adaptive Cards with static choi
:::image type="content" source="../../assets/images/Cards/peoplepicker-static-choice.png" alt-text="people-picker-static-choice":::
-You can implement People Picker for efficient task management in different scenarios.
+You can implement People Picker for efficient task management in different scenarios.
+ ## Code sample
platform What Are Cards https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/what-are-cards.md
In addition to Adaptive Cards, Teams supports two other types of cards:
[People Picker](cards/people-picker.md#people-picker-in-adaptive-cards) added as an input control in Adaptive Cards enable search and selection of people. You can use it in chats, channels, task modules, and tabs. The mobile and desktop clients support People Picker, which provides an inline typing experience.
+### People icon in an Adaptive Card
+
+[People icon in an Adaptive Card](cards/cards-format.md#people-icon-in-an-adaptive-card) helps users to view the images of users in the Adaptive Card in Teams. You can view the image of a single user or multiple users. People icon is supported in Teams mobile and desktop clients.
+ ### Typeahead search in Adaptive Cards Typeahead search added as an input control in Adaptive Cards enable [dynamic search](~/task-modules-and-cards/cards/dynamic-search.md) experience from a dynamically loaded dataset. It also allows users to do a type-ahead static search within a list with limited number of choices. The mobile and desktop clients support type ahead dynamic search experience.
platform Whats New https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/whats-new.md
Discover Microsoft Teams platform features that are generally available (GA). Yo
| 25/05/2023 | Use a deep link to open a tab app in meeting side panel in Teams mobile client. | Build apps for Teams meetings and calls > Enable and configure apps for Teams meeting > [Build tabs for meeting](apps-in-teams-meetings/build-tabs-for-meeting.md#deep-link-to-meeting-side-panel) | |23/05/2023 | Live Share SDK is now generally available. Use Live Share to transform Teams apps into collaborative multi-user experiences without writing any dedicated back-end code. | Build apps for Teams meetings and calls > Enhanced collaboration with Live Share > [Live Share SDK](apps-in-teams-meetings/teams-live-share-overview.md)| |23/05/2023 | Use Teams app design guidelines to help you make quick and right decisions to design your app. | Design your app > [Overview](concepts/design/design-teams-app-overview.md)|
-Cater your app to a specific audience from the available list of countries or regions. | Distribute your app > Publish to the Teams store > Prepare your Teams store submission > [Distribute your app to specific countries or regions](concepts/deploy-and-publish/appsource/prepare/submission-checklist.md#distribute-your-app-to-specific-countries)|
+Cater your app to a specific audience from the available list of countries or regions. | Distribute your app > Publish to the Teams store > Prepare your Teams store submission > [Distribute your app to specific countries or regions](concepts/deploy-and-publish/appsource/prepare/submission-checklist.md#distribute-your-app-to-specific-countries-or-regions)|
| 17/05/2023 | Use the Teams Toolkit v5 extension with many new app development features to get started with app development for Teams using Visual Studio Code. | Tools and SDKs > Teams Toolkit > [Teams Toolkit Overview](toolkit/teams-toolkit-fundamentals.md)| | 17/05/2023 | Updated Get started module with GitHub Codespaces and step-by-step guides aligned with Teams Toolkit v5. It also includes details for extending Teams app over Microsoft 365 and Outlook. | [Get started](get-started/get-started-overview.md)|
Teams platform features that are available to all app developers.
**2023 July**
-* ***July 20, 2023***: [App caching for iOS personal tray](tabs/how-to/app-caching.md)
+* ***July 25, 2023***: [Use people icon in an Adaptive Card to view the images of users](task-modules-and-cards/cards/cards-format.md#people-icon-in-an-adaptive-card).
+
+* ***July 20, 2023***: [App caching for iOS personal tray](tabs/how-to/app-caching.md).
* ***July 06, 2023***: [Use app icon badging to identify any app activity during a meeting](apps-in-teams-meetings/app-icon-badging-for-your-app.md).
Teams platform features that are available to all app developers.
|20/02/2023| Plan, strategize, and execute your app growth in Teams to make it a successful app on the marketplace. | Grow your app > [Strategize and execute growth for your app](concepts/deploy-and-publish/appsource/post-publish/app-growth/overview-app-growth.md)| |17/02/2023| Build a dashboard tab app that acts as a tool to track, analyze, monitor, display, and extract data. | Build Tabs > [Build a dashboard tab app](tabs/how-to/build-a-dashboard-tab-app.md#build-a-dashboard-tab-app)| |09/02/2023| Build apps for anonymous users that support anonymous users to attend Teams meetings with an alternative authentication experience. | Build apps for Teams meetings and calls > Enable and configure apps for Teams meeting > [Build apps for anonymous users](apps-in-teams-meetings/build-apps-for-anonymous-user.md) |
-|31/01/2023| Get update and soft delete event notification in a bot when you edit, undelete or soft delete a message in a chat. | Build bots > Bot conversations > [Messages in bot conversations](bots/how-to/conversations/conversation-messages.md#get-edit-message-event)
+|31/01/2023| Get update and soft delete activity notification in a bot when you edit, undelete or soft delete a message in a chat. | Build bots > Bot conversations > [Messages in bot conversations](bots/how-to/conversations/conversation-messages.md#get-edit-message-activity)
</details> </br>