diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json
index 3dc4b3dedb..38600d7ba7 100644
--- a/.openpublishing.redirection.json
+++ b/.openpublishing.redirection.json
@@ -1,6 +1,36 @@
{
"redirections": [
- {
+ {
+ "source_path": "powerapps-docs/developer/data-platform/org-service/samples/enable-field-security-entity.md",
+ "redirect_url": "column-level-security",
+ "redirect_document_id": "false"
+ },
+ {
+ "source_path": "powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-permissions.md",
+ "redirect_url": "column-level-security",
+ "redirect_document_id": "false"
+ },
+ {
+ "source_path": "powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-sharing-records.md",
+ "redirect_url": "column-level-security",
+ "redirect_document_id": "false"
+ },
+ {
+ "source_path": "powerapps-docs/developer/data-platform/field-security-entities.md",
+ "redirect_url": "column-level-security",
+ "redirect_document_id": "false"
+ },
+ {
+ "source_path": "powerapps-docs/developer/data-platform/calculated-rollup-attributes.md",
+ "redirect_url": "specialized-columns.md",
+ "redirect_document_id": "false"
+ },
+ {
+ "source_path": "powerapps-docs/developer/data-platform/deletemultiple.md",
+ "redirect_url": "bulk-operations#deletemultiple",
+ "redirect_document_id": "false"
+ },
+ {
"source_path": "powerapps-docs/developer/test-engine/overview.md",
"redirect_url": "/power-platform/test-engine/overview",
"redirect_document_id": "false"
@@ -4122,7 +4152,7 @@
},
{
"source_path": "powerapps-docs/developer/common-data-service/field-security-entities.md",
- "redirect_url": "../data-platform/field-security-entities",
+ "redirect_url": "../data-platform/column-level-security",
"redirect_document_id": false
},
{
@@ -8957,7 +8987,7 @@
},
{
"source_path": "powerapps-docs/maker/canvas-apps/working-with-dynamic-schema.md",
- "redirect_url": "/power-apps/maker/canvas-apps/untyped-and-dynamic-objects#converting-formulas-that-return-untyped-objects-that-previously-returned-boolean",
+ "redirect_url": "/power-apps/maker/canvas-apps/untyped-and-dynamic-objects#converting-formulas-that-return-dynamic-values-that-previously-returned-boolean",
"redirect_document_id": false
},
{
@@ -9599,6 +9629,11 @@
"source_path": "powerapps-docs/maker/canvas-apps/common-performance-issue-resolutions.md",
"redirect_url": "../../../power-apps/maker/canvas-apps/create-performant-apps-overview",
"redirect_document_id": false
+ },
+ {
+ "source_path": "powerapps-docs/maker/model-driven-apps/build-app-three-steps.md",
+ "redirect_url": "../../../power-apps/maker/model-driven-apps/build-first-model-driven-app",
+ "redirect_document_id": false
}
]
}
\ No newline at end of file
diff --git a/powerapps-docs/developer/component-framework/bring-intelligence-using-agent-apis.md b/powerapps-docs/developer/component-framework/bring-intelligence-using-agent-apis.md
new file mode 100644
index 0000000000..27b9c5aabe
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/bring-intelligence-using-agent-apis.md
@@ -0,0 +1,49 @@
+---
+title: "Bring intelligence into your components using Agent APIs (preview)"
+description: "Learn about how you can integrate Copilot Studio topics into your custom components using Agent APIs"
+author: adrianorth
+ms.author: aorth
+ms.date: 07/07/2025
+ms.reviewer: jdaly
+ms.topic: conceptual
+ms.subservice: pcf
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+---
+
+# Bring intelligence into your component using Agent APIs (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+Agent APIs are a set of interfaces introduced in Microsoft Power Apps that allow components to interact with topics created in Microsoft Copilot Studio. These APIs are available in two forms:
+
+- `Context.Copilot` methods used for PCF controls. This is the subject of this article.
+- [Xrm.Copilot namespace used for client scripts in model-driven apps.](../model-driven-apps/clientapi/bring-intelligence-using-agent-apis.md)
+
+These APIs are designed to enhance integration with Microsoft Copilot Studio, enabling more intelligent and responsive app experiences. The APIs use a single Copilot Studio agent that is either:
+- Interactive agent selected in the model app designer of custom apps. See more at [Working with an interactive agent](../../maker/model-driven-apps/add-agents-to-app.md#working-with-an-interactive-agent).
+- Model app containing lead or opportunity table, which implicitly uses the "Copilot in Dynamics 365 Sales" agent.
+
+|API|Description|
+|---------|---------|
+|[copilot.executeEvent](reference/copilot/executeevent.md)|[!INCLUDE [executeevent-description](reference/copilot/includes/executeevent-description.md)]|
+|[copilot.executePrompt](reference/copilot/executeprompt.md)|[!INCLUDE [executeprompt-description](reference/copilot/includes/executeprompt-description.md)]|
+
+## Accessibility
+
+When creating a code component, ensure the following best practices in [code component accessibility checks](code-components-best-practices.md#check-accessibility) are followed to have an accessible experience.
+
+### Related articles
+
+[FAQ for Agent APIs and Agent Response component](../../maker/common/faq-agent-api-component.md)
+[Copilot](reference/copilot.md)
+[executeEvent](reference/copilot/executeevent.md)
+[executePrompt](reference/copilot/executeprompt.md)
+[Working with an interactive agent](../../maker/model-driven-apps/add-agents-to-app.md#working-with-an-interactive-agent)
+[Power Apps component framework overview](overview.md)
+[Create your first code component](implementing-controls-using-typescript.md)
+[Learn Power Apps component framework](/training/paths/use-power-apps-component-framework)
+[Xrm.Copilot (Client API reference)](../model-driven-apps/clientapi/reference/xrm-copilot.md)
+[Add agent response with the form designer (preview)](../../maker/model-driven-apps/form-designer-add-configure-agent-response.md)
diff --git a/powerapps-docs/developer/component-framework/component-framework-for-canvas-apps.md b/powerapps-docs/developer/component-framework/component-framework-for-canvas-apps.md
index 806cc823c5..31e103254b 100644
--- a/powerapps-docs/developer/component-framework/component-framework-for-canvas-apps.md
+++ b/powerapps-docs/developer/component-framework/component-framework-for-canvas-apps.md
@@ -4,7 +4,7 @@ description: Learn how to create code components using Power Apps component fram
keywords:
author: anuitz
ms.author: anuitz
-ms.date: 05/27/2022
+ms.date: 07/01/2025
ms.reviewer: jdaly
ms.topic: how-to
ms.subservice: pcf
@@ -14,7 +14,7 @@ contributors:
# Code components for canvas apps
-Professional developers can use Power Apps component framework to create code components that can be used in their canvas apps. More information: [Power Apps component framework overview](overview.md)
+Professional developers can use Power Apps component framework to create code components that can be used in their canvas apps. More information: [Power Apps component framework overview](overview.md).
App makers can use Power Apps component framework to create, import, and add code components to canvas apps by using [Microsoft Power Platform CLI](get-powerapps-cli.md). Certain APIs might not be available in canvas apps. We recommend that you check each API to determine where it's available.
@@ -23,7 +23,7 @@ App makers can use Power Apps component framework to create, import, and add cod
> [!WARNING]
> Code components contain code that may not be generated by Microsoft and can potentially access security tokens and data when rendered in Power Apps Studio. When adding code components to a canvas app, make sure that the code component solutions are from a trusted source. This vulnerability does not exist when playing the canvas app.
-When you open a canvas app that contains code components in Power Apps Studio, a warning message about potentially unsafe code appears. Code components in the Power Apps Studio environment have access to security tokens; hence only components from trusted sources should be opened. Administrators and system customizers should review and validate all code components before importing those components in an environment and making them available for makers to use in their apps. The `Default` publisher is shown when you import code components by using an unmanaged solution or when you have used [pac pcf push](/power-platform/developer/cli/reference/pcf#pac-pcf-push) to install your code component.
+When you open a canvas app that contains code components in Power Apps Studio, a warning message about potentially unsafe code appears. Code components in the Power Apps Studio environment have access to security tokens; hence only components from trusted sources should be opened. Administrators and system customizers should review and validate all code components before importing those components in an environment and making them available for makers to use in their apps. The `Default` publisher is shown when you import code components by using an unmanaged solution or when you have used [pac pcf push](/power-platform/developer/cli/reference/pcf#pac-pcf-push) to install your code component.

@@ -39,13 +39,13 @@ To add code components to an app, you need to enable the Power Apps component fr
1. Sign in to [Power Apps](https://powerapps.microsoft.com/).
2. Select **Settings** , and then select **Admin Center**.
-
+
> [!div class="mx-imgBorder"]
- > 
+ > 
3. On the left pane, select **Environments**, select the environment where you want to enable this feature, and then select **Settings**.
-4. Expand **Product**, and select **Features**.
+4. Expand **Product**, and select **Features**.
5. From the list of available features, turn on **Power Apps component framework for canvas apps**, and then select **Save**.
@@ -56,6 +56,8 @@ To add code components to an app, you need to enable the Power Apps component fr
After you enable the Power Apps component framework feature in your environment, you can start implementing the logic for code components. For a step-by-step tutorial, go to [Create your first code component](implementing-controls-using-typescript.md).
+We recommend that you check the [limitations](limitations.md) of code components in canvas apps before starting implementation.
+
## Add components to a canvas app
1. Go to Power Apps Studio.
@@ -65,8 +67,8 @@ After you enable the Power Apps component framework feature in your environment,
> [!IMPORTANT]
> Make sure the solution .zip file containing the code components has already been [imported](../../maker/data-platform/import-update-export-solutions.md) into Microsoft Dataverse before you proceed to the next step.
-3. On the left pane, select **Add** (**+**), and then select **Get more components**.
-
+3. On the left pane, select **Add** (**+**), and then select **Get more components**.
+
> [!div class="mx-imgBorder"]
> 
@@ -82,26 +84,26 @@ After you enable the Power Apps component framework feature in your environment,
> [!NOTE]
> You can also add components by selecting **Insert** > **Custom** > **Import component**. This option will be removed in a future release, so we suggest using the flow described above.
- >
+ >
-On the **Properties** tab, you'll notice the code component properties are displayed.
+On the **Properties** tab, you'll notice the code component properties are displayed.
> [!div class="mx-imgBorder"]
> 
> [!NOTE]
-> Existing code components can be re-imported by updating the code component's manifest version if you want the properties to be available in the default **Properties** tab. As before, the properties will continue to be available on the **Advanced** properties tab.
+> Existing code components can be re-imported by updating the code component's manifest version if you want the properties to be available in the default **Properties** tab. As before, the properties will continue to be available on the **Advanced** properties tab.
## Delete a code component from a canvas app
-1. Open the app where you've added the code component.
-1. On the left pane, select **Tree view**, and then select the screen where you've added the code component.
+1. Open the app where you've added the code component.
+1. On the left pane, select **Tree view**, and then select the screen where you've added the code component.
1. Next to the component, select **More** (**...**), and then select **Delete**.
> [!div class="mx-imgBorder"]
> 
-1. Save the app to see the changes.
+1. Save the app to see the changes.
## Update existing code components
@@ -116,5 +118,4 @@ Whenever you update the code components and want to see the runtime changes, you
[Create your first code component](implementing-controls-using-typescript.md)
[Learn Power Apps component framework](/training/paths/use-power-apps-component-framework)
-
[!INCLUDE[footer-include](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/component-framework/issues-and-workarounds.md b/powerapps-docs/developer/component-framework/issues-and-workarounds.md
index 7bebadc833..2c81b5f21a 100644
--- a/powerapps-docs/developer/component-framework/issues-and-workarounds.md
+++ b/powerapps-docs/developer/component-framework/issues-and-workarounds.md
@@ -3,7 +3,7 @@ title: Common issues and workarounds (Power Apps Component Framework) | Microsof
description: Provides information on known issues and workarounds some come across while working with Power Apps component framework and CLI
author: anuitz
ms.author: anuitz
-ms.date: 10/28/2024
+ms.date: 07/01/2025
ms.reviewer: jdaly
ms.topic: article
ms.subservice: pcf
@@ -164,13 +164,13 @@ Power Apps component framework dataset component currently does not properly sho
No workaround as of now. We are working on pushing a fix to our deployment trains.-->
-## Authentication for third party services fails in Canvas
+## Custom authentication fails in Canvas
-PCF authentication for third parties isn't supported.
+Custom authentication within PCF controls is not supported within canvas apps.
**Workaround**
-Use combination of a [custom page](../../maker/model-driven-apps/model-app-page-overview.md) and a [connector](../../maker/canvas-apps/connections-list.md).
+Use [connectors](../../maker/canvas-apps/connections-list.md) to handle authentication.
## Control can't finish loading
diff --git a/powerapps-docs/developer/component-framework/limitations.md b/powerapps-docs/developer/component-framework/limitations.md
index 5968350865..6785aac149 100644
--- a/powerapps-docs/developer/component-framework/limitations.md
+++ b/powerapps-docs/developer/component-framework/limitations.md
@@ -3,7 +3,7 @@ title: "Limitations of Power Apps component framework | MicrosoftDocs"
description: "Limitations using Power Apps component framework"
author: anuitz
ms.author: anuitz
-ms.date: 12/04/2024
+ms.date: 07/01/2025
ms.reviewer: jdaly
ms.topic: article
ms.subservice: pcf
@@ -21,6 +21,8 @@ With Power Apps component framework, you can create your own code components to
3. Code components should not use the HTML web storage objects, like `window.localStorage` and `window.sessionStorage`, to store data. Data stored locally on the user's browser or mobile client is not secure and not guaranteed to be available reliably.
+4. Custom auth in code components is not supported in Power Apps canvas applications. Use connectors to get data and take actions instead.
+
## Related topics
[Power Apps component framework API reference](reference/index.md)
diff --git a/powerapps-docs/developer/component-framework/reference/context.md b/powerapps-docs/developer/component-framework/reference/context.md
index 7cdc2f99c5..714ab5fb54 100644
--- a/powerapps-docs/developer/component-framework/reference/context.md
+++ b/powerapps-docs/developer/component-framework/reference/context.md
@@ -3,7 +3,7 @@ title: Context (Power Apps component framework API reference) | Microsoft Docs
description: Provides all the properties and methods available in the Power Apps component framework
author: anuitz
ms.author: anuitz
-ms.date: 05/27/2022
+ms.date: 06/16/2025
ms.reviewer: jdaly
ms.topic: reference
ms.subservice: pcf
@@ -28,6 +28,12 @@ Model-driven apps, canvas apps, & portals.
[!INCLUDE [client-description](includes/client-description.md)]
**Type**: [Client](client.md)
+### copilot
+
+[!INCLUDE [copilot-description](includes/copilot-description.md)]
+
+**Type**: [Copilot](copilot.md)
+
### device
[!INCLUDE [device-description](includes/device-description.md)]
diff --git a/powerapps-docs/developer/component-framework/reference/copilot.md b/powerapps-docs/developer/component-framework/reference/copilot.md
new file mode 100644
index 0000000000..d1a941e6fc
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/reference/copilot.md
@@ -0,0 +1,41 @@
+---
+title: Copilot (Power Apps component framework API reference) (preview)
+description: Provides methods to execute registered Microsoft Copilot Studio Topics.
+author: aorth
+ms.author: aorth
+ms.date: 06/16/2025
+ms.reviewer: jdaly
+ms.topic: reference
+ms.subservice: pcf
+contributors:
+ - JimDaly
+---
+
+# Copilot (Power Apps component framework API reference) (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+[!INCLUDE [copilot-description](includes/copilot-description.md)]
+
+## Available for
+
+Model-driven apps
+
+## Syntax
+
+`context.copilot`
+
+## Methods
+
+| Method| Description|
+| --- | --- |
+| [executeEvent](copilot/executeevent.md) | [!INCLUDE [executeevent-description](copilot/includes/executeevent-description.md)] |
+| [executePrompt](copilot/executeprompt.md) | [!INCLUDE [executeprompt-description](copilot/includes/executeprompt-description.md)] |
+
+
+### Related articles
+
+[Power Apps component framework API reference](../reference/index.md)
+[Power Apps component framework overview](../overview.md)
+
+[!INCLUDE[footer-include](../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/component-framework/reference/copilot/executeevent.md b/powerapps-docs/developer/component-framework/reference/copilot/executeevent.md
new file mode 100644
index 0000000000..9f55710d90
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/reference/copilot/executeevent.md
@@ -0,0 +1,73 @@
+---
+title: executeEvent (Power Apps component framework API reference) (preview)
+description: Executes a Microsoft Copilot Studio topic based on the registered Event Name.
+author: adrianorth
+ms.author: aorth
+ms.date: 07/07/2025
+ms.reviewer: jdaly
+ms.topic: reference
+ms.subservice: pcf
+contributors:
+ - JimDaly
+---
+
+# executeEvent (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+[!INCLUDE[./includes/executeevent-description.md](./includes/executeevent-description.md)]
+
+## Available for
+
+Model-driven apps
+
+## Syntax
+
+`context.copilot.executeEvent(eventName, eventParameters).then(successCallback, errorCallback);`
+
+## Parameters
+
+| Parameter Name| Type| Required | Description|
+| --- | --- | --- | --- |
+| `eventName` | string | Yes | Event Name registered in the Copilot Studio topic |
+| `eventParameters` | Unknown | Yes | Parameters needed for the event execution. These depend on what the topic does.|
+| `successCallback` | Function | Yes | A function to call when the operation succeeds.|
+| `errorCallback` | Function | Yes | A function to call when the operation fails.|
+
+## Return Value
+
+Type: `Promise<`[MCSResponse](mcsresponse.md)`>`
+
+See [Promise](https://developer.mozilla.org/docs/Web/JavaScript/reference/Global_Objects/Promise) and [MCSResponse](mcsresponse.md)
+
+## Accessing app context
+
+When an Agent API is called, context for the app is passed to the Copilot Studio topic through a set of variables. The following are context variables available as [Copilot Studio global variables](/microsoft-copilot-studio/authoring-variables-bot).
+
+[!INCLUDE [app-context-table](../../../model-driven-apps/clientapi/includes/app-context-table.md)]
+
+For example, using `Global.PA__Copilot_Model_PageContext.pageContext.id.guid` and `Global.PA__Copilot_Model_PageContext.pageContext.entityTypeName`, the form's record can be retrieved from Dataverse.
+
+[!INCLUDE [accessing-event-parameters](../../../model-driven-apps/clientapi/includes/accessing-event-parameters.md)]
+
+### Example
+
+In Microsoft Copilot Studio, where a topic is registered that accepts an ID (entity record ID) as an input parameter. Based on the input, it retrieves the related activities of that entity record and returns the results as an Copilot Studio event activity. The PCF context API enables the execution of these methods within the context of PCF controls.
+
+```javascript
+const response = await context.copilot.executeEvent(
+ "Microsoft.PowerApps.Copilot.RelatedActivities",
+ { id:"aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"});
+```
+
+[!INCLUDE [accessing-event-parameters-response](../../../model-driven-apps/clientapi/includes/accessing-event-parameters-response.md)]
+
+
+### Related articles
+
+[Copilot](../copilot.md)
+[executePrompt](executeprompt.md)
+[Power Apps component framework API reference](../../reference/index.md)
+[Power Apps component framework overview](../../overview.md)
+
+[!INCLUDE[footer-include](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/component-framework/reference/copilot/executeprompt.md b/powerapps-docs/developer/component-framework/reference/copilot/executeprompt.md
new file mode 100644
index 0000000000..282ce2ab15
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/reference/copilot/executeprompt.md
@@ -0,0 +1,73 @@
+---
+title: executePrompt (Power Apps component framework API reference) (preview)
+description: Executes a Microsoft Copilot Studio topic based on the trigger queries registered in the topic.
+author: adrianorth
+ms.author: aorth
+ms.date: 06/16/2025
+ms.reviewer: jdaly
+ms.topic: reference
+ms.subservice: pcf
+contributors:
+ - JimDaly
+---
+
+# executePrompt (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+[!INCLUDE[./includes/executeprompt-description.md](./includes/executeprompt-description.md)]
+
+## Available for
+
+Model-driven apps
+
+## Syntax
+
+`context.copilot.executeEvent(promptText).then(successCallback, errorCallback);`
+
+## Parameters
+
+| Parameter Name| Type| Required | Description|
+| --- | --- | --- | --- |
+| `promptText` | string | Yes | The text that is registered as a trigger query in the MCS topic. |
+| `successCallback` | Function | Yes | A function to call when the operation succeeds.|
+| `errorCallback` | Function | Yes | A function to call when the operation fails.|
+
+## Return Value
+
+Type: `Promise<`[MCSResponse](mcsresponse.md)`>`
+
+See [Promise](https://developer.mozilla.org/docs/Web/JavaScript/reference/Global_Objects/Promise) and [MCSResponse](mcsresponse.md)
+
+## Example
+
+In Microsoft Copilot Studio, when a topic is triggered by queries like "hello" or "hi." When `executePrompt` runs with matching `promptText`, it activates the topic and returns a Message activity with the response text.
+
+```typescript
+const response = await context.copilot.executePrompt("hello");
+```
+
+### Response
+
+```json
+[
+ {
+ "type": "message",
+ "timestamp": "2025-02-05T16:46:07.7799759+00:00",
+ "replyToId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
+ "attachments": [],
+ "textFormat": "markdown",
+ "text": "Hello, how can I help you today?",
+ "speak": "Hello, how can I help?"
+ }
+]
+```
+
+### Related articles
+
+[Copilot](../copilot.md)
+[executeEvent](executeevent.md)
+[Power Apps component framework API reference](../../reference/index.md)
+[Power Apps component framework overview](../../overview.md)
+
+[!INCLUDE[footer-include](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/component-framework/reference/copilot/includes/executeevent-description.md b/powerapps-docs/developer/component-framework/reference/copilot/includes/executeevent-description.md
new file mode 100644
index 0000000000..f14865b3a6
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/reference/copilot/includes/executeevent-description.md
@@ -0,0 +1 @@
+Executes a Microsoft Copilot Studio topic based on the registered Event Name. Returns an array of type [MCSResponse](../mcsresponse.md).
\ No newline at end of file
diff --git a/powerapps-docs/developer/component-framework/reference/copilot/includes/executeprompt-description.md b/powerapps-docs/developer/component-framework/reference/copilot/includes/executeprompt-description.md
new file mode 100644
index 0000000000..c0ed81bd8d
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/reference/copilot/includes/executeprompt-description.md
@@ -0,0 +1 @@
+Executes a Microsoft Copilot Studio topic based on the trigger queries registered in the topic. Returns an array of type [MCSResponse](../mcsresponse.md).
\ No newline at end of file
diff --git a/powerapps-docs/developer/component-framework/reference/copilot/mcsresponse.md b/powerapps-docs/developer/component-framework/reference/copilot/mcsresponse.md
new file mode 100644
index 0000000000..7297d75dac
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/reference/copilot/mcsresponse.md
@@ -0,0 +1,54 @@
+---
+title: "MCSResponse Interface (Power Apps component framework API reference) (preview)"
+description: The interface that describes the properties of contains data returned by the context.executeEvent and context.executePrompt methods.
+author: adrianorth
+ms.author: aorth
+ms.date: 06/16/2025
+ms.reviewer: jdaly
+ms.topic: reference
+applies_to: "Dynamics 365 (online)"
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+---
+
+# MCSResponse Interface (Power Apps component framework API reference) (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+An interface that describes the data returned by the [executeEvent](executeevent.md) and [executePrompt](executeprompt.md) methods.
+
+
+
+## Properties
+
+The following table describes the `MCSResponse` properties. Only the `type` property will always be present.
+
+
+| Name| Type| Description|
+|---|---|---|
+| `type`| `string`| **Required.** The type of the response.|
+| `id`| `string`| Unique identifier for the response.|
+| `locale`| `string`| Locale information (e.g., language or region).|
+| `replyToId`| `string`| ID of the message this is replying to.|
+| `timestamp`| `string`| Timestamp of the response.|
+| `speak`| `string`| Text to be spoken by a speech synthesizer.|
+| `text`| `string`| Text content of the response.|
+| `textFormat`| `plain` \| `markdown` \| `xml` | Format of the text content.|
+| `suggestedActions` | `{ actions: any[]; to?: string[] }` | Suggested actions for the user to take.|
+| `value`| `unknown`| Custom payload or data.|
+| `valueType`| `string`| Type of the value payload.|
+| `name`| `string`| Name of the response or action.|
+| `attachmentLayout` | `list` \| `carousel` | Layout style for displaying attachments.|
+| `attachments`| [Attachment](#attachment-interface)[]| Array of attachments included in the response.|
+
+### Attachment Interface
+
+| Name| Type| Description|
+|---|---|---|
+| `content`| `unknown` | **Required.** The content of the attachment. |
+| `contentType`| `string` | Describes the type of content. |
+
+
diff --git a/powerapps-docs/developer/component-framework/reference/includes/copilot-description.md b/powerapps-docs/developer/component-framework/reference/includes/copilot-description.md
new file mode 100644
index 0000000000..81c6808b1b
--- /dev/null
+++ b/powerapps-docs/developer/component-framework/reference/includes/copilot-description.md
@@ -0,0 +1 @@
+Provides methods to execute registered Microsoft Copilot Studio Topics.
\ No newline at end of file
diff --git a/powerapps-docs/developer/component-framework/toc.yml b/powerapps-docs/developer/component-framework/toc.yml
index d5622cce5f..a65dfb5986 100644
--- a/powerapps-docs/developer/component-framework/toc.yml
+++ b/powerapps-docs/developer/component-framework/toc.yml
@@ -62,6 +62,8 @@ items:
href: publish-components-app-source.md
- name: Customize the editable grid control
href: customize-editable-grid-control.md
+ - name: Bring intelligence into your components using Agent APIs
+ href: bring-intelligence-using-agent-apis.md
- name: Troubleshooting
items:
- name: Common issues and workarounds
@@ -154,6 +156,15 @@ items:
href: reference/controlattributes.md
- name: ControlAttributesType
href: reference/controlattributestype.md
+ - name: Copilot
+ href: reference/copilot.md
+ items:
+ - name: executeEvent
+ href: reference/copilot/executeevent.md
+ - name: executePrompt
+ href: reference/copilot/executeprompt.md
+ - name: MCSResponse
+ href: reference/copilot/mcsresponse.md
- name: DataProviderCapabilities
href: reference/dataprovidercapabilities.md
- name: DataSet
diff --git a/powerapps-docs/developer/data-platform/TOC.yml b/powerapps-docs/developer/data-platform/TOC.yml
index de8bac174c..7be9f6d78e 100644
--- a/powerapps-docs/developer/data-platform/TOC.yml
+++ b/powerapps-docs/developer/data-platform/TOC.yml
@@ -24,6 +24,8 @@
href: security-access-coding.md
- name: Security roles and templates
href: security-roles.md
+ - name: Column-level security
+ href: column-level-security.md
- name: Microsoft Entra ID group teams
href: aad-group-team.md
- name: Work with data using code
@@ -137,11 +139,8 @@
- name: "Dataverse SQL"
href: how-dataverse-sql-differs-from-transact-sql.md
- name: Bulk Operation messages
- displayName: CreateMultiple, UpdateMultiple, UpsertMultiple
+ displayName: CreateMultiple, UpdateMultiple, UpsertMultiple, DeleteMultiple
href: bulk-operations.md
- items:
- - name: Use DeleteMultiple (preview)
- href: deletemultiple.md
- name: Restore deleted records (preview)
displayName: RecycleBin, Restore
href: restore-deleted-records.md
@@ -411,8 +410,6 @@
href: time-zone-entities.md
- name: BusinessUnit table
href: businessunit-entity.md
- - name: Field security tables
- href: field-security-entities.md
- name: Use access teams and owner teams to collaborate and share information
href: use-access-teams-owner-teams-collaborate-share-information.md
- name: Azure AD user tables
@@ -442,8 +439,8 @@
href: entity-attribute-metadata-messages.md
- name: Behavior and format of the date and time column
href: behavior-format-date-time-attribute.md
- - name: Formula, calculated, and rollup columns
- href: calculated-rollup-attributes.md
+ - name: Specialized columns
+ href: specialized-columns.md
- name: Create auto-number columns
href: create-auto-number-attributes.md
- name: Choices
diff --git a/powerapps-docs/developer/data-platform/aaduser-entity.md b/powerapps-docs/developer/data-platform/aaduser-entity.md
index ca07df0d7f..02a734eab1 100644
--- a/powerapps-docs/developer/data-platform/aaduser-entity.md
+++ b/powerapps-docs/developer/data-platform/aaduser-entity.md
@@ -1,14 +1,13 @@
---
-title: "Azure Active Directory user (AADUser) table (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "An Azure Active Directory user virtual table in Microsoft Dataverse." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.custom: ""
+title: "Azure Active Directory user (AADUser) table (Microsoft Dataverse) | Microsoft Docs"
+description: "An Azure Active Directory user virtual table in Microsoft Dataverse."
ms.date: 04/20/2022
ms.reviewer: "pehecke"
ms.topic: "article"
-author: "NHelgren" # GitHub ID
+author: "NHelgren"
ms.service: powerapps
ms.subservice: dataverse-developer
-ms.author: "nhelgren" # MSFT alias of Microsoft employees only
+ms.author: "nhelgren"
search.audienceType:
- developer
---
diff --git a/powerapps-docs/developer/data-platform/access-web-services.md b/powerapps-docs/developer/data-platform/access-web-services.md
index 7f19a66531..e21a9f3d81 100644
--- a/powerapps-docs/developer/data-platform/access-web-services.md
+++ b/powerapps-docs/developer/data-platform/access-web-services.md
@@ -2,16 +2,16 @@
title: "Access external web services (Microsoft Dataverse) | MicrosoftDocs"
description: "Learn how to access a web service from a custom plug-in or workflow activity."
ms.custom: ""
-ms.date: 01/24/2025
-ms.reviewer: "pehecke"
-ms.topic: "article"
-author: MicroSri
+ms.date: 06/10/2025
+ms.reviewer: pehecke
+ms.topic: article
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: "pehecke"
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
- - PHecke
+ - phecke
---
# Access external web services
@@ -22,7 +22,7 @@ Plug-ins and custom workflow activities can access the network through the HTTP
- Access to localhost (loopback) isn't permitted.
- IP addresses can't be used. You must use a named web address that requires DNS name resolution.
- Anonymous authentication is supported and recommended. There's no provision for prompting the logged on user for credentials, or saving those credentials.
-- Your server must allow connections from [Power Platform and Dynamics 365 services IP address values specified under the AzureCloud service tag](/power-platform/admin/online-requirements#ip-addresses-required).
+- Your server must allow connections from Power Platform and Dynamics 365 services [IP address values](/power-platform/admin/online-requirements#ip-addresses-required) specified under the `PowerPlatformPlex` service tag.
Other methods of accessing web services include the use of Webhooks and the [!INCLUDE [pn_azure_service_bus](../../includes/pn_azure_service_bus.md)]. Refer to the links provided in the next sections for more information on those topics.
diff --git a/powerapps-docs/developer/data-platform/analyze-performance.md b/powerapps-docs/developer/data-platform/analyze-performance.md
index fda75ee8a8..cd4cd17224 100644
--- a/powerapps-docs/developer/data-platform/analyze-performance.md
+++ b/powerapps-docs/developer/data-platform/analyze-performance.md
@@ -1,12 +1,12 @@
---
title: "Analyze plug-in performance (Microsoft Dataverse) | Microsoft Docs"
description: "Learn how to find and analyze performance data on plug-ins execution."
-ms.date: 08/15/2023
-ms.reviewer: "pehecke"
-ms.topic: "article"
-author: MicroSri
+ms.date: 06/20/2025
+ms.reviewer: pehecke
+ms.topic: article
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: "pehecke"
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -14,16 +14,16 @@ contributors:
---
# Analyze plug-in performance
-When you add business logic to your plug-in you should be aware of the impact your plug-ins will have on overall system performance.
+When you add business logic to your plug-in you should be aware of the impact your plug-ins have on overall system performance.
## Time and resource constraints
-There is a hard **2-minute time limit** for a Dataverse message operation to complete. This limit includes executing the intended message operation and all registered synchronous plug-ins. There are also limitations on the amount of CPU and memory resources that can be used by extensions. If the limits are exceeded an exception is thrown and the entire message operation will be cancelled (rolled back).
+There's a hard **2-minute time limit** for a Dataverse message operation to complete. This limit includes executing the intended message operation and all registered synchronous plug-ins. There are also limitations on the amount of CPU and memory resources that extensions can use. If the limits are exceeded, Dataverse throws an exception and the entire message operation is canceled (rolled back).
-If the time limit is exceeded, an will be thrown. If any custom extension exceeds threshold CPU, memory, or handle limits or is otherwise unresponsive, that process will be killed by the platform. At that point any current extension in that process will fail with exceptions. However, the next time that the extension is executed it will run normally.
+If the time limit is exceeded, Dataverse throws a . If any custom extension exceeds threshold CPU, memory, or handle limits or is otherwise unresponsive, Dataverse kills that process. At that point any current extension in that process fails with exceptions. However, the next time that the extension is executed it will run normally.
> [!IMPORTANT]
-> You cannot control how long the message operation or other synchronous registered plug-ins take to execute. You can only control how long your plug-in takes to execute based on its design and coding.
+> You can't control how long the message operation or other synchronous registered plug-ins take to execute. You can only control how long your plug-in takes to execute based on its design and coding.
>
> Our general recommendation is to limit the time your plug-in takes to execute to no more than 2 seconds.
>
@@ -34,7 +34,7 @@ More information: [Best practices and guidance regarding plug-in and workflow de
## Monitor performance
> [!IMPORTANT]
-> This feature is no longer operational or supported. Do not use.
+> This feature is no longer operational or supported. Don't use.
>
> This section will be removed in a future article update.
diff --git a/powerapps-docs/developer/data-platform/api-limits.md b/powerapps-docs/developer/data-platform/api-limits.md
index 17090a6c3c..a60977575c 100644
--- a/powerapps-docs/developer/data-platform/api-limits.md
+++ b/powerapps-docs/developer/data-platform/api-limits.md
@@ -4,9 +4,9 @@ description: "Understand what a developer needs to do to manage service protecti
ms.date: 11/26/2024
ms.reviewer: jdaly
ms.topic: article
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/application-insights-ilogger.md b/powerapps-docs/developer/data-platform/application-insights-ilogger.md
index 7ebcf4e1fa..449fb1cc29 100644
--- a/powerapps-docs/developer/data-platform/application-insights-ilogger.md
+++ b/powerapps-docs/developer/data-platform/application-insights-ilogger.md
@@ -1,9 +1,9 @@
---
title: "Write Telemetry to your Application Insights resource using ILogger (Microsoft Dataverse) | Microsoft Docs"
description: "When you enable Application Insights for your organization, any plug-ins written using the ILogger Interface provided in the SDK writes telemetry to your Application Insights resource."
-ms.date: 03/10/2023
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: how-to
ms.subservice: dataverse-developer
@@ -17,12 +17,12 @@ contributors:
# Write Telemetry to your Application Insights resource using ILogger
> [!IMPORTANT]
-> To use this capability you must first enable the Application Insights integration feature. More information: [Analyze model-driven apps and Microsoft Dataverse telemetry with Application Insights](/power-platform/admin/analyze-telemetry)
-> There is presently no support of `ILogger` within a plug-in profiling/debug session of the Plug-in Registration tool or the Power Platform Tools extension for Visual Studio.
+> To use this capability, you must first enable the Application Insights integration feature using an administrator account. Ensure that the user enabling the feature has the necessary privileges to modify the Dataverse organization (such as System Administrator role or being a Power Platform/Dynamics 365 admin) and has contributor access to the Application Insights resource. If a user without the necessary permissions enables the integration, telemetry data will not be written to Application Insights. More information: [Analyze model-driven apps and Microsoft Dataverse telemetry with Application Insights](/power-platform/admin/analyze-telemetry)
+> There's presently no support of `ILogger` within a plug-in profiling/debug session of the Plug-in Registration tool or the Power Platform Tools extension for Visual Studio.
When you enable Application Insights for your organization, any plug-ins written using the [ILogger Interface](/dotnet/api/microsoft.xrm.sdk.plugintelemetry.ilogger) provided in the SDK for .NET assemblies write telemetry to your Application Insights resource.
-The Dataverse platform captures the Dataverse and model-driven app telemetry data and exports it to your Application Insights resource. There's some latency between the time it was captured and when it becomes available to you in Application Insights. Because Microsoft gathers this telemetry, you don't need to write any code to enable it.
+The Dataverse platform captures the Dataverse and model-driven app telemetry data and exports it to your Application Insights resource. There's some latency between the time it was captured and when it becomes available to you in Application Insights. Because Microsoft gathers this telemetry, you don't need to write any code to enable it.
Telemetry data that comes from plug-ins using the ILogger interface is different in two ways:
@@ -37,24 +37,24 @@ Using ILogger provides true telemetry data and is intended to work together with
|---------|---------|---------|
|Intended use|Capture telemetry over time for analysis and debugging.|While developing and debugging plug-ins|
|How long data is stored|According to your Application Insights data retention period, which is 90 days by default|24 hours|
-|Available|Only for organizations that have subscribed to Application Insights integration.|Available for any organization when Plug-in tracing is enabled.|
-|Amount of data|Each log message can pass a String value.|Only 10 kb of text can be written for each plug-in execution. Any more is truncated.|
+|Available|Only for organizations that subscribe to Application Insights integration.|Available for any organization when Plug-in tracing is enabled.|
+|Amount of data|Each log message can pass a String value.|Only 10 kb of text can be written for each plug-in execution. The text is truncated after the first 10 kb.|
|Available in runtime errors|No|Available in model-driven app client errors and as annotations in Web API. More information: [Include more details with errors](webapi/compose-http-requests-handle-errors.md#include-more-details-with-errors)|
You should continue to use the [ITracingService.Trace](xref:Microsoft.Xrm.Sdk.ITracingService.Trace%2A) to write to the Plug-in Trace Log table when needed. Not every organization enables Application Insights. If your plug-in code uses the ILogger interface and the organization doesn't have Application Insights integration enabled, nothing is written. So, it's important to continue to use the ITracingService Trace method in your plug-ins. Plug-in trace logs continue to be an important way to capture data while developing and debugging plug-ins, but they were never intended to provide telemetry data. More information: [Plug-ins: Tracing and logging](logging-tracing.md)
You should use [ILogger](xref:Microsoft.Xrm.Sdk.PluginTelemetry.ILogger) because it provides telemetry about what happens within a plug-in. This telemetry is integrated with the larger scope of data captured with the Application Insights integration. The Application Insights integration tells you when a plug-in executes, how long it takes to run and whether it makes any external http requests, but Microsoft can't add any telemetry code within the plug-ins that you write to extend the behavior of the platform.
-If you're an ISV with a product that includes plug-ins, your customers who enable Application Insights appreciate being able to see what is going on within your plug-ins and this data may help you support them if there are issues. But data captured using ILogger is only sent to the subscribing customer's resource. You'll only be able to see data captured for your own environments when you have Application Insights enabled.
+If you're an ISV with a product that includes plug-ins, your customers who enable Application Insights appreciate being able to see what is going on within your plug-ins and this data might help you support them if there are issues. But data captured using ILogger is only sent to the subscribing customer's resource. You'll only be able to see data captured for your own environments when you have Application Insights enabled.
## Use ILogger
-ILogger is a common interface for capturing log information. The implementation provided with the SDK for .NET assemblies provides common methods to support establishing a scope and different levels of logging. There's currently no setting to control what level of logs are written. The levels can be used within Application Insights to filter which logs to view.
+ILogger is a common interface for capturing log information. The implementation provided with the SDK for .NET assemblies provides common methods to support establishing a scope and different levels of logging. There's currently no setting to control what level of logs are written. The levels can be used within Application Insights to filter the logs to view.
-The following is an example of a plug-in using both ILogger and ITracingService.Trace.
+The following example plug-in shows using both ILogger and ITracingService.Trace.
> [!NOTE]
-> Make sure you include `using Microsoft.Xrm.Sdk.PluginTelemetry;`. Don't use `using Microsoft.Extensions.Logging;`, otherwise the `ILogger` instance will be null.
+> Make sure you include `using Microsoft.Xrm.Sdk.PluginTelemetry;`. Don't use `using Microsoft.Extensions.Logging;`, otherwise the `ILogger` instance is null.
```csharp
using Microsoft.Xrm.Sdk;
@@ -206,7 +206,7 @@ When this plug-in is registered on a synchronous `PostOperation` step for the `C
You can filter items for a single operation using the `operation_ParentId` that represents the request ID of the response header.
-:::image type="content" source="media/application-insights-ilogger-trace-operation_parentid.png" alt-text="Filter items for a single operation using the operation_ParentId .":::
+:::image type="content" source="media/application-insights-ilogger-trace-operation_parentid.png" alt-text="Filter items for a single operation using the operation_ParentId.":::
The corresponding plug-in trace log entry looks like this:
@@ -232,7 +232,7 @@ And this query limits the results to the logs added during the `OutboundCall` sc
## Logging Exceptions
-At the bottom of the plug-in code example above, the following code uses [LogError](/dotnet/api/microsoft.xrm.sdk.plugintelemetry.ilogger.logerror) to log a caught exception and throws an [InvalidPluginExecutionException](/dotnet/api/microsoft.xrm.sdk.invalidpluginexecutionexception):
+At the bottom of the previous plug-in code example, the following code uses [LogError](/dotnet/api/microsoft.xrm.sdk.plugintelemetry.ilogger.logerror) to log a caught exception and throws an [InvalidPluginExecutionException](/dotnet/api/microsoft.xrm.sdk.invalidpluginexecutionexception):
```csharp
catch (Exception e)
@@ -250,7 +250,7 @@ Using the plug-in code above, you can cause an exception by passing an invalid v
This value overrides the default value (`https://www.bing.com`) and cause the outbound call to fail.
-There's nothing wrong with the request that a client may send:
+There's nothing wrong with the request that a client might send:
```http
POST [Organization URI]/api/data/v9.1/accounts HTTP/1.1
@@ -326,7 +326,7 @@ Within Application Insights, if you view traces scoped to this request and with
:::image type="content" source="media/application-insights-ilogger-trace-error.png" alt-text="View traces scoped to this request and with the scope set to OutboundCall.":::
-Within Application Insights, when you switch your query to use `exceptions` rather than `traces`, you'll see three exceptions logged:
+Within Application Insights, when you switch your query to use `exceptions` rather than `traces`, you see three exceptions logged:
:::image type="content" source="media/application-insights-ilogger-cause-error-exceptions.png" alt-text="Switch your query to use exceptions rather than traces.":::
diff --git a/powerapps-docs/developer/data-platform/apply-business-logic-with-code.md b/powerapps-docs/developer/data-platform/apply-business-logic-with-code.md
index 8741fb4a6c..463000f8f7 100644
--- a/powerapps-docs/developer/data-platform/apply-business-logic-with-code.md
+++ b/powerapps-docs/developer/data-platform/apply-business-logic-with-code.md
@@ -2,8 +2,8 @@
title: Apply business logic using code (Microsoft Dataverse)| Microsoft Docs
description: Learn how to write code to customize business data processing in Microsoft Dataverse.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
suite: powerapps
ms.subservice: dataverse-developer
diff --git a/powerapps-docs/developer/data-platform/auditing/configure.md b/powerapps-docs/developer/data-platform/auditing/configure.md
index f9110c935b..147f12b852 100644
--- a/powerapps-docs/developer/data-platform/auditing/configure.md
+++ b/powerapps-docs/developer/data-platform/auditing/configure.md
@@ -1,7 +1,7 @@
---
title: Configure auditing
description: Learn how to programmatically configure auditing settings for the organization, tables, and columns in Microsoft Dataverse.
-ms.date: 06/02/2023
+ms.date: 06/10/2025
ms.topic: overview
ms.subservice: dataverse-developer
author: paulliew
@@ -21,7 +21,7 @@ Microsoft Dataverse auditing uses settings in the [Organization table](../refere
## Configure organization settings
-Four properties in the [Organization table](../reference/entities/organization.md) control how auditing is enabled for an environment. The organization table contains a single row. The `organizationid` column is the primary key. Query the row directly to get the key value, or execute the `WhoAmI` message and take the value of the `WhoAmIResponse.OrganizationId` property.
+Five properties in the [Organization table](../reference/entities/organization.md) control how auditing is enabled for an environment. The organization table contains a single row. The `organizationid` column is the primary key. Query the row directly to get the key value, or execute the `WhoAmI` message and take the value of the `WhoAmIResponse.OrganizationId` property.
The following table describes the organization table columns that control auditing behavior.
@@ -31,6 +31,7 @@ The following table describes the organization table columns that control auditi
|`AuditRetentionPeriodV2`
`auditretentionperiodv2`
**Audit Retention Period Settings**|Integer|The number of days to retain audit log records
The default value is 30. Valid values are between 1 and 365,000 days (~1,000 years). If the value is set to -1, the records are retained forever.
[Administrator's guide: Start/stop auditing and set retention policy](/power-platform/admin/manage-dataverse-auditing#startstop-auditing-for-a-dataverse-environment-and-set-retention-policy)|
|`IsUserAccessAuditEnabled`
`isuseraccessauditenabled`
**Is User Access Auditing Enabled**|Boolean|Whether user access logging is enabled
Auditing for the environment must be enabled for user access logging to be enabled.|
|`UserAccessAuditingInterval`
`useraccessauditinginterval`
**User Authentication Auditing Interval**|Integer|How often user access is logged, in hours
The default value is 4.|
+|`AuditSettings`
`auditsettings`
**Audit Settings**|String|Json format string. Contains audit feature related settings.|
### Retrieve organization settings
@@ -42,6 +43,7 @@ Use the following queries to retrieve your organization settings.
```http
GET [Organization URI]/api/data/v9.2/organizations?$select=
+auditsettings,
isauditenabled,
auditretentionperiodv2,
isuseraccessauditenabled,
@@ -59,10 +61,11 @@ If-None-Match: null
HTTP/1.1 200 OK
{
- "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#organizations(isauditenabled,auditretentionperiodv2,isuseraccessauditenabled,useraccessauditinginterval)",
+ "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#organizations(auditsettings,isauditenabled,auditretentionperiodv2,isuseraccessauditenabled,useraccessauditinginterval)",
"value": [
{
"@odata.etag": "W/\"67404512\"",
+ "auditsettings": "{\"IsSqlAuditWriteDisabled\":true}",
"isauditenabled": true,
"auditretentionperiodv2": 30,
"isuseraccessauditenabled": true,
@@ -84,16 +87,17 @@ Learn more about:
///
/// Shows Auditing Configuration properties
///
-/// The IOrganizationService instance to use.
-static void ShowAuditingConfig(IOrganizationService svc)
+/// The IOrganizationService instance to use.
+static void ShowAuditingConfig(IOrganizationService service)
{
WhoAmIResponse whoAmIResponse =
- (WhoAmIResponse)svc.Execute(new WhoAmIRequest());
+ (WhoAmIResponse)service.Execute(new WhoAmIRequest());
- Entity organization = svc.Retrieve(
+ Entity organization = service.Retrieve(
entityName: "organization",
id: whoAmIResponse.OrganizationId,
columnSet: new ColumnSet(
+ "auditsettings",
"isauditenabled",
"auditretentionperiodv2",
"isuseraccessauditenabled",
@@ -101,6 +105,8 @@ static void ShowAuditingConfig(IOrganizationService svc)
)
);
+ Console.WriteLine($"auditsettings: " +
+ $"{organization["auditsettings"]}");
Console.WriteLine($"isauditenabled: " +
$"{organization["isauditenabled"]}");
Console.WriteLine($"auditretentionperiodv2: " +
@@ -123,13 +129,70 @@ Learn more about:
### Change organization settings
-Change the column values in the organization table to change how auditing works for the environment. You must have the System Administrator or System Customizer role to change these settings.
+Change the column values in the organization table to change how auditing works for the environment. You must have the System Administrator or System Customizer role to change these settings. [Learn more about reading and updating environment settings](../organization-table.md)
-You can use Web API or Dataverse SDK for .NET to change your organization settings:
+#### Change AuditSettings
+
+[Organization.AuditSettings](../reference/entities/organization.md#BKMK_AuditSettings) contains a json string to store settings to enable different capabilities. You can enable some capabilities by updating the `auditsettings` column of the organization record. The following table specifies what audit settings exist, what they're used for, and whether they can be changed.
+
+| Setting | Description | Updatable |
+|-----------|-----------|-----------|
+| `StoreLabelNameforPicklistAudits` | For audits of picklist values, audit both option value and option name. Otherwise only the option value. The original user selected label choice persists in the audit records. | Yes |
+| `IsSqlAuditWriteDisabled` | If NoSql audits are enabled, stop writing data to sql audit table | No, throws an error. |
+| `ApplyRetentionToExistingLogs` | Apply new retention policy to existing audit records | No, is ignored. |
+
+Use the following examples to set your organization settings. You'll need the `organizationid` value. See [Retrieve organization settings](#retrieve-organization-settings) for how to obtain it.
+
+##### [Web API](#tab/webapi)
+
+**Request:**
+
+```http
+PATCH [Organization URI]/api/data/v9.2/organizations([Organization ID]) HTTP/1.1
+Content-Type: application/json
+OData-MaxVersion: 4.0
+OData-Version: 4.0
+If-Match: *
+
+{
+ "auditsettings": "{\"StoreLabelNameforPicklistAudits\":true}"
+}
+```
+
+**Response:**
+
+```http
+HTTP/1.1 204 No content
+```
+
+Learn more about:
- [Update and delete table rows using the Web API](../webapi/update-delete-entities-using-web-api.md)
+
+##### [SDK for .NET](#tab/sdk)
+
+```csharp
+///
+/// Sets audit settings
+///
+/// The IOrganizationService instance to use.
+static void SetAuditSettings(IOrganizationService service)
+{
+ WhoAmIResponse whoAmIResponse =
+ (WhoAmIResponse)service.Execute(new WhoAmIRequest());
+
+ var organization = new Entity("organization", whoAmIResponse.OrganizationId);
+ organization["auditsettings"] = "{\"StoreLabelNameforPicklistAudits\":true}";
+ service.Update(organization);
+}
+```
+
+Learn more about:
+
- [Update and delete table rows using the SDK for .NET](../org-service/entity-operations-update-delete.md)
+---
+
## Configure tables and columns
When auditing is enabled for the organization, any tables that are enabled for auditing write audit data for all columns that are enabled for auditing. The primary control is at the organization and then the table level.
@@ -215,8 +278,8 @@ Learn more about:
/// Lists the tables that can be enabled for auditing and
/// the tables that cannot be enabled for auditing.
///
-/// The IOrganizationService instance to use.
-static void ShowTableAuditConfigurations(IOrganizationService svc)
+/// The IOrganizationService instance to use.
+static void ShowTableAuditConfigurations(IOrganizationService service)
{
//Define properties to return
MetadataPropertiesExpression EntityProperties =
@@ -247,7 +310,7 @@ static void ShowTableAuditConfigurations(IOrganizationService svc)
};
RetrieveMetadataChangesResponse response =
- (RetrieveMetadataChangesResponse)svc.Execute(request);
+ (RetrieveMetadataChangesResponse)service.Execute(request);
Console.WriteLine("These tables can be enabled for auditing:");
response.EntityMetadata.ToList().ForEach(x =>
@@ -325,10 +388,10 @@ Learn more about: [Query table definitions using the Web API](../webapi/query-me
/// Lists the columns of a table that can be enabled for auditing and
/// the columns that cannot be enabled for auditing.
///
-/// The IOrganizationService instance to use.
+/// The IOrganizationService instance to use.
/// The logical name of the table.
static void ShowColumnAuditConfigurations(
-IOrganizationService svc,
+IOrganizationService service,
string tableLogicalName)
{
@@ -379,7 +442,7 @@ RetrieveMetadataChangesRequest request =
};
RetrieveMetadataChangesResponse response =
- (RetrieveMetadataChangesResponse)svc.Execute(request);
+ (RetrieveMetadataChangesResponse)service.Execute(request);
response.EntityMetadata.ToList().ForEach(x =>
{
@@ -472,7 +535,7 @@ PublishXmlRequest request = new PublishXmlRequest()
"
};
-svc.Execute(request);
+service.Execute(request);
```
Learn more about:
diff --git a/powerapps-docs/developer/data-platform/best-practices/business-logic/do-not-use-parallel-execution-in-plug-ins.md b/powerapps-docs/developer/data-platform/best-practices/business-logic/do-not-use-parallel-execution-in-plug-ins.md
index e86ad7c0d3..133eecd4a6 100644
--- a/powerapps-docs/developer/data-platform/best-practices/business-logic/do-not-use-parallel-execution-in-plug-ins.md
+++ b/powerapps-docs/developer/data-platform/best-practices/business-logic/do-not-use-parallel-execution-in-plug-ins.md
@@ -1,9 +1,9 @@
---
-title: "Do not use parallel execution within plug-ins and workflow activities | MicrosoftDocs"
-description: "Multi or parallel threading within plug-ins or custom workflow activities is not supported."
-ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+title: "Don't use parallel execution within plug-ins and workflow activities | MicrosoftDocs"
+description: "Multi or parallel threading within plug-ins or custom workflow activities isn't supported."
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: article
ms.subservice: dataverse-developer
@@ -13,7 +13,7 @@ contributors:
- JimDaly
- phecke
---
-# Do not use parallel execution within plug-ins and workflow activities
+# Don't use parallel execution within plug-ins and workflow activities
**Category**: Design, Performance, Security, Supportability
@@ -23,18 +23,18 @@ contributors:
## Symptoms
-Multi-threading or parallel calls within plug-ins or custom workflow activities can cause corruption of those the connections. As an example, executing parallel threads can log exceptions such as:
+Multi-threading or parallel calls within plug-ins or custom workflow activities can cause corruption of those the connections. As an example, executing parallel threads can log exceptions such as:
`Generic SQL error.`
`The transaction active in this session has been committed or aborted by another session.`
-Also, non-thread safe objects such as items in the [System.Collections Namespace](/dotnet/api/system.collections) can become corrupted by parallel threads.
+Also, nonthread safe objects such as items in the [System.Collections Namespace](/dotnet/api/system.collections) can become corrupted by parallel threads.
## Guidance
-The sandbox service has been designed to execute calls in a specific order as part of a transaction. Developing plug-ins or custom workflow activities to make parallel or multi-threaded calls is not supported. Develop your plug-ins and custom workflow activities knowing that the calls will be performed sequentially and may need to be rolled back.
+The sandbox service is designed to execute calls in a specific order as part of a transaction. Developing plug-ins or custom workflow activities to make parallel or multi-threaded calls isn't supported. Develop your plug-ins and custom workflow activities knowing that the calls are performed sequentially and might need to be rolled back.
> [!NOTE]
> Using parallel execution from a client program is a supported practice to optimize performance as needed. This guidance is specific to code written to be executed within a plug-in or custom workflow activity.
@@ -43,7 +43,7 @@ The sandbox service has been designed to execute calls in a specific order as pa
## Problematic patterns
-Plug-ins and custom workflow activities run within a single transaction and multiple threads introduced by parallel execution can corrupt the transaction. The following are examples of patterns and practices that should not be used within plug-ins and custom workflow activities:
+Plug-ins and custom workflow activities run within a single transaction and multiple threads introduced by parallel execution can corrupt the transaction. The following are examples of patterns and practices that shouldn't be used within plug-ins and custom workflow activities:
- Using [Task-based asynchronous pattern (TAP)](/dotnet/standard/asynchronous-programming-patterns/task-based-asynchronous-pattern-tap)
- Using [Task Parallel Library (TPL)](/dotnet/standard/parallel-programming/task-parallel-library-tpl)
diff --git a/powerapps-docs/developer/data-platform/best-practices/business-logic/implement-all-types-of-queries-when-filtering-preoperation-retrievemultiple.md b/powerapps-docs/developer/data-platform/best-practices/business-logic/implement-all-types-of-queries-when-filtering-preoperation-retrievemultiple.md
index d7a15b1cbc..8534c9e85c 100644
--- a/powerapps-docs/developer/data-platform/best-practices/business-logic/implement-all-types-of-queries-when-filtering-preoperation-retrievemultiple.md
+++ b/powerapps-docs/developer/data-platform/best-practices/business-logic/implement-all-types-of-queries-when-filtering-preoperation-retrievemultiple.md
@@ -3,8 +3,8 @@ title: "Implement all types of queries when filtering results using PreOperation
description: "For best performance and consistent results for all applications you must implement filtering for all types of queries that can be used with plug-ins that are registered for the PreOperation stage of RetrieveMultiple."
suite: powerapps
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: article
ms.subservice: dataverse-developer
diff --git a/powerapps-docs/developer/data-platform/best-practices/business-logic/manage-plug-ins-single-solution.md b/powerapps-docs/developer/data-platform/best-practices/business-logic/manage-plug-ins-single-solution.md
index c8d77a54bc..f2e7278ce5 100644
--- a/powerapps-docs/developer/data-platform/best-practices/business-logic/manage-plug-ins-single-solution.md
+++ b/powerapps-docs/developer/data-platform/best-practices/business-logic/manage-plug-ins-single-solution.md
@@ -2,8 +2,8 @@
title: "Manage plug-ins in a single solution | MicrosoftDocs"
description: "The definition of a Plug-in assembly should be maintained within a single solution. You may want to have a separate solution that contains only plug-in definitions to help manage the plugin definitions."
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
suite: powerapps
ms.subservice: dataverse-developer
diff --git a/powerapps-docs/developer/data-platform/best-practices/business-logic/optimize-assembly-development.md b/powerapps-docs/developer/data-platform/best-practices/business-logic/optimize-assembly-development.md
index 1d0e4b0374..d26c1841b3 100644
--- a/powerapps-docs/developer/data-platform/best-practices/business-logic/optimize-assembly-development.md
+++ b/powerapps-docs/developer/data-platform/best-practices/business-logic/optimize-assembly-development.md
@@ -2,9 +2,9 @@
title: "Optimize custom assembly development | MicrosoftDocs"
description: "Consider merging separate plug-ins/custom workflow activities into a single custom assembly to improve performance and maintainability and move plug-ins/custom workflow activities into multiple custom assemblies if an assembly size is near the sandbox assembly size constraints."
suite: powerapps
-ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: how-to
ms.subservice: dataverse-developer
@@ -16,8 +16,6 @@ contributors:
---
# Optimize assembly development
-
-
**Category**: Performance, Maintainability, Design
**Impact potential**: Low
@@ -26,7 +24,7 @@ contributors:
## Symptoms
-When developing custom assemblies, there are a couple of considerations to take in:
+Consider the following points when developing custom assemblies:
1. Assemblies with a large number of custom workflow activities can take a long time to upload when being registered.
1. Multiple different custom assemblies
@@ -41,9 +39,9 @@ When developing custom assemblies, there are a couple of considerations to take
### Limit the number of Custom Workflow Activities in a Single assembly
-When an assembly that contains custom workflow activities is uploaded during plug-in registration, additional checks are required for custom workflow activities.
+When an assembly that contains custom workflow activities is uploaded during plug-in registration, more checks are required for custom workflow activities.
-While an assembly with hundreds of ordinary plug-in types may be uploaded very quickly, an assembly with more than 100 custom workflow activities may take several minutes or even time out when being registered or updated. We recommend including no more than 50 custom workflow activities in a single assembly.
+While an assembly with hundreds of ordinary plug-in types might be uploaded quickly, an assembly with more than 100 custom workflow activities might take several minutes or even time out when being registered or updated. We recommend including no more than 50 custom workflow activities in a single assembly.
### Consolidate Plug-ins or Custom Workflow Activities into a Single Assembly
@@ -56,7 +54,7 @@ Plug-ins and custom workflow activities developed for a Dataverse solution shoul
### Move Plug-ins/Custom Workflow Activities into Multiple Assemblies
-Power Apps and Dynamics 365 (online) has an assembly size constraint of 16 MB which cannot be changed. If your assembly size is nearing 16 MB, consider moving plug-in/custom workflow activities into multiple assemblies.
+Power Apps and Dynamics 365 (online) has an assembly size constraint of 16 MB, which can't be changed. If your assembly size is nearing 16 MB, consider moving plug-in/custom workflow activities into multiple assemblies.
@@ -64,24 +62,25 @@ Power Apps and Dynamics 365 (online) has an assembly size constraint of 16 MB wh
### Assemblies take a long time to upload when being registered
-When a custom workflow activity type plug-in is uploaded while being registered, each type requires additional validation checking. When an assembly contains more than a hundred custom workflow activity type plug-ins, it could require several minutes to complete the checks and is at risk of timing out.
+When a custom workflow activity type plug-in is uploaded while being registered, each type requires more validation checking. When an assembly contains more than a hundred custom workflow activity type plug-ins, it could require several minutes to complete the checks and is at risk of timing out.
### Multiple assemblies
Having multiple assemblies has a couple of areas that can be impacted:
-1. Performance - each assembly has a lifecycle that is managed by Dataverse. This includes loading, caching, and unloading the assemblies. Having more than one assembly causes more work to be done on the server, loading and caching an assembly, and could affect the overall plug-in/custom workflow activity execution length.
+1. Performance - Dataverse manages the lifecycle of each assembly. This includes loading, caching, and unloading the assemblies. Having more than one assembly causes more work to be done on the server, loading and caching an assembly, and could affect the overall plug-in/custom workflow activity execution length.
2. Maintainability - having more than one plug-in/custom workflow activity Visual Studio project leads to more complex application lifecycle management (ALM). It increases the risk and the amount of time when updating/patching the appropriate project for a specific plug-in/custom workflow activity, packaging the plug-ins/custom workflow activities within a solution, and managing plug-ins/custom workflow activities within a deployment.
### Assembly larger than 16 MB
-You will not be able to register a custom assembly within Dataverse that is larger than 16 MB.
+
+You won't be able to register a custom assembly within Dataverse that is larger than 16 MB.
## Additional information
-Quite often, developers create a new Visual Studio project for each plug-in/custom workflow activity. In turn, this causes a separate assembly to be generated for each plug-in/custom workflow activity.
+Often, developers create a new Visual Studio project for each plug-in/custom workflow activity. In turn, this causes a separate assembly to be generated for each plug-in/custom workflow activity.
diff --git a/powerapps-docs/developer/data-platform/best-practices/business-logic/set-timeout-for-external-calls-from-plug-ins.md b/powerapps-docs/developer/data-platform/best-practices/business-logic/set-timeout-for-external-calls-from-plug-ins.md
index 5924d5f34a..9a188b6a75 100644
--- a/powerapps-docs/developer/data-platform/best-practices/business-logic/set-timeout-for-external-calls-from-plug-ins.md
+++ b/powerapps-docs/developer/data-platform/best-practices/business-logic/set-timeout-for-external-calls-from-plug-ins.md
@@ -1,9 +1,9 @@
---
title: "Set Timeout when making external calls in a plug-in | MicrosoftDocs"
-description: "Limit the time period that external calls will expect a response within plug-ins"
-ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+description: "Limit the time period that external calls expect a response within plug-ins"
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
suite: powerapps
ms.topic: how-to
@@ -25,25 +25,25 @@ contributors:
## Symptoms
-If a plug-in makes external web requests that fail to respond quickly, the plug-in will wait for the full default timeout period before failing. This duration may cause a long transaction that can effect other operations. If the plug-in is registered:
+If a plug-in makes external web requests that fail to respond quickly, the plug-in waits for the full default timeout period before failing. This duration might cause a long transaction that can effect other operations. If the plug-in is registered:
-- Synchronously, users may experience:
+- Synchronously, users might experience:
- Unresponsive model-driven apps
- Slow client interactions
- The browser stops responding
-- Asynchronously, plug-in executions may take an extended period of time before failing.
+- Asynchronously, plug-in executions might take an extended period of time before failing.
## Guidance
-The default timeout value for .Net Http clients is 100 seconds, just 20 seconds short of the time available for the plug-in to complete. It is best to establish an expected baseline time that a calling service will respond. The longer it exceeds this normal response time, the higher the probability it will ultimately fail. As a performance best practice, it is best to fail quickly rather than allow the default timeout period to expire. You should control the period that your call to the external service will wait.
+The default timeout value for .NET Http clients is 100 seconds, just 20 seconds short of the time available for the plug-in to complete. It's best to establish an expected baseline time that a calling service responds. The longer it exceeds this normal response time, the higher the probability it will fail. As a performance best practice, it's best to fail quickly rather than allow the default timeout period to expire. You should control the period that your call to the external service waits.
-The timeout value you should set will depend on the service. For example, if you can monitor the performance of the service you may determine a duration where 99.999% of requests succeed and set your timeout period to that duration with a few seconds buffer. This will prevent the occasional outliers from having an inordinate impact on the performance of your plug-in.
+The timeout value you should set depends on the service. For example, if you can monitor the performance of the service you might determine a duration where 99.999% of requests succeed and set your timeout period to that duration with a few seconds buffer. This prevents the occasional outliers from having an inordinate impact on the performance of your plug-in.
-If you are using [System.Net.Http.HttpClient Class](/dotnet/api/system.net.http.httpclient), you can set the `Timeout` value explicitly, as shown in this example setting the timeout to 15 seconds.
+If you're using [System.Net.Http.HttpClient Class](/dotnet/api/system.net.http.httpclient), you can set the `Timeout` value explicitly, as shown in this example setting the timeout to 15 seconds.
```csharp
using (HttpClient client = new HttpClient())
@@ -62,7 +62,7 @@ using (HttpClient client = new HttpClient())
}
```
-If you are using [System.Net.WebClient Class](/dotnet/api/system.net.webclient), you need to create a derived class and override the base [GetWebRequest Method](/dotnet/api/system.net.webclient.getwebrequest) to set the timeout:
+If you're using [System.Net.WebClient Class](/dotnet/api/system.net.webclient), you need to create a derived class and override the base [GetWebRequest Method](/dotnet/api/system.net.webclient.getwebrequest) to set the timeout:
```csharp
///
diff --git a/powerapps-docs/developer/data-platform/best-practices/business-logic/use-invalidpluginexecutionexception-plugin-workflow-activities.md b/powerapps-docs/developer/data-platform/best-practices/business-logic/use-invalidpluginexecutionexception-plugin-workflow-activities.md
index c02c6478bd..e790b1a124 100644
--- a/powerapps-docs/developer/data-platform/best-practices/business-logic/use-invalidpluginexecutionexception-plugin-workflow-activities.md
+++ b/powerapps-docs/developer/data-platform/best-practices/business-logic/use-invalidpluginexecutionexception-plugin-workflow-activities.md
@@ -1,9 +1,9 @@
---
title: "Use InvalidPluginExecutionException in plug-ins and workflow activities | MicrosoftDocs"
description: "Use InvalidPluginExecutionException when raising errors within the context of a plug-in or workflow activity."
-ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
suite: powerapps
ms.topic: article
@@ -25,11 +25,11 @@ contributors:
## Symptoms
-If a synchronous plug-in returns an exception other than back to the platform, in a Power Apps client an error is displayed to the user with the message of the exception and the stack trace. This provides an unfriendly user experience in what is likely already a frustrating situation.
+If a synchronous plug-in returns an exception other than back to the platform, a Power Apps client displays an error to the user with the message of the exception and the stack trace. This provides an unfriendly user experience in what is likely already a frustrating situation.
-If you are using to intentionally cancel the operation because of data validation logic issue, you should provide guidance applicable to the application user so that they can correct the issue and continue.
+If you're using to intentionally cancel the operation because of data validation logic issue, you should provide guidance applicable to the application user so that they can correct the issue and continue.
-If the error is unexpected, it is still recommended to catch the exception, convert it into a , and then throw the new exception so that applications can show a friendly error message with guidance to help a user or technical staff quickly identify the issue.
+If the error is unexpected, it's still recommended to catch the exception, convert it into a , and then throw the new exception so that applications can show a friendly error message with guidance to help a user or technical staff quickly identify the issue.
@@ -40,11 +40,11 @@ Plug-ins should only return an returns to the caller with a friendly message and an `IsvAborted` error code. Failure to catch and convert an exception into a will result in an `IsvUnExpected` error code with no friendly message displayed to the user from a Power Apps client.
+A thrown returns to the caller with a friendly message and an `IsvAborted` error code. Failure to catch and convert an exception into a results in an `IsvUnExpected` error code with no friendly message displayed to the user from a Power Apps client.
### Handle errors from functions called in plug-ins
-Within your plug-in you will commonly call other functions to re-use code. How you handle errors in these functions is very important because an unhandled error may cause the worker process to crash. This will not only terminate your plug-in, but may also terminate any concurrent plug-ins running for your organization. More information: [Error: Sandbox Worker process crashed](../../troubleshoot-plug-in.md#error-sandbox-worker-process-crashed)
+Plug-ins commonly call other functions to reuse code. How you handle errors in these functions is important because an unhandled error might cause the worker process to crash. This crashing worker process not only terminates your plug-in, but might also terminate any concurrent plug-ins running for your organization. More information: [Error: Sandbox Worker process crashed](../../troubleshoot-plug-in.md#error-sandbox-worker-process-crashed)
@@ -53,9 +53,9 @@ Within your plug-in you will commonly call other functions to re-use code. How y
> [!WARNING]
> These patterns should be avoided.
-Do not use HTML within error message text.
+Don't use HTML within error message text.
-Web applications which access Dataverse data should HTML encode any error message text before they display it to a user. This will prevent any HTML in your message from rendered as you intend. It will just show the HTML code.
+Web applications that access Dataverse data should HTML encode any error message text before they display it to a user. This encoding prevents any HTML in your message from rendered as you intend. It just shows the HTML code.
diff --git a/powerapps-docs/developer/data-platform/best-practices/business-logic/verify-certification-dependencies.md b/powerapps-docs/developer/data-platform/best-practices/business-logic/verify-certification-dependencies.md
index 2883b7df62..8f8fe68f32 100644
--- a/powerapps-docs/developer/data-platform/best-practices/business-logic/verify-certification-dependencies.md
+++ b/powerapps-docs/developer/data-platform/best-practices/business-logic/verify-certification-dependencies.md
@@ -1,9 +1,9 @@
---
title: "Verify certification dependencies for plug-ins making outbound calls | MicrosoftDocs"
description: "Ensure that any certificates that your code depends on for outbound calls has a valid chain of certificates."
-ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
suite: powerapps
ms.topic: article
@@ -26,7 +26,7 @@ contributors:
## Symptoms
-You may get this error when your plug-in makes an https call to an external resource:
+You might get this error when your plug-in makes an https call to an external resource:
`WebException: The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.`
@@ -42,9 +42,9 @@ You should verify that the site you want to connect with has a valid chain of ce
## Additional information
-You may encounter this when connecting to a new endpoint for the first time or when something about the certificate has changed.
+You might encounter this error when connecting to a new endpoint for the first time or when something about the certificate changed.
-When the code in your plug-in running in the sandbox attempts to connect to an external endpoint using https, the Dataverse Sandbox will start SSL/TLS negotiation. The endpoint presents a certificate to use for encryption. If the certificate has one or more intermediate certificates it must present the entire chain to successfully complete SSL/TLS negotiation. If the complete chain is not presented SSL/TLS communication cannot be established.
+When the code in your plug-in running in the sandbox attempts to connect to an external endpoint using https, the Dataverse Sandbox starts SSL/TLS negotiation. The endpoint presents a certificate to use for encryption. If the certificate has one or more intermediate certificates it must present the entire chain to successfully complete SSL/TLS negotiation. If the complete chain isn't presented SSL/TLS communication can't be established.
For more information about requirements, see [Server cipher suites and TLS requirements](/power-platform/admin/server-cipher-tls-requirements).
diff --git a/powerapps-docs/developer/data-platform/best-practices/work-with-data/index.md b/powerapps-docs/developer/data-platform/best-practices/work-with-data/index.md
index c20f6725be..666a62b869 100644
--- a/powerapps-docs/developer/data-platform/best-practices/work-with-data/index.md
+++ b/powerapps-docs/developer/data-platform/best-practices/work-with-data/index.md
@@ -1,8 +1,8 @@
---
title: "Developers: Best practices and guidance around working with data for Microsoft Dataverse | Microsoft Docs"
description: Best practices and guidance around working with data for developers of Microsoft Dataverse.
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: best-practice
ms.date: 03/26/2021
diff --git a/powerapps-docs/developer/data-platform/best-practices/work-with-data/invalidcharactersinfield.md b/powerapps-docs/developer/data-platform/best-practices/work-with-data/invalidcharactersinfield.md
index ce12e64c9e..c3ebdd841e 100644
--- a/powerapps-docs/developer/data-platform/best-practices/work-with-data/invalidcharactersinfield.md
+++ b/powerapps-docs/developer/data-platform/best-practices/work-with-data/invalidcharactersinfield.md
@@ -1,10 +1,10 @@
---
title: "Manage invalid characters | Microsoft Docs"
description: "Describes how to manage invalid characters with the Dataverse API. Only allowed characters can be used or an error is thrown."
-ms.date: 03/22/2022
+ms.date: 06/20/2025
ms.topic: article
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.subservice: dataverse-developer
search.audienceType:
@@ -15,18 +15,18 @@ contributors:
# Manage invalid characters
-There are a set of characters that cannot be saved in string or memo columns. When an application saves data containing these characters to Dataverse, the following error will occur:
+There is a set of characters that can't be saved in string or memo columns. When an application saves data containing these characters to Dataverse, the following error occurs:
Name: `InvalidCharactersInField`
-Hexadecimal error code : `80040278`
+Hexadecimal error code: `80040278`
Error Number: `-2147220872`
Description: `The field '{0}' contains one or more invalid characters.`
Dataverse uses the [System.Xml.XmlConvert.VerifyXmlChars(String) Method](/dotnet/api/system.xml.xmlconvert.verifyxmlchars) for every string value passed to these columns. This error is thrown on the first invalid character encountered.
-You may encounter these characters in email content that includes replies or when text is copied from another source which may have characters to control presentation.
+You might encounter these characters in email content that includes replies or when text is copied from another source that might have characters to control presentation.
-To prevent this error you can:
+To prevent this error, you can:
- HTML encode the content before saving.
diff --git a/powerapps-docs/developer/data-platform/build-and-package.md b/powerapps-docs/developer/data-platform/build-and-package.md
index 4efdd171d4..f0c5981e5a 100644
--- a/powerapps-docs/developer/data-platform/build-and-package.md
+++ b/powerapps-docs/developer/data-platform/build-and-package.md
@@ -3,8 +3,8 @@ title: Build and package plug-in code
description: Learn about building and packaging plug-in code for Microsoft Dataverse, including assembly constraints and dependent assembly limitations.
ms.date: 04/04/2025
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.subservice: dataverse-developer
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/bulk-operations.md b/powerapps-docs/developer/data-platform/bulk-operations.md
index 34486d555b..1cb0d38a2f 100644
--- a/powerapps-docs/developer/data-platform/bulk-operations.md
+++ b/powerapps-docs/developer/data-platform/bulk-operations.md
@@ -1,9 +1,9 @@
---
title: Use bulk operation messages
description: Learn how to use special APIs to perform operations on multiple rows of data in a Microsoft Dataverse table.
-ms.date: 01/31/2025
-author: MicroSri
-ms.author: sriknair
+ms.date: 07/07/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: how-to
ms.subservice: dataverse-developer
@@ -20,8 +20,8 @@ To get the best performance when you run operations on multiple rows of a Micros
- [`CreateMultiple`](#createmultiple): Creates multiple records of the same type in a single request.
- [`UpdateMultiple`](#updatemultiple): Updates multiple records of the same type in a single request.
-- [`UpsertMultiple`](upsertmultiple.md): Creates or updates multiple records of the same type in a single request.
-- [`DeleteMultiple` (preview)](deletemultiple.md): For elastic tables only. Deletes multiple records of the same type in a single request.
+- [`UpsertMultiple`](#upsertmultiple): Creates or updates multiple records of the same type in a single request.
+- [`DeleteMultiple`](#deletemultiple): For elastic tables only. Deletes multiple records of the same type in a single request.
> [!NOTE]
> For guidance about options when performing bulk operations, such when to use these APIs compared to batch APIs like `ExecuteMultiple`, see [Optimize performance for bulk operations](optimize-performance-create-update.md).
@@ -374,6 +374,107 @@ These queries will not return results for the `UpsertMultiple` message. A table
Multiple records with the same primary key or alternate key values in the payload are not supported with `UpsertMultiple`. When more than one record in the `Targets` parameter is uniquely identified by a primary or alternate key, `UpsertMultiple` will return an error. [This behavior is different from `UpdateMultiple`](#duplicate-records-in-updatemultiple-targets-parameter).
+### DeleteMultiple
+
+Delete multiple rows of data in elastic tables with a single request.
+
+##### [SDK for .NET](#tab/sdk)
+
+You must use the [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest) because the [SDK for .NET](org-service/overview.md) doesn't have a `DeleteMultipleRequest` class. Learn how to [use messages with the SDK for .NET](org-service/use-messages.md).
+
+The following `DeleteMultipleExample` static method uses the `DeleteMultiple` message with the [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest) to delete multiple rows from the `contoso_SensorData` elastic table using the alternate key to include the `partitionid` to uniquely identify the rows.
+
+```csharp
+public static void DeleteMultipleExample(IOrganizationService service)
+{
+ string tableLogicalName = "contoso_sensordata";
+
+ List entityReferences = new() {
+ {
+ new EntityReference(logicalName: tableLogicalName,
+ keyAttributeCollection: new KeyAttributeCollection
+ {
+ { "contoso_sensordataid", "3f56361a-b210-4a74-8708-3c664038fa41" },
+ { "partitionid", "deviceid-001" }
+ })
+ },
+ { new EntityReference(logicalName: tableLogicalName,
+ keyAttributeCollection: new KeyAttributeCollection
+ {
+ { "contoso_sensordataid", "e682715b-1bba-415e-b2bc-de9327308423" },
+ { "partitionid", "deviceid-002" }
+ })
+ }
+ };
+
+ OrganizationRequest request = new(requestName:"DeleteMultiple")
+ {
+ Parameters = {
+ {"Targets", new EntityReferenceCollection(entityReferences)}
+ }
+ };
+
+ service.Execute(request);
+}
+```
+
+##### [Web API](#tab/webapi)
+
+The following example shows how to use the [DeleteMultiple action](xref:Microsoft.Dynamics.CRM.DeleteMultiple) to delete multiple rows from the `contoso_SensorData` elastic table including the `partitionid` to uniquely identify the rows.
+
+**Request:**
+
+```http
+POST [Organization Uri]/api/data/v9.2/contoso_sensordatas/Microsoft.Dynamics.CRM.DeleteMultiple
+OData-MaxVersion: 4.0
+OData-Version: 4.0
+If-None-Match: null
+Accept: application/json
+Content-Type: application/json; charset=utf-8
+Content-Length: 603
+
+{
+ "Targets": [
+ {
+ "@odata.type": "Microsoft.Dynamics.CRM.contoso_sensordata",
+ "contoso_sensordataid": "6114ca58-0928-ee11-9965-6045bd5cd155",
+ "partitionid": "Device-ABC-1234"
+ },
+ {
+ "@odata.type": "Microsoft.Dynamics.CRM.contoso_sensordata",
+ "contoso_sensordataid": "6214ca58-0928-ee11-9965-6045bd5cd155",
+ "partitionid": "Device-ABC-1234"
+ },
+ {
+ "@odata.type": "Microsoft.Dynamics.CRM.contoso_sensordata",
+ "contoso_sensordataid": "6314ca58-0928-ee11-9965-6045bd5cd155",
+ "partitionid": "Device-ABC-1234"
+ }
+ ]
+}
+```
+
+**Response:**
+
+```http
+HTTP/1.1 204 NoContent
+OData-Version: 4.0
+```
+
+---
+
+#### DeleteMultiple availability
+
+`DeleteMultiple` is supported only for elastic tables. Elastic tables don't support [table relationship cascading behavior](configure-entity-relationship-cascading-behavior.md), which can result in unpredictable execution times for delete operations. If you use `DeleteMultiple` on a standard table, you get the error: `DeleteMultiple has not yet been implemented.`
+
+
+#### DeleteMultiple examples
+
+You can find sample code on GitHub in [github.com/microsoft/PowerApps-Samples](https://github.com/microsoft/PowerApps-Samples):
+
+- [Elastic table sample code](elastic-table-samples.md)
+- Within [Sample: SDK for .NET Use bulk operations](org-service/samples/create-update-multiple.md) or [Sample: Web API Use bulk operations](webapi/samples/create-update-multiple.md), change the `Settings.cs` config file and choose the `UseElastic` option.
+
## Standard and elastic table usage
@@ -384,7 +485,7 @@ Both standard and elastic tables benefit from a significant performance boost wh
| [Number of records](#number-of-records) | Operations are more efficient with a larger number of records. There's no limit on the number of records, but there are message size and time limits. We recommend sending 100 - 1000 records at a time.| We recommend sending 100 records at a time. |
| [On Error behavior](#on-error-behavior) | All operations roll back on error. | Partial success is possible. |
| [Availability](#availability) | Not all standard tables support these messages. | Messages are available for all elastic tables. |
-| [DeleteMultiple](deletemultiple.md) | Not available. Use the SDK [BulkDeleteRequest class](xref:Microsoft.Crm.Sdk.Messages.BulkDeleteRequest) or the Web API [BulkDelete action](xref:Microsoft.Dynamics.CRM.BulkDelete) instead. [Learn how to delete data in bulk](delete-data-bulk.md). | Available using the SDK [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest). The Web API `DeleteMultiple` action is private, but you can use it now. It will become public soon. |
+| [DeleteMultiple](#deletemultiple) | Not available. Use the SDK [BulkDeleteRequest class](xref:Microsoft.Crm.Sdk.Messages.BulkDeleteRequest) or the Web API [BulkDelete action](xref:Microsoft.Dynamics.CRM.BulkDelete) instead. [Learn how to delete data in bulk](delete-data-bulk.md). | Use the SDK [DeleteMultipleRequest Class](/dotnet/api/microsoft.xrm.sdk.messages.deletemultiplerequest) or Web API [DeleteMultiple Action](/power-apps/developer/data-platform/webapi/reference/deletemultiple)|
Standard and elastic table usage is different because standard tables use Azure SQL and support transactions. Elastic tables use Azure Cosmos DB, which doesn't support transactions but is able to handle large amounts of data at high levels of throughput with low latency. The following sections provide more details. [Learn more about bulk operations on elastic tables](use-elastic-tables.md#bulk-operations-with-elastic-tables).
@@ -445,9 +546,6 @@ When you use the Web API to perform a bulk operation on an elastic table, you ne
Bulk operation message availability depends on whether you're using standard tables or elastic tables. All elastic tables support the `CreateMultiple`, `UpdateMultiple`, `UpsertMultiple`, and `DeleteMultiple` messages.
-See also:
-- [DeleteMultiple Availability](deletemultiple.md#availability)
-
#### Availability with standard tables
You can use the `CreateMultiple` and `UpdateMultiple` bulk operation messages with custom standard tables and many common standard tables, but not all. You should test whether individual standard tables support these messages. The following examples show you how to do that.
@@ -626,8 +724,6 @@ These limits are based on data changes: `Create`, `Update`, and `Delete` operati
### See also
-[Use UpsertMultiple (preview)](upsertmultiple.md)
-[Use DeleteMultiple (preview)](deletemultiple.md)
[Elastic tables](elastic-tables.md)
[Write plug-ins for CreateMultiple and UpdateMultiple](write-plugin-multiple-operation.md)
[Sample: SDK for .NET Use bulk operations](org-service/samples/create-update-multiple.md)
diff --git a/powerapps-docs/developer/data-platform/bypass-custom-business-logic.md b/powerapps-docs/developer/data-platform/bypass-custom-business-logic.md
index 814058d351..811ad0aff4 100644
--- a/powerapps-docs/developer/data-platform/bypass-custom-business-logic.md
+++ b/powerapps-docs/developer/data-platform/bypass-custom-business-logic.md
@@ -4,9 +4,9 @@ description: "Make data changes which bypass custom Dataverse logic."
ms.date: 12/04/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/bypass-power-automate-flows.md b/powerapps-docs/developer/data-platform/bypass-power-automate-flows.md
index 6d74447894..b12746bc4f 100644
--- a/powerapps-docs/developer/data-platform/bypass-power-automate-flows.md
+++ b/powerapps-docs/developer/data-platform/bypass-power-automate-flows.md
@@ -4,9 +4,9 @@ description: "Make data changes that don't trigger Power Automate flows."
ms.date: 07/01/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/column-level-security.md b/powerapps-docs/developer/data-platform/column-level-security.md
new file mode 100644
index 0000000000..0570ffaddc
--- /dev/null
+++ b/powerapps-docs/developer/data-platform/column-level-security.md
@@ -0,0 +1,782 @@
+---
+title: Column-level security with code
+description: "Learn how developers use code to secure data for specific columns or fields in a table so that only specified users and teams can view or set the values."
+ms.date: 07/29/2025
+ms.reviewer: jdaly
+ms.topic: article
+author: paulliew
+ms.subservice: dataverse-developer
+ms.author: paulliew
+search.audienceType:
+ - developer
+---
+# Column-level security with code
+
+Column-level security is applied for columns that contain sensitive information. Passwords, bank account numbers, government ID, telephone numbers, or email addresses can be secured at the column level.
+
+This article explains how developers can work with column-level security capabilities using code and the Dataverse SDK for .NET or Web API. You don't need to write code to use this feature. [Learn how to configure column-level security to control access](/power-platform/admin/field-level-security). Developers should also understand how to configure column-level security using [Power Apps](https://powerapps.microsoft.com/).
+
+## Discover which columns are secured
+
+Detect which columns are secured by retrieving the definition of the column and examining the boolean [AttributeMetadata.IsSecured property](/dotnet/api/microsoft.xrm.sdk.metadata.attributemetadata.issecured).
+
+There are two ways to discover which columns are secured with code. These ways are described in the following two sections:
+
+- [Retrieve column data filtered on IsSecured](#retrieve-column-data-filtered-on-issecured)
+- [Retrieve FieldSecurityProfile for System Administrator role](#retrieve-fieldsecurityprofile-for-system-administrator-role)
+
+### Retrieve column data filtered on IsSecured
+
+This method queries the organization's metadata to identify columns marked with the `IsSecured` property set to `true`. Everyone has access to view this data. [Learn how to Query schema definitions](query-schema-definitions.md)
+
+The resulting CSV file contains two columns: **Table** and **Column**, representing the schema names of the tables and their secured
+columns, respectively.
+
+#### [SDK for .NET](#tab/sdk)
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="GetSecuredColumns":::
+
+#### [Web API](#tab/webapi)
+
+This JSON represents the [EntityQueryExpression](/power-apps/developer/data-platform/webapi/reference/entityqueryexpression) data used with the `Query` parameter with the [RetrieveMetadataChanges Function](/power-apps/developer/data-platform/webapi/reference/retrievemetadatachanges) to return data about columns that are secured using the [AttributeMetadata](/power-apps/developer/data-platform/webapi/reference/attributemetadata)`.IsSecured` property.
+
+```json
+{
+ "Properties": {
+ "AllProperties": false,
+ "PropertyNames": ["SchemaName","Attributes"]
+ },
+ "Criteria": {
+ "FilterOperator": "And",
+ "Conditions": []
+ },
+ "AttributeQuery": {
+ "Properties": {
+ "AllProperties": false,
+ "PropertyNames": [
+ "SchemaName", "IsSecured"
+ ]
+ },
+ "Criteria": {
+ "FilterOperator": "And",
+ "Conditions": [
+ {
+ "ConditionOperator": "Equals",
+ "PropertyName": "IsSecured",
+ "Value": {
+ "Type": "System.Boolean",
+ "Value": "true"
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+**Request**:
+
+This JSON is URL encoded before sending:
+
+```http
+GET [ORGANIZATION URI]/api/data/v9.2/RetrieveMetadataChanges(Query=@p1)?@p1=%7b+%22Properties%22%3a+%7b+%22AllProperties%22%3a+false%2c+%22PropertyNames%22%3a+%5b%22SchemaName%22%2c%22Attributes%22%5d+%7d%2c+%22Criteria%22%3a+%7b+%22FilterOperator%22%3a+%22And%22%2c+%22Conditions%22%3a+%5b%5d+%7d%2c+%22AttributeQuery%22%3a+%7b+%22Properties%22%3a+%7b+%22AllProperties%22%3a+false%2c+%22PropertyNames%22%3a+%5b+%22SchemaName%22%2c+%22IsSecured%22+%5d+%7d%2c+%22Criteria%22%3a+%7b+%22FilterOperator%22%3a+%22And%22%2c+%22Conditions%22%3a+%5b+%7b+%22ConditionOperator%22%3a+%22Equals%22%2c+%22PropertyName%22%3a+%22IsSecured%22%2c+%22Value%22%3a+%7b+%22Type%22%3a+%22System.Boolean%22%2c+%22Value%22%3a+%22true%22+%7d+%7d+%5d+%7d+%7d+%7d HTTP/1.1
+Accept: application/json
+Authorization: Bearer [REDACTED]
+OData-MaxVersion: 4.0
+OData-Version: 4.0
+```
+
+**Response**:
+
+> [!NOTE]
+> The data represented in this response was edited to remove null property values returned in the `EntityMetadata` property and it only returns a single representative secured column. In reality, the total amount of data returned is large depending on the number of tables in your environment.
+
+This example shows how the [Account.OpenDeals column](/dynamics365/developer/reference/entities/account#BKMK_OpenDeals) is one of the secured columns.
+
+```http
+HTTP/1.1 200 OK
+Content-Type: application/json; odata.metadata=minimal
+OData-Version: 4.0
+Content-Length: 5324876
+
+{
+ "@odata.context": "[ORGANIZATION URI]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.RetrieveMetadataChangesResponse",
+ "ServerVersionStamp": "152647645!07/11/2025 22:09:13",
+ "DeletedMetadata": {
+ "Count": 0,
+ "IsReadOnly": false,
+ "Keys": [],
+ "Values": []
+ },
+ "EntityMetadata": [
+ {
+ "SchemaName": "Account",
+ "MetadataId": "70816501-edb9-4740-a16c-6a5efbc05d84",
+ "Attributes": [
+ {
+ "SchemaName": "OpenDeals",
+ "MetadataId": "e10cdd44-5c7f-4ac8-a5d1-b2118926f2bd",
+ "IsSecured": true
+ }
+ ]
+ },
+ Truncated for brevity...
+ ]
+}
+```
+
+---
+
+### Retrieve FieldSecurityProfile for System Administrator role
+
+
+This method queries the Dataverse field permission table to identify columns that the [Field Security Profile (FieldSecurityProfile)](reference/entities/fieldsecurityprofile.md) record with ID `572329c1-a042-4e22-be47-367c6374ea45` secures. This record manages access to secured columns for system administrators. Typically, only system administrators have the `prvReadFieldPermission` privilege to retrieve this data.
+
+#### [SDK for .NET](#tab/sdk)
+
+The static `GetSecuredColumnList` method returns fully qualified column names in the format `TableName.ColumnName`, sorted alphabetically.
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="GetSecuredColumnList":::
+
+#### [Web API](#tab/webapi)
+
+
+**Request**:
+
+```http
+GET https://[ORGANIZATION URI]/api/data/v9.2/fieldsecurityprofiles(572329c1-a042-4e22-be47-367c6374ea45)/lk_fieldpermission_fieldsecurityprofileid?$select=entityname,attributelogicalname&$count=true HTTP/1.1
+Accept: application/json
+Authorization: Bearer [REDACTED]
+Prefer: odata.include-annotations="*"
+OData-Version: 4.0
+OData-MaxVersion: 4.0
+```
+
+**Response**:
+
+The results in this example were edited for brevity to show only one example column ([Account.OpenDeals column](/dynamics365/developer/reference/entities/account#BKMK_OpenDeals)).
+
+```http
+HTTP/1.1 200 OK
+Content-Type: application/json; odata.metadata=minimal
+OData-Version: 4.0
+Preference-Applied: odata.include-annotations="*"
+
+{
+ "@odata.context": "[ORGANIZATION URI]/api/data/v9.2/$metadata#fieldpermissions(entityname,attributelogicalname)",
+ "@odata.count": 20,
+ "@Microsoft.Dynamics.CRM.totalrecordcount": 20,
+ "@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded": false,
+ "value": [
+ {
+ "@odata.etag": "W/\"15577006\"",
+ "entityname@OData.Community.Display.V1.FormattedValue": "Account",
+ "entityname": "account",
+ "attributelogicalname": "opendeals",
+ "fieldpermissionid": "9b2606bb-0144-413a-ac56-be26922d4edb"
+ },
+ Truncated for brevity...
+ ]
+}
+```
+
+---
+
+## Discover which columns can be secured
+
+You can't secure every column. When you [enable column security](/power-platform/admin/field-level-security#enable-column-security) using [Power Apps](https://make.powerapps.com/), the **Enable column security** checkbox is disabled for certain fields. You don't need to manually check each column to find out if you can secure it. Write a query to retrieve which columns you can secure.
+
+Three boolean [AttributeMetadata](/dotnet/api/microsoft.xrm.sdk.metadata.attributemetadata) properties control whether you can secure any column:
+
+- [CanBeSecuredForCreate](/dotnet/api/microsoft.xrm.sdk.metadata.attributemetadata.canbesecuredforcreate)
+- [CanBeSecuredForRead](/dotnet/api/microsoft.xrm.sdk.metadata.attributemetadata.canbesecuredforread)
+- [CanBeSecuredForUpdate](/dotnet/api/microsoft.xrm.sdk.metadata.attributemetadata.canbesecuredforupdate)
+
+When all of these properties are false, the column can't be secured. Some columns might only be secured for one or two of the three operations: `Create`, `Read`, and `Update`.
+
+The following queries return this data so you can discover which columns in your environment can be secured:
+
+### [SDK for .NET](#tab/sdk)
+
+This static `DumpColumnSecurityInfo` method retrieves metadata about entity attributes, including security-related properties, and writes the information to a CSV file. The output file contains details such as whether columns are secured, can be secured for create, update, or read operations, and other relevant metadata.
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="DumpColumnSecurityInfo":::
+
+### [Web API](#tab/webapi)
+
+This JSON represents the [EntityQueryExpression](/power-apps/developer/data-platform/webapi/reference/entityqueryexpression) data used with the `Query` parameter with the [RetrieveMetadataChanges Function](/power-apps/developer/data-platform/webapi/reference/retrievemetadatachanges) to return data about whether columns can be secured using the [AttributeMetadata](/power-apps/developer/data-platform/webapi/reference/attributemetadata)`.IsSecured` property.
+
+```json
+{
+ "Properties": {
+ "AllProperties": false,
+ "PropertyNames": ["SchemaName","Attributes"]
+ },
+ "Criteria": {
+ "FilterOperator": "And",
+ "Conditions": [
+ {
+ "ConditionOperator": "Equals",
+ "PropertyName": "IsPrivate",
+ "Value": {
+ "Type": "System.Boolean",
+ "Value": "false"
+ }
+ }
+ ]
+ },
+ "AttributeQuery": {
+ "Properties": {
+ "AllProperties": false,
+ "PropertyNames": [
+ "SchemaName",
+ "AttributeTypeName",
+ "IsPrimaryName",
+ "IsSecured",
+ "CanBeSecuredForCreate",
+ "CanBeSecuredForUpdate",
+ "CanBeSecuredForRead"
+ ]
+ },
+ "Criteria": {
+ "FilterOperator": "And",
+ "Conditions": [
+ {
+ "ConditionOperator": "NotEquals",
+ "PropertyName": "AttributeTypeName",
+ "Value": {
+ "Type": "Microsoft.Xrm.Sdk.Metadata.AttributeTypeDisplayName",
+ "Value": "VirtualType"
+ }
+ }
+ ]
+ }
+ }
+}
+```
+
+**Request**:
+
+```http
+GET [ORGANIZATION URI]/api/data/v9.2/RetrieveMetadataChanges(Query=@p1)?@p1=+%7b+%22Properties%22%3a+%7b+%22AllProperties%22%3a+false%2c+%22PropertyNames%22%3a+%5b%22SchemaName%22%2c%22Attributes%22%5d+%7d%2c+%22Criteria%22%3a+%7b+%22FilterOperator%22%3a+%22And%22%2c+%22Conditions%22%3a+%5b+%7b+%22ConditionOperator%22%3a+%22Equals%22%2c+%22PropertyName%22%3a+%22IsPrivate%22%2c+%22Value%22%3a+%7b+%22Type%22%3a+%22System.Boolean%22%2c+%22Value%22%3a+%22false%22+%7d+%7d+%5d+%7d%2c+%22AttributeQuery%22%3a+%7b+%22Properties%22%3a+%7b+%22AllProperties%22%3a+false%2c+%22PropertyNames%22%3a+%5b+%22SchemaName%22%2c+%22AttributeTypeName%22%2c+%22IsPrimaryName%22%2c+%22IsSecured%22%2c+%22CanBeSecuredForCreate%22%2c+%22CanBeSecuredForUpdate%22%2c+%22CanBeSecuredForRead%22+%5d+%7d%2c+%22Criteria%22%3a+%7b+%22FilterOperator%22%3a+%22And%22%2c+%22Conditions%22%3a+%5b+%7b+%22ConditionOperator%22%3a+%22NotEquals%22%2c+%22PropertyName%22%3a+%22AttributeTypeName%22%2c+%22Value%22%3a+%7b+%22Type%22%3a+%22Microsoft.Xrm.Sdk.Metadata.AttributeTypeDisplayName%22%2c+%22Value%22%3a+%22VirtualType%22+%7d+%7d+%5d+%7d+%7d+%7d HTTP/1.1
+Accept: application/json
+Authorization: Bearer [REDACTED]
+OData-MaxVersion: 4.0
+OData-Version: 4.0
+```
+
+**Response**:
+
+> [!NOTE]
+> The data in this response is edited to remove null property values returned in the `EntityMetadata` property and it only returns a single representative column from one table. In reality, the total amount of data returned is large depending on the number of tables and columns in your environment.
+
+This example shows the requested properties of the [Account.AccountCategoryCode column](/power-apps/developer/data-platform/reference/entities/account#BKMK_AccountCategoryCode) is one of the secured columns.
+
+```http
+HTTP/1.1 200 OK
+Content-Type: application/json; odata.metadata=minimal
+OData-Version: 4.0
+
+{
+ "@odata.context": "[ORGANIZATION URI]/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.RetrieveMetadataChangesResponse",
+ "ServerVersionStamp": "152647645!07/11/2025 23:37:54",
+ "DeletedMetadata": {
+ "Count": 0,
+ "IsReadOnly": false,
+ "Keys": [],
+ "Values": []
+ },
+ "EntityMetadata": [
+ {
+ "SchemaName": "Account",
+ "MetadataId": "70816501-edb9-4740-a16c-6a5efbc05d84",
+ "Attributes": [
+ {
+ "CanBeSecuredForRead": true,
+ "CanBeSecuredForCreate": true,
+ "CanBeSecuredForUpdate": true,
+ "IsPrimaryName": false,
+ "IsSecured": false,
+ "LogicalName": "accountcategorycode",
+ "SchemaName": "AccountCategoryCode",
+ "MetadataId": "118771ca-6fb9-4f60-8fd4-99b6124b63ad",
+ "AttributeTypeName": {
+ "Value": "PicklistType"
+ }
+ },
+ Truncated for brevity...
+ ]
+ },
+ Truncated for brevity...
+ ]
+}
+```
+
+[Learn how to Query schema definitions](query-schema-definitions.md)
+
+---
+
+## Secure a column with code
+
+It's easiest to [Secure a column](/power-platform/admin/field-level-security#enable-column-securit) using [Power Apps](https://make.powerapps.com/). If you need to automate securing a column, use code to update the column definition to set the [AttributeMetadata.IsSecured property](/dotnet/api/microsoft.xrm.sdk.metadata.attributemetadata.issecured) property as shown in the following examples:
+
+
+### [SDK for .NET](#tab/sdk)
+
+This static `SetColumnIsSecured` method retrieves the current definition of the specified column and updates its security status only if the provided value differs from the current value. If the column is already set to the specified security status, no update request is sent.
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="SetColumnIsSecured":::
+
+[Learn how to update a column using the SDK for .NET](org-service/metadata-attributemetadata.md#update-a-column)
+
+### [Web API](#tab/webapi)
+
+The following `Set-ColumnIsSecured-Example` PowerShell function retrieves the current definition of the specified column and updates its security status only if the provided value differs from the current value. If the column is already set to the specified security status, no update request is sent.
+
+This function depends on [Get-Column](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/webapi/PS/README.md#get-column-function) and [Update-Column](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/webapi/PS/README.md#update-column-function) functions defined by the [Dataverse Web API PowerShell Helper functions](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/webapi/PS/README.md) used by other PowerShell samples.
+
+:::code language="powershell" source="~/../PowerApps-Samples/dataverse/webapi/PS/ColumnLevelSecurity/Examples.ps1" id="SetColumnIsSecuredExample":::
+
+[Learn how to update a column using the Web API](webapi/create-update-column-definitions-using-web-api.md#update-a-column)
+
+---
+
+## Provide access to secured columns
+
+By default, when a column is secured, only people who have the system administrator security role can read or set the value. A system administrator can provide other users access to secured columns in two ways:
+
+- [Manage access using field security profiles](#manage-access-using-field-security-profiles): Use field security profiles to give access to column data for all records to groups.
+- [Share data in secured fields](#share-data-in-secured-fields): Use field sharing to give a specific principal or team access to data in a secure column for a specific record.
+
+### Manage access using field security profiles
+
+This approach is the most common when you have different groups of users who require different levels of access. See the [Column-level security example](/power-platform/admin/column-level-security-example) that describes how to secure fields for different users using the Power Platform admin center.
+
+To do this using code, create [Field Security Profile (FieldSecurityProfile)](reference/entities/fieldsecurityprofile.md) records that associate principals (users and teams) with [Field Permission (FieldPermission)](reference/entities/fieldpermission.md) records that control which data operations can be performed on that column for any record.
+
+
+
+
+
+:::image type="content" source="media/fieldsecurityprofile-erd.png" alt-text="entity relationship diagram for the fieldsecurityprofile table and related tables":::
+
+You can associate system users and teams to your field security profile using the [systemuserprofiles_association](/power-apps/developer/data-platform/reference/entities/fieldsecurityprofile#BKMK_systemuserprofiles_association) and [teamprofiles_association](/power-apps/developer/data-platform/reference/entities/fieldsecurityprofile#BKMK_teamprofiles_association) many-to-many relationships respectively.
+
+Associate field permissions to the field security profiles using the [`lk_fieldpermission_fieldsecurityprofileid` one-to-many relationship](reference/entities/fieldsecurityprofile.md#BKMK_lk_fieldpermission_fieldsecurityprofileid). The following table describes important field permission table columns:
+
+
+|Column |Type |Description |
+|---------|---------|---------|
+|`FieldSecurityProfileId`|Lookup|Refers to the field security profile this field permission applies to.|
+|`EntityName`|String|The logical name of the table that contains the secured column.|
+|`AttributeLogicalName`|String|The logical name of the secured column.|
+|`CanCreate`|Choice|Whether create access is allowed. See [Field security permission type options](#field-security-permission-type-options)|
+|`CanRead`|Choice|Whether read access is allowed. See [Field security permission type options](#field-security-permission-type-options)|
+|`CanUpdate`|Choice|Whether update access is allowed. See [Field security permission type options](#field-security-permission-type-options)|
+|`CanReadUnmasked`|Choice|Whether an unmasked value can be retrieved when `CanRead` is **Allowed**.|
+
+#### Field security permission type options
+
+The `CanCreate`, `CanRead`, and `CanUpdate` choice columns use the values defined by the `field_security_permission_type` global choice:
+
+- `0` **Not Allowed**
+- `4` **Allowed**
+
+> [!NOTE]
+> Don't set `CanReadUnmasked` column unless you're using the [display masked data](#display-masked-data) feature and you want to enable an app to return the unmasked value.
+
+### Share data in secured fields
+
+Create [Field Sharing (PrincipalObjectAttributeAccess)](reference/entities/principalobjectattributeaccess.md) records to share access to a secured field for a specific record with someone else.
+
+> [!NOTE]
+> Conceptually, this process is similar to the [PrincipalObjectAccess](reference/entities/principalobjectaccess.md) table that manages sharing of records. The difference is that with *record sharing* you use the `GrantAccess`, `ModifyAccess`, and `RevokeAccess` messages to add, modify, and remove records from the `PrincipalObjectAccess` table. [Learn more about sharing records](security-sharing-assigning.md#sharing-records)
+>
+> With *field sharing*, use the `PrincipalObjectAttributeAccess` table to grant, modify, and revoke field access using create, update, and delete operations on a table row.
+
+The `PrincipalObjectAttributeAccess` table has these columns:
+
+|Column |Type |Description |
+|---------|---------|---------|
+|`AttributeId`|Guid|The [AttributeMetadata.MetadataId](/dotnet/api/microsoft.xrm.sdk.metadata.metadatabase.metadataid) of the secured column. |
+|`ObjectId`|Lookup|A reference to the record that contains the secured column.|
+|`PrincipalId`|Lookup|A reference to the principal (user or team) you're granting access to.|
+|`ReadAccess`|Bool|Whether to grant read access to the field data|
+|`UpdateAccess`|Bool|Whether to grant update access to the field data|
+
+
+#### Getting column AttributeId
+
+The `PrincipalObjectAttributeAccess.AttributeId` column uses the [AttributeMetadata.MetadataId](/dotnet/api/microsoft.xrm.sdk.metadata.metadatabase.metadataid) rather than the column logical name. You need to retrieve this value from the metadata. If your application has a metadata cache, you can include this data and access it as needed.
+
+#### Retrieve column AttributeId example
+
+This example shows how to get the [AttributeMetadata.MetadataId](/dotnet/api/microsoft.xrm.sdk.metadata.metadatabase.metadataid) value you need to set the `PrincipalObjectAttributeAccess.AttributeId` column value.
+
+##### [SDK for .NET](#tab/sdk)
+
+The [Grant column access](#grant-column-access-example), [Modify column access](#modify-column-access-example), and [Revoke column access](#revoke-column-access-example) SDK for .NET examples use the `RetrieveColumnId` static method to retrieve the [AttributeMetadata.MetadataId](/dotnet/api/microsoft.xrm.sdk.metadata.metadatabase.metadataid) value used in the `PrincipalObjectAttributeAccess.AttributeId` column.
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="RetrieveColumnId":::
+
+[Learn how to query schema definitions](query-schema-definitions.md)
+
+
+##### [Web API](#tab/webapi)
+
+This example returns the column `MetadataId` when the table `LogicalName` is `account` and the column `LogicalName` is `name`.
+
+**Request**:
+
+```http
+GET [Organization URL]/api/data/v9.2/EntityDefinitions(LogicalName='account')/Attributes(LogicalName='name')/MetadataId HTTP/1.1
+Accept: application/json
+OData-MaxVersion: 4.0
+OData-Version: 4.0
+```
+
+**Response**:
+
+```http
+HTTP/1.1 200 OK
+Content-Type: application/json; odata.metadata=minimal
+OData-Version: 4.0
+
+{
+ "@odata.context": "[Organization URL]/api/data/v9.2/$metadata#EntityDefinitions('account')/Attributes('name')/MetadataId",
+ "value": "a1965545-44bc-4b7b-b1ae-93074d0e3f2a"
+}
+```
+
+---
+
+
+#### Grant column access example
+
+These examples create a new [Field Sharing (PrincipalObjectAttributeAccess)](reference/entities/principalobjectattributeaccess.md) record to share access to the specified field.
+
+##### [SDK for .NET](#tab/sdk)
+
+This method allows you to share read and/or update permissions for a secured column in a Dataverse table with a specific principal (user or team). The column must be configured as a secured field in Dataverse.
+
+This example depends on the `RetrieveColumnId` example function found in [Retrieve column AttributeId example](#retrieve-column-attributeid-example).
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="GrantColumnAccess":::
+
+##### [Web API](#tab/webapi)
+
+This example grants the user with `systemuserid` value of `d93e9712-5c0b-f011-bae2-7c1e526458ff` read access to the value of the column that has `AttributeMetadata.MetadataId` of `0134fc5f-cb61-f011-bec2-00224823101f` for the `sample_example` table record with primary key value of `eccf556c-cb61-f011-bec2-7ced8d1ef7ad`.
+
+
+**Request**:
+
+```http
+POST [ORGANIZATION URI]/api/data/v9.2/principalobjectattributeaccessset HTTP/1.1
+Accept: application/json
+Authorization: Bearer [REDACTED]
+OData-Version: 4.0
+OData-MaxVersion: 4.0
+Content-Type: application/json
+
+{
+ "objectid_sample_example@odata.bind": "/sample_examples(eccf556c-cb61-f011-bec2-7ced8d1ef7ad)",
+ "attributeid": "0134fc5f-cb61-f011-bec2-00224823101f",
+ "updateaccess": false,
+ "principalid_systemuser@odata.bind": "/systemusers(d93e9712-5c0b-f011-bae2-7c1e526458ff)",
+ "@odata.type": "Microsoft.Dynamics.CRM.principalobjectattributeaccess",
+ "readaccess": true
+}
+```
+
+**Response**:
+
+The primary key value for the created record is `784a01b1-cb61-f011-bec2-00224823101f`. Use this value to identify records to modify or delete access.
+
+```http
+HTTP/1.1 204 No Content
+OData-Version: 4.0
+OData-EntityId: [ORGANIZATION URI]/api/data/v9.2/principalobjectattributeaccessset(784a01b1-cb61-f011-bec2-00224823101f)
+```
+
+[Learn to create a table row using the Web API](webapi/create-entity-web-api.md)
+
+---
+
+#### Modify column access example
+
+These examples retrieve and update an existing [Field Sharing (PrincipalObjectAttributeAccess)](reference/entities/principalobjectattributeaccess.md) record to modify access to the specified field.
+
+##### [SDK for .NET](#tab/sdk)
+
+This example depends on the `RetrieveColumnId` example function found in [Retrieve column AttributeId example](#retrieve-column-attributeid-example).
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="ModifyColumnAccess":::
+
+##### [Web API](#tab/webapi)
+
+This example modifies the access granted in the [Grant column access example](#grant-column-access-example) to include update access.
+
+**Request**:
+
+```http
+PATCH [ORGANIZATION URI]/api/data/v9.2/principalobjectattributeaccessset(784a01b1-cb61-f011-bec2-00224823101f) HTTP/1.1
+Accept: application/json
+Authorization: Bearer [REDACTED]
+OData-Version: 4.0
+If-Match: *
+OData-MaxVersion: 4.0
+Content-Type: application/json
+
+{
+ "updateaccess": true
+}
+```
+
+**Response**:
+
+```http
+HTTP/1.1 204 No Content
+OData-Version: 4.0
+```
+
+[Learn how to update a record using Web API](webapi/update-delete-entities-using-web-api.md#basic-update)
+
+---
+
+#### Revoke column access example
+
+These examples retrieve and delete an existing [Field Sharing (PrincipalObjectAttributeAccess)](reference/entities/principalobjectattributeaccess.md) record to revoke access to the specified field.
+
+##### [SDK for .NET](#tab/sdk)
+
+This example depends on the `RetrieveColumnId` example function found in [Retrieve column AttributeId example](#retrieve-column-attributeid-example).
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="RevokeColumnAccess":::
+
+##### [Web API](#tab/webapi)
+
+This example removes the access that was granted in the [Grant column access example](#grant-column-access-example).
+
+
+**Request**:
+
+```http
+DELETE [ORGANIZATION URI]/api/data/v9.2/principalobjectattributeaccessset(784a01b1-cb61-f011-bec2-00224823101f) HTTP/1.1
+Accept: application/json
+Authorization: Bearer [REDACTED]
+OData-MaxVersion: 4.0
+OData-Version: 4.0
+```
+
+**Response**:
+
+```http
+HTTP/1.1 204 No Content
+OData-Version: 4.0
+```
+
+[Learn to delete a record using Web API](webapi/update-delete-entities-using-web-api.md#basic-delete)
+
+---
+
+## Display Masked data
+
+The default API behavior when returning a value for a secured column is to return no data. The calling application can't distinguish between a value that is secured and a value that is null.
+
+[There's now a preview feature](/power-platform/admin/create-manage-masking-rules) you can use to specify that a string value is returned when data exists. This string might totally obfuscate the value or show portions of the data depending on masking rules you define. In this way, the application can better manage sensitive data.
+
+With this feature, you can configure [Field Permission (FieldPermission)](reference/entities/fieldpermission.md) records to create field security profiles that enable applications to send requests to retrieve records with the masking removed so that the data can be shown under controlled circumstances. [Learn more about retrieving unmasked data](#retrieve-unmasked-data)
+
+### Create a secure masking rule
+
+Every column that displays masked data needs to refer to a [Secured Masking Rule (MaskingRule)](reference/entities/maskingrule.md) table row. You can create secure masking rules in Power Apps and add them to your solution, or you can use any of the existing rules.
+
+Create [Secured Masking Column (AttributeMaskingRule)](reference/entities/attributemaskingrule.md) table records to specify which masking rule a secure column should use.
+
+The following diagram describes these tables:
+
+:::image type="content" source="media/maskingrule-attributemaskingrule-erd.png" alt-text="Diagram showing columns and relationships between the MaskingRule and AttributeMaskingRule tables":::
+
+
+
+
+#### Secured Masking Rule columns
+
+The [Secured Masking Rule (MaskingRule)](reference/entities/maskingrule.md) table has these write-able columns:
+
+|Column|Type|Description|
+|---|---|---|
+|`Name`|String|The unique name of the secured masking rule.|
+|`Description`|String|Description of the secured masking rule.|
+|`DisplayName`|String|The display name of the secured masking rule.|
+|`MaskedCharacter`|String|Character used to mask.|
+|`RegularExpression`|String|Regular Expression in C#.|
+|`IsCustomizable`|BooleanManagedProperty|Information that specifies whether this component can be customized. [Learn more about managed properties](/power-platform/alm/managed-properties-alm)|
+|`RichTestData`|String|Set rich text test data to test this secured masking rule.|
+|`MaskedRichTestData`|String|`RichTestData` column data evaluated by this secured masking rule.|
+|`TestData`|String|Set test data to test this secured masking rule.|
+|`MaskedTestData`|String|`TestData` column data evaluated by a secured masking rule.|
+
+> [!NOTE]
+> The `RichTestData`, `MaskedRichTestData`, `TestData`, and `MaskedTestData` columns exist to support the experience to test masking rules in [Power Apps](https://make.powerapps.com/?utm_source=padocs&utm_medium=linkinadoc&utm_campaign=referralsfromdoc). [Learn more about creating masking rules](/power-platform/admin/create-manage-masking-rules#create-masking-rules).
+
+#### Secured Masking Column columns
+
+The [Secured Masking Column (AttributeMaskingRule)](reference/entities/attributemaskingrule.md) table has these write-able columns:
+
+|Column|Type|Description|
+|---|---|---|
+|`AttributeLogicalName`|String|Logical name of the column for which the secured masking rule is used.|
+|`EntityName`|String|Logical name of the table that contains the column.|
+|`MaskingRuleId`|Lookup|The masking rule that the column uses|
+|`UniqueName`|String|The unique name of the secured masking column.|
+|`IsCustomizable`|BooleanManagedProperty|Information that specifies whether this component can be customized. [Learn more about managed properties](/power-platform/alm/managed-properties-alm)|
+
+
+### Retrieve unmasked data
+
+When a [Field Permission (FieldPermission)](reference/entities/fieldpermission.md) record `CanRead` column is **Allowed**, you can set the `CanReadUnmasked` choice column when the column has an [Secured Masking Column (AttributeMaskingRule)](reference/entities/attributemaskingrule.md) record associated with it.
+
+The `CanReadUnmasked` column supports the following options defined by the `field_security_permission_readunmasked` global choice.
+
+|Value|Label|Description|
+|---|---|---|
+|0|**Not Allowed**|The default value. If there isn't an `AttributeMaskingRule` for the column, you can't set any other value.|
+|1|**One Record**|Unmasked data can be returned using the a `Retrieve` operation only.|
+|3|**All Records**|Unmasked data can be returned using the a `Retrieve` and `RetrieveMultiple` operations.|
+
+
+#### Retrieve unmasked data example
+
+The following examples show how to use the [`UnMaskedData` optional parameter](optional-parameters.md#return-unmasked-data) to request that the unmasked value is returned when the configuration of the field permission allows it.
+
+### [SDK for .NET](#tab/sdk)
+
+The `GetUnmaskedExampleRows` example returns unmasked values for any of the requested columns where the field permission `CanReadUnmasked` column value is set to **All Records** because the optional `UnMaskedData` parameter is added to the `RetrieveMultiple` request.
+
+This method queries the `sample_example` table and retrieves specific columns, including sensitive data such as government ID and date of birth. The query results are ordered by the `sample_name` column in descending order.
+
+:::code language="csharp" source="~/../PowerApps-Samples/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/Examples.cs" id="GetUnmaskedExampleRows":::
+
+### [Web API](#tab/webapi)
+
+**Request:**
+
+```http
+GET [ORGANIZATION URI]/api/data/v9.2/sample_examples?$select=sample_name,sample_email,sample_governmentid,sample_telephonenumber,sample_dateofbirth&$orderby=sample_name%20desc&UnMaskedData=true HTTP/1.1
+Accept: application/json
+Authorization: Bearer [Redacted]
+Prefer: odata.include-annotations="*"
+OData-Version: 4.0
+OData-MaxVersion: 4.0
+```
+
+**Response:**
+
+```http
+HTTP/1.1 200 OK
+Content-Type: application/json; odata.metadata=minimal
+OData-Version: 4.0
+Preference-Applied: odata.include-annotations="*"
+
+{
+ "@odata.context": "[ORGANIZATION URI]/api/data/v9.2/$metadata#sample_examples(sample_name,sample_email,sample_governmentid,sample_telephonenumber,sample_dateofbirth)",
+ "@Microsoft.Dynamics.CRM.totalrecordcount": -1,
+ "@Microsoft.Dynamics.CRM.totalrecordcountlimitexceeded": false,
+ "@Microsoft.Dynamics.CRM.globalmetadataversion": "153019637",
+ "value": [
+ {
+ "@odata.etag": "W/\"153019647\"",
+ "sample_email": "jaydenp@adatum.com",
+ "sample_governmentid": "***-**-5353",
+ "sample_dateofbirth": "3/25/1974",
+ "sample_name": "Jayden Phillips",
+ "sample_exampleid": "eccf556c-cb61-f011-bec2-7ced8d1ef7ad",
+ "sample_telephonenumber": "(736) 555-9012"
+ },
+ {
+ "@odata.etag": "W/\"153012339\"",
+ "sample_email": "benjamin@adventure-works.com",
+ "sample_governmentid": "***-**-7508",
+ "sample_dateofbirth": "6/18/1984",
+ "sample_name": "Benjamin Stuart",
+ "sample_exampleid": "edcf556c-cb61-f011-bec2-7ced8d1ef7ad",
+ "sample_telephonenumber": "(195) 555-7901"
+ },
+ {
+ "@odata.etag": "W/\"153012340\"",
+ "sample_email": "avery@alpineskihouse.com",
+ "sample_governmentid": "***-**-1720",
+ "sample_dateofbirth": "9/4/1994",
+ "sample_name": "Avery Howard",
+ "sample_exampleid": "eecf556c-cb61-f011-bec2-7ced8d1ef7ad",
+ "sample_telephonenumber": "(152) 555-5591"
+ }
+ ]
+}
+```
+
+---
+
+### Related articles
+
+[Security and data access](security-model.md)
+[Sharing and assigning](security-sharing-assigning.md)
+[Sample: Column-level security using Dataverse SDK for .NET](org-service/samples/column-level-security.md)
+[Sample: Column-level security using Dataverse Web API (PowerShell)](webapi/samples/column-level-security-powershell.md)
diff --git a/powerapps-docs/developer/data-platform/community-tools.md b/powerapps-docs/developer/data-platform/community-tools.md
index bdbf553f06..870ce15c03 100644
--- a/powerapps-docs/developer/data-platform/community-tools.md
+++ b/powerapps-docs/developer/data-platform/community-tools.md
@@ -1,12 +1,12 @@
---
title: "Community tools for Microsoft Dataverse (Dataverse) | Microsoft Docs"
description: "Read about the community built tools that help you perform various tasks with Microsoft Dataverse."
-ms.date: 03/15/2021
+ms.date: 06/20/2025
ms.reviewer: pehecke
ms.topic: article
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
---
@@ -15,11 +15,11 @@ search.audienceType:
The Power Apps community creates tools!
> [!IMPORTANT]
-> Tools created by the community are not supported by Microsoft. If you have questions or issues with community tools, contact the publisher of the tool.
+> Tools created by the community aren't supported by Microsoft. If you have questions or issues with community tools, contact the publisher of the tool.
## XrmToolBox
-Many of the most popular ones are distributed in the [XrmToolBox](https://www.xrmtoolbox.com/). XrmToolBox is a Windows application that connects to Dataverse, providing tools to ease customization, configuration, and operation tasks. It's shipped with more than 30 plugins to make administration, customization, or configuration tasks easier and less time consuming.
+Many of the most popular ones are distributed in the [XrmToolBox](https://www.xrmtoolbox.com/). XrmToolBox is a Windows application that connects to Dataverse, providing tools to ease customization, configuration, and operation tasks. It includes more than 30 plugins to make administration, customization, or configuration tasks easier and less time consuming.
The following list of selected community tools is distributed via the XrmToolBox that you can use with Dataverse.
@@ -48,14 +48,12 @@ The [Level up](https://chrome.google.com/webstore/detail/level-up-for-dynamics-3
## Visual Studio Code Extensions
-With the popularity of building own's extension for Visual Studio Code the community has built several of them.
-
-The following is a selected list of community tools available for Visual Studio Code:
+The following table contains a selected list of community tools available for Visual Studio Code:
|Tool |Description |
|---------|---------|
|[Dataverse DevTools](https://marketplace.visualstudio.com/items?itemName=danish-naglekar.dataverse-devtools)|The all-in-one tool to develop code for Dataverse/Dynamics 365. Helps you connect to a Dataverse environment, generate TypeScript definitions for entities, create different type of Dataverse-specific projects, and much more.|
|[Power Apps Portal Helper](https://marketplace.visualstudio.com/items?itemName=oleksandr-olashyn.portal-helper-vscode)|Set of commands that simplify working with Power Apps CLI for Portals|
-|[PCF Builder](https://marketplace.visualstudio.com/items?itemName=danish-naglekar.pcf-builder)|Helps with initializing, building and testing Power Apps Component Framework components|
+|[PCF Builder](https://marketplace.visualstudio.com/items?itemName=danish-naglekar.pcf-builder)|Helps with initializing, building, and testing Power Apps Component Framework components|
[!INCLUDE[footer-include](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/create-custom-api-maker-portal.md b/powerapps-docs/developer/data-platform/create-custom-api-maker-portal.md
index f75699e282..c5619583fd 100644
--- a/powerapps-docs/developer/data-platform/create-custom-api-maker-portal.md
+++ b/powerapps-docs/developer/data-platform/create-custom-api-maker-portal.md
@@ -1,34 +1,33 @@
---
-title: "Create a custom API in Power Apps (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
+title: "Create a custom API in Power Apps (Microsoft Dataverse) | Microsoft Docs"
description: "Create a custom API definition using Power Apps (make.powerapps.com)"
-ms.custom: ""
-ms.date: 04/19/2022
-ms.reviewer: "jdaly"
+ms.date: 06/20/2025
+ms.reviewer: jdaly
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
---
# Create a custom API in Power Apps
-When creating a custom API, you must use a solution. If you are not familiar with solutions, first read [Create a solution](../../maker/data-platform/create-solution.md).
+When creating a custom API, you must use a solution. If you aren't familiar with solutions, first read [Create a solution](../../maker/data-platform/create-solution.md).
-Your solution must be associated with a publisher. The publisher will have a specific customization prefix associated with it. You must use a customization prefix when creating a custom API and this prefix should be the same used by the publisher of your solution. The instructions below will use the value `sample` as the customization prefix because it is the one set for the publisher.
+Your solution must be associated with a publisher. The publisher has a specific customization prefix associated with it. You must use a customization prefix when creating a custom API and this prefix should be the same used by the publisher of your solution. The following instructions use the value `sample` as the customization prefix because it's the one set for the publisher.
> [!IMPORTANT]
-> - There is now a better experience for creating custom API. You can use a designer within the Plug-in registration tool. More information: [Create a custom API using the plug-in registration tool](create-custom-api-prt.md)
-> - Many fields related to creating custom API cannot be changed after you create them. You should carefully plan the design of the custom API before you start. If you later decide that you need to change things after you create the custom API, you may need to delete the existing record and re-create the custom API. Review the information about the columns that cannot be changed here: [CustomAPI tables](custom-api-tables.md)
+> - There's now a better experience for creating custom API. You can use a designer within the Plug-in registration tool. More information: [Create a custom API using the plug-in registration tool](create-custom-api-prt.md)
+> - Many fields related to creating custom API can't be changed after you create them. You should carefully plan the design of the custom API before you start. If you later decide that you need to change things after you create the custom API, you might need to delete the existing record and re-create the custom API. Review the information about the columns that can't be changed here: [CustomAPI tables](custom-api-tables.md)
## Create a custom API record
-1. In your solution, click **New** > **More** > **Other** > **custom API** from the drop-down.
-1. Edit the fields to set the properties of your custom API. You must set values for the following fields. For more information see [Custom API table columns](custom-api-tables.md#custom-api-table-columns)
+1. In your solution, select **New** > **More** > **Other** > **custom API** from the drop-down.
+1. Edit the fields to set the properties of your custom API. You must set values for the following fields. For more information, see [Custom API table columns](custom-api-tables.md#custom-api-table-columns)
- You cannot set values for **Plug-in Type** unless you have already created the plug-in. You can change this later.
+ You can't set values for **Plug-in Type** before you create the plug-in. You can change this later.
-1. Click **Save**. Your form should look something like this:
+1. Select **Save**. Your form should look something like this:
:::image type="content" source="media/saved-customapi-form.png" alt-text="Saved Custom API form.":::
@@ -36,26 +35,26 @@ Your solution must be associated with a publisher. The publisher will have a spe
A custom API doesn't require parameters. Create as many parameters as you need to pass data needed for your logic.
-1. In your solution, click **New** > **More** > **Other** > **Custom API Request Parameter** from the drop-down.
-1. Edit the fields to set the properties of your custom API Request Parameter. For more information see [CustomAPIRequestParameter Table Columns](custom-api-tables.md#customapirequestparameter-table-columns)
+1. In your solution, select **New** > **More** > **Other** > **Custom API Request Parameter** from the drop-down.
+1. Edit the fields to set the properties of your custom API Request Parameter. For more information, see [CustomAPIRequestParameter Table Columns](custom-api-tables.md#customapirequestparameter-table-columns)
-1. Click **Save**. Your form should look something like this:
+1. Select **Save**. Your form should look something like this:
:::image type="content" source="media/customapi-request-parameter-form.png" alt-text="Example of a custom API Request Parameter Form.":::
## Create any Response Properties
-A custom API that represents an Action doesn't require response properties. A Function must have at least one. If the operation succeeds, it will return a success response. If it fails, it will return an error. You should define response properties for any data that your API will return.
+A custom API that represents an Action doesn't require response properties. A Function must have at least one. If the operation succeeds, it returns a success response. If it fails, it returns an error. You should define response properties for any data that your API returns.
-If there is only a single **Entity** or **EntityCollection** response property defined, the response will be of that type. If there are multiple properties, or one or more property of a simple type, the API will return a complex type where each response property will be a property of that complex type.
+If there's only a single **Entity** or **EntityCollection** response property defined, the response is of that type. If there are multiple properties, or one or more properties of a simple type, the API returns a complex type where each response property is a property of that complex type.
-For example, if your custom API Unique name is `sample_CustomAPIExample`, it will return a complex type named `sample_CustomAPIExampleResponse` with properties for each response property you define.
+For example, if your custom API Unique name is `sample_CustomAPIExample`, it returns a complex type named `sample_CustomAPIExampleResponse` with properties for each response property you define.
-1. In your solution, click **New** > **More** > **Other** > **Custom API Response Property** from the drop-down.
-1. Edit the fields to set the properties of your custom API Response Property. For more information see [CustomAPIResponseProperty Table Columns](customapiresponseproperty-table-columns.md)
+1. In your solution, select **New** > **More** > **Other** > **Custom API Response Property** from the drop-down.
+1. Edit the fields to set the properties of your custom API Response Property. For more information, see [CustomAPIResponseProperty Table Columns](customapiresponseproperty-table-columns.md)
-1. Click **Save**. Your form should look something like this:
+1. Select **Save**. Your form should look something like this:
:::image type="content" source="media/customapi-response-property-form.png" alt-text="Custom API Response Property Form.":::
@@ -78,26 +77,26 @@ Search the result to find the name of the custom API. For example, the API defin
## Test your custom API
-Now that you have created your custom API you can try it. Even if you haven't set a plug-in type to define the main operation, you can test it now to verify that you can call it correctly. Any response properties will return their default value, such as null. More information: [Invoking custom APIs](custom-api.md#invoking-custom-apis).
+After you create your custom API you can try it. Even if you haven't set a plug-in type to define the main operation, you can test it now to verify that you can call it correctly. Any response properties return their default value, such as null. More information: [Invoking custom APIs](custom-api.md#invoking-custom-apis).
## Update the custom API Plugin Type
For information about how to write a plug-in for a custom api, see [Write a Plug-in for your custom API](custom-api.md#write-a-plug-in-for-your-custom-api).
-After you have registered your assembly, you need to set the **Plugin Type** value for the custom API you created. This is a lookup property, so you just need to find the Plug-in Type that represents the type created when you registered the assembly.
+After you register your assembly, you need to set the **Plugin Type** value for the custom API you created. This is a lookup property, so you just need to find the Plug-in Type that represents the type created when you registered the assembly.
:::image type="content" source="media/set-custom-api-type.png" alt-text="Set the custom API Plugin Type Lookup.":::
-Once you have set the **Plugin Type**, you can test your custom API to verify the correct results are returned.
+Once you set the **Plugin Type**, you can test your custom API to verify the correct results are returned.
## Other ways to create custom APIs
The plugin registration tool provides a custom API designer. More information: [Create a custom API using the plug-in registration tool](create-custom-api-prt.md)
-You may have requirements to create a client application which will allow creation of custom APIs outside of the designer. Because the data for custom APIs is stored in tables, you can create them using code. More information: [Create a custom API with code](create-custom-api-with-code.md).
+You might have requirements to create a client application that allows creation of custom APIs outside of the designer. Because the data for custom APIs is stored in tables, you can create them using code. More information: [Create a custom API with code](create-custom-api-with-code.md).
-Your ALM process may be better served by creating custom APIs by editing solution files. More information: [Create a custom API with solution files](create-custom-api-solution.md).
+Your ALM process might be better served by creating custom APIs by editing solution files. More information: [Create a custom API with solution files](create-custom-api-solution.md).
### See also
diff --git a/powerapps-docs/developer/data-platform/create-custom-api-solution.md b/powerapps-docs/developer/data-platform/create-custom-api-solution.md
index b212ac6ab0..ab6977f86e 100644
--- a/powerapps-docs/developer/data-platform/create-custom-api-solution.md
+++ b/powerapps-docs/developer/data-platform/create-custom-api-solution.md
@@ -4,9 +4,9 @@ description: "You can write create custom APIs by editing solution files."
ms.date: 07/14/2023
ms.reviewer: jdaly
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -213,7 +213,7 @@ See the information in [CustomAPIResponseProperty Table Columns](customapirespon
1. Wait a few minutes while the solution import completes.
> [!NOTE]
- > It is possible you will see an error if another solution is being installed at the same time. More information: [The solution installation or removal failed due to the installation or removal of another solution at the same time](https://support.microsoft.com/help/4343228/the-solution-installation-or-removal-failed-due-to-the-installation-or)
+ > It is possible you will see an error if another solution is being installed at the same time. More information: [Concurrent solution operation failures](/troubleshoot/power-platform/dataverse/working-with-solutions/concurrent-solution-operation-failures)
## Step 8: Verify that the custom API was added to your solution
diff --git a/powerapps-docs/developer/data-platform/create-custom-api-with-code.md b/powerapps-docs/developer/data-platform/create-custom-api-with-code.md
index dfaa9ba9e8..81f9612ec6 100644
--- a/powerapps-docs/developer/data-platform/create-custom-api-with-code.md
+++ b/powerapps-docs/developer/data-platform/create-custom-api-with-code.md
@@ -1,9 +1,9 @@
---
-title: "Create a custom API with code (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "You can write code create custom APis." # 115-145 characters including spaces. This abstract displays in the search result.
-author: MicroSri
-ms.author: sriknair
-ms.date: 09/27/2022
+title: "Create a custom API with code (Microsoft Dataverse) | Microsoft Docs"
+description: "You can write code create custom APIs."
+author: MsSQLGirl
+ms.author: jukoesma
+ms.date: 06/20/2025
ms.topic: how-to
ms.subservice: dataverse-developer
ms.reviewer: jdaly
@@ -15,11 +15,11 @@ contributors:
# Create a custom API with code
> [!NOTE]
-> This is an advanced topic that assumes you have already read and understood these topics:
+> Creating an API with code is an advanced subject that assumes you read and understood these articles:
> - [Create and use custom APIs](custom-api.md)
> - [Create a custom API using the plug-in registration tool](create-custom-api-prt.md)
>
-> You should also understand how to create Microsoft Dataverse records, using either the Web API or SDK for .NET. For more information see:
+> You should also understand how to create Microsoft Dataverse records, using either the Web API or SDK for .NET. For more information, see:
> - [Create an entity record using the Web API](webapi/create-entity-web-api.md)
> - [Create entities using the SDK for .NET](org-service/entity-operations-create.md)
@@ -29,7 +29,7 @@ The tables in [Custom API tables](custom-api-tables.md) describe all the propert
#### [SDK for .NET](#tab/sdk)
-This code uses the with a early-bound programming style. You can also use . More information:
+This code uses the with an early-bound programming style. You can also use . More information:
- [Use CrmServiceClient constructors to connect to Dataverse](xrm-tooling/use-crmserviceclient-constructors-connect.md)
- [Late-bound and Early-bound programming using the SDK for .NET](org-service/early-bound-programming.md)
@@ -37,7 +37,7 @@ This code uses the with
This example shows the creation of a custom API action with one request parameter and one response property in a single operation. More information: [Create related entities in one operation](org-service/entity-operations-create.md#create-related-entities-in-one-operation)
-This custom api is created as part of a solution with the uniquename `CustomAPIExample` and is associated with a plug-in type with id = `00000000-0000-0000-0000-000000000001`.
+This custom API is created as part of a solution with the uniquename `CustomAPIExample` and is associated with a plug-in type with ID = `00000000-0000-0000-0000-000000000001`.
```csharp
string conn = $@"
@@ -111,7 +111,7 @@ Guid customAPIId = ((CreateResponse)service.Execute(createReq)).id;
This example shows the creation of a custom API action with one request parameter and one response property in a single operation. More information: [Create related table rows in one operation](webapi/create-entity-web-api.md#create-related-table-rows-in-one-operation)
-This custom api is created as part of a solution with the uniquename `CustomAPIExample` and is associated with a plug-in type with id = `00000000-0000-0000-0000-000000000001`.
+This custom API is created as part of a solution with the uniquename `CustomAPIExample` and is associated with a plug-in type with ID = `00000000-0000-0000-0000-000000000001`.
**Request:**
diff --git a/powerapps-docs/developer/data-platform/create-elastic-tables.md b/powerapps-docs/developer/data-platform/create-elastic-tables.md
index 52c233c1b5..d0a2355757 100644
--- a/powerapps-docs/developer/data-platform/create-elastic-tables.md
+++ b/powerapps-docs/developer/data-platform/create-elastic-tables.md
@@ -3,8 +3,8 @@ title: Create elastic tables using code
description: Learn how to create Dataverse elastic tables with code.
ms.topic: how-to
ms.date: 02/22/2024
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/custom-actions.md b/powerapps-docs/developer/data-platform/custom-actions.md
index 5f341cfb0b..446aaf943c 100644
--- a/powerapps-docs/developer/data-platform/custom-actions.md
+++ b/powerapps-docs/developer/data-platform/custom-actions.md
@@ -1,14 +1,12 @@
---
-title: "Create your own messages (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Learn about creating your own custom Microsoft Dataverse messages to be executed from your applications, and how these custom messages differ from using the custom API feature." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.custom: ""
-ms.date: 03/21/2022
-ms.reviewer: "jdaly"
-
-ms.topic: "article"
-author: MicroSri
+title: "Create your own messages (Microsoft Dataverse) | Microsoft Docs"
+description: "Learn about creating your own custom Microsoft Dataverse messages to be executed from your applications, and how these custom messages differ from using the custom API feature."
+ms.date: 06/20/2025
+ms.reviewer: jdaly
+ms.topic: article
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
---
@@ -17,7 +15,7 @@ search.audienceType:
[!INCLUDE[cc-terminology](includes/cc-terminology.md)]
-Microsoft Dataverse exposes APIs using *messages*. There are many out-of-box messages available for you to use. Custom messages are typically used to add new domain specific functionality to combine multiple message requests into a single request. For example, in a support call center, you may want to combine the `Create`, `Assign`, and `Update` messages into a single new `Escalate` message.
+Microsoft Dataverse exposes APIs using *messages*. There are many out-of-box messages available for you to use. Custom messages are typically used to add new domain specific functionality to combine multiple message requests into a single request. For example, in a support call center, you might want to combine the `Create`, `Assign`, and `Update` messages into a single new `Escalate` message.
There are now two ways to define custom messages:
@@ -36,17 +34,17 @@ The following table describes some of the different capabilities.
|Capability |Custom Process Action |Custom API |Description |
|---------|---------|---------|---------|
|Declarative logic with workflow |Yes|No|Workflow Actions can have logic defined without writing code using the Classic Workflow designer.
Custom APIs require a plug-in written in .NET to implement logic that is applied on the server.|
-|Require specific privilege|No|Yes|With custom API you can designate that a user must have a specific privilege to call the message. If the user doesn't have that privilege through their security roles or team membership, an error will be returned.|
-|Define main operation logic with code|Yes|Yes|With Custom Process Actions the main operation processes the Workflow definition which may include custom workflow activities. The code in these custom workflow activities is processed in the main operation together with any other logic in the workflow.
When the custom process action doesn't contain any custom workflow activities, developers frequently add logic to the Post-Operation stage in the event pipeline to define logic.
With custom API the message creator simply associates their plug-in type with the custom API to provide the main operation logic.
More information: [Event execution pipeline](event-framework.md#event-execution-pipeline)|
-|Block Extension by other plug-ins|Yes|Yes| With Custom Process actions set the [IsCustomProcessingStepAllowedForOtherPublishers](reference/entities/workflow.md#BKMK_IsCustomProcessingStepAllowedForOtherPublishers) managed property to `true` if you wish to allow 3rd party plug-ins to run when registered on the message for your custom process action. When set to `false`, only plug-ins from the same solution publisher will run when a plug-in step is registered for the message.
For custom API, set the [AllowedCustomProcessingStepType](reference/entities/customapi.md#BKMK_AllowedCustomProcessingStepType) to control whether any plug-ins steps may be registered, or if only asynchronous plug-ins may be registered. More information: [Select a Custom Processing Step Type](custom-api.md#select-a-custom-processing-step-type)|
-|Make message private|No|Yes|When you create a message using a Custom Process Action, it is exposed publicly in the endpoint for anyone else to discover and use. If someone else takes a dependency on the message you created, their code will be broken if you remove, rename, or change the input or output parameter signature in the future.
If you do not intend for your message to be used by anyone else, you can mark it as a private message. This will indicate that you do not support others using the message you create, and it will not be included in definitions of available functions or actions exposed by the Web API $metadata service definition. Classes for calling these messages will not be generated using code generation tools, but you will still be able to use it. More information: [When to make your custom API private](custom-api.md#when-to-make-your-custom-api-private)|
-|Localizable names and descriptions|No|Yes|While Custom Process Actions provide for a friendly name for the custom action and any input and output parameters it uses, these values are not localizable. With custom API you can provide localizable names and descriptions. These localized strings can then be bound to controls that provide a UI to use the message. More information: [Localized Label values](custom-api.md#localized-label-values)|
-|Create OData Function|No|Yes| The Dataverse Web API is an OData web service. OData provides for two types of operations: *Actions* & *Functions*.
- An **Action** is an operation that makes changes to data in the system. It is invoked using the Http POST method and parameters are passed in the body of the request.
- A **Function** is an operation that makes no change to data, for example an operation that simply retrieves data. It is invoked using an Http GET method and the parameters are passed in the URL of the request
Custom Process Actions are always Actions. Custom API provides the option to define custom Functions.
More information: [When to create a Function](custom-api.md#when-to-create-a-function)|
-|Create a global operation not bound to a table|Yes|Yes|Both provide the ability to define a global message not bound to a table.|
-|Bind an operation to a table|Yes|Yes|Both provide the ability to pass a reference to a specific table record by binding it to a table.|
-|Bind an operation to a table collection|No|Yes|Binding an operation to a table collection allows for another way to define the signature for the custom API. While this does not pass a collection of entities as an input parameter, it restricts the context of the operation to that type of table collection. Use this when your operation works with a collection of a specific type of table or your operation will return a collection of that type.|
-|Compose or modify a custom API by editing a solution|No|Yes|ISVs who build and maintain products that work with the Power Platform apply ALM practices that involve solutions. The data within a solution is commonly checked into a source code repository and checked out by a developer applying changes.
A Custom Process Action is defined by a XAML Windows Workflow Foundation document which is transported as part of a solution. However, creating new or editing existing workflow definitions outside of the workflow designer is not supported.
Custom API definitions are solution aware components included in a solution through a set of folders and XML documents. These files and the file structure enable transport the API from one environment to another. Because these are plain text files, changes can be made to them, or new APIs can be defined by working with these files. This method of defining custom APIs is supported. More information: [Create a custom API with solution files](create-custom-api-solution.md).|
-|Subject to 2 minute time limit|No|Yes|A plug-in that implements the main operation for a custom API is subject to the 2 minute time limit to complete execution.
A Custom Process Action is not technically limited to two minutes. If a step in the Workflow logic contains a custom workflow activity, *that part* will be limited to two minutes. But the entire workflow cannot run indefinitely. There are other limitations that will cause long-running Custom Process Actions to fail. More information: [Watch out for long running actions](workflow-custom-actions.md#watch-out-for-long-running-actions)|
+|Require specific privilege|No|Yes|With custom API, you can designate that a user must have a specific privilege to call the message. If the user doesn't have that privilege through their security roles or team membership, an error is returned.|
+|Define main operation logic with code|Yes|Yes|With Custom Process Actions, the main operation processes the Workflow definition that might include custom workflow activities. The code in these custom workflow activities is processed in the main operation together with any other logic in the workflow.
When the custom process action doesn't contain any custom workflow activities, developers frequently add logic to the Post-Operation stage in the event pipeline to define logic.
With custom API, the message creator simply associates their plug-in type with the custom API to provide the main operation logic.
More information: [Event execution pipeline](event-framework.md#event-execution-pipeline)|
+|Block Extension by other plug-ins|Yes|Yes| With Custom Process actions set the [IsCustomProcessingStepAllowedForOtherPublishers](reference/entities/workflow.md#BKMK_IsCustomProcessingStepAllowedForOtherPublishers) managed property to `true` if you wish to allow third party plug-ins to run when registered on the message for your custom process action. When set to `false`, only plug-ins from the same solution publisher runs when a plug-in step is registered for the message.
For custom API, set the [AllowedCustomProcessingStepType](reference/entities/customapi.md#BKMK_AllowedCustomProcessingStepType) to control whether any plug-ins steps might be registered, or if only asynchronous plug-ins might be registered. More information: [Select a Custom Processing Step Type](custom-api.md#select-a-custom-processing-step-type)|
+|Make message private|No|Yes|When you create a message using a Custom Process Action, it's exposed publicly in the endpoint for anyone else to discover and use. If someone else takes a dependency on the message you created, their code will be broken if you remove, rename, or change the input or output parameter signature in the future.
If you don't intend for your message to be used by anyone else, you can mark it as a private message. This indicates that you don't support others using the message you create, and it isn't included in definitions of available functions or actions exposed by the Web API $metadata service definition. Classes for calling these messages won't be generated using code generation tools, but you'll still be able to use it. More information: [When to make your custom API private](custom-api.md#when-to-make-your-custom-api-private)|
+|Localizable names and descriptions|No|Yes|While Custom Process Actions provide for a friendly name for the custom action and any input and output parameters it uses, these values aren't localizable. With custom API, you can provide localizable names and descriptions. These localized strings can then be bound to controls that provide a UI to use the message. More information: [Localized Label values](custom-api.md#localized-label-values)|
+|Create OData Function|No|Yes| The Dataverse Web API is an OData web service. OData provides for two types of operations: *Actions* & *Functions*.
- An **Action** is an operation that makes changes to data in the system. It's invoked using the Http POST method and parameters are passed in the body of the request.
- A **Function** is an operation that makes no change to data, for example, an operation that simply retrieves data. It's invoked using an Http GET method and the parameters are passed in the URL of the request
Custom Process Actions are always Actions. Custom API provides the option to define custom Functions.
More information: [When to create a Function](custom-api.md#when-to-create-a-function)|
+|Create a global operation not bound to a table|Yes|Yes|You can use both to define a global message not bound to a table.|
+|Bind an operation to a table|Yes|Yes|You can use both to pass a reference to a specific table record by binding it to a table.|
+|Bind an operation to a table collection|No|Yes|Binding an operation to a table collection allows for another way to define the signature for the custom API. While this doesn't pass a collection of entities as an input parameter, it restricts the context of the operation to that type of table collection. Use this when your operation works with a collection of a specific type of table or your operation returns a collection of that type.|
+|Compose or modify a custom API by editing a solution|No|Yes|ISVs who build and maintain products that work with the Power Platform apply ALM practices that involve solutions. The data within a solution is commonly checked into a source code repository and checked out by a developer applying changes.
A XAML Windows Workflow Foundation document contains the data that defines the Custom Process Action transported as part of a solution. However, creating new or editing existing workflow definitions outside of the workflow designer isn't supported.
Custom API definitions are solution aware components included in a solution through a set of folders and XML documents. These files and the file structure enable transport the API from one environment to another. Because these are plain text files, changes can be made to them, or new APIs can be defined by working with these files. This method of defining custom APIs is supported. More information: [Create a custom API with solution files](create-custom-api-solution.md).|
+|Subject to 2-minute time limit|No|Yes|A plug-in that implements the main operation for a custom API is subject to the 2-minute time limit to complete execution.
A Custom Process Action isn't technically limited to two minutes. If a step in the Workflow logic contains a custom workflow activity, *that part* is limited to two minutes. But the entire workflow can't run indefinitely. There are other limitations that cause long-running Custom Process Actions to fail. More information: [Watch out for long running actions](workflow-custom-actions.md#watch-out-for-long-running-actions)|
## Next Steps
diff --git a/powerapps-docs/developer/data-platform/custom-api-tables.md b/powerapps-docs/developer/data-platform/custom-api-tables.md
index 4cc487cca0..67bca44c6d 100644
--- a/powerapps-docs/developer/data-platform/custom-api-tables.md
+++ b/powerapps-docs/developer/data-platform/custom-api-tables.md
@@ -4,9 +4,9 @@ description: "Describes the tables and column values to use when creating custom
ms.date: 02/24/2023
ms.reviewer: jdaly
ms.topic: article
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/custom-api.md b/powerapps-docs/developer/data-platform/custom-api.md
index 91e1ca429c..3fb3c237ff 100644
--- a/powerapps-docs/developer/data-platform/custom-api.md
+++ b/powerapps-docs/developer/data-platform/custom-api.md
@@ -1,8 +1,8 @@
---
title: "Create and use custom APIs (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Custom API is a code-first way to define custom messages for Microsoft Dataverse" # 115-145 characters including spaces. This abstract displays in the search result.
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.date: 11/26/2024
ms.reviewer: jdaly
ms.topic: how-to
diff --git a/powerapps-docs/developer/data-platform/debug-plug-in.md b/powerapps-docs/developer/data-platform/debug-plug-in.md
index 4546c79c12..2806800292 100644
--- a/powerapps-docs/developer/data-platform/debug-plug-in.md
+++ b/powerapps-docs/developer/data-platform/debug-plug-in.md
@@ -1,12 +1,12 @@
---
-title: "Debug plug-ins (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Learn how to debug plug-ins using the Plug-in Registration tool." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 05/10/2022
-ms.reviewer: "pehecke"
+title: "Debug plug-ins (Microsoft Dataverse) | Microsoft Docs"
+description: "Learn how to debug plug-ins using the Plug-in Registration tool."
+ms.date: 06/20/2025
+ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -32,7 +32,7 @@ The process of writing, registering, and debugging a plug-in is:
1. **Verify expected trace logs are written**
1. **Debug the assembly as needed**
-Content in this topic coverts the steps **in bold** above and supports the following tutorials:
+Content in this article coverts the previous steps **in bold** and supports the following tutorials:
- [Tutorial: Write and register a plug-in](tutorial-write-plug-in.md)
- [Tutorial: Debug a plug-in](tutorial-debug-plug-in.md)
@@ -40,20 +40,20 @@ Content in this topic coverts the steps **in bold** above and supports the follo
## Test your assembly
-The simplest way to test your assembly may simply be to manually perform the operation using the app. But you should also be aware that events that cause plug-ins to execute can be initiated in multiple ways, such as a table created from a workflow, or from the web services.
+The simplest way to test your assembly might be to manually perform the operation using the app. But you should also know that events that cause plug-ins to execute can be initiated in multiple ways, such as a table created from a workflow, or from the web services.
-Execution context information may be different depending on how the action is performed. When writing your plug-in, make sure you practice defensive programming practices and don't assume that every value you expect will always be there.
+Execution context information might be different depending on how the action is performed. When writing your plug-in, make sure you practice defensive programming practices and don't assume that every value you expect is always there.
-You may want to write a program that will automate performing the operations that will cause your plug-in to fire and include a number of possible variations.
+You might want to write a program that automates performing the operations that cause your plug-in to fire and include many possible variations.
-If you want to use a test automation framework, you will find that the community has created some tools for this. More information: [Testing tools for server-side development](testing-tools-server.md)
+If you want to use a test automation framework, you'll find that the community created some tools for automated testing. More information: [Testing tools for server-side development](testing-tools-server.md)
## Use Tracing
As described in [Tracing service](write-plug-in.md#tracing-service), you can write messages to the [PluginTraceLog Table](reference/entities/plugintracelog.md) within the code of your plug-in by using the . method.
-Before you will be able to use this service, you must enable tracing in your Microsoft Dataverse environment. The process is described in [View trace logs](tutorial-write-plug-in.md#view-trace-logs).
+Before you'll be able to use this service, you must enable tracing in your Microsoft Dataverse environment. The process is described in [View trace logs](tutorial-write-plug-in.md#view-trace-logs).
> [!NOTE]
> Trace logging takes up organization storage space especially when many traces and exceptions are generated. You should only turn trace logging on for debugging and troubleshooting, and turn it off after your investigation is completed.
@@ -62,7 +62,7 @@ While debugging, you can easily query the trace logs for a given plug-in class u
`GET /api/data/v9.0/plugintracelogs?$select=messageblock&$filter=startswith(typename,'BasicPlugin.FollowUpPlugin')`
-The JSON results will be returned to your browser like so:
+The JSON results are returned to your browser like so:
```json
@@ -76,28 +76,28 @@ The JSON results will be returned to your browser like so:
```
> [!TIP]
-> This works best if you install a browser plug-in that will format the returned JSON. Or you may want to use an API client like Postman or [Insomnia](webapi/insomnia.md), or you may want to use [VS Code with PowerShell](webapi/quick-start-ps.md).
+> This works best if you install a browser extension that formats the returned JSON. Or you might want to use an API client like Postman or [Insomnia](webapi/insomnia.md), or you might want to use [VS Code with PowerShell](webapi/quick-start-ps.md).
>
-> You may prefer to use the [XrmToolbox Plugin Trace Viewer](https://www.xrmtoolbox.com/plugins/Cinteros.XrmToolBox.PluginTraceViewer/). This community tool is not supported by Microsoft. If you have questions pertaining to this tool, contact the publisher.
+> You might prefer to use the [XrmToolbox Plugin Trace Viewer](https://www.xrmtoolbox.com/plugins/Cinteros.XrmToolBox.PluginTraceViewer/). This community tool isn't supported by Microsoft. If you have questions pertaining to this tool, contact the publisher.
Tracing messages can also be found in the log file that can be downloaded when a synchronous plug-in or custom workflow assembly throws an error that results in an error dialog that is displayed to the user. The user can select the **Download Log File** button to view the log containing details of the exception and the trace output.
For asynchronous registered plug-ins and workflow assemblies that return an exception, the tracing information is shown in the details area of the **System Job** form in the web application.
> [!NOTE]
-> If your custom code executes within a database transaction, and an exception occurs that causes a transaction rollback, all table data changes by your code will be undone. However, the `PluginTraceLog` table records will remain after the rollback completes.
+> If your custom code executes within a database transaction, and an exception occurs that causes a transaction rollback, all table data changes by your code are undone. However, the `PluginTraceLog` table records will remain after the rollback completes.
## Use Plug-in profiler
-Plug-in profiler is a solution that you can install on your environment that enables you to capture the execution context of a plug-in and then use that data to re-play the event within Visual Studio while debugging.
+Plug-in profiler is a solution that you can install on your environment that enables you to capture the execution context of a plug-in and then use that data to replay the event within Visual Studio while debugging.
You can find instructions to install and use Plug-in profiler in the [Tutorial: Debug a plug-in](tutorial-debug-plug-in.md). See [Install plug-in profiler](tutorial-debug-plug-in.md#install-plug-in-profiler) and [Debug your plug-in](tutorial-debug-plug-in.md#debug-your-plug-in)
### View Plug-in Profile data
-After you have installed the Plug-in profiler and captured some profiles, you can view the event context and replay data that is used when you debug. Viewing this data can help you understand the execution context data that your plug-in can use.
+After you install the Plug-in profiler and captured some profiles, you can view the event context and replay data that is used when you debug. Viewing this data can help you understand the execution context data that your plug-in can use.
-You can view this data using the Plug-in Registration tool by selecting the **View Plug-in Profile** command. This will open the Plugin Profile dialog
+You can view this data using the Plug-in Registration tool by selecting the **View Plug-in Profile** command. This opens the Plugin Profile dialog

@@ -107,7 +107,7 @@ Select the  icon and in the **Se
And then select **View** in the **Plugin Profile** dialog.
-This will download an open an XML file with the profile information. The `Context` element represents the execution context passed to the plug-in.
+This downloads and opens an XML file with the profile information. The `Context` element represents the execution context passed to the plug-in.

diff --git a/powerapps-docs/developer/data-platform/define-alternate-keys-entity.md b/powerapps-docs/developer/data-platform/define-alternate-keys-entity.md
index abe2c2174a..8c85dcdeda 100644
--- a/powerapps-docs/developer/data-platform/define-alternate-keys-entity.md
+++ b/powerapps-docs/developer/data-platform/define-alternate-keys-entity.md
@@ -4,9 +4,9 @@ description: "The topic explains about how to create alternate keys for a table.
ms.date: 09/23/2024
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
---
diff --git a/powerapps-docs/developer/data-platform/deletemultiple.md b/powerapps-docs/developer/data-platform/deletemultiple.md
deleted file mode 100644
index 2f489fa37b..0000000000
--- a/powerapps-docs/developer/data-platform/deletemultiple.md
+++ /dev/null
@@ -1,134 +0,0 @@
----
-title: Use DeleteMultiple (preview)
-description: Learn how to use Delete to delete multiple rows of data in a Microsoft Dataverse elastic table.
-ms.date: 09/03/2024
-author: pnghub
-ms.author: gned
-ms.reviewer: jdaly
-ms.topic: how-to
-ms.subservice: dataverse-developer
-search.audienceType:
- - developer
-contributors:
- - JimDaly
- - sumantb-msft
-ms.custom: bap-template
----
-
-# Use DeleteMultiple (preview)
-
-[!INCLUDE [cc-beta-prerelease-disclaimer](../../includes/cc-beta-prerelease-disclaimer.md)]
-
-> [!IMPORTANT]
-> This is a preview feature.
->
-> [!INCLUDE [cc-preview-features-definition](../../includes/cc-preview-features-definition.md)]
-
-### DeleteMultiple
-
-Delete multiple rows of data in elastic tables with a single request.
-
-##### [SDK for .NET](#tab/sdk)
-
-You must use the [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest) because the [SDK for .NET](org-service/overview.md) doesn't have a `DeleteMultipleRequest` class. Learn how to [use messages with the SDK for .NET](org-service/use-messages.md).
-
-The following `DeleteMultipleExample` static method uses the `DeleteMultiple` message with the [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest) to delete multiple rows from the `contoso_SensorData` elastic table using the alternate key to include the `partitionid` to uniquely identify the rows.
-
-```csharp
-public static void DeleteMultipleExample(IOrganizationService service)
-{
- string tableLogicalName = "contoso_sensordata";
-
- List entityReferences = new() {
- {
- new EntityReference(logicalName: tableLogicalName,
- keyAttributeCollection: new KeyAttributeCollection
- {
- { "contoso_sensordataid", "3f56361a-b210-4a74-8708-3c664038fa41" },
- { "partitionid", "deviceid-001" }
- })
- },
- { new EntityReference(logicalName: tableLogicalName,
- keyAttributeCollection: new KeyAttributeCollection
- {
- { "contoso_sensordataid", "e682715b-1bba-415e-b2bc-de9327308423" },
- { "partitionid", "deviceid-002" }
- })
- }
- };
-
- OrganizationRequest request = new(requestName:"DeleteMultiple")
- {
- Parameters = {
- {"Targets", new EntityReferenceCollection(entityReferences)}
- }
- };
-
- service.Execute(request);
-}
-```
-
-##### [Web API](#tab/webapi)
-
-The following example shows how to use the [DeleteMultiple action](xref:Microsoft.Dynamics.CRM.DeleteMultiple) to delete multiple rows from the `contoso_SensorData` elastic table including the `partitionid` to uniquely identify the rows.
-
-**Request:**
-
-```http
-POST [Organization Uri]/api/data/v9.2/contoso_sensordatas/Microsoft.Dynamics.CRM.DeleteMultiple
-OData-MaxVersion: 4.0
-OData-Version: 4.0
-If-None-Match: null
-Accept: application/json
-Content-Type: application/json; charset=utf-8
-Content-Length: 603
-
-{
- "Targets": [
- {
- "@odata.type": "Microsoft.Dynamics.CRM.contoso_sensordata",
- "contoso_sensordataid": "6114ca58-0928-ee11-9965-6045bd5cd155",
- "partitionid": "Device-ABC-1234"
- },
- {
- "@odata.type": "Microsoft.Dynamics.CRM.contoso_sensordata",
- "contoso_sensordataid": "6214ca58-0928-ee11-9965-6045bd5cd155",
- "partitionid": "Device-ABC-1234"
- },
- {
- "@odata.type": "Microsoft.Dynamics.CRM.contoso_sensordata",
- "contoso_sensordataid": "6314ca58-0928-ee11-9965-6045bd5cd155",
- "partitionid": "Device-ABC-1234"
- }
- ]
-}
-```
-
-**Response:**
-
-```http
-HTTP/1.1 204 NoContent
-OData-Version: 4.0
-```
-
----
-
-## Availability
-
-`DeleteMultiple` is supported only for elastic tables. Elastic tables don't support [table relationship cascading behavior](configure-entity-relationship-cascading-behavior.md), which can result in unpredictable execution times for delete operations. If you use `DeleteMultiple` on a standard table, you get the error: `DeleteMultiple has not yet been implemented.`
-
-
-## Examples
-
-You can find sample code on GitHub in [github.com/microsoft/PowerApps-Samples](https://github.com/microsoft/PowerApps-Samples):
-
-- [Elastic table sample code](elastic-table-samples.md)
-- Within [Sample: SDK for .NET Use bulk operations](org-service/samples/create-update-multiple.md) or [Sample: Web API Use bulk operations](webapi/samples/create-update-multiple.md), change the `Settings.cs` config file and choose the `UseElastic` option.
-
-### See also
-
-[Use bulk operation messages](bulk-operations.md)
-[Elastic tables](elastic-tables.md)
-[Elastic table sample code](elastic-table-samples.md)
-[Sample: SDK for .NET Use bulk operations](org-service/samples/create-update-multiple.md)
-[Sample: Web API Use bulk operations](webapi/samples/create-update-multiple.md)
\ No newline at end of file
diff --git a/powerapps-docs/developer/data-platform/elastic-table-samples.md b/powerapps-docs/developer/data-platform/elastic-table-samples.md
index f440bee56e..aa5d17233e 100644
--- a/powerapps-docs/developer/data-platform/elastic-table-samples.md
+++ b/powerapps-docs/developer/data-platform/elastic-table-samples.md
@@ -3,8 +3,8 @@ title: Elastic table sample code
description: Learn about the sample code that is available on GitHub for Dataverse elastic table operations and the ExecuteCosmosSqlQuery message.
ms.topic: article
ms.date: 12/04/2023
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
contributors:
- sumantb-msft
@@ -23,6 +23,9 @@ The following sample applications on GitHub show how to use code to work with el
- Use the `ExecuteCosmosSqlQuery` message.
- Use the `DeleteMultiple` message with the [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest) to delete elastic table records in bulk.
+> [!NOTE]
+> The [DeleteMultipleRequest Class](/dotnet/api/microsoft.xrm.sdk.messages.deletemultiplerequest) is now available to use.
+
> [!div class="nextstepaction"]
> [SDK for .NET elastic tables sample](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/orgsvc/CSharp-NETCore/ElasticTableOperations/README.md)
@@ -33,7 +36,7 @@ The following sample applications on GitHub show how to use code to work with el
- Use the [CreateMultiple action](xref:Microsoft.Dynamics.CRM.CreateMultiple) to create elastic table records.
- Use the [UpdateMultiple action](xref:Microsoft.Dynamics.CRM.UpdateMultiple) to set JSON data for a column.
- Use the [ExecuteCosmosSqlQuery function](xref:Microsoft.Dynamics.CRM.ExecuteCosmosSqlQuery) to query JSON data in columns.
-- Use the `DeleteMultiple` action to delete elastic table records in bulk.
+- Use the [DeleteMultiple action](xref:Microsoft.Dynamics.CRM.DeleteMultiple) to delete elastic table records in bulk.
> [!div class="nextstepaction"]
> [Web API elastic tables sample](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/webapi/CSharp-NETx/ElasticTableOperations/README.md)
diff --git a/powerapps-docs/developer/data-platform/elastic-tables.md b/powerapps-docs/developer/data-platform/elastic-tables.md
index bf7ff15dc4..0b7b3e7a52 100644
--- a/powerapps-docs/developer/data-platform/elastic-tables.md
+++ b/powerapps-docs/developer/data-platform/elastic-tables.md
@@ -3,8 +3,8 @@ title: Elastic tables for developers
description: This article provides information to developers about Dataverse elastic tables and how to use elastic tables using code.
ms.topic: article
ms.date: 12/04/2023
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
contributors:
- sumantb-msft
diff --git a/powerapps-docs/developer/data-platform/entity-attribute-metadata.md b/powerapps-docs/developer/data-platform/entity-attribute-metadata.md
index 438a77f699..9b76df0323 100644
--- a/powerapps-docs/developer/data-platform/entity-attribute-metadata.md
+++ b/powerapps-docs/developer/data-platform/entity-attribute-metadata.md
@@ -118,15 +118,18 @@ Because `RequiredLevel` is a managed property, as a publisher of a managed solut
More information: [Managed Properties](/power-platform/alm/managed-properties-alm)
-## Formula, rollup, and calculated columns
+## Specialized columns
Formula, rollup, and calculated columns free the user from having to manually perform calculations and focus on their work. System administrators can define a column to contain the value of many common calculations without having to work with a developer. Developers can also use the platform capabilities to perform these calculations rather than within their own code.
+A prompt column is an AI-powered data type in Microsoft Dataverse that enables you to define natural language prompts tied to other columns in your table.
+
More information:
- [Define rollup columns that aggregate values](../../maker/data-platform/define-rollup-fields.md)
- [Define calculated columns to automate calculations](../../maker/data-platform/define-calculated-fields.md)
-- [Formula, rollup, and calculated columns](calculated-rollup-attributes.md)
+- [Prompt columns (preview)](../../maker/data-platform/prompt-column.md)
+- [Specialized columns using code](specialized-columns.md)
## Column format
diff --git a/powerapps-docs/developer/data-platform/fetchxml/aggregate-data.md b/powerapps-docs/developer/data-platform/fetchxml/aggregate-data.md
index c479d13e35..22feb3c97f 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/aggregate-data.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/aggregate-data.md
@@ -4,9 +4,9 @@ description: Learn how to use FetchXml to retrieve aggregated data from Microsof
ms.date: 02/29/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/fetchxml/filter-rows.md b/powerapps-docs/developer/data-platform/fetchxml/filter-rows.md
index b21b635c9e..205c48c560 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/filter-rows.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/filter-rows.md
@@ -4,9 +4,9 @@ description: Learn how to use FetchXml to filter rows when you retrieve data fro
ms.date: 04/01/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/fetchxml/join-tables.md b/powerapps-docs/developer/data-platform/fetchxml/join-tables.md
index ec1234e9e9..b4d6ba311f 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/join-tables.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/join-tables.md
@@ -4,9 +4,9 @@ description: Learn how to use FetchXml to join tables when you retrieve data fro
ms.date: 03/22/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/fetchxml/optimize-performance.md b/powerapps-docs/developer/data-platform/fetchxml/optimize-performance.md
index 740cec91cb..a937f089fa 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/optimize-performance.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/optimize-performance.md
@@ -4,9 +4,9 @@ description: Learn how to optimize performance when you retrieve data from Micro
ms.date: 01/06/2025
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/fetchxml/order-rows.md b/powerapps-docs/developer/data-platform/fetchxml/order-rows.md
index 649ca5d9ab..d250f8cbb1 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/order-rows.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/order-rows.md
@@ -4,9 +4,9 @@ description: Learn how to use FetchXml to order rows when you retrieve data from
ms.date: 03/06/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/all-attributes.md b/powerapps-docs/developer/data-platform/fetchxml/reference/all-attributes.md
index be7a05731a..b32228e8c6 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/all-attributes.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/all-attributes.md
@@ -1,8 +1,8 @@
---
title: all-attributes element
description: Use this element to specify that all columns in the containing entity or link-entity element should be returned.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/attribute.md b/powerapps-docs/developer/data-platform/fetchxml/reference/attribute.md
index 30f439abf3..dfcda04634 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/attribute.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/attribute.md
@@ -1,8 +1,8 @@
---
title: attribute element
-description: Use this element to specify which columns in the containing entity or link-entity element should be returned.
-author: pnghub
-ms.author: gned
+description: Use this element to specify which columns in the containing entity or link-entity element to return.
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 07/12/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/condition.md b/powerapps-docs/developer/data-platform/fetchxml/reference/condition.md
index f7a5e0ddb2..d13928f961 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/condition.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/condition.md
@@ -1,8 +1,8 @@
---
title: condition element
description: Use this element to specify a condition to be evaluated as part of a filter for each row in the containing entity or link-entity elements to be returned.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/entity.md b/powerapps-docs/developer/data-platform/fetchxml/reference/entity.md
index 1eb049e0a3..735eaca495 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/entity.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/entity.md
@@ -1,8 +1,8 @@
---
title: entity element
description: Use this element to specify the entity of the query.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/fetch.md b/powerapps-docs/developer/data-platform/fetchxml/reference/fetch.md
index f19b928f61..2c5b1f971d 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/fetch.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/fetch.md
@@ -1,8 +1,8 @@
---
title: fetch element
description: Use this element as the root element in the query.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/filter.md b/powerapps-docs/developer/data-platform/fetchxml/reference/filter.md
index 28e0914a39..cee06598b8 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/filter.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/filter.md
@@ -1,8 +1,8 @@
---
title: filter element
description: Use this element to specify a set of conditions to be evaluated for each row of the containing entity or link-entity element that determines if the row is returned.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/index.md b/powerapps-docs/developer/data-platform/fetchxml/reference/index.md
index e012e83d7d..a842732a27 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/index.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/index.md
@@ -1,8 +1,8 @@
---
title: FetchXml reference
description: The articles in this section describe elements you use to compose a query using FetchXml. FetchXml is a proprietary XML based language that is used in Microsoft Dataverse to retrieve data.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/link-entity.md b/powerapps-docs/developer/data-platform/fetchxml/reference/link-entity.md
index 4b7ed8667a..ba5777f1f4 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/link-entity.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/link-entity.md
@@ -1,8 +1,8 @@
---
title: link-entity element
description: Use this element to join tables with the containing entity or link-entity element.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/operators.md b/powerapps-docs/developer/data-platform/fetchxml/reference/operators.md
index bc65a10eed..4ae8c4fe14 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/operators.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/operators.md
@@ -1,8 +1,8 @@
---
title: condition operator values
description: Use these values in a condition element operator attribute to specify how to evaluate the condition.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 03/08/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/order.md b/powerapps-docs/developer/data-platform/fetchxml/reference/order.md
index 10848c5a35..d090d43692 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/order.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/order.md
@@ -1,8 +1,8 @@
---
title: order element
description: Use this element to specify the sort order of rows from the containing entity or link-entity element.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/reference/value.md b/powerapps-docs/developer/data-platform/fetchxml/reference/value.md
index 735f25b5fc..ee2ef2181e 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/reference/value.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/reference/value.md
@@ -1,8 +1,8 @@
---
title: value element
description: Use this element to specify the values to evaluate with a condition.
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.date: 02/29/2024
ms.topic: reference
diff --git a/powerapps-docs/developer/data-platform/fetchxml/retrieve-data.md b/powerapps-docs/developer/data-platform/fetchxml/retrieve-data.md
index 5db87dde29..0a87f80a42 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/retrieve-data.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/retrieve-data.md
@@ -4,9 +4,9 @@ description: Learn how to use the Dataverse SDK for .NET or Web API to send a re
ms.date: 01/26/2025
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/fetchxml/sample.md b/powerapps-docs/developer/data-platform/fetchxml/sample.md
index 5d28f349f2..336f8192dd 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/sample.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/sample.md
@@ -4,9 +4,9 @@ description: Try using FetchXML to retrieve Dataverse data using this sample cod
ms.date: 12/04/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/fetchxml/select-columns.md b/powerapps-docs/developer/data-platform/fetchxml/select-columns.md
index 67efeaca93..270f08f1e1 100644
--- a/powerapps-docs/developer/data-platform/fetchxml/select-columns.md
+++ b/powerapps-docs/developer/data-platform/fetchxml/select-columns.md
@@ -4,9 +4,9 @@ description: Learn how to use FetchXml to select columns when you retrieve data
ms.date: 02/29/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/field-security-entities.md b/powerapps-docs/developer/data-platform/field-security-entities.md
deleted file mode 100644
index b7d5a58638..0000000000
--- a/powerapps-docs/developer/data-platform/field-security-entities.md
+++ /dev/null
@@ -1,93 +0,0 @@
----
-title: "Field security entities (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Learn about using field security entities to apply field-level security, which restricts field access to specified users and teams." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.custom: ""
-ms.date: 03/27/2021
-ms.reviewer: "pehecke"
-
-ms.topic: how-to
-author: "paulliew" # GitHub ID
-ms.subservice: dataverse-developer
-ms.author: "jdaly" # MSFT alias of Microsoft employees only
-search.audienceType:
- - developer
----
-# Field security tables
-
-[!INCLUDE[cc-terminology](includes/cc-terminology.md)]
-
-You use field security tables to apply field-level security, which restricts field access to specified users and teams. The scope of field-level security is global, which means that it applies to all records within the organization, regardless of the business unit hierarchical level to which the record or the user belongs. Field security works in all Microsoft Dataverse clients, including the Web client, Dynamics 365 for Outlook, and Dynamics. It applies to all components, such as the Dataverse web services, reports, search, offline, filtered views, auditing, and duplicate detection. For this release, field security can be applied to both custom fields and many out-of-box (OOB) fields.
-
-> [!IMPORTANT]
-> Field-level security profiles prevent unintended users from getting access to Dataverse data based on the profile definitions. If the SQL Server ACLs are misconfigured, or if there is a SQL injection issue, adversaries can get direct access to data in SQL Server thereby bypassing field level security restrictions. For more information, see [Overview of Web Application Security Threats](/previous-versions/f13d73y6(v=vs.140)).
-
-
-
-## Set up and use field security
- To use field security you must do the following:
-
-1. Create a field security profile record.
-
-2. Add users or teams to the profile.
-
-3. Find a columns that can be secured at the field level.
-
-4. Secure the column, either when you create the column or by updating the column definition.
-
-5. Publish the customizations.
-
-6. Create a field permission record that defines what access (create, update, read) the profile will have for the custom column.
-
- For sample code about how to perform these steps, see [Sample: Enable Field Security For An Entity](org-service/samples/enable-field-security-entity.md).
-
- Use the following field permission columns to set whether the specified field security profile can create, read, or update a column.
- You can set or compare the value for these columns by using the `field_security_permission_type` global choice:
-
-- `FieldPermission`.`CanCreate`
-
-- `FieldPermission`.`CanRead`
-
-- `FieldPermission`.`CanUpdate`
-
-> [!IMPORTANT]
-> If low privilege users are given Read access to the field security profile entity, they can see what profiles other users have and find other users with access to secured attributes they are interested in. They can then use social engineering techniques to get assigned a profile with access to those secured attributes.
-
-
-
-## Which attributes can be secured?
- To see which columns can be secured, you can query the table definition for the following properties:
-
--
-
--
-
--
-
- There are a few additional rules that apply to certain attribute data types:
-
-- Boolean attributes can be secured for create and update operations but not for read.
-
-- Option set attributes can be secured for create, update, and read when a default value is unspecified.
-
- There are thousands of columns that can be secured, so there are two easier ways to look for this information. To view the table definition for your organization, install the Table definition browser solution described in [Browse table definition in your environment](browse-your-metadata.md). You can also browse the reference documentation for entities in the [Table/entity reference](reference/about-entity-reference.md).
-
-
-## Share secured fields
- You can share secured fields much as you can share records. To do this, you create, update, or delete a `PrincipalObjectAttributeAccess` (field sharing) record, where you specify the user or team, the entity, and the permissions.
-
- The following table lists the corresponding methods for securing a field compared to securing a record.
-
-|Record sharing|Field access sharing|
-|--------------------|--------------------------|
-|Use the message to grant record access for a user or team.|Use the message or the . method to grant secured field access for a user or team.|
-|Use the message to update record access for a user or team.|Use the message or the . method to update secured field access for a user or team.|
-|Use the message to remove record access for a user or team.|Use the message or the . method to remove secured field access for a user or team.|
-
-### See also
- [Security and data access](security-model.md)
- [FieldSecurityProfile Entity](reference/entities/fieldsecurityprofile.md)
- [FieldPermission Entity](reference/entities/fieldpermission.md)
- [PrincipalObjectAttributeAccess Entity](reference/entities/principalobjectattributeaccess.md)
-
-
-[!INCLUDE[footer-include](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/handle-exceptions.md b/powerapps-docs/developer/data-platform/handle-exceptions.md
index 6412368438..4497a3e008 100644
--- a/powerapps-docs/developer/data-platform/handle-exceptions.md
+++ b/powerapps-docs/developer/data-platform/handle-exceptions.md
@@ -2,8 +2,8 @@
title: "Handle exceptions in a plug-in (Microsoft Dataverse) | Microsoft Docs"
description: "Understand system behavior when a plug-in passes an exception back to the caller."
ms.date: 02/05/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: "article"
ms.subservice: dataverse-developer
diff --git a/powerapps-docs/developer/data-platform/impersonate-a-user.md b/powerapps-docs/developer/data-platform/impersonate-a-user.md
index 8dea73b930..243dc3b43d 100644
--- a/powerapps-docs/developer/data-platform/impersonate-a-user.md
+++ b/powerapps-docs/developer/data-platform/impersonate-a-user.md
@@ -2,8 +2,8 @@
title: "Impersonate a user (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Learn how to write plug-in code to act on behalf of a specific user."
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: "article"
ms.subservice: dataverse-developer
diff --git a/powerapps-docs/developer/data-platform/impersonate-another-user.md b/powerapps-docs/developer/data-platform/impersonate-another-user.md
index c5d9e9375f..44b666b0db 100644
--- a/powerapps-docs/developer/data-platform/impersonate-another-user.md
+++ b/powerapps-docs/developer/data-platform/impersonate-another-user.md
@@ -2,11 +2,11 @@
title: "Impersonate another user (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Use impersonation to execute business logic on behalf of another Microsoft Dataverse user." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 03/22/2022
-ms.reviewer: "pehecke"
-ms.topic: "article"
-author: MicroSri
+ms.reviewer: pehecke
+ms.topic: article
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/includes/data-service-error-codes.md b/powerapps-docs/developer/data-platform/includes/data-service-error-codes.md
index f656cd8b8e..11814cbf76 100644
--- a/powerapps-docs/developer/data-platform/includes/data-service-error-codes.md
+++ b/powerapps-docs/developer/data-platform/includes/data-service-error-codes.md
@@ -16,7 +16,7 @@
|`0x8006041c`
`-2147089380`|Name: **ActionStepInvalidProcessAction**
Message: `ActionStep {0} references invalid Process Action {1}.`|
|`0x8006040d`
`-2147089395`|Name: **ActionStepInvalidProcessid**
Message: `ActionStep references invalid Process Id.`|
|`0x8006040c`
`-2147089396`|Name: **ActionStepInvalidStageid**
Message: `ActionStep references invalid Stage Id.`|
-|`0x80060382`
`-2147089534`|Name: **ActionSupportNotEnabled**
Message: ` Business Processes containing an Action Step cannot be exported because Action Step support is still a Public Preview feature and it is not currently enabled for this organization.`|
+|`0x80060382`
`-2147089534`|Name: **ActionSupportNotEnabled**
Message: `Business Processes containing an Action Step cannot be exported because Action Step support is still a Public Preview feature and it is not currently enabled for this organization.`|
|`0x80061001`
`-2147086335`|Name: **ActivePropertyValidationFailed**
Message: `You can't create a property instance for an inactive property.`|
|`0x80040526`
`-2147220186`|Name: **ActiveQueueItemAlreadyExists**
Message: `An active queue item already exists for the given object. Cannot create more than one active queue item for this object.`|
|`0x8004F871`
`-2147157903`|Name: **ActiveSlaCannotEdit**
Message: `You can't edit an active SLA. Deactivate the SLA, and then try editing it.`|
@@ -74,6 +74,7 @@
|`0x80048547`
`-2147187385`|Name: **AppEntityLimitExceeded**
Message: `This operation failed since it exceeded the maximum entity limit of {0} total entities for the app {1} set by its owning publisher {2}.`|
|`0x80048552`
`-2147187374`|Name: **AppEntityLimitExceededInSiteMap**
Message: `You cannot save or publish the sitemap. The publisher ({0}) of the app ({1}) allows only up to {2} additional entities to be added.`|
|`0x80095FFC`
`-2146869252`|Name: **ApplicationBasedAccessControlError**
Message: `Access to Dataverse API is restricted for this application Id : '{0}'. Please contact your administrator for more information.`|
+|`0x80090922`
`-2146891486`|Name: **ApplicationBasedAccessControlUserDoesNotHaveMappedRolesError**
Message: `User with SystemUserId = {0} and AccessResultType = {1} has not been explictly or implictly assigned any roles that are mapped to ApplicationId = {2}. Please assign the appropriate roles to grant access and try again.`|
|`0x8005F231`
`-2147093967`|Name: **ApplicationMetadataConverterFailed**
Message: `Sorry, something went wrong. Please try again, or restart the app.`|
|`0x8005F233`
`-2147093965`|Name: **ApplicationMetadatadaCreateFailed**
Message: `Sorry, something went wrong. Please try again, or restart the app.`|
|`0x8005F232`
`-2147093966`|Name: **ApplicationMetadatadaNullData**
Message: `Sorry, something went wrong. Please try again, or restart the app.`|
@@ -236,84 +237,84 @@
|`0x80043b03`
`-2147206397`|Name: **BaseUnitNotDeletable**
Message: `The base unit of a schedule cannot be deleted.`|
|`0x80043b17`
`-2147206377`|Name: **BaseUnitNotNull**
Message: `Do not use a base unit as the value for a primary unit. This value should always be null.`|
|`0x80043810`
`-2147207152`|Name: **BaseUomNameNotSpecified**
Message: `baseuomname not specified`|
-|`0x8004B540`
`-2147175104`|Name: **BDK_E_ADDRESS_VALIDATION_FAILURE**
Message: `{0} `|
-|`0x8004B541`
`-2147175103`|Name: **BDK_E_AGREEMENT_ALREADY_SIGNED**
Message: `{0} `|
-|`0x8004B542`
`-2147175102`|Name: **BDK_E_AUTHORIZATION_FAILED**
Message: `{0} `|
-|`0x8004B543`
`-2147175101`|Name: **BDK_E_AVS_FAILED**
Message: `{0} `|
-|`0x8004B544`
`-2147175100`|Name: **BDK_E_BAD_CITYNAME_LENGTH**
Message: `{0} `|
-|`0x8004B545`
`-2147175099`|Name: **BDK_E_BAD_STATECODE_LENGTH**
Message: `{0} `|
-|`0x8004B546`
`-2147175098`|Name: **BDK_E_BAD_ZIPCODE_LENGTH**
Message: `{0} `|
-|`0x8004B547`
`-2147175097`|Name: **BDK_E_BADXML**
Message: `{0} `|
-|`0x8004B548`
`-2147175096`|Name: **BDK_E_BANNED_PAYMENT_INSTRUMENT**
Message: `{0} `|
-|`0x8004B549`
`-2147175095`|Name: **BDK_E_BANNEDPERSON**
Message: `{0} `|
-|`0x8004B54A`
`-2147175094`|Name: **BDK_E_CANNOT_EXCEED_MAX_OWNERSHIP**
Message: `{0} `|
-|`0x8004B54B`
`-2147175093`|Name: **BDK_E_COUNTRY_CURRENCY_PI_MISMATCH**
Message: `{0} `|
-|`0x8004B54C`
`-2147175092`|Name: **BDK_E_CREDIT_CARD_EXPIRED**
Message: `{0} `|
-|`0x8004B54D`
`-2147175091`|Name: **BDK_E_DATE_EXPIRED**
Message: `{0} `|
-|`0x8004B54E`
`-2147175090`|Name: **BDK_E_ERROR_COUNTRYCODE_MISMATCH**
Message: `{0} `|
-|`0x8004B54F`
`-2147175089`|Name: **BDK_E_ERROR_COUNTRYCODE_REQUIRED**
Message: `{0} `|
-|`0x8004B550`
`-2147175088`|Name: **BDK_E_EXTRA_REFERRAL_DATA**
Message: `{0} `|
-|`0x8004B551`
`-2147175087`|Name: **BDK_E_GUID_EXISTS**
Message: `{0} `|
-|`0x8004B552`
`-2147175086`|Name: **BDK_E_INVALID_ADDRESS_ID**
Message: `{0} `|
+|`0x8004B540`
`-2147175104`|Name: **BDK_E_ADDRESS_VALIDATION_FAILURE**
Message: `{0}`|
+|`0x8004B541`
`-2147175103`|Name: **BDK_E_AGREEMENT_ALREADY_SIGNED**
Message: `{0}`|
+|`0x8004B542`
`-2147175102`|Name: **BDK_E_AUTHORIZATION_FAILED**
Message: `{0}`|
+|`0x8004B543`
`-2147175101`|Name: **BDK_E_AVS_FAILED**
Message: `{0}`|
+|`0x8004B544`
`-2147175100`|Name: **BDK_E_BAD_CITYNAME_LENGTH**
Message: `{0}`|
+|`0x8004B545`
`-2147175099`|Name: **BDK_E_BAD_STATECODE_LENGTH**
Message: `{0}`|
+|`0x8004B546`
`-2147175098`|Name: **BDK_E_BAD_ZIPCODE_LENGTH**
Message: `{0}`|
+|`0x8004B547`
`-2147175097`|Name: **BDK_E_BADXML**
Message: `{0}`|
+|`0x8004B548`
`-2147175096`|Name: **BDK_E_BANNED_PAYMENT_INSTRUMENT**
Message: `{0}`|
+|`0x8004B549`
`-2147175095`|Name: **BDK_E_BANNEDPERSON**
Message: `{0}`|
+|`0x8004B54A`
`-2147175094`|Name: **BDK_E_CANNOT_EXCEED_MAX_OWNERSHIP**
Message: `{0}`|
+|`0x8004B54B`
`-2147175093`|Name: **BDK_E_COUNTRY_CURRENCY_PI_MISMATCH**
Message: `{0}`|
+|`0x8004B54C`
`-2147175092`|Name: **BDK_E_CREDIT_CARD_EXPIRED**
Message: `{0}`|
+|`0x8004B54D`
`-2147175091`|Name: **BDK_E_DATE_EXPIRED**
Message: `{0}`|
+|`0x8004B54E`
`-2147175090`|Name: **BDK_E_ERROR_COUNTRYCODE_MISMATCH**
Message: `{0}`|
+|`0x8004B54F`
`-2147175089`|Name: **BDK_E_ERROR_COUNTRYCODE_REQUIRED**
Message: `{0}`|
+|`0x8004B550`
`-2147175088`|Name: **BDK_E_EXTRA_REFERRAL_DATA**
Message: `{0}`|
+|`0x8004B551`
`-2147175087`|Name: **BDK_E_GUID_EXISTS**
Message: `{0}`|
+|`0x8004B552`
`-2147175086`|Name: **BDK_E_INVALID_ADDRESS_ID**
Message: `{0}`|
|`0x8004B553`
`-2147175085`|Name: **BDK_E_INVALID_BILLABLE_ACCOUNT_ID**
Message: `{0} The specified Billing account is invalid. Or, although the objectID is of the correct type, the account it identifies does not exist in the system.`|
-|`0x8004B554`
`-2147175084`|Name: **BDK_E_INVALID_BUF_SIZE**
Message: `{0} `|
-|`0x8004B555`
`-2147175083`|Name: **BDK_E_INVALID_CATEGORY_NAME**
Message: `{0} `|
-|`0x8004B556`
`-2147175082`|Name: **BDK_E_INVALID_COUNTRY_CODE**
Message: `{0} `|
-|`0x8004B557`
`-2147175081`|Name: **BDK_E_INVALID_CURRENCY**
Message: `{0} `|
-|`0x8004B558`
`-2147175080`|Name: **BDK_E_INVALID_CUSTOMER_TYPE**
Message: `{0} `|
-|`0x8004B559`
`-2147175079`|Name: **BDK_E_INVALID_DATE**
Message: `{0} `|
-|`0x8004B55A`
`-2147175078`|Name: **BDK_E_INVALID_EMAIL_ADDRESS**
Message: `{0} `|
-|`0x8004B55B`
`-2147175077`|Name: **BDK_E_INVALID_FILTER**
Message: `{0} `|
-|`0x8004B55C`
`-2147175076`|Name: **BDK_E_INVALID_GUID**
Message: `{0} `|
-|`0x8004B55D`
`-2147175075`|Name: **BDK_E_INVALID_INPUT_TO_TAXWARE_OR_VERAZIP**
Message: `{0} `|
-|`0x8004B55E`
`-2147175074`|Name: **BDK_E_INVALID_LOCALE**
Message: `{0} `|
+|`0x8004B554`
`-2147175084`|Name: **BDK_E_INVALID_BUF_SIZE**
Message: `{0}`|
+|`0x8004B555`
`-2147175083`|Name: **BDK_E_INVALID_CATEGORY_NAME**
Message: `{0}`|
+|`0x8004B556`
`-2147175082`|Name: **BDK_E_INVALID_COUNTRY_CODE**
Message: `{0}`|
+|`0x8004B557`
`-2147175081`|Name: **BDK_E_INVALID_CURRENCY**
Message: `{0}`|
+|`0x8004B558`
`-2147175080`|Name: **BDK_E_INVALID_CUSTOMER_TYPE**
Message: `{0}`|
+|`0x8004B559`
`-2147175079`|Name: **BDK_E_INVALID_DATE**
Message: `{0}`|
+|`0x8004B55A`
`-2147175078`|Name: **BDK_E_INVALID_EMAIL_ADDRESS**
Message: `{0}`|
+|`0x8004B55B`
`-2147175077`|Name: **BDK_E_INVALID_FILTER**
Message: `{0}`|
+|`0x8004B55C`
`-2147175076`|Name: **BDK_E_INVALID_GUID**
Message: `{0}`|
+|`0x8004B55D`
`-2147175075`|Name: **BDK_E_INVALID_INPUT_TO_TAXWARE_OR_VERAZIP**
Message: `{0}`|
+|`0x8004B55E`
`-2147175074`|Name: **BDK_E_INVALID_LOCALE**
Message: `{0}`|
|`0x8004B55F`
`-2147175073`|Name: **BDK_E_INVALID_OBJECT_ID**
Message: `{0} The Billing system cannot find the object (e.g. account or subscription or offering).`|
-|`0x8004B560`
`-2147175072`|Name: **BDK_E_INVALID_OFFERING_GUID**
Message: `{0} `|
-|`0x8004B561`
`-2147175071`|Name: **BDK_E_INVALID_PAYMENT_INSTRUMENT_STATUS**
Message: `{0} `|
-|`0x8004B562`
`-2147175070`|Name: **BDK_E_INVALID_PAYMENT_METHOD_ID**
Message: `{0} `|
-|`0x8004B563`
`-2147175069`|Name: **BDK_E_INVALID_PHONE_TYPE**
Message: `{0} `|
-|`0x8004B564`
`-2147175068`|Name: **BDK_E_INVALID_POLICY_ID**
Message: `{0} `|
-|`0x8004B565`
`-2147175067`|Name: **BDK_E_INVALID_REFERRALDATA_XML**
Message: `{0} `|
-|`0x8004B566`
`-2147175066`|Name: **BDK_E_INVALID_STATE_FOR_COUNTRY**
Message: `{0} `|
+|`0x8004B560`
`-2147175072`|Name: **BDK_E_INVALID_OFFERING_GUID**
Message: `{0}`|
+|`0x8004B561`
`-2147175071`|Name: **BDK_E_INVALID_PAYMENT_INSTRUMENT_STATUS**
Message: `{0}`|
+|`0x8004B562`
`-2147175070`|Name: **BDK_E_INVALID_PAYMENT_METHOD_ID**
Message: `{0}`|
+|`0x8004B563`
`-2147175069`|Name: **BDK_E_INVALID_PHONE_TYPE**
Message: `{0}`|
+|`0x8004B564`
`-2147175068`|Name: **BDK_E_INVALID_POLICY_ID**
Message: `{0}`|
+|`0x8004B565`
`-2147175067`|Name: **BDK_E_INVALID_REFERRALDATA_XML**
Message: `{0}`|
+|`0x8004B566`
`-2147175066`|Name: **BDK_E_INVALID_STATE_FOR_COUNTRY**
Message: `{0}`|
|`0x8004B567`
`-2147175065`|Name: **BDK_E_INVALID_SUBSCRIPTION_ID**
Message: `{0} The subscription id specified is invalid. Or, although the objectID is of correct type and also points to a valid account in SCS, the subscription it identifies does not exist in SCS.`|
-|`0x8004B568`
`-2147175064`|Name: **BDK_E_INVALID_TAX_EXEMPT_TYPE**
Message: `{0} `|
-|`0x8004B569`
`-2147175063`|Name: **BDK_E_MEG_CONFLICT**
Message: `{0} `|
-|`0x8004B56A`
`-2147175062`|Name: **BDK_E_MULTIPLE_CITIES_FOUND**
Message: `{0} `|
-|`0x8004B56B`
`-2147175061`|Name: **BDK_E_MULTIPLE_COUNTIES_FOUND**
Message: `{0} `|
-|`0x8004B56C`
`-2147175060`|Name: **BDK_E_NON_ACTIVE_ACCOUNT**
Message: `{0} `|
+|`0x8004B568`
`-2147175064`|Name: **BDK_E_INVALID_TAX_EXEMPT_TYPE**
Message: `{0}`|
+|`0x8004B569`
`-2147175063`|Name: **BDK_E_MEG_CONFLICT**
Message: `{0}`|
+|`0x8004B56A`
`-2147175062`|Name: **BDK_E_MULTIPLE_CITIES_FOUND**
Message: `{0}`|
+|`0x8004B56B`
`-2147175061`|Name: **BDK_E_MULTIPLE_COUNTIES_FOUND**
Message: `{0}`|
+|`0x8004B56C`
`-2147175060`|Name: **BDK_E_NON_ACTIVE_ACCOUNT**
Message: `{0}`|
|`0x8004B56D`
`-2147175059`|Name: **BDK_E_NOPERMISSION**
Message: `{0} The calling partner does not have access to this method or when the requester does not have permission to search against the supplied search PUID.`|
-|`0x8004B56E`
`-2147175058`|Name: **BDK_E_OBJECT_ROLE_LIMIT_EXCEEDED**
Message: `{0} `|
-|`0x8004B56F`
`-2147175057`|Name: **BDK_E_OFFERING_ACCOUNT_CURRENCY_MISMATCH**
Message: `{0} `|
-|`0x8004B570`
`-2147175056`|Name: **BDK_E_OFFERING_COUNTRY_ACCOUNT_MISMATCH**
Message: `{0} `|
-|`0x8004B571`
`-2147175055`|Name: **BDK_E_OFFERING_NOT_PURCHASEABLE**
Message: `{0} `|
-|`0x8004B572`
`-2147175054`|Name: **BDK_E_OFFERING_PAYMENT_INSTRUMENT_MISMATCH**
Message: `{0} `|
-|`0x8004B573`
`-2147175053`|Name: **BDK_E_OFFERING_REQUIRES_PI**
Message: `{0} `|
-|`0x8004B574`
`-2147175052`|Name: **BDK_E_PARTNERNOTINBILLING**
Message: `{0} `|
-|`0x8004B575`
`-2147175051`|Name: **BDK_E_PAYMENT_PROVIDER_CONNECTION_FAILED**
Message: `{0} `|
-|`0x8004B577`
`-2147175049`|Name: **BDK_E_POLICY_DEAL_COUNTRY_MISMATCH**
Message: `{0} `|
-|`0x8004B576`
`-2147175050`|Name: **BDK_E_PRIMARY_PHONE_REQUIRED**
Message: `{0} `|
-|`0x8004B578`
`-2147175048`|Name: **BDK_E_PUID_ROLE_LIMIT_EXCEEDED**
Message: `{0} `|
-|`0x8004B579`
`-2147175047`|Name: **BDK_E_RATING_FAILURE**
Message: `{0} `|
-|`0x8004B57A`
`-2147175046`|Name: **BDK_E_REQUIRED_FIELD_MISSING**
Message: `{0} `|
-|`0x8004B57B`
`-2147175045`|Name: **BDK_E_STATE_CITY_INVALID**
Message: `{0} `|
-|`0x8004B57C`
`-2147175044`|Name: **BDK_E_STATE_INVALID**
Message: `{0} `|
-|`0x8004B57D`
`-2147175043`|Name: **BDK_E_STATE_ZIP_CITY_INVALID**
Message: `{0} `|
-|`0x8004B57E`
`-2147175042`|Name: **BDK_E_STATE_ZIP_CITY_INVALID2**
Message: `{0} `|
-|`0x8004B57F`
`-2147175041`|Name: **BDK_E_STATE_ZIP_CITY_INVALID3**
Message: `{0} `|
-|`0x8004B580`
`-2147175040`|Name: **BDK_E_STATE_ZIP_CITY_INVALID4**
Message: `{0} `|
-|`0x8004B581`
`-2147175039`|Name: **BDK_E_STATE_ZIP_COVERS_MULTIPLE_CITIES**
Message: `{0} `|
-|`0x8004B582`
`-2147175038`|Name: **BDK_E_STATE_ZIP_INVALID**
Message: `{0} `|
-|`0x8004B583`
`-2147175037`|Name: **BDK_E_TAXID_EXPDATE**
Message: `{0} `|
-|`0x8004B584`
`-2147175036`|Name: **BDK_E_TOKEN_BLACKLISTED**
Message: `{0} `|
-|`0x8004B585`
`-2147175035`|Name: **BDK_E_TOKEN_EXPIRED**
Message: `{0} `|
-|`0x8004B586`
`-2147175034`|Name: **BDK_E_TOKEN_NOT_VALID_FOR_OFFERING**
Message: `{0} `|
-|`0x8004B587`
`-2147175033`|Name: **BDK_E_TOKEN_RANGE_BLACKLISTED**
Message: `{0} `|
-|`0x8004B588`
`-2147175032`|Name: **BDK_E_TRANS_BALANCE_TO_PI_INVALID**
Message: `{0} `|
+|`0x8004B56E`
`-2147175058`|Name: **BDK_E_OBJECT_ROLE_LIMIT_EXCEEDED**
Message: `{0}`|
+|`0x8004B56F`
`-2147175057`|Name: **BDK_E_OFFERING_ACCOUNT_CURRENCY_MISMATCH**
Message: `{0}`|
+|`0x8004B570`
`-2147175056`|Name: **BDK_E_OFFERING_COUNTRY_ACCOUNT_MISMATCH**
Message: `{0}`|
+|`0x8004B571`
`-2147175055`|Name: **BDK_E_OFFERING_NOT_PURCHASEABLE**
Message: `{0}`|
+|`0x8004B572`
`-2147175054`|Name: **BDK_E_OFFERING_PAYMENT_INSTRUMENT_MISMATCH**
Message: `{0}`|
+|`0x8004B573`
`-2147175053`|Name: **BDK_E_OFFERING_REQUIRES_PI**
Message: `{0}`|
+|`0x8004B574`
`-2147175052`|Name: **BDK_E_PARTNERNOTINBILLING**
Message: `{0}`|
+|`0x8004B575`
`-2147175051`|Name: **BDK_E_PAYMENT_PROVIDER_CONNECTION_FAILED**
Message: `{0}`|
+|`0x8004B577`
`-2147175049`|Name: **BDK_E_POLICY_DEAL_COUNTRY_MISMATCH**
Message: `{0}`|
+|`0x8004B576`
`-2147175050`|Name: **BDK_E_PRIMARY_PHONE_REQUIRED**
Message: `{0}`|
+|`0x8004B578`
`-2147175048`|Name: **BDK_E_PUID_ROLE_LIMIT_EXCEEDED**
Message: `{0}`|
+|`0x8004B579`
`-2147175047`|Name: **BDK_E_RATING_FAILURE**
Message: `{0}`|
+|`0x8004B57A`
`-2147175046`|Name: **BDK_E_REQUIRED_FIELD_MISSING**
Message: `{0}`|
+|`0x8004B57B`
`-2147175045`|Name: **BDK_E_STATE_CITY_INVALID**
Message: `{0}`|
+|`0x8004B57C`
`-2147175044`|Name: **BDK_E_STATE_INVALID**
Message: `{0}`|
+|`0x8004B57D`
`-2147175043`|Name: **BDK_E_STATE_ZIP_CITY_INVALID**
Message: `{0}`|
+|`0x8004B57E`
`-2147175042`|Name: **BDK_E_STATE_ZIP_CITY_INVALID2**
Message: `{0}`|
+|`0x8004B57F`
`-2147175041`|Name: **BDK_E_STATE_ZIP_CITY_INVALID3**
Message: `{0}`|
+|`0x8004B580`
`-2147175040`|Name: **BDK_E_STATE_ZIP_CITY_INVALID4**
Message: `{0}`|
+|`0x8004B581`
`-2147175039`|Name: **BDK_E_STATE_ZIP_COVERS_MULTIPLE_CITIES**
Message: `{0}`|
+|`0x8004B582`
`-2147175038`|Name: **BDK_E_STATE_ZIP_INVALID**
Message: `{0}`|
+|`0x8004B583`
`-2147175037`|Name: **BDK_E_TAXID_EXPDATE**
Message: `{0}`|
+|`0x8004B584`
`-2147175036`|Name: **BDK_E_TOKEN_BLACKLISTED**
Message: `{0}`|
+|`0x8004B585`
`-2147175035`|Name: **BDK_E_TOKEN_EXPIRED**
Message: `{0}`|
+|`0x8004B586`
`-2147175034`|Name: **BDK_E_TOKEN_NOT_VALID_FOR_OFFERING**
Message: `{0}`|
+|`0x8004B587`
`-2147175033`|Name: **BDK_E_TOKEN_RANGE_BLACKLISTED**
Message: `{0}`|
+|`0x8004B588`
`-2147175032`|Name: **BDK_E_TRANS_BALANCE_TO_PI_INVALID**
Message: `{0}`|
|`0x8004B589`
`-2147175031`|Name: **BDK_E_UNKNOWN_SERVER_FAILURE**
Message: `{0} Unknown server failure.`|
-|`0x8004B58A`
`-2147175030`|Name: **BDK_E_UNSUPPORTED_CHAR_EXIST**
Message: `{0} `|
+|`0x8004B58A`
`-2147175030`|Name: **BDK_E_UNSUPPORTED_CHAR_EXIST**
Message: `{0}`|
|`0x8004B58F`
`-2147175025`|Name: **BDK_E_USAGE_COUNT_FOR_TOKEN_EXCEEDED**
Message: `{0} Billing token is already spent.`|
-|`0x8004B58B`
`-2147175029`|Name: **BDK_E_VATID_DOESNOTHAVEEXPDATE**
Message: `{0} `|
-|`0x8004B58C`
`-2147175028`|Name: **BDK_E_ZIP_CITY_MISSING**
Message: `{0} `|
+|`0x8004B58B`
`-2147175029`|Name: **BDK_E_VATID_DOESNOTHAVEEXPDATE**
Message: `{0}`|
+|`0x8004B58C`
`-2147175028`|Name: **BDK_E_ZIP_CITY_MISSING**
Message: `{0}`|
|`0x8004B58D`
`-2147175027`|Name: **BDK_E_ZIP_INVALID**
Message: `{0} Billing zip code error.`|
|`0x8004B58E`
`-2147175026`|Name: **BDK_E_ZIP_INVALID_FOR_ENTERED_STATE**
Message: `{0} Billing zip code error.`|
|`0x8005E003`
`-2147098621`|Name: **BidsAuthenticationError**
Message: `An error occured while authenticating with server {0}.`|
@@ -421,7 +422,7 @@
|`0x8004030a`
`-2147220726`|Name: **CampaignNotSpecifiedForCampaignResponse**
Message: `RegardingObjectId is a required field.`|
|`0x8006099E`
`-2147087970`|Name: **CanAssociateOnlyMobileOfflineEnabledEntityToProfileItem**
Message: `{0} needs to be enabled for mobile offline.`|
|`0x8006099C`
`-2147087972`|Name: **CanAssociateOnlyMobileOfflineEnableEntityToProfileItem**
Message: `This entity needs to be enabled for mobile offline.`|
-|`0x8006099D`
`-2147087971`|Name: **CanAssociateOnlyOneEntityPerProfileItem**
Message: `You can only add one mobile offline profile item record per entity to a mobile offline profile record. `|
+|`0x8006099D`
`-2147087971`|Name: **CanAssociateOnlyOneEntityPerProfileItem**
Message: `You can only add one mobile offline profile item record per entity to a mobile offline profile record.`|
|`0x8003F451`
`-2147224495`|Name: **CancelActiveChildCaseFirst**
Message: `Cancel active child case before canceling parent case.`|
|`0x80044F03`
`-2147201277`|Name: **CancelAsyncOperationsRetriableError**
Message: `Failed to cancel targeted system jobs, will be retried later.`|
|`0x80044F04`
`-2147201276`|Name: **CancelAsyncOperationsTerminalError**
Message: `Failed to cancel targeted system jobs.`|
@@ -537,7 +538,7 @@
|`0x80055005`
`-2147135483`|Name: **CannotCreateSLAForEntity**
Message: `You can't create a service level agreement (SLA) for this entity because it’s not enabled for creating SLAs`|
|`0x80041d4d`
`-2147214003`|Name: **CannotCreateSyncUserIsLicensedField**
Message: `The property IsLicensed cannot be set for Sync User Creation.`|
|`0x80041d4b`
`-2147214005`|Name: **CannotCreateSyncUserObjectMissing**
Message: `This is not a valid Microsoft Online Services ID for this organization.`|
-|`0x80090481`
`-2146892671`|Name: **CannotCreateSystemFieldOnEntityUpdate**
Message: `Attribute {0} cannot be created on an existing entity {1} because it is not a custom field. `|
+|`0x80090481`
`-2146892671`|Name: **CannotCreateSystemFieldOnEntityUpdate**
Message: `Attribute {0} cannot be created on an existing entity {1} because it is not a custom field.`|
|`0x800608D5`
`-2147088171`|Name: **CannotCreateSystemOrDefaultTheme**
Message: `You can’t create system or default themes. System or default theme can only be created out of box.`|
|`0x80044804`
`-2147203068`|Name: **CannotCreateUpdateSourceAttribute**
Message: `Source Attribute Not Valid For Create/Update if Metric Type is Count.`|
|`0x8004027a`
`-2147220870`|Name: **CannotDeactivateDefaultView**
Message: `Default views cannot be deactivated.`|
@@ -637,12 +638,13 @@
|`0x8004852C`
`-2147187412`|Name: **CannotExecuteRequestBecauseHttpsIsRequired**
Message: `HTTPS protocol is required for this type of request, please enable HTTPS protocol and try again.`|
|`0x80090474`
`-2146892684`|Name: **CannotExportRoutingRuleForNonCaseEntity**
Message: `Exporting routing rules is only available for cases when using basic routing rulesets.`|
|`0x8004F847`
`-2147157945`|Name: **CannotExportRuleOnAnyEntityRoutingRuleFCBOff**
Message: `Unable to export routing rule set record for entities (except case entity) as the feature control bit for entity records routing is disabled.`|
+|`0x80041155`
`-2147217067`|Name: **CannotFilterOnMaskedAttribute**
Message: `Filtering on masked attributes without the read unmasked column permission is not allowed.`|
|`0x8004F083`
`-2147159933`|Name: **CannotFindBaseFromUpgrade**
Message: `Cannot find the data for the previous version of the holding solution: [{0}].`|
|`0x80044342`
`-2147204286`|Name: **CannotFindDomainAccount**
Message: `Invalid domain account`|
|`0x8004F060`
`-2147159968`|Name: **CannotFindLayerToMerge**
Message: `Cannot find a suitable layer to merge Component: [{0}] with Id: [{1}]. Cannot continue with the operation. Check the layers of the component.`|
|`0x800404eb`
`-2147220245`|Name: **CannotFindObjectInQueue**
Message: `The object was not found in the given queue`|
|`0x800404ec`
`-2147220244`|Name: **CannotFindUserQueue**
Message: `Cannot find user queue`|
-|`0x8004F6A3`
`-2147158365`|Name: **CannotFollowInactiveEntity**
Message: `Can't follow inactive record. `|
+|`0x8004F6A3`
`-2147158365`|Name: **CannotFollowInactiveEntity**
Message: `Can't follow inactive record.`|
|`0x80090012`
`-2146893806`|Name: **CannotGenerateFileSasUrl**
Message: `Cannot generate SAS url for this file.`|
|`0x80048446`
`-2147187642`|Name: **CannotGrantAccessToAddressBookFilters**
Message: `Cannot grant access to address book filters`|
|`0x80040271`
`-2147220879`|Name: **CannotGrantAccessToOfflineFilters**
Message: `Cannot grant access to offline filters`|
@@ -761,7 +763,8 @@
|`0x80061114`
`-2147086060`|Name: **CannotUpdateExternalPartyWithSameCorrelationKey**
Message: `An external party record already exists with the same correlation key value.`|
|`0x80044901`
`-2147202815`|Name: **CannotUpdateGoalPeriodInfoChildGoal**
Message: `You cannot update goal period related attributes on a child goal.`|
|`0x80044910`
`-2147202800`|Name: **CannotUpdateGoalPeriodInfoClosedGoal**
Message: `You cannot change the time period of this goal because there are one or more closed subordinate goals.`|
-|`0x80048461`
`-2147187615`|Name: **CannotUpdateLogicalAttribute**
Message: `Cannot update logical attribute {0} `|
+|`0x80048362`
`-2147187870`|Name: **CannotUpdateLicenseStateForUser**
Message: `User with SystemUserId={0} and SystemManagedUserType={1} cannot have their licensed state updated.`|
+|`0x80048461`
`-2147187615`|Name: **CannotUpdateLogicalAttribute**
Message: `Cannot update logical attribute {0}`|
|`0x8004F024`
`-2147160028`|Name: **CannotUpdateManagedSolution**
Message: `Cannot update solution '{0}' because it is a managed solution.`|
|`0x80044900`
`-2147202816`|Name: **CannotUpdateMetricOnChildGoal**
Message: `You cannot update metric on a child goal.`|
|`0x80044902`
`-2147202814`|Name: **CannotUpdateMetricOnGoalWithChildren**
Message: `You cannot update metric on a goal which has associated child goals.`|
@@ -801,6 +804,7 @@
|`0x8005F214`
`-2147093996`|Name: **CantSaveRecordInOffline**
Message: `You can't save this record while you're offline.`|
|`0x8006111A`
`-2147086054`|Name: **CantSetIsGuestProfile**
Message: `You can’t set or change the value of the IsGuestProfile field because it’s for internal use only.`|
|`0x8005F224`
`-2147093980`|Name: **CantUpdateOnlineRecord**
Message: `You can’t update this record because it doesn’t exist in the offline mode.`|
+|`0x80072360`
`-2147015840`|Name: **CanvasAppCouldNotBeDeletedDueToBeingARequiredDependency**
Message: `The {0} with name '{1}' cannot be deleted because it is a required dependency by one or more components (from managed or active layer) outside this solution.`|
|`0x80050121`
`-2147155679`|Name: **CanvasAppNotPartOfAppModule**
Message: `The custom page being opened is not part of this app.`|
|`0x80072356`
`-2147015850`|Name: **CanvasAppsExpectedFileMissing**
Message: `The solution specified an expected assets file but that file was missing or invalid.`|
|`0x80072354`
`-2147015852`|Name: **CanvasAppsInvalidSolutionFileContent**
Message: `The request to import a canvas app should contain at least one asset file.`|
@@ -873,6 +877,7 @@
|`0x80061771`
`-2147084431`|Name: **CloneSolutionPatchException**
Message: `Patch '{0}' has a matching or higher version ({1}) than that of the patch being installed.`|
|`0x80071112`
`-2147020526`|Name: **CloneTitleTooLong**
Message: `A validation error occurred. The length of the Name attribute of the mobileofflineprofile entity exceeded the maximum allowed length of 200.`|
|`0x8003F452`
`-2147224494`|Name: **CloseActiveChildCaseFirst**
Message: `Close active child case before closing parent case.`|
+|`0x80098020`
`-2146861024`|Name: **ClusteringFeatureNotAvailable**
Message: `This operation couldn't be completed because {0} feature is not enabled for your organization as {1}.`|
|`0x80090019`
`-2146893799`|Name: **CmkStatusMismatch**
Message: `The CMK status does not match. Input: {0}, expected: {1}`|
|`0x80061500`
`-2147085056`|Name: **ColorStripAttributesExceeded**
Message: `Color Strip section cannot have more than 1 attribute`|
|`0x80061502`
`-2147085054`|Name: **ColorStripAttributesInvalid**
Message: `Color Strip section can only have attributes of type Two Options, Option Set and Status Reason`|
@@ -992,7 +997,7 @@
|`0x80050300`
`-2147155200`|Name: **CrmLicensingError**
Message: `A failure occurred during licensing check.`|
|`0x80050307`
`-2147155193`|Name: **CrmLicensingNoAccessViaEntitlementBilling**
Message: `This user with userId={0} does not have an appropriate license to access this application uniqueName={1} with Id={2} from publisher={3}. An appropriate license is required or the user needs to have sufficient per app licenses allocated, for accessing custom applications. For more information, please refer https://go.microsoft.com/fwlink/p/?linkid=2122607 Error=CrmLicensingNoAccessViaEntitlementBilling.`|
|`0x80050303`
`-2147155197`|Name: **CrmLicensingNoRestrictedServicePlan**
Message: `This application {0}({1}) requires an appropriate license. Technical Information: This user with user Id {2} does not have appropriate license(s) to access this application from publisher {3}. An appropriate license is required with one of these service plans : {4}. Error=CrmLicensingNoRestrictedServicePlan.`|
-|`0x80050301`
`-2147155199`|Name: **CrmLicensingNoServicePlan**
Message: `This user with userId={0} does not have appropriate license(s) to access this application uniqueName={1} with Id={2} from publisher={3}. An appropriate license is required with one of these service plans : {5}. For more information, please refer https://go.microsoft.com/fwlink/p/?linkid=2122607 Error=CrmLicensingNoServicePlan.`|
+|`0x80050301`
`-2147155199`|Name: **CrmLicensingNoServicePlan**
Message: `This user with userId={0} does not have appropriate license(s) to access this application uniqueName={1} with Id={2} from publisher={3}. An appropriate license is required with one of these service plans: {5}. For additional troubleshooting steps, please refer https://go.microsoft.com/fwlink/p/?linkid=2314633. For a mapping of all licenses to service plans, refer https://go.microsoft.com/fwlink/p/?linkid=2307706 Error=CrmLicensingNoServicePlan.`|
|`0x80050302`
`-2147155198`|Name: **CrmLicensingNoUserPass**
Message: `This user with userId={0} does not have an appropriate license to access this application uniqueName={1} with Id={2} from publisher={3}. An appropriate license is required or the organization instance needs to have sufficient per app licenses assigned, for accessing custom applications. For more information, please refer https://go.microsoft.com/fwlink/p/?linkid=2122607 Error=CrmLicensingNoUserPass.`|
|`0x8004B056`
`-2147176362`|Name: **CrmLiveAddOnAddLicenseLimitReached**
Message: `Your subscription has the maximum number of user licenses available. For additional licenses, please contact our sales organization at 1-877-Dynamics 365-CHOICE (276-2464).`|
|`0x8004B057`
`-2147176361`|Name: **CrmLiveAddOnAddStorageLimitReached**
Message: `Your storage consumption has reached the maximum storage limit allotted to this environment. Trial environments are allocated with limited resources. If you are not using a trial environment, please contact support.`|
@@ -1093,20 +1098,21 @@
|`0x80071156`
`-2147020458`|Name: **CyclicDependency**
Message: `Cyclic component dependency detected. Please check the exception for more details. Fix the invalid dependencies and try the operation one more time. Detaisl: {0}`|
|`0x8004417F`
`-2147204737`|Name: **CyclicReferencesNotSupported**
Message: `The input contains a cyclic reference, which is not supported.`|
|`0x80072401`
`-2147015679`|Name: **DatabaseCallsBlockedFailure**
Message: `This invocation may lead to calls to Database which is not allowed.`|
+|`0x80048564`
`-2147187356`|Name: **DatabaseUnavailable**
Message: `Database is currently unavailable. This operation should be retried later. Database connection exception message: {0}`|
|`0x8004B065`
`-2147176347`|Name: **DatacenterNotAvailable**
Message: `This datacenter endpoint is not currently available for this organization.`|
|`0x80040345`
`-2147220667`|Name: **DataColumnsNumberMismatch**
Message: `The number of fields differs from the number of column headings.`|
-|`0x80048744`
`-2147186876`|Name: **DataEngineComputedColumnQueryThrottling**
Message: `This query cannot be executed because it conflicts with Query Throttling; the query uses a computed column in a filter condition, which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
+|`0x80048744`
`-2147186876`|Name: **DataEngineComputedColumnQueryThrottling**
Message: `This query is throttled as it negatively impacts the database health; the query uses a computed column in a filter condition, which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
|`0x80048589`
`-2147187319`|Name: **DataEngineCreateIndexCannotQueue**
Message: `The adhoc request already exists`|
|`0x80048588`
`-2147187320`|Name: **DataEngineCreateIndexMetadataAlreadyExists**
Message: `The requested index already Exists in Index Metadata. The index will be created during the nightly job.`|
|`0x80048590`
`-2147187312`|Name: **DataEngineCreateIndexSqlIndexAlreadyExists**
Message: `The Index or a super-set index already exists in sql.`|
|`0x80048586`
`-2147187322`|Name: **DataEngineIndexMGMTApisForbidden**
Message: `Forbidden: Invalid User for endpoint`|
|`0x80048587`
`-2147187321`|Name: **DataEngineIndexMGMTApisInvalidInput**
Message: `Input Invalid: {0}`|
-|`0x80048644`
`-2147187132`|Name: **DataEngineLeadingWildcardQueryThrottling**
Message: `This query cannot be executed because it conflicts with Query Throttling; the query uses a leading wildcard value in a filter condition, which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
-|`0x80048745`
`-2147186875`|Name: **DataEnginePerformanceValidationIssuesQueryThrottling**
Message: `This query cannot be executed because it conflicts with Query Throttling; the query has performance validation issues ({0}), which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
+|`0x80048644`
`-2147187132`|Name: **DataEngineLeadingWildcardQueryThrottling**
Message: `This query is throttled as it negatively impacts the database health; the query uses a leading wildcard value in a filter condition, which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
+|`0x80048745`
`-2147186875`|Name: **DataEnginePerformanceValidationIssuesQueryThrottling**
Message: `This query is throttled as it negatively impacts the database health; the query has performance validation issues ({0}), which will cause the query to be throttled more aggressively. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
|`0x80049544`
`-2147183292`|Name: **DataEngineQueryBlocking**
Message: `This query cannot be executed because it was blocked by the platform. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
|`0x80049545`
`-2147183291`|Name: **DataEngineQueryBlockingQDS**
Message: `This query cannot be executed because it was blocked by the platform. This was blocked due to query complexity leading to timeouts. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
-|`0x80048544`
`-2147187388`|Name: **DataEngineQueryThrottling**
Message: `This query cannot be executed because it conflicts with Query Throttling. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
-|`0x80050544`
`-2147154620`|Name: **DataEngineSerializeQueryThrottling**
Message: `This query cannot be executed because it conflicts with Query Throttling. The query is restricted to limited parallel executions. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
+|`0x80048544`
`-2147187388`|Name: **DataEngineQueryThrottling**
Message: `This query is throttled as it negatively impacts the database health. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
+|`0x80050544`
`-2147154620`|Name: **DataEngineSerializeQueryThrottling**
Message: `This query is throttled as it negatively impacts the database health. The query is restricted to limited parallel executions. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2162952`|
|`0x80160021`
`-2146041823`|Name: **DataFieldNameIsMissing**
Message: `Required attribute \datafieldname\ is missing for control. More Details:{0}`|
|`0x8006041b`
`-2147089381`|Name: **DatafieldNameShouldBeNull**
Message: `ActionStep {0} references invalid DataFieldName {1}.`|
|`0x80160022`
`-2146041822`|Name: **DataFieldSpecifiedIsNotALookup**
Message: `The datafieldname attribute {0} is not of type lookup. More Details:{1}`|
@@ -1156,7 +1162,7 @@
|`0x80090910`
`-2146891504`|Name: **DelegatedAuthorizationTeamNotFound**
Message: `Matching delegated authorization team not found for delegated authorization '{0}'.`|
|`0x80097208`
`-2146864632`|Name: **DelegatedTeamMembershipNotAllowed**
Message: `Team '{0}' is associated to a delegated authorization and cannot have members.`|
|`0x8004501A`
`-2147200998`|Name: **DeleteActiveWorkflowTemplateDependency**
Message: `Cannot delete workflow dependency from a published workflow template .`|
-|`0x80049950`
`-2147182256`|Name: **DeletedItemRefMarkedInvalid**
Message: `Deleted item ref '{0}' has been marked invalid for restore. This entity cannot be restored. `|
+|`0x80049950`
`-2147182256`|Name: **DeletedItemRefMarkedInvalid**
Message: `Deleted item ref '{0}' has been marked invalid for restore. This entity cannot be restored.`|
|`0x80097262`
`-2146864542`|Name: **DeleteElasticTableDataError**
Message: `DeleteElasticTableData failed with Status code : '{0}'`|
|`0x80045006`
`-2147201018`|Name: **DeletePublishedWorkflowDefinitionWorkflowDependency**
Message: `Cannot delete a workflow dependency for a published workflow definition.`|
|`0x80045004`
`-2147201020`|Name: **DeleteWorkflowActivation**
Message: `Cannot delete a workflow activation.`|
@@ -1204,6 +1210,7 @@
|`0x80048cf8`
`-2147185416`|Name: **DiscountTypeAndPriceLevelCurrencyNotEqual**
Message: `The currency of the discount needs to match the currency of the price list for discount type amount.`|
|`0x80050124`
`-2147155676`|Name: **DiskSpaceNotEnough**
Message: `There is not enough space in the Temp Folder.`|
|`0x80040c06`
`-2147218426`|Name: **DistinctClauseUnsupportedForMultiPartitionQuery**
Message: `Distinct clause is not supported for multi-partition query.`|
+|`0x80040c0c`
`-2147218420`|Name: **DistinctWithGroupByClauseUnsupportedForMultiPartitionQuery**
Message: `Distinct with group by clause is not supported for multi-partition query.`|
|`0x80072531`
`-2147015375`|Name: **DistinctWithImageAttributeError**
Message: `Distinct is not allowed when image attributes are selected.`|
|`0x80048453`
`-2147187629`|Name: **DistributeListAssociatedVary**
Message: `This campaign activity cannot be distributed. Mail merge activities can be done only on marketing lists that are all the same record type. For this campaign activity, remove marketing lists so that the remaining ones are the same record type, and then try again.`|
|`0x80048454`
`-2147187628`|Name: **DistributeNoListAssociated**
Message: `This campaign activity cannot be distributed. No marketing lists are associated with it. Add at least one marketing list and try again.`|
@@ -1374,8 +1381,8 @@
|`0x80060421`
`-2147089375`|Name: **EntityIsNotBusinessProcessFlowEnabled**
Message: `The IsBusinessProcessEnabled property of the {0} entity is false.`|
|`0x80047008`
`-2147192824`|Name: **EntityIsNotCustomizable**
Message: `The specified entity is not customizable`|
|`0x8006111B`
`-2147086053`|Name: **EntityIsNotEnabledForExternalParty**
Message: `You can't create/update an external party item associated to an entity that is not enabled for external party.`|
-|`0x8004F6A2`
`-2147158366`|Name: **EntityIsNotEnabledForFollow**
Message: `This entity is not enabled to be followed. `|
-|`0x8004F6A1`
`-2147158367`|Name: **EntityIsNotEnabledForFollowUser**
Message: `This entity is not enabled to be followed. `|
+|`0x8004F6A2`
`-2147158366`|Name: **EntityIsNotEnabledForFollow**
Message: `This entity is not enabled to be followed.`|
+|`0x8004F6A1`
`-2147158367`|Name: **EntityIsNotEnabledForFollowUser**
Message: `This entity is not enabled to be followed.`|
|`0x80043b1e`
`-2147206370`|Name: **EntityIsUnlocked**
Message: `This entity is already unlocked.`|
|`0x80090110`
`-2146893552`|Name: **EntityKeyAttributeNotValidForCreate**
Message: `Attribute of an entity key must be valid for create. Atribute Name = '{0}' Id = '{1}'`|
|`0x80090112`
`-2146893550`|Name: **EntityKeyAttributeNotValidForCreateAndUpdate**
Message: `Attribute of an entity key must be valid for create and update. Atribute Name = '{0}' Id = '{1}'`|
@@ -1392,7 +1399,7 @@
|`0x80040387`
`-2147220601`|Name: **EntityLoopBeingCreated**
Message: `Creating this parental association would create a loop in this entity hierarchy.`|
|`0x80040386`
`-2147220602`|Name: **EntityLoopExists**
Message: `Loop exists in this entity hierarchy.`|
|`0x8005F238`
`-2147093960`|Name: **EntityMetadataSyncFailed**
Message: `There were problems with the server configurations. There was a problem with the server configuration changes. We are unable to load the application, please contact your Dynamics 365 administrator.`|
-|`0x8005F239`
`-2147093959`|Name: **EntityMetadataSyncFailedWithContinue**
Message: `There were difficulties with the server configuration changes. You can continue to use the app with the older configuration, however, you may experience problems including errors when saving. Please contact your Dynamics 365 administrator. `|
+|`0x8005F239`
`-2147093959`|Name: **EntityMetadataSyncFailedWithContinue**
Message: `There were difficulties with the server configuration changes. You can continue to use the app with the older configuration, however, you may experience problems including errors when saving. Please contact your Dynamics 365 administrator.`|
|`0x80048334`
`-2147187916`|Name: **EntityNotEnabledForAutoCreatedAccessTeams**
Message: `The entity with logicalname {0} and ObjectTypeCode {1} is not enabled for auto created access teams.`|
|`0x8004E00C`
`-2147164148`|Name: **EntityNotEnabledForCharts**
Message: `Charts are not enabled on the specified primary entity type code: {0}.`|
|`0x8005F200`
`-2147094016`|Name: **EntityNotEnabledForThisDevice**
Message: `Entity not enabled to be viewed in this device`|
@@ -1594,12 +1601,13 @@
|`0x8009724D`
`-2146864563`|Name: **FilterOnSecuredAttributeCallerCantReadNotSupportedForElasticTables**
Message: `Caller does not have read permission on secured attribute ('{0}'). Filtering on this attribute without permission is not supported for Elastic Tables.`|
|`0x80060443`
`-2147089341`|Name: **FinalMergedEntityIsNull**
Message: `Error creating or updating Business Process: final merged entity cannot be null.`|
|`0x80090300`
`-2146893056`|Name: **FinanceAndOperationsVirtualEntityInvalidDataSource**
Message: `Unable to establish connection using data source: '{0}'. Failed to sync entity metadata. Ensure the data source is configured properly.`|
+|`0x80090318`
`-2146893032`|Name: **FinanceAndOperationsVirtualEntityInvalidDataSourceV2**
Message: `Unable to establish connection using data source: '{0}', Error: '{1}' Ensure the data source is configured properly.`|
|`0x80090301`
`-2146893055`|Name: **FinanceAndOperationsVirtualEntityInvalidEntities**
Message: `Unable to sync metadata for entities: '{0}'. Ensure the entities are available in data source: '{1}'.`|
|`0x80090302`
`-2146893054`|Name: **FinanceAndOperationsVirtualEntitySyncError**
Message: `Failed to sync entity metadata for entity '{0}'. Exception details: {1}.`|
-|`0x80097501`
`-2146863871`|Name: **FinOpsCallBackException**
Message: ` Finance and Operations returned an exception, Error Code "{0}".`|
-|`0x80097504`
`-2146863868`|Name: **FinOpsGrpcChannelGenericException**
Message: ` An error has occured when communicating with Finance And Operations.`|
-|`0x80097503`
`-2146863869`|Name: **FinOpsGrpcChannelRpcException**
Message: ` An error has occured when communicating with Finance And Operations. Error Detail- {0}.`|
-|`0x80097502`
`-2146863870`|Name: **FinOpsGrpcChannelTimeoutException**
Message: ` Timeout error has occured when communicating with Finance And Operations. Error Detail- {0}.`|
+|`0x80097501`
`-2146863871`|Name: **FinOpsCallBackException**
Message: `Finance and Operations returned an exception, Error Code "{0}".`|
+|`0x80097504`
`-2146863868`|Name: **FinOpsGrpcChannelGenericException**
Message: `An error has occured when communicating with Finance And Operations.`|
+|`0x80097503`
`-2146863869`|Name: **FinOpsGrpcChannelRpcException**
Message: `An error has occured when communicating with Finance And Operations. Error Detail- {0}.`|
+|`0x80097502`
`-2146863870`|Name: **FinOpsGrpcChannelTimeoutException**
Message: `Timeout error has occured when communicating with Finance And Operations. Error Detail- {0}.`|
|`0x80060456`
`-2147089322`|Name: **FirstStageIdInTraversedPathDoesNotMatchFirstStageIdInBusinessProcess**
Message: `First Stage ID in traversed path ‘{0}’ does not match first Stage ID in Business Process ‘{1}’. Please contact your system administrator.`|
|`0x80044903`
`-2147202813`|Name: **FiscalPeriodGoalMissingInfo**
Message: `For a goal of fiscal period type, the fiscal period attribute must be set.`|
|`0x80043809`
`-2147207159`|Name: **FiscalSettingsAlreadyUpdated**
Message: `Fiscal settings have already been updated. They can be updated only once.`|
@@ -1700,7 +1708,7 @@
|`0x80048060`
`-2147188640`|Name: **ImportCustomizationsBadZipFileError**
Message: `The solution file is invalid. The compressed file must contain the following files at its root: solution.xml, customizations.xml, and [Content_Types].xml. Customization files exported from previous versions of Microsoft Dynamics 365 are not supported.`|
|`0x8004E308`
`-2147163384`|Name: **ImportDashboardDeletedError**
Message: `A dashboard with the same id is marked as deleted in the system. Please first publish the system form entity and import again.`|
|`0x80048049`
`-2147188663`|Name: **ImportDefaultAsPackageError**
Message: `The package supplied for the default solution is trying to install it in managed mode. The default solution cannot be managed. In the XML for the default solution, set the Managed value back to "false" and try to import the solution again.`|
-|`0x80048034`
`-2147188684`|Name: **ImportDependencySolutionError**
Message: `{0} requires solutions that are not currently installed. Import the following solutions before Importing this one. {1} `|
+|`0x80048034`
`-2147188684`|Name: **ImportDependencySolutionError**
Message: `{0} requires solutions that are not currently installed. Import the following solutions before Importing this one. {1}`|
|`0x8004810c`
`-2147188468`|Name: **ImportDuplicateEntity**
Message: `This import has failed because a different entity with the identical name, {0}, already exists in the target organization.`|
|`0x8004800C`
`-2147188724`|Name: **ImportEmailTemplateError**
Message: `There was an error in parsing the email templates in Import Xml`|
|`0x8004802B`
`-2147188693`|Name: **ImportEmailTemplateErrorMissingFile**
Message: `E-mail Template '{0}' import: The attachment '{1}' was not found in the import zip file.`|
@@ -1765,6 +1773,7 @@
|`0x80048073`
`-2147188621`|Name: **ImportServiceEndpointError**
Message: `An error occurred while importing Service Endpoints.`|
|`0x80048011`
`-2147188719`|Name: **ImportSiteMapError**
Message: `An error occurred while importing the Site Map.`|
|`0x8004F868`
`-2147157912`|Name: **ImportSlaError**
Message: `An error occurred while importing SLAs.`|
+|`0x80072048`
`-2147016632`|Name: **ImportSolutionAfterAppUpdatesOperationFailed**
Message: `Solution import failed due to failure in installing required dependencies. Please see addition details in Solution history record of this solution import operation.`|
|`0x8004804C`
`-2147188660`|Name: **ImportSolutionBlockedByRunSafeInternalErrors**
Message: `An error occurred while trying to run solution checker enforcement on the importing solution. Try importing the solution again. If this problem persists, contact your system administrator.`|
|`0x8004803D`
`-2147188675`|Name: **ImportSolutionBlockedByRunSafeIssues**
Message: `Solution is blocked from importing due to critical violations. Fix these violations, then retry the import.`|
|`0x80048033`
`-2147188685`|Name: **ImportSolutionError**
Message: `An error occurred while importing a Solution.`|
@@ -1831,7 +1840,7 @@
|`0x80048502`
`-2147187454`|Name: **IncorrectSingleFileMultipleEntityMap**
Message: `There should be two or more Entity Mappings defined when EntitiesPerFile in ImportMap is set to Multiple`|
|`0x80048360`
`-2147187872`|Name: **IncorrectUserAzureState**
Message: `User with SystemUserId={0} and AzureActiveDirectoryObjectId={1} is present in Azure Active Directory with state {2}. AzureState can't be set to incorrect value={3}.`|
|`0x80060991`
`-2147087983`|Name: **IncreasingDaysWillResetMobileOfflineData**
Message: `Increasing the number of days will cause a reset of mobile offline data and a resynchronization with mobile devices.`|
-|`0x80048d40`
`-2147185344`|Name: **IndexExceedsMaxLength**
Message: `The index entry of length for the index exceeds the maximum length. Please try removing some columns or reduce the number of columns in the table. `|
+|`0x80048d40`
`-2147185344`|Name: **IndexExceedsMaxLength**
Message: `The index entry of length for the index exceeds the maximum length. Please try removing some columns or reduce the number of columns in the table.`|
|`0x8005E008`
`-2147098616`|Name: **IndexOutOfRange**
Message: `The index {0} is out of range for {1}. Number of elements present are {2}.`|
|`0x80060895`
`-2147088235`|Name: **IndexSizeConstraintViolated**
Message: `Index size exceeded the size limit of {0} bytes. The key is too large. Try removing some columns or making the strings in string columns shorter.`|
|`0x8004F800`
`-2147158016`|Name: **InitializeErrorNoReadOnSource**
Message: `The operation could not be completed because you donot have read access on some of the fields in {0} record.`|
@@ -2055,6 +2064,7 @@
|`0x80040396`
`-2147220586`|Name: **InvalidFileBadCharacters**
Message: `The file could not be uploaded because it contains invalid character(s)`|
|`0x80090000`
`-2146893824`|Name: **InvalidFileRangeRequested**
Message: `Chunk range used in this call is either not valid or it is bigger than allowed {0} MB.`|
|`0x80090015`
`-2146893803`|Name: **InvalidFileRangeRequestedSqlStorage**
Message: `{0} in multiple chunks is not supported for the files stored in the database.`|
+|`0x80072524`
`-2147015388`|Name: **InvalidFileRecordsFound**
Message: `Invalid file records found for requested {0}`|
|`0x80090011`
`-2146893807`|Name: **InvalidFileSasUrl**
Message: `SAS url has either expired or is invalid.`|
|`0x800608CC`
`-2147088180`|Name: **InvalidFileType**
Message: `Invalid File Type.`|
|`0x8004E01E`
`-2147164130`|Name: **InvalidFilterCriteriaForVisualization**
Message: `The visualization cannot be rendered for the given filter criteria.`|
@@ -2326,7 +2336,7 @@
|`0x80048511`
`-2147187439`|Name: **InvalidTransformationParameterEmptyCollection**
Message: `The transformation parameter: {0} has an invalid input value length: {1}. The parameter length cannot be an empty collection.`|
|`0x80040382`
`-2147220606`|Name: **InvalidTransformationParameterMapping**
Message: `The transformation parameter mapping defined is invalid. Check that the target attribute name exists.`|
|`0x8004037c`
`-2147220612`|Name: **InvalidTransformationParameterMappings**
Message: `One or more transformation parameter mappings are invalid or do not match the transformation parameter description.`|
-|`0x80048510`
`-2147187440`|Name: **InvalidTransformationParameterOutsideRange**
Message: `The transformation parameter: {0} has an invalid input value: {1}. The parameter is out of the permissible range: {2}. `|
+|`0x80048510`
`-2147187440`|Name: **InvalidTransformationParameterOutsideRange**
Message: `The transformation parameter: {0} has an invalid input value: {1}. The parameter is out of the permissible range: {2}.`|
|`0x80048512`
`-2147187438`|Name: **InvalidTransformationParameterOutsideRangeGeneric**
Message: `One or more input transformation parameter values are outside the permissible range: {0}.`|
|`0x80048507`
`-2147187449`|Name: **InvalidTransformationParametersGeneric**
Message: `The transformation parameter: {0} has an invalid input value: {1}. The parameter must be of type: {2}.`|
|`0x80048508`
`-2147187448`|Name: **InvalidTransformationParameterString**
Message: `The transformation parameter: {0} has an invalid input value: {1}. The parameter must be a string that is not empty.`|
@@ -2450,7 +2460,7 @@
|`0x8004F050`
`-2147159984`|Name: **LayerDesiredOrderInvalidXMLDetail**
Message: `The LayerDesiredOrder parameter contains an invalid XML schema. Check the property [{0}].`|
|`0x8004F052`
`-2147159982`|Name: **LayerDesiredOrderNotAllowedOnPatch**
Message: `The LayerDesiredOrder parameter cannot be used when importing a Patch. The parameter can only be used while importing a solution.`|
|`0x8004F048`
`-2147159992`|Name: **LayerDesiredOrderNotSamePublisher**
Message: `The solution [{0}] was used in the LayerDesiredOrder parameter, but its publisher [{1}] does not match the publisher of the solution being installed: [{2}]. This parameter can be used only by solutions from the same publisher.`|
-|`0x8004F065`
`-2147159963`|Name: **LayerDesiredOrderNotWhitelist**
Message: `The LayerDesiredOrder parameter is present in the import request of [{0}], but this solution is not allowed to use it. Solutions must be allow listed to use this feature.`|
+|`0x8004F065`
`-2147159963`|Name: **LayerDesiredOrderNotWhitelist**
Message: `The LayerDesiredOrder parameter is present in the import request of [{0}], but this solution is not allowed to use it. Solutions must be allow (white) listed to use this feature.`|
|`0x8004F047`
`-2147159993`|Name: **LayerDesiredOrderPendingUpgrade**
Message: `The solution [{0}] used in LayerDesiredOrder parameter has a pending upgrade. Please complete its upgrade before retrying this operation.`|
|`0x8004F056`
`-2147159978`|Name: **LayerDesiredOrderPublisherNotAllowed**
Message: `The publisher [{0}] is not allowed to use the LayerDesiredOrder parameter.`|
|`0x8004F058`
`-2147159976`|Name: **LayerDesiredOrderRestrictedSolution**
Message: `The LayerDesiredOrder parameter cannot be used on [{0}].`|
@@ -2477,6 +2487,7 @@
|`0x80090438`
`-2146892744`|Name: **LinkedAttributeOptionSetValueMismatch**
Message: `OptionSet value {2} is not found in linked attribute optionset for attribute {0} of entity {1}`|
|`0x80071120`
`-2147020512`|Name: **LinkedEntitiesAreNotAllowed**
Message: `The filter contains a link-entity with an invalid link-type. The link-type must be "Any" or "Not Any".`|
|`0x80071143`
`-2147020477`|Name: **LinkEntityCountExceeded**
Message: `The profile could not be published because one or more tables exceed the allowed number of relationships of {1}. Please reduce the number of relationships for the following table(s): {0}.`|
+|`0x80041d3a`
`-2147214022`|Name: **LinkEntityVirtualFilterNotPermitted**
Message: `RetrieveMultiple cannot accept LinkEntity which is virtual entity with filters defined outside of LinkEntity node. Move the filters inside.`|
|`0x8004D239`
`-2147167687`|Name: **LiveAdminUnknownCommand**
Message: `Unknown administration command {0}`|
|`0x8004D238`
`-2147167688`|Name: **LiveAdminUnknownObject**
Message: `Unknown administration target {0}`|
|`0x8004B524`
`-2147175132`|Name: **LivePlatformEmailInvalidBody**
Message: `The "Body" parameter is blank or null`|
@@ -2491,6 +2502,7 @@
|`0x80072454`
`-2147015596`|Name: **LocalDataSourceTimeOutError**
Message: `The operation timed out. Please try again.`|
|`0x80072043`
`-2147016637`|Name: **LockdownOfUnmanagedSolutionImports**
Message: `This environment doesn't allow unmanaged customizations. This was a choice made by your admin, and certain actions won't be available or will be view only. Learn more: https://go.microsoft.com/fwlink/?linkid=2251006`|
|`0x80072042`
`-2147016638`|Name: **LockdownOfUnmangedCustomization**
Message: `This environment doesn't allow unmanaged customizations. This was a choice made by your admin, and certain actions won't be available or will be view only. Learn more: https://go.microsoft.com/fwlink/?linkid=2251006`|
+|`0x80072046`
`-2147016634`|Name: **LockdownOfUnmangedCustomizationForClusteredEnvironments**
Message: `This clustered environment doesn't allow unmanaged customizations. This was a choice made by your admin, and certain actions won't be available or will be view only.`|
|`0x8004F703`
`-2147158269`|Name: **LockStatusNotValidForDynamicList**
Message: `Lock Status cannot be specified for a dynamic list.`|
|`0x800608D2`
`-2147088174`|Name: **LogoImageNodeDoesNotExist**
Message: `Logo Image node in organization cache theme data doesnot exist.`|
|`0x80040372`
`-2147220622`|Name: **LongParseRow**
Message: `The row is too long to import`|
@@ -2562,7 +2574,7 @@
|`0x8006088C`
`-2147088244`|Name: **MailboxTrackingFolderMappingCannotBeUpdated**
Message: `The mailbox tracking folder mapping cannot be updated.`|
|`0x8005E247`
`-2147098041`|Name: **MailboxUnsupportedEmailServerType**
Message: `Server-side synchronization for appointments, contacts, and tasks isn't supported for POP3 or SMTP server types. Select a supported email type or change the synchronization method for appointments, contacts, and tasks to None.`|
|`0x80097303`
`-2146864381`|Name: **MalformODataAnnotationHeader**
Message: `Error identified on the 'odata.include-annotations' value inside the 'Prefer' header. Refer to the following link for more details: https://go.microsoft.com/fwlink/?linkid=2300109. See exception message for more details '{0}'.`|
-|`0x80060383`
`-2147089533`|Name: **ManagedBpfDeletionInvalid**
Message: ` The business process flow is part of a managed solution and cannot be individually deleted. Uninstall the parent solution to remove the business process flow.`|
+|`0x80060383`
`-2147089533`|Name: **ManagedBpfDeletionInvalid**
Message: `The business process flow is part of a managed solution and cannot be individually deleted. Uninstall the parent solution to remove the business process flow.`|
|`0x8004A114`
`-2147180268`|Name: **ManagedIdentityCredentialSourceNotSupported**
Message: `The configured Credential Source for ManagedIdentity is not support`|
|`0x8004A119`
`-2147180263`|Name: **ManagedIdentityPublisherRestriction**
Message: `ManagedIdentity cannot be assigned to a component from different publisher.`|
|`0x80072457`
`-2147015593`|Name: **ManagedProcessDeletionError**
Message: `The process is part of a managed solution and cannot be individually deleted. Uninstall the parent solution to remove the process.`|
@@ -2813,6 +2825,7 @@
|`0x8004E123`
`-2147163869`|Name: **OccurrenceSkipsOverBackward**
Message: `Cannot reschedule an occurrence of the recurring appointment if it skips over an earlier occurrence of the same appointment.`|
|`0x8004E122`
`-2147163870`|Name: **OccurrenceSkipsOverForward**
Message: `Cannot reschedule an occurrence of the recurring appointment if it skips over a later occurrence of the same appointment.`|
|`0x8004E121`
`-2147163871`|Name: **OccurrenceTimeSpanTooBig**
Message: `Cannot perform the operation. An instance is outside of series effective expansion range.`|
+|`0x80040c0a`
`-2147218422`|Name: **ODataBatchChangeMultiplePartitionsNotSupported**
Message: `Request in OData $batch operations can't target more than one partition due to changeset transaction requirements. Requested partitions: '{0}'.`|
|`0x80040c00`
`-2147218432`|Name: **ODataBatchChangeSetPartitionedRequestNotSupported**
Message: `Request '{0}' in OData $batch changesets is targeting a remote partition '{1}' instead of local. This is not supported. Please directly execute the $batch operation on targeted organization instead of routing through this one.`|
|`0x80048d19`
`-2147185383`|Name: **ODataClientPayloadError**
Message: `Error identified in Payload provided by the user for Entity :'{0}', For more information on this error please follow this help link {2} ----> InnerException : {1}.`|
|`0x8004B00C`
`-2147176436`|Name: **OfferingCategoryAndTokenNull**
Message: `Offer category and Billing Token are both missing, but at least one is required.`|
@@ -2869,6 +2882,7 @@
|`0x80094007`
`-2146877433`|Name: **OptionSetValuesNotFound**
Message: `Could not find OptionSet values for Table: '{0}', AttributeMetadataId: '{1}'.`|
|`0x80048402`
`-2147187710`|Name: **OptionValuePrefixOutOfRange**
Message: `CustomizationOptionValuePrefix must be a number between {0} and {1}`|
|`0x80048d16`
`-2147185386`|Name: **OrderByColumnsMustBeUnique**
Message: `A column has been specified more than once in the order by list. Columns in the order by list must be unique.`|
+|`0x80040c0d`
`-2147218419`|Name: **OrderByNotSubSequenceOfGroupByInMultiPartitionQuery**
Message: `Order by columns must be a subsequence of group by columns in multi-partition queries.`|
|`0x8004804a`
`-2147188662`|Name: **OrganizationDataServiceDeprecatedError**
Message: `The Organization Data Service (OData v2.0 endpoint) has been removed. Please use the Dataverse Web API (OData v4.0) endpoint instead. See https://go.microsoft.com/fwlink/?linkid=2206384`|
|`0x8004A104`
`-2147180284`|Name: **OrganizationDisabled**
Message: `The Dynamics 365 organization you are attempting to access is currently disabled. Please contact your system administrator`|
|`0x8004B044`
`-2147176380`|Name: **OrganizationMigrationUnderway**
Message: `Organization migration is already underway.`|
@@ -2903,8 +2917,8 @@
|`0x80040361`
`-2147220639`|Name: **OwnerValueNotMapped**
Message: `The owner value is not mapped`|
|`0x80097379`
`-2146864263`|Name: **PackageEntityNotFound**
Message: `Package entity is not found in org, failed to validate dynamics billing context of workflow.`|
|`0x8005F21A`
`-2147093990`|Name: **PageNotFound**
Message: `Page not found. The record might not exist, or the link might be incorrect.`|
-|`0x80097505`
`-2146863867`|Name: **ParallelRequestsToFinOpsNotSupported**
Message: ` Concurrent sdk calls are not allowed. Please work with plugin owner to make sure multiple sdk calls in parallel are not made to avoid this error.`|
-|`0x80048d41`
`-2147185343`|Name: **ParamNotValidDataType**
Message: `The supplied value is not a valid instance of data type. Check the source data for invalid values and update the correct data type. `|
+|`0x80097505`
`-2146863867`|Name: **ParallelRequestsToFinOpsNotSupported**
Message: `Concurrent sdk calls are not allowed. Please work with plugin owner to make sure multiple sdk calls in parallel are not made to avoid this error.`|
+|`0x80048d41`
`-2147185343`|Name: **ParamNotValidDataType**
Message: `The supplied value is not a valid instance of data type. Check the source data for invalid values and update the correct data type.`|
|`0x80041d23`
`-2147214045`|Name: **ParentBusinessDoesNotExist**
Message: `The parent business Id is invalid.`|
|`0x8003F455`
`-2147224491`|Name: **ParentCaseNotAllowedAsAChildCase**
Message: `You can't add a parent case as a child case`|
|`0x80044905`
`-2147202811`|Name: **ParentChildMetricIdDiffers**
Message: `The metricid of child goal should be same as the parent goal.`|
@@ -2937,7 +2951,7 @@
|`0x8004431A`
`-2147204326`|Name: **PicklistValueOutOfRange**
Message: `The picklist value is out of the range.`|
|`0x80049949`
`-2147182263`|Name: **PicklistValueOutOfRangeRecycleBin**
Message: `Picklist value not valid, please add the invalid value back to the picklist before restoring record. See inner exception for details.`|
|`0x8005F212`
`-2147093998`|Name: **PingFailureErrorCode**
Message: `The system couldn't reconnect with your {#Brand_CRM} server.`|
-|`0x8004419e`
`-2147204706`|Name: **PipelineCancellationRequested**
Message: `The operation is cancelled as requested by the source - Sandbox`|
+|`0x8004419e`
`-2147204706`|Name: **PipelineCancellationRequested**
Message: `The request has been cancelled because it originated from a plugin that has already exceeded the 2 minute timeout limit.`|
|`0x80097622`
`-2146863582`|Name: **PlatformNotSupported**
Message: `The specified call has encountered an PlatformNotSupportedException, Retrying the operation may succeed or you can specify a request header "x-ms-select-stable-service" to be directed to the stable endpoint.`|
|`0x80072044`
`-2147016636`|Name: **PlatformSkuLockedForCustomization**
Message: `This is a platform environment and it only allows customizations from authorized Microsoft solutions.`|
|`0x8004418f`
`-2147204721`|Name: **PluginAssemblyContentSizeExceeded**
Message: `"The assembly content size '{0} bytes' has exceeded the maximum value allowed for isolated plug-ins '{1} bytes'."`|
@@ -2960,7 +2974,7 @@
|`0x80091007`
`-2146889721`|Name: **PluginSecureStoreTPSAssemblyNotRegistered**
Message: `Assembly is not registered in TPS`|
|`0x80091009`
`-2146889719`|Name: **PluginSecureStoreTPSClient**
Message: `Unable to create TPS Client`|
|`0x80091006`
`-2146889722`|Name: **PluginSecureStoreTPSKeyVaultUnconfigured**
Message: `KeyVaultURI was not configured for an Assembly in TPS`|
-|`0x80081118`
`-2146954984`|Name: **PluginTypeDisabled**
Message: `Plugin type {0} has been disabled. Please disable the steps registered on this plugin type. To re-enable plugin type, please contact Microsoft Dynamics 365 technical support.`|
+|`0x80081118`
`-2146954984`|Name: **PluginTypeDisabled**
Message: `Plugin type '{0}' has been disabled. Please disable the steps registered on this plugin type. To re-enable plugin type, please contact Microsoft Dynamics 365 technical support.`|
|`0x8004417C`
`-2147204740`|Name: **PluginTypeMustBeUnique**
Message: `Multiple plug-in types from the same assembly and with the same typename are not allowed.`|
|`0x80048116`
`-2147188458`|Name: **POAOperationConcurrentRequested**
Message: `More than one concurrent {0} requests detected for an Entity {1} and ObjectTypeCode {2}.`|
|`0x80090428`
`-2146892760`|Name: **PolymorphicLookupNotSupportedInSolutionAwareEntity**
Message: `The entity '{0}' is solution aware and cannot include the polymorphic lookup.`|
@@ -3010,13 +3024,14 @@
|`0x80041153`
`-2147217069`|Name: **PrivilegeChecker_CannotCreateRoleWithActiveRun**
Message: `Cannot create role using an active privilege checker run.`|
|`0x80041152`
`-2147217070`|Name: **PrivilegeChecker_CannotStartAnotherPrivilegeChecker**
Message: `A Privilege Checker run is already active for the specified user {0}.`|
|`0x80041151`
`-2147217071`|Name: **PrivilegeChecker_FeatureNotReady**
Message: `The Privilege Checker feature is not ready to be used yet.`|
+|`0x80041154`
`-2147217068`|Name: **PrivilegeChecker_OnlyUsersCanUse**
Message: `Only users can be traced for the privilege checker tool.`|
|`0x80040276`
`-2147220874`|Name: **PrivilegeCreateIsDisabledForOrganization**
Message: `Privilege Create is disabled for organization.`|
|`0x80040220`
`-2147220960`|Name: **PrivilegeDenied**
Message: `{5} {2}(Id = {3}) is missing {0} privilege on {1} entity(OTC={4}). Consider adding missing privilege to one of the principal (user/team) roles for the request to succeed.`|
|`0x80045054`
`-2147200940`|Name: **ProcessActionDoesNotExist**
Message: `Process Action does not exist.`|
|`0x80045053`
`-2147200941`|Name: **ProcessActionIsNotActive**
Message: `Process Action should be active to be used on Action Step.`|
|`0x80060379`
`-2147089543`|Name: **ProcessActionNameIncorrect**
Message: `Process Action “{0}” does not match the name configured: “{1}”. Contact your system administrator to check the configuration metadata if the error persists.`|
|`0x80045058`
`-2147200936`|Name: **ProcessActionWithInvalidInputOutputParam**
Message: `Process Action contains a parameter that is not supported. Name: {0}, type: {1}, direction: {2}.`|
-|`0x80045057`
`-2147200937`|Name: **ProcessActionWithInvalidInputParam**
Message: `Process Action contains a field in input parameter that is unsupported on Action Steps. Refer to {0} `|
+|`0x80045057`
`-2147200937`|Name: **ProcessActionWithInvalidInputParam**
Message: `Process Action contains a field in input parameter that is unsupported on Action Steps. Refer to {0}`|
|`0x80045056`
`-2147200938`|Name: **ProcessActionWithInvalidOutputParam**
Message: `Process Action contains a field in output parameter that is unsupported on Action Steps. Refer to {0}.`|
|`0x80060380`
`-2147089536`|Name: **ProcessActionWorkflowNotEnabledForOnDemand**
Message: `Process Action or Workflow must be enabled for on-demand execution to be available for action steps.`|
|`0x80060372`
`-2147089550`|Name: **ProcessControlDoesNotExistOnForm**
Message: `Process Control does not exist on form`|
@@ -3027,7 +3042,7 @@
|`0x80072553`
`-2147015341`|Name: **ProcessImageFailure**
Message: `Error occured when processing image. Reason: {0}`|
|`0x80060370`
`-2147089552`|Name: **ProcessInstanceNotFound**
Message: `Supplied process instance {0} does not match any existing instance on this entity {1}`|
|`0x80060398`
`-2147089512`|Name: **ProcessNameContainsInvalidCharacters**
Message: `The business process name contains invalid characters.`|
-|`0x80060418`
`-2147089384`|Name: **ProcessNameIsNullOrEmpty**
Message: `The business process flow name is NULL or empty. `|
+|`0x80060418`
`-2147089384`|Name: **ProcessNameIsNullOrEmpty**
Message: `The business process flow name is NULL or empty.`|
|`0x80060461`
`-2147089311`|Name: **ProcessStageIdIsEmpty**
Message: `Validation error: Primary Stage ID cannot be empty.`|
|`0x8004F995`
`-2147157611`|Name: **ProductCanOnlyBeUpdatedInDraft**
Message: `Product, product family and bundle can only be updated in draft state.`|
|`0x80061006`
`-2147086330`|Name: **ProductCloneFailed**
Message: `You can't clone a child record of a retired product family.`|
@@ -3062,6 +3077,9 @@
|`0x80061100`
`-2147086080`|Name: **ProfileRuleMissingRuleCriteria**
Message: `You can't activate this rule until you resolve any missing rule criteria information in the rule items.`|
|`0x80061103`
`-2147086077`|Name: **ProfileRulePublishedByOwner**
Message: `Your rule can't be activated until the current active rule is deactivated. The active rule can only be deactivated by the rule owner.`|
|`0x80061101`
`-2147086079`|Name: **ProfileRuleWorkflowAuthorGenericError**
Message: `An error occurred while authoring workflow. Please fix workflow definition and try again.`|
+|`0x80060569`
`-2147089047`|Name: **PromptFieldAdditionNotAllowed**
Message: `More than 5 columns of type Prompt filed are not allowed.`|
+|`0x80060567`
`-2147089049`|Name: **PromptFieldAIModelIDNotValid**
Message: `Provided AIModel Id as part of Formula defination {0} is not guid`|
+|`0x80060568`
`-2147089048`|Name: **PromptFieldDataTypeNotValid**
Message: `The {0} data type isn’t valid for the prompt field.`|
|`0x80160045`
`-2146041787`|Name: **PropertyBoundToNonExistingAttribute**
Message: `Property {0} is bound to a non-existent attribute {1} in entity {2}. More Details:{3}`|
|`0x80160051`
`-2146041775`|Name: **PropertyBoundToNonExistingAttributeInPrimaryAndRelatedEntitiesAndNotExistingAsFormParameter**
Message: `Property {0} is bound to a non-existent attribute {1} in current entity {2} or in related entity {3} and also not present as part of formParameters. More Details:{4}`|
|`0x80160046`
`-2146041786`|Name: **PropertyBoundToNonExistingEntity**
Message: `Property {0} is bound to an attribute in non-existent entity. More Details:{1}`|
@@ -3271,7 +3289,7 @@
|`0x80048469`
`-2147187607`|Name: **RelationshipRoleNodeNumberInvalid**
Message: `There must be two entity relationship role nodes when creating a new many-to-many entity relationship.`|
|`0x80048835`
`-2147186635`|Name: **RelationshipSchemaNameConflictWithFieldNameOnReferencedEntity**
Message: `RelationshipName {0} conflict with attribute name on entity {1} (entityid={2}). Please use unique name for relationship.`|
|`0x80090421`
`-2146892767`|Name: **RelationshipsMissingFromCreatePolymorphicLookupAttribute**
Message: `The OneToManyRelationships property must contain at least one relationship. Lookup attribute name '{0}', Relationships count '{1}'.`|
-|`0x8005F221`
`-2147093983`|Name: **RelatioshipAlreadyExists**
Message: `Selected Relationship {0} for entity already exists in profile under profile item association {1}. `|
+|`0x8005F221`
`-2147093983`|Name: **RelatioshipAlreadyExists**
Message: `Selected Relationship {0} for entity already exists in profile under profile item association {1}.`|
|`0x800608B8`
`-2147088200`|Name: **ReloginRequiredForSharePoint**
Message: `Relogin required. To continue use SharePoint integration, you need to relogin.`|
|`0x8004F075`
`-2147159947`|Name: **RemoveActiveCustomizationsFailedForEntity**
Message: `Entity '{0}' validation failed for property '{1}' which has value '{2}' on Active layer and value '{3}' on solution '{4}' layer. The values must match.`|
|`0x8004F059`
`-2147159975`|Name: **RemoveActiveCustomizationsNotSupported**
Message: `RemoveActiveCustomizations is not supported for components of type {0}.`|
@@ -3314,6 +3332,7 @@
|`0x80044302`
`-2147204350`|Name: **RequestIsNotAuthenticated**
Message: `Request is not authenticated.`|
|`0x8009732B`
`-2146864341`|Name: **RequestIsNotValidCustomApi**
Message: `{0} is not a valid Custom API.`|
|`0x8004418a`
`-2147204726`|Name: **RequestLengthTooLarge**
Message: `Request message length is too large.`|
+|`0x80040c0b`
`-2147218421`|Name: **RequestRequirePartitionId**
Message: `Entity {1} is a partitioned entity. {0} Request requires partition id to be provided.`|
|`0x80081009`
`-2146955255`|Name: **RequiredBundleItemCannotBeUpdated**
Message: `You can't delete this bundle item because it's a required product in the bundle.`|
|`0x80081008`
`-2146955256`|Name: **RequiredBundleProductCannotBeDeleted**
Message: `You can't delete this product record because it's a required product in a bundle.`|
|`0x8004F029`
`-2147160023`|Name: **RequiredChildReportHasOtherParent**
Message: `A category option for the reports was not found.`|
@@ -3325,14 +3344,14 @@
|`0x80160032`
`-2146041806`|Name: **RequiredPropertyDeclarationIsMissing**
Message: `Property {0} is required, but the declaration is missing. More Details:{1}`|
|`0x8004F600`
`-2147158528`|Name: **RequireValidImportMapForUpdate**
Message: `The update operation cannot be completed because the import map used for the update is invalid.`|
|`0x80005050`
`-2147463088`|Name: **RestoreJobInvalid**
Message: `Deleted item reference or bulk restore job not found for job id '{0}'`|
-|`0x80072533`
`-2147015373`|Name: **RestrictCustomPluginForVE**
Message: `Custom plugins are not allowed for Virtual Entity. `|
+|`0x80072533`
`-2147015373`|Name: **RestrictCustomPluginForVE**
Message: `Custom plugins are not allowed for Virtual Entity.`|
|`0x8004F022`
`-2147160030`|Name: **RestrictedSolutionName**
Message: `The solution unique name '{0}' is restricted and can only be used by internal solutions.`|
|`0x8004A121`
`-2147180255`|Name: **RestrictedToAccessCDSLiteNonOdataEndpoint**
Message: `The Application with Id:{appId} can only use Odata endpoint to access APIs of Dataverse for Teams organization.`|
|`0x80044152`
`-2147204782`|Name: **RestrictInheritedRole**
Message: `Inherited roles cannot be modified.`|
|`0x80097260`
`-2146864544`|Name: **RestrictNotSupportedDueToElasticTableInParentGraph**
Message: `Restrict configuration for delete is not supported as there is a cascade relationship between elastic table {0} and sql table {1}.`|
|`0x80090303`
`-2146893053`|Name: **RestrictSynchronousCustomPluginForVECUDEvents**
Message: `Only Asynchronous plugin steps are allowed for virtual entity external events.`|
-|`0x80072535`
`-2147015371`|Name: **RestrictVEInBatch**
Message: `Write operation for Virtual Entity is not allowed in Batch request. `|
-|`0x80072534`
`-2147015372`|Name: **RestrictVEPluginOnNestedPipelineAtRunTime**
Message: `Custom plugin execution is not allowed in nested pipeline for Virtual Entity. `|
+|`0x80072535`
`-2147015371`|Name: **RestrictVEInBatch**
Message: `Write operation for Virtual Entity is not allowed in Batch request.`|
+|`0x80072534`
`-2147015372`|Name: **RestrictVEPluginOnNestedPipelineAtRunTime**
Message: `Custom plugin execution is not allowed in nested pipeline for Virtual Entity.`|
|`0x80097250`
`-2146864560`|Name: **RetainNotSupportedForSQLAudits**
Message: `Retain is not supported for SQL Audits.`|
|`0x80048d22`
`-2147185374`|Name: **RetentionDisabledOrg**
Message: `Your admin has disabled long term retention for this environment. Please contact your admin to enable an environment for long term retention.`|
|`0x80048d28`
`-2147185368`|Name: **RetentionPolicyRescheduleError**
Message: `The parameter entered is invalid. Parameter name: {0}`|
@@ -3458,17 +3477,18 @@
|`0x80043800`
`-2147207168`|Name: **SalesPeopleEmptySalesPerson**
Message: `Parent salesperson cannot be empty`|
|`0x80043805`
`-2147207163`|Name: **SalesPeopleManagerNotAllowed**
Message: `Territory manager cannot belong to other territory`|
|`0x80072007`
`-2147016697`|Name: **SameSolutionCircularDependenciesIdentified**
Message: `Circular dependencies were identified for this solution.`|
-|`0x80048840`
`-2147186624`|Name: **SampleDataIsNotUninstalled**
Message: `InitialSolutionSampleDataState is not Uninstalled. :{0} `|
+|`0x80048840`
`-2147186624`|Name: **SampleDataIsNotUninstalled**
Message: `InitialSolutionSampleDataState is not Uninstalled. :{0}`|
|`0x80044171`
`-2147204751`|Name: **SandboxClientPluginTimeout**
Message: `The plug-in execution failed because the operation has timed-out at the Sandbox Client.`|
|`0x8004418e`
`-2147204722`|Name: **SandboxHostNotAvailable**
Message: `The plug-in execution failed because no Sandbox Hosts are currently available. Please check that you have a Sandbox server configured and that it is running.`|
|`0x80044172`
`-2147204750`|Name: **SandboxHostPluginTimeout**
Message: `The plug-in execution failed because the operation has timed-out at the Sandbox Host.`|
|`0x80044194`
`-2147204716`|Name: **SandboxHostSubnetDelegationFailed**
Message: `The plug-in execution failed because your organization's subnet delegation configuration may be incorrect. To fix the configuration, contact your tenant administrator. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2195693`|
+|`0x8004029B`
`-2147220837`|Name: **SandboxMessageSizeExceeded**
Message: `"Message size exceeded when sending context to Sandbox. Message size: '{0}'Mb"`|
|`0x80081115`
`-2146954987`|Name: **SandboxPluginDisabled**
Message: `Sandbox Plug-in execution is disabled.`|
|`0x80044174`
`-2147204748`|Name: **SandboxSdkListenerStartFailed**
Message: `The plug-in execution failed because the Sandbox Client encountered an error during initialization.`|
|`0x8004418d`
`-2147204723`|Name: **SandboxWorkerNotAvailable**
Message: `The plug-in execution failed because the Sandbox Worker process crashed. This is typically due to an error in the plug-in code. Please refer to this document: https://go.microsoft.com/fwlink/?linkid=2189390`|
|`0x80081111`
`-2146954991`|Name: **SandboxWorkerPluginExecuteTimeout**
Message: `Didn’t receive a response from the {0} plug-in within the 2:20-minute limit.`|
|`0x80044173`
`-2147204749`|Name: **SandboxWorkerPluginTimeout**
Message: `The plug-in execution failed because the operation has timed-out at the Sandbox Worker.`|
-|`0x80081116`
`-2146954986`|Name: **SandboxWorkerThrottleLimit**
Message: `Maximum processes allocated for plug-in business logic exceeded. Fatal errors in plug-ins for this environment have occurred {0} times in the last {1} minutes. Each error requires an additional process to recover. Processes for plug-ins are being recycled. All plug-ins for this environment will fail during this period. More information: https://go.microsoft.com/fwlink/?linkid=2038718 `|
+|`0x80081116`
`-2146954986`|Name: **SandboxWorkerThrottleLimit**
Message: `Maximum processes allocated for plug-in business logic exceeded. Fatal errors in plug-ins for this environment have occurred {0} times in the last {1} minutes. Each error requires an additional process to recover. Processes for plug-ins are being recycled. All plug-ins for this environment will fail during this period. More information: https://go.microsoft.com/fwlink/?linkid=2038718`|
|`0x8004026b`
`-2147220885`|Name: **SaveAsDraftAppointmentNotAllowed**
Message: `AllowSaveAsDraftAppointment is turned off.`|
|`0x8005F209`
`-2147094007`|Name: **SaveDataFileErrorOutOfSpace**
Message: `Try this action again. If the problem continues, check the {0} for solutions or contact your organization's {#Brand_CRM} Administrator. Finally, you can contact {1}.`|
|`0x80047017`
`-2147192809`|Name: **SavedQueryIsNotCustomizable**
Message: `The specified view is not customizable`|
@@ -3559,7 +3579,7 @@
|`0x8004F0F4`
`-2147159820`|Name: **SharePointUnableToRetrieveGroup**
Message: `Unable to retrieve the group {0} from SharePoint.`|
|`0x8004F301`
`-2147159295`|Name: **SharePointUrlHostValidator**
Message: `The URL cannot be resolved into an IP.`|
|`0x8004F306`
`-2147159290`|Name: **SharePointUrlIsRootWebValidator**
Message: `The URL is not valid. The URL must be a valid site collection and cannot include a subsite. The URL must be in a valid form, such as http://SharePointServer/sites/CrmSite.`|
-|`0x800608B6`
`-2147088202`|Name: **SharePointVersionUnsupported**
Message: `Microsoft Dynamics 365 cannot connect to Sharepoint as the Sharepoint Version is unsupported. Install the correct version, and then try again. `|
+|`0x800608B6`
`-2147088202`|Name: **SharePointVersionUnsupported**
Message: `Microsoft Dynamics 365 cannot connect to Sharepoint as the Sharepoint Version is unsupported. Install the correct version, and then try again.`|
|`0x80071016`
`-2147020778`|Name: **SimilarityRuleDisabled**
Message: `No similarity rule active for this entity.`|
|`0x80071018`
`-2147020776`|Name: **SimilarityRuleFCBOff**
Message: `Similarity rules not enabled.`|
|`0x80160040`
`-2146041792`|Name: **SimplePropertyCannotHaveChildNodes**
Message: `Simple property {0} cannot have child nodes. More Details:{1}`|
@@ -3586,16 +3606,16 @@
|`0x80071151`
`-2147020463`|Name: **SolutionConcurrencyFailure**
Message: `The solution installation or removal failed due to the installation or removal of another solution at the same time. Please try again later.`|
|`0x8004701C`
`-2147192804`|Name: **SolutionConfigurationPageMustBeHtmlWebResource**
Message: `The solution configuration page must exist within the solution it represents.`|
|`0x8004F080`
`-2147159936`|Name: **SolutionContextNotSupported**
Message: `This method doesn't only support SolutionContexts used to install managed solutions. Unsupported: [{0}]`|
-|`0x80040c04`
`-2147218428`|Name: **SolutionDeleteNotPermittedOnSecondary**
Message: ` Solution '{0}' with version '{1}' is present organization(s) with ID(s) '{2}'. Solution should be deleted on primary and on organizationss with higher secondary index before the current secondary organization.`|
+|`0x80040c04`
`-2147218428`|Name: **SolutionDeleteNotPermittedOnSecondary**
Message: `Solution '{0}' with version '{1}' in mode '{2}' exists on secondary organization(s) with id(s) '{3}'. Solution should be deleted on primary and on organizationss with higher secondary index before the current secondary organization.`|
|`0x80048543`
`-2147187389`|Name: **SolutionImportCauseTimeout**
Message: `The operation timed out. This may be because a solution is currently being imported into this environment. Please try again after the solution import is completed. Solutions should be imported outside of working hours if possible.`|
-|`0x80040c01`
`-2147218431`|Name: **SolutionInstallNotPermitted**
Message: ` Solution '{0}' with version '{1}' is missing on secondary organization(s) with id(s) '{2}'. Solution should be applied on all secondary organizations before primary.`|
+|`0x80040c01`
`-2147218431`|Name: **SolutionInstallNotPermitted**
Message: `Solution '{0}' with version '{1}' in mode '{2}' is missing on secondary organization(s) with id(s) '{3}'. Solution should be applied on floor secondary organization before install.`|
|`0x80072003`
`-2147016701`|Name: **SolutionRestrictedAttributes**
Message: `Component cannot be created because it already has solution-aware columns. Entity: {0}, Existing Attribute: {1}`|
|`0x80097603`
`-2146863613`|Name: **SolutionSignatureVerifiedRequired**
Message: `Digital Signature verification required for importing solution with name {0} and publisher name {1}.`|
|`0x8004F023`
`-2147160029`|Name: **SolutionUniqueNameViolation**
Message: `The solution unique name '{0}' is already being used and cannot be used again.`|
-|`0x80040c02`
`-2147218430`|Name: **SolutionUpdateNotPermitted**
Message: ` Solution '{0}' with version '{1}' is missing on active secondary organization(s) with ID(s) '{2}' that have a lower secondary index than the current one. The solution must be applied to these secondary organizations before update.`|
+|`0x80040c02`
`-2147218430`|Name: **SolutionUpdateNotPermitted**
Message: `Solution '{0}' with version '{1}' in mode '{2}' is missing on secondary organization(s) with id(s) '{3}'. Solution should be applied on floor secondary organization before update.`|
|`0x8004F046`
`-2147159994`|Name: **SolutionUpgradeFailed**
Message: `Solution Upgrade action failed after import as holding. InnerException is: {1}.`|
|`0x8004853B`
`-2147187397`|Name: **SolutionUpgradeNotAvailable**
Message: `"The {0} solution doesn’t have an upgrade that is ready to be applied."`|
-|`0x80040c03`
`-2147218429`|Name: **SolutionUpgradeNotPermitted**
Message: ` Solution '{0}' with version '{1}' is missing on active secondary organization(s) with ID(s) '{2}' that have a lower secondary index than the current one. The solution must be applied to these secondary organizations before upgrade.`|
+|`0x80040c03`
`-2147218429`|Name: **SolutionUpgradeNotPermitted**
Message: `Solution '{0}' with version '{1}' in mode '{2}' is missing on secondary organization(s) with id(s) '{3}'. Solution should be applied on floor secondary organization before upgrade.`|
|`0x8004803C`
`-2147188676`|Name: **SolutionUpgradeOfApiManagedSolutionError**
Message: `The import has failed because an ApiManaged solution cannot be updated.`|
|`0x8004853C`
`-2147187396`|Name: **SolutionUpgradeWrongSolutionSelected**
Message: `"To use this action, you must first select the old solution and then try again."`|
|`0x80044340`
`-2147204288`|Name: **SourceAttributeHeaderTooBig**
Message: `Column headers must be 160 or fewer characters. Fix the column headers, and then run Data Migration Manager again.`|
@@ -3604,7 +3624,7 @@
|`0x8004033d`
`-2147220675`|Name: **SourceEntityMappedToMultipleTargets**
Message: `This source entity is mapped to more than one Microsoft Dynamics 365 entity. Remove any duplicate mappings, and then import this data map again.`|
|`0x8006072A`
`-2147088598`|Name: **SPAccountNameFetchFailure**
Message: `Exception occured while fetching account name from Sharepoint.`|
|`0x80060760`
`-2147088544`|Name: **SPAllFilesErrorScenario**
Message: `One or more sites in all files view of SharePointDocument failed.`|
-|`0x8006070A`
`-2147088630`|Name: **SPBadLockInFileCollectionErrorCode**
Message: `The file in the collection has bad lock `|
+|`0x8006070A`
`-2147088630`|Name: **SPBadLockInFileCollectionErrorCode**
Message: `The file in the collection has bad lock`|
|`0x80060767`
`-2147088537`|Name: **SPCertificationError**
Message: `S2STokenIssuer certificate not found.`|
|`0x80060761`
`-2147088543`|Name: **SPConnectionFailure**
Message: `Failed to connect to SharePointSite.`|
|`0x80060720`
`-2147088608`|Name: **SPCurrentDocumentLocationDisabledErrorCode**
Message: `Current document location is disabled by administrator`|
@@ -3709,6 +3729,9 @@
|`0x80048292`
`-2147188078`|Name: **SrsDataConnectorNotInstalledUpload**
Message: `This report can’t upload because Dynamics 365 Reporting Extensions, required components for reporting, are not installed on the server that is running Microsoft SQL Server Reporting Services.`|
|`0x80072570`
`-2147015312`|Name: **SSM_MaxPCI_Exceeded**
Message: `Please re-login to refresh your session.`|
|`0x80072571`
`-2147015311`|Name: **SSM_RefreshToken_Failed**
Message: `Failed to refresh login session.`|
+|`0x8005E280`
`-2147097984`|Name: **SSSACSEndpointUrlUpdateRequiresExchangeOrTenantAdmin**
Message: `The Azure Communication Service (ACS) Endpoint URL must be supplied by an Exchange Administrator or Office 365 Global Administrator. Please see https://go.microsoft.com/fwlink/?linkid=2306201 to learn more.`|
+|`0x8005E281`
`-2147097983`|Name: **SSSACSInvalidDeploymentType**
Message: `Azure Communication Service (ACS) integration is only available for Online deployments. Please see https://go.microsoft.com/fwlink/?linkid=2306201 to learn more.`|
+|`0x8005E279`
`-2147097991`|Name: **SSSACSInvalidEmailServerProfileType**
Message: `Azure Communication Service (ACS) integration can only be enabled for Exchange Online email server profiles. Please see https://go.microsoft.com/fwlink/?linkid=2306201 to learn more.`|
|`0x8005E278`
`-2147097992`|Name: **SSSGmailSignInInvalidRedirectUri**
Message: `Sign-in failed due to an invalid or missing redirect uri specified in the associated Google web application client configuration. For more information on how to fix this error, see https://go.microsoft.com/fwlink/?linkid=2292432`|
|`0x80060451`
`-2147089327`|Name: **StageEntityIsNull**
Message: `Validation error: stage entity cannot be null.`|
|`0x80060454`
`-2147089324`|Name: **StageIdIsEmpty**
Message: `Validation error: Stage ID cannot be empty.`|
@@ -3719,7 +3742,7 @@
|`0x80097700`
`-2146863360`|Name: **StageSolutionUnmanagedRootsConversionWarning**
Message: `One or more components in the solution already exist in your system as unmanaged components. Importing this solution will convert the components into managed components for this solution. Warning: Any customizations that your organization has made to these components will be lost. After the import operation is complete, managed solutions from other solution publishers will be unable to update these components.`|
|`0x80060470`
`-2147089296`|Name: **StandAloneBpfNotActivated**
Message: `Stand Alone BPF must be activated on Flows page.`|
|`0x80055006`
`-2147135482`|Name: **StandardSlaTypeNotApplicable**
Message: `Standard SLA Type is only supported for incident entity. Current entity object type code is {0}. Please pass appropriate SLA Type or entity`|
-|`0x80048d21`
`-2147185375`|Name: **StatementConflictedWithAConstraint**
Message: `Statement conflicted with a constraint. `|
+|`0x80048d21`
`-2147185375`|Name: **StatementConflictedWithAConstraint**
Message: `Statement conflicted with a constraint.`|
|`0x8004F857`
`-2147157929`|Name: **StateTransitionActivateNewStatus**
Message: `You can't activate this record because of the status transition rules.Contact your system administrator.`|
|`0x8004F855`
`-2147157931`|Name: **StateTransitionActiveToCanceled**
Message: `Because of the status transition rules, you can't cancel the case in the current status.Change the case status, and then try canceling it, or contact your system administrator.`|
|`0x8004F854`
`-2147157932`|Name: **StateTransitionActiveToResolve**
Message: `Because of the status transition rules, you can't resolve a case in the current status.Change the case status, and then try resolving it, or contact your system administrator.`|
@@ -3740,6 +3763,13 @@
|`0x8004D292`
`-2147167598`|Name: **StringAttributeIndexError**
Message: `One of the attributes of the selected entity is a part of database index and so it cannot be greater than 900 bytes.`|
|`0x80044331`
`-2147204303`|Name: **StringLengthTooLong**
Message: `A validation error occurred. A string value provided is too long.`|
|`0x80090429`
`-2146892759`|Name: **StringOrBinaryTruncation**
Message: `String or binary data would be truncated in table '{0}', column '{1}'. Truncated value: {2}.`|
+|`0x80090929`
`-2146891479`|Name: **StubUserImpersonationCreationUnauthorized**
Message: `Impersonable Stub Users can only be created by authorized applications. Contact your system administrator for assistance.`|
+|`0x80090924`
`-2146891484`|Name: **StubUserImpersonationEnablementUnauthorized**
Message: `Impersonation for Stub Users can only be set by authorized applications. Contact your system administrator for assistance.`|
+|`0x80090927`
`-2146891481`|Name: **StubUserImpersonationFeatureNotEnabled**
Message: `This operation couldn't be completed because the Stub User Impersonation feature isn’t enabled for your organization.`|
+|`0x80090928`
`-2146891480`|Name: **StubUserImpersonationInvalidUserConfiguration**
Message: `Impersonable Stub Users can only be created in disabled state.`|
+|`0x80090926`
`-2146891482`|Name: **StubUserImpersonationInvalidUserType**
Message: `Updated value of SystemManagedUserType={0} is not permitted.`|
+|`0x80090923`
`-2146891485`|Name: **StubUserImpersonationMustToggleStandalone**
Message: `Toggling impersonation for a Stub User must be done in a standalone Update request. Modify other user attributes in another Update request.`|
+|`0x80090925`
`-2146891483`|Name: **StubUserImpersonationUnauthorized**
Message: `User with SystemUserId={0}, IsDisabled={1} and SystemManagedUserType={2} is not valid for toggling Stub User Impersonation.`|
|`0x80048537`
`-2147187401`|Name: **SubcomponentDoesNotExist**
Message: `Subcomponent {0} of type {1} is not found in the organization, it can not be added to the SolutionComponents.`|
|`0x80048536`
`-2147187402`|Name: **SubcomponentMissingARoot**
Message: `Subcomponent {0} cannot be added to the solution because the root component {1} is missing.`|
|`0x80043e02`
`-2147205630`|Name: **SubjectDoesNotExist**
Message: `Subject does not exist.`|
@@ -3762,6 +3792,7 @@
|`0x8004F657`
`-2147158441`|Name: **SystemFormCopyUnmatchedFormType**
Message: `The form type of the SourceId is not valid for the Target entity.`|
|`0x8004F658`
`-2147158440`|Name: **SystemFormCreateWithExistingLabel**
Message: `The id '{0}' for label '{1}' in the form with id: '{2}' is already in use by another form. Replace the id with a different unique value.`|
|`0x8004F655`
`-2147158443`|Name: **SystemFormImportMissingRoles**
Message: `The unmanaged solution you are importing has displaycondition XML attributes that refer to security roles that are missing from the target system. Any displaycondition attributes that refer to these security roles will be removed.`|
+|`0x80090921`
`-2146891487`|Name: **SystemUserAttributeUpdateNotAllowedFromCreate**
Message: `SystemUser updates from plugins registered on PostCreate of SystemUser are not allowed to change certain attributes ({1}), as their values could depend on components which are not yet created. Consider making the updates async.`|
|`0x8004A112`
`-2147180270`|Name: **SystemUserDisabled**
Message: `The system user was disabled therefore the ticket expired.`|
|`0x80044357`
`-2147204265`|Name: **SystemUserUpdateNotAllowedFromCreate**
Message: `SystemUser updates are not allowed from plugins registered on PostCreate of SystemUser as it could depend on components which are not yet created. Consider making them async.`|
|`0x8009049E`
`-2146892642`|Name: **TableTypeMismatch**
Message: `There is a mismatch of values among TableType '{0}', DataProviderId '{1}' and DataSourceId '{2}'.`|
@@ -3914,7 +3945,7 @@
|`0x800404c4`
`-2147220284`|Name: **unManagederrorprocessingfilternodes**
Message: `An unexpected error occurred processing the filter nodes.`|
|`0x800404ae`
`-2147220306`|Name: **unManagedfieldnotvalidatedbyplatform**
Message: `A field was not validated by the platform.`|
|`0x800404ab`
`-2147220309`|Name: **unManagedfilterindexoutofrange**
Message: `The filter index is out of range.`|
-|`0x80048306`
`-2147187962`|Name: **unManagedIdsAccessDenied**
Message: `{0} with id {1} does not have {2} right(s) for record with id {3} of entity {4}. Consider assigning a role with the required access level to the user or team. For further troubleshooting, please work with a system administrator to use the Access Checker tool on this record: {5}. More details: {6}`|
+|`0x80048306`
`-2147187962`|Name: **unManagedIdsAccessDenied**
Message: `{0} with id {1} does not have {2} right(s) for record with id {3} of entity {4}. Consider assigning a role with the {7} level to the user or team. For further troubleshooting, please work with a system administrator to use the Access Checker tool on this record: {5}. More details: {6}`|
|`0x80040511`
`-2147220207`|Name: **unManagedidsaccounthaschildopportunities**
Message: `The Account has child opportunities.`|
|`0x8004350a`
`-2147207926`|Name: **unManagedidsactivitydurationdoesnotmatch**
Message: `Activity duration does not match start/end time`|
|`0x80043509`
`-2147207927`|Name: **unManagedidsactivityinvalidduration**
Message: `Invalid activity duration`|
@@ -4347,7 +4378,7 @@
|`0x80041d24`
`-2147214044`|Name: **UserLoopExists**
Message: `A manager for this user cannot be set because an existing relationship in the management hierarchy is causing a circular relationship. This is usually caused by a manual edit of the Microsoft Dynamics 365 database. To fix this, the hierarchy in the database must be changed to remove the circular relationship.`|
|`0x8005E24D`
`-2147098035`|Name: **UserNameRequiredForImpersonation**
Message: `Type in a user name and save again`|
|`0x8005F111`
`-2147094255`|Name: **UserNeverLoggedIntoYammer**
Message: `To follow other users, you must be logged in to Yammer. Log in to your Yammer account, and try again.`|
-|`0x8004D24B`
`-2147167669`|Name: **UserNotAssignedLicense**
Message: `The user(Id = {0}, accessMode = {1}) has not been assigned any License. Please contact your system administrator to assign license to this user for the action to succeed.`|
+|`0x8004D24B`
`-2147167669`|Name: **UserNotAssignedLicense**
Message: `The user(Id = {0}, accessMode = {1}) has not been assigned any License. Please contact your system administrator to assign license to this user for the action to succeed. Additional Details: {2}`|
|`0x80042f09`
`-2147209463`|Name: **UserNotAssignedRoles**
Message: `The user (Id = {0}) has not been assigned any roles.`|
|`0x80048d29`
`-2147185367`|Name: **UserNotAuthorized**
Message: `Not authorized to perform this operation.`|
|`0x80041d07`
`-2147214073`|Name: **UserNotInParentHierarchy**
Message: `The user is not in parent user's business hierarchy.`|
diff --git a/powerapps-docs/developer/data-platform/logging-tracing.md b/powerapps-docs/developer/data-platform/logging-tracing.md
index a284390628..1faa9f8d73 100644
--- a/powerapps-docs/developer/data-platform/logging-tracing.md
+++ b/powerapps-docs/developer/data-platform/logging-tracing.md
@@ -1,9 +1,9 @@
---
title: "Logging and tracing (Microsoft Dataverse) | Microsoft Docs"
description: "Use the plugin trace log to store plug-in execution information to aid in plug-in debugging."
-ms.date: 04/22/2024
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: concept-article
ms.subservice: dataverse-developer
@@ -27,24 +27,24 @@ Recording of run-time tracing information for Microsoft Dataverse is provided by
This data can be found in model-driven applications by navigating to **Settings** and choosing the **Plug-in Trace Log** tile. The tile is only visible if you have access to the trace log table records in your assigned security role.
- You may find it easier to view this data by using the Web API in your browser using the example shown in [Use Tracing](debug-plug-in.md#use-tracing) or by using the [Plug-in trace viewer](#plug-in-trace-viewer) community tool.
+ You may find it easier to view this data by using the Web API in your browser using the example shown in [Use Tracing](debug-plug-in.md#use-tracing) or by using the [Plugin Trace Viewer](#plugin-trace-viewer) community tool.
> [!IMPORTANT]
> Trace logging takes up organization storage space especially when many traces and exceptions are generated. You should only turn trace logging on for debugging and troubleshooting, and turn it off after your investigation is completed.
- **Error dialog**
- A synchronous registered plug-in or custom workflow activity that returns an exception from the platform results in an error dialog box in the web application presented to the logged on user. The user may select the **Download Log File** button in the dialog to view the log containing exception and trace output.
+ A synchronous registered plug-in or custom workflow activity that returns an exception from the platform results in an error dialog box in the web application presented to the logged on user. The user can select the **Download Log File** button in the dialog to view the log containing exception and trace output.
- **System job**
- For asynchronous registered plug-in or custom workflow activities that returns an exception, the tracing information is shown in the **Details** area of the **System Job** form in the web application.
+ For asynchronous registered plug-in or custom workflow activities that return an exception, the tracing information is shown in the **Details** area of the **System Job** form in the web application.
## Enable trace logging
-Whether trace logs will be written depends on the value of the [Organization](./reference/entities/organization.md) table [PluginTraceLogSetting](./reference/entities/organization.md#BKMK_PluginTraceLogSetting) column value. You can enable trace logging by programmatically updating the `PluginTraceLogSetting` value.
+Whether trace logs are written depends on the value of the [Organization](./reference/entities/organization.md) table [PluginTraceLogSetting](./reference/entities/organization.md#BKMK_PluginTraceLogSetting) column value. You can enable trace logging by programmatically updating the `PluginTraceLogSetting` value.
A second method to enable trace logging is through the legacy web application. Navigate to **Settings** > **Administration** > **System Settings**. In the **Customization** tab, locate the drop-down menu labeled **Enable logging to plug-in trace log** and select one of the available options. More information: [Settings in Unified Interface apps](/power-platform/admin/admin-settings#settings-in-unified-interface-apps), [Settings in legacy web client apps](/power-platform/admin/admin-settings#settings-in-legacy-web-client-apps)
@@ -52,7 +52,7 @@ A third option can be found in the Plug-in Registration tool. After connecting t
|Value|Option|Description|
|------------|-----------------|-----------------|
-|0|Off|Writing to the trace log is disabled. No **PluginTraceLog** records will be created. However, custom code can still call the method even though no log is written.|
+|0|Off|Writing to the trace log is disabled. No **PluginTraceLog** records are created. However, custom code can still call the method even though no log is written.|
|1|Exceptions|Trace information is written to the log if an exception is passed back to the platform from custom code.|
|2|All|Trace information is written to the log upon code completion or an exception is passed back to the platform from the custom code.|
@@ -60,7 +60,7 @@ If the trace logging setting is set to **Exception** and your custom code return
## Write to the tracing service
-Before writing to the tracing service, you must first extract the tracing service object from the passed execution context. Afterwards, simply add calls to your custom code where appropriate passing any relevant diagnostic information in that method call.
+Before writing to the tracing service, you must first extract the tracing service object from the passed execution context. Afterwards, add calls to your custom code where appropriate passing any relevant diagnostic information in that method call.
```csharp
//Extract the tracing service for use in debugging plug-ins.
@@ -72,16 +72,16 @@ Before writing to the tracing service, you must first extract the tracing servic
```
-Next, build and deploy the plug-in or custom workflow activity. During execution of the custom code, the information provided in the **Trace** method calls is written to a trace log table record by , if supported by your organization and enabled, and may also be made available to the user in a Web dialog or system job as described in the previous section. Tracing information written to the trace log is configured in the trace settings. For more information see [Enable trace logging](#bkmk_trace-settings).
+Next, build and deploy the plug-in or custom workflow activity. During execution of the custom code, the information provided in the **Trace** method calls is written to a trace log table record by , if supported by your organization and enabled, and might also be made available to the user in a Web dialog or system job as described in the previous section. Tracing information written to the trace log is configured in the trace settings. For more information, see [Enable trace logging](#bkmk_trace-settings).
> [!NOTE]
-> If your custom code executes within a database transaction, and an exception occurs that causes a transaction rollback, all table data changes by your code will be undone. However, the [PluginTraceLog](reference/entities/plugintracelog.md) records will remain after the rollback completes.
+> If your custom code executes within a database transaction, and an exception occurs that causes a transaction rollback, all table data changes by your code are undone. However, the [PluginTraceLog](reference/entities/plugintracelog.md) records will remain after the rollback completes.
## Additional information about the tracing service
The batches the information provided to it through the **Trace** method. The information is written to a new [PluginTraceLog](reference/entities/plugintracelog.md) record after the custom code successfully runs to completion or an exception is thrown.
-Each `Trace` call is logged as a new line in the [PluginTraceLog](reference/entities/plugintracelog.md) [MessageBlock](reference/entities/plugintracelog.md#BKMK_MessageBlock) column. Only 10kb of text can be written. Older trace lines will be removed to meet this limit so that only the most recent lines will be saved.
+Each `Trace` call is logged as a new line in the [PluginTraceLog](reference/entities/plugintracelog.md) [MessageBlock](reference/entities/plugintracelog.md#BKMK_MessageBlock) column. Only 10 kb of text can be written. Older trace lines are removed to meet this limit so that only the most recent lines are saved.
[PluginTraceLog](reference/entities/plugintracelog.md) records have a finite lifetime. A bulk deletion background job runs once per day to delete records that are older than 24 hours from creation.
@@ -90,13 +90,13 @@ Each `Trace` call is logged as a new line in the [PluginTraceLog](reference/enti
## Community tools
-### Plug-in trace viewer
+### Plugin Trace Viewer
-**Plug-in Trace Viewer** is a tool that XrmToolbox community developed. Please see the [Community tools for Dataverse](community-tools.md) topic for community developed tools.
+**[Plugin Trace Viewer](https://jonasr.app/PTV)** is a tool that XrmToolBox community developed. Please see the [Community tools for Dataverse](community-tools.md) topic for community developed tools.
> [!NOTE]
-> The community tools are not a product of Microsoft and does not extend support to the community tools.
-> If you have questions pertaining to the tool, please contact the publisher. More Information: [XrmToolBox](https://www.xrmtoolbox.com).
+> Microsoft doesn't extend support to community tools.
+> If you have questions pertaining to the tool, contact the publisher. More Information: [XrmToolBox](https://www.xrmtoolbox.com).
### See also
diff --git a/powerapps-docs/developer/data-platform/long-term-retention.md b/powerapps-docs/developer/data-platform/long-term-retention.md
index 4ce30d74ae..2414b99036 100644
--- a/powerapps-docs/developer/data-platform/long-term-retention.md
+++ b/powerapps-docs/developer/data-platform/long-term-retention.md
@@ -3,8 +3,8 @@ title: Long-term data retention
description: Learn how to use retention policies to transfer data from your Microsoft Dataverse transactional database to a managed data lake for cost-efficient long-term storage.
ms.date: 12/12/2024
ms.topic: how-to
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.subservice: dataverse-developer
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/media/fieldsecurityprofile-erd.png b/powerapps-docs/developer/data-platform/media/fieldsecurityprofile-erd.png
new file mode 100644
index 0000000000..b79d4d371d
Binary files /dev/null and b/powerapps-docs/developer/data-platform/media/fieldsecurityprofile-erd.png differ
diff --git a/powerapps-docs/developer/data-platform/media/maskingrule-attributemaskingrule-erd.png b/powerapps-docs/developer/data-platform/media/maskingrule-attributemaskingrule-erd.png
new file mode 100644
index 0000000000..d65b0271cd
Binary files /dev/null and b/powerapps-docs/developer/data-platform/media/maskingrule-attributemaskingrule-erd.png differ
diff --git a/powerapps-docs/developer/data-platform/optional-parameters.md b/powerapps-docs/developer/data-platform/optional-parameters.md
index 3f58ccc5c8..ed0e890837 100644
--- a/powerapps-docs/developer/data-platform/optional-parameters.md
+++ b/powerapps-docs/developer/data-platform/optional-parameters.md
@@ -1,12 +1,12 @@
---
title: "Use optional parameters (Microsoft Dataverse) | Microsoft Docs"
description: "Use optional parameters to control operation behaviors"
-ms.date: 07/01/2024
+ms.date: 06/20/2025
ms.reviewer: jdaly
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -20,7 +20,7 @@ contributors:
Dataverse provides a set of optional parameters or request header values a developer of a client application can use to modify the behavior of individual requests. This article describes the parameter values and request headers that you can use to get the behaviors you need.
> [!NOTE]
-> This article introduces these parameters but does not explain them in depth. Please follow the links for more information to fully understand the scenarios for using these parameters.
+> This article introduces these parameters but doesn't explain them in depth. Follow the links for more information to fully understand the scenarios for using these parameters.
## How to use
@@ -28,21 +28,21 @@ How you use these optional parameters depends on whether you're using the Datave
### [SDK for .NET](#tab/sdk)
-Usually, you will add the parameter to the [OrganizationRequest.Parameters Collection](xref:Microsoft.Xrm.Sdk.OrganizationRequest.Parameters) of the named request class.
+Usually, you'll add the parameter to the [OrganizationRequest.Parameters Collection](xref:Microsoft.Xrm.Sdk.OrganizationRequest.Parameters) of the named request class.
> [!NOTE]
-> You cannot specify these parameters using the 7 shortcut methods exposed with the . You must use the named request class with the [IOrganizationService.Execute method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A).
+> You can't specify these parameters using the seven shortcut methods exposed with the . You must use the named request class with the [IOrganizationService.Execute method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A).
-One exception is when setting the `partitionid`, this is set as an attribute of the entity instance. More information: [Perform a data operation with specified partition](#perform-a-data-operation-with-specified-partition)
+One exception is when setting the `partitionid`. The `partitionid` is set as an attribute of the entity instance. More information: [Perform a data operation with specified partition](#perform-a-data-operation-with-specified-partition)
More information:
- [Use messages with the SDK for .NET](org-service/use-messages.md)
-- See the examples below
+- See the following examples
### [Web API](#tab/webapi)
-Usually, you'll add the parameter as a request header with the `MSCRM.` namespace.
+Usually, you add the parameter as a request header with the `MSCRM.` namespace.
Two exceptions are the following that are appended to the URL.
@@ -52,7 +52,7 @@ Two exceptions are the following that are appended to the URL.
More information:
- [Compose HTTP requests and handle errors : Other headers](webapi/compose-http-requests-handle-errors.md#other-headers)
-- See the examples below.
+- See the following examples.
---
@@ -277,7 +277,7 @@ More information: [Shared variables](understand-the-data-context.md#shared-varia
## Perform a data operation with specified partition
-When using elastic tables with a partitioning strategy, you can pass a unique string value with the `partitionid` parameter to access non-relational table data within a storage partition.
+When using elastic tables with a partitioning strategy, you can pass a unique string value with the `partitionid` parameter to access nonrelational table data within a storage partition.
The following examples use the `partitionid` value of `deviceId` when retrieving a `contoso_sensordata` record.
@@ -327,7 +327,7 @@ Alternatively, you can use the `partitionid` value using alternate key style.
## Bypass custom Dataverse logic
-Synchronous logic must be applied during the transaction and can significantly impact performance of individual operations. When performing bulk operations, the additional time for these individual operations can increase the time required. Use the `BypassBusinessLogicExecution` parameter when you want to improve performance while performing bulk data operations.
+Synchronous logic must be applied during the transaction and can significantly impact performance of individual operations. With bulk operations, the extra time for these individual operations can increase the time required. Use the `BypassBusinessLogicExecution` parameter when you want to improve performance while performing bulk data operations.
> [!IMPORTANT]
> The calling user must have the `prvBypassCustomBusinessLogic` privilege.
@@ -376,12 +376,12 @@ MSCRM.BypassBusinessLogicExecution: CustomSync,CustomAsync
## Bypass Power Automate Flows
-When bulk data operations occur that trigger flows, Dataverse creates system jobs to execute the flows. When the number of system jobs is very large, it may cause performance issues for the system. If this occurs, you can choose to bypass triggering the flows by using the `SuppressCallbackRegistrationExpanderJob` optional parameter.
+When bulk data operations occur that trigger flows, Dataverse creates system jobs to execute the flows. When the number of system jobs is large, it might cause performance issues for the system. If performance issues occur, you can choose to bypass triggering the flows by using the `SuppressCallbackRegistrationExpanderJob` optional parameter.
The [CallbackRegistration table](reference/entities/callbackregistration.md) manages flow triggers, and there's an internal operation called *expander* that calls the registered flow triggers.
> [!NOTE]
-> When this option is used, the flow owners will not receive a notification that their flow logic was bypassed.
+> When this option is used, the flow owners won't receive a notification that their flow logic was bypassed.
### [SDK for .NET](#tab/sdk)
@@ -422,10 +422,49 @@ MSCRM.SuppressCallbackRegistrationExpanderJob: true
More information: [Bypass Power Automate Flows](bypass-power-automate-flows.md)
+## Return unmasked data
+
+When you have a column configured to use the [masking rules](/power-platform/admin/create-manage-masking-rules) preview feature you can use the `UnMaskedData` optional parameter to request that the unmasked value is returned.
+
+### [SDK for .NET](#tab/sdk)
+
+```csharp
+RetrieveMultipleRequest request = new()
+{
+ Query = query,
+ ["UnMaskedData"] = true
+};
+
+var response = (RetrieveMultipleResponse)service.Execute(request);
+```
+
+### [Web API](#tab/webapi)
+
+Use the `UnMaskedData=true` query option to indicate that unmasked values should be returned.
+
+> [!IMPORTANT]
+> The `UnMaskedData` option is case sensitive. If you use the incorrect parameter value you will get this error:
+> `{"error":{"code":"0x80060888","message":"The query parameter [REDACTED] is not supported"}}`
+
+**Request:**
+
+```http
+GET [ORGANIZATION URI]/api/data/v9.2/sample_examples?$select=sample_name,sample_email,sample_governmentid,sample_telephonenumber,sample_dateofbirth&$orderby=sample_name desc&UnMaskedData=true HTTP/1.1
+Accept: application/json
+Authorization: Bearer [REDACTED]
+OData-Version: 4.0
+OData-MaxVersion: 4.0
+```
+
+---
+
+[Learn more about retrieving unmasked data](column-level-security.md#retrieve-unmasked-data).
+
+
### See also
-[Use messages with the SDK for .NET](org-service/use-messages.md)
-[Web API: Compose HTTP requests and handle errors : Other headers](webapi/compose-http-requests-handle-errors.md#other-headers)
+[Use messages with the SDK for .NET](org-service/use-messages.md)
+[Web API: Compose HTTP requests and handle errors : Other headers](webapi/compose-http-requests-handle-errors.md#other-headers)
[Bypass Custom Business Logic](bypass-custom-business-logic.md)
diff --git a/powerapps-docs/developer/data-platform/org-service/build-queries-with-linq-net-language-integrated-query.md b/powerapps-docs/developer/data-platform/org-service/build-queries-with-linq-net-language-integrated-query.md
index 6fb1f67a68..40d9ca68f2 100644
--- a/powerapps-docs/developer/data-platform/org-service/build-queries-with-linq-net-language-integrated-query.md
+++ b/powerapps-docs/developer/data-platform/org-service/build-queries-with-linq-net-language-integrated-query.md
@@ -2,8 +2,8 @@
title: "Build queries with LINQ (.NET language-integrated query) (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Learn how to use .NET Language-Integrated Query (LINQ) to write queries for Microsoft Dataverse." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/org-service/early-bound-programming.md b/powerapps-docs/developer/data-platform/org-service/early-bound-programming.md
index 509e810377..2bcf81986a 100644
--- a/powerapps-docs/developer/data-platform/org-service/early-bound-programming.md
+++ b/powerapps-docs/developer/data-platform/org-service/early-bound-programming.md
@@ -4,8 +4,8 @@ description: "Describes the different programming styles available when using th
ms.collection: get-started
ms.topic: "article"
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/org-service/entity-operations-associate-disassociate.md b/powerapps-docs/developer/data-platform/org-service/entity-operations-associate-disassociate.md
index 095fd29150..d97303b511 100644
--- a/powerapps-docs/developer/data-platform/org-service/entity-operations-associate-disassociate.md
+++ b/powerapps-docs/developer/data-platform/org-service/entity-operations-associate-disassociate.md
@@ -4,8 +4,8 @@ description: "Learn how to associate and disassociate table rows using the SDK f
ms.date: 12/13/2024
ms.reviewer: "pehecke"
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/entity-operations-create.md b/powerapps-docs/developer/data-platform/org-service/entity-operations-create.md
index 15c2a80887..e6980a3542 100644
--- a/powerapps-docs/developer/data-platform/org-service/entity-operations-create.md
+++ b/powerapps-docs/developer/data-platform/org-service/entity-operations-create.md
@@ -4,8 +4,8 @@ description: "Learn how to create table rows using the SDK for .NET."
ms.date: 12/16/2024
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/entity-operations-query-data.md b/powerapps-docs/developer/data-platform/org-service/entity-operations-query-data.md
index d0f17f564e..510edd6af4 100644
--- a/powerapps-docs/developer/data-platform/org-service/entity-operations-query-data.md
+++ b/powerapps-docs/developer/data-platform/org-service/entity-operations-query-data.md
@@ -4,8 +4,8 @@ description: "Introduces the different ways to query data using Microsoft Datave
ms.date: 05/03/2024
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/entity-operations-retrieve.md b/powerapps-docs/developer/data-platform/org-service/entity-operations-retrieve.md
index 9397720963..c1a14c6150 100644
--- a/powerapps-docs/developer/data-platform/org-service/entity-operations-retrieve.md
+++ b/powerapps-docs/developer/data-platform/org-service/entity-operations-retrieve.md
@@ -1,11 +1,11 @@
---
-title: "Retrieve a table row using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Describes options available when retrieving a row programmatically." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 05/18/2023
+title: "Retrieve a table row using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs"
+description: "Describes options available when retrieving a row programmatically."
+ms.date: 06/20/2025
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -17,31 +17,31 @@ contributors:
[!INCLUDE[cc-terminology](../includes/cc-terminology.md)]
-You will typically retrieve a row based on the results of a query and the query results should include a unique identifier for the row.
+You'll typically retrieve a row based on the results of a query and the query results should include a unique identifier for the row.
> [!NOTE]
-> In the following examples the `accountid` variable represents the identifier for an account row.
+> In the following examples, the `accountid` variable represents the identifier for an account row.
-You have some options to define the data returned when you retrieve a row. You will use the class to define which column (attribute) values you require.
+You have some options to define the data returned when you retrieve a row. You use the class to define which column (attribute) values you require.
> [!IMPORTANT]
-> When retrieving rows you should only request the column values you need by setting the specific columns using the class constructor. Although class constructor provides an overload that accepts a boolean `allColumns` parameter, you should not use this in production code. More information: [Do not retrieve Entity all columns via query APIs](../best-practices/work-with-data/retrieve-specific-columns-entity-via-query-apis.md)
+> When retrieving rows, you should only request the column values you need by setting the specific columns using the class constructor. Although class constructor provides an overload that accepts a boolean `allColumns` parameter, you shouldn't use this parameter set to true in production code. More information: [Don't retrieve Entity all columns via query APIs](../best-practices/work-with-data/retrieve-specific-columns-entity-via-query-apis.md)
-If you need to return related rows you can include a query with your retrieve request to define which related rows to return.
+If you need to return related rows, you can include a query with your retrieve request to define which related rows to return.
## Basic Retrieve
-You can retrieve individual rows using either the . method or by setting the property of the class to a reference row and use the . method.
+You can retrieve individual rows using either the [IOrganizationService.Retrieve](xref:Microsoft.Xrm.Sdk.IOrganizationService.Retrieve%2A) method or by setting the property of the class to a reference row and use the [IOrganizationService.Execute](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A) method.
-This example shows using the . method.
+This example shows using the [](xref:Microsoft.Xrm.Sdk.IOrganizationService.Retrieve%2A) method.
```csharp
Entity entity = svc.Retrieve("account", accountid, new ColumnSet("name"));
Console.WriteLine("account name: {0}", entity["name"]);
```
-This example shows using the and classes with the . method.
+This example shows using the and classes with the [IOrganizationService.Execute](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A) method.
```csharp
RetrieveRequest request = new RetrieveRequest()
@@ -55,16 +55,16 @@ Console.WriteLine("account name: {0}", entity["name"]);
```
> [!NOTE]
-> Most of the time you should use the . method.
+> Most of the time you should use the [IOrganizationService.Retrieve](xref:Microsoft.Xrm.Sdk.IOrganizationService.Retrieve%2A) method.
>
-> Use with the . method for special circumstances as described below.
+> Use with the [IOrganizationService.Execute](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A) method for special circumstances as described below.
> More information:
> - [Retrieve with related rows](#retrieve-with-related-rows)
> - [Retrieve with an alternate key](#retrieve-with-an-alternate-key)
## Retrieve with related rows
-When you retrieve an individual row you can also include a query to include related rows by setting the property of the .
+When you retrieve an individual row, you can also include a query to include related rows by setting the property of the .
You can define a query using any of the classes derived from and associate it with a specific table row relationship. Add a collection of pairs of queries and relationships to the property using a .
@@ -111,6 +111,7 @@ Entity primaryContact = retrievedAccount
Console.WriteLine("Primary Contact Fullname: {0}",primaryContact["fullname"]);
```
+
The results of the sample could look like the following:
```
@@ -126,7 +127,7 @@ More information: [Query data using the SDK for .NET](entity-operations-query-da
## Retrieve with an alternate key
-If you have configured a table to use an alternate key, you can use this alternate key to define an and pass this value as the . property.
+If you configured a table to use an alternate key, you can use this alternate key to define an and pass this value as the . property.
For example, if you define the `account` `accountnumber` column to be an alternate key, you can retrieve an account using the value of that column.
@@ -161,15 +162,15 @@ Entity entity = response.Entity;
Console.WriteLine(entity["name"]);
```
> [!NOTE]
-> Alternate keys are usually used only for data integration scenarios
+> Alternate keys are used only for data integration scenarios
## Retrieve records from elastic tables
-If you are retrieving elastic table data stored in partitions be sure to specify the partition key when retrieving that data. More information: [Retrieve a record in an elastic table](../use-elastic-tables.md#retrieve-a-record-in-an-elastic-table)
+If you're retrieving elastic table data stored in partitions, be sure to specify the partition key when retrieving that data. More information: [Retrieve a record in an elastic table](../use-elastic-tables.md#retrieve-a-record-in-an-elastic-table)
## Access Formatted values
-The method to access formatted values on a retrieve operation is the same you will use when accessing them in the results of a query. More information: [Access formatted values](entity-operations-query-data.md#formatted-values-are-returned-for-some-columns)
+The method to access formatted values on a retrieve operation is the same you'll use when accessing them in the results of a query. More information: [Access formatted values](entity-operations-query-data.md#formatted-values-are-returned-for-some-columns)
diff --git a/powerapps-docs/developer/data-platform/org-service/entity-operations-update-delete.md b/powerapps-docs/developer/data-platform/org-service/entity-operations-update-delete.md
index cf727f3f5f..a0e63247e5 100644
--- a/powerapps-docs/developer/data-platform/org-service/entity-operations-update-delete.md
+++ b/powerapps-docs/developer/data-platform/org-service/entity-operations-update-delete.md
@@ -1,11 +1,11 @@
---
-title: "Update and delete table rows using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Learn how to update and delete table rows using the SDK for .NET." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 07/22/2023
+title: "Update and delete table rows using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs"
+description: "Learn how to update and delete table rows using the SDK for .NET."
+ms.date: 06/20/2025
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -22,23 +22,23 @@ This article includes examples using both late-bound and early-bound programming
Each of the examples uses a `svc` variable that represents an instance of a class that implements the methods in the interface. For information about the classes that support this interface see [IOrganizationService Interface](iorganizationservice-interface.md).
> [!IMPORTANT]
-> When updating a table row, only include the columns you are changing. Simply updating the columns of a table row that you previously retrieved will update each column even though the value is unchanged. This can cause system events that can trigger business logic that expects that the values have actually changed. This can also cause columns to appear to have been updated in auditing data when in fact they haven't actually changed.
+> When updating a table row, only include the columns you're changing. Simply updating the columns of a table row that you previously retrieved update each column even though the value is unchanged. This can cause system events that can trigger business logic that expects that the values actually changed. This can also cause columns to appear to be updated in auditing data when in fact they haven't changed.
>
-> You should create a new `Entity` instance, set the id attribute and any attribute values you are changing, and use that entity instance to update the table row.
+> You should create a new `Entity` instance, set the ID attribute and any attribute values you're changing, and use that entity instance to update the table row.
> [!NOTE]
-> The column definition includes a `RequiredLevel` property. When this is set to `SystemRequired`, you cannot set these columns to a null value. If you attempt this you will get error code `-2147220989` with the message `Attribute: cannot be set to NULL`.
+> The column definition includes a `RequiredLevel` property. When this is set to `SystemRequired`, you can't set these columns to a null value. If you attempt to set this column to a null value, you'll get error code `-2147220989` with the message `Attribute: cannot be set to NULL`.
>
> More information: [Column (attribute) requirement level](../entity-attribute-metadata.md#column-requirement-level)
## Basic update
-Both of the examples below use the [IOrganizationService.Update method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Update%2A) to set column values for a table row that was previously retrieved.
+Both of the following examples use the [IOrganizationService.Update method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Update%2A) to set column values for a table row that was previously retrieved.
Use the [Entity.Id property](xref:Microsoft.Xrm.Sdk.Entity.Id) to transfer the unique identifier value of the retrieved row to the entity instance used to perform the update operation.
> [!NOTE]
-> If you attempt to update a row without a primary key value you will get the error: `Entity Id must be specified for Update`.
+> If you attempt to update a row without a primary key value, you'll get the error: `Entity Id must be specified for Update`.
>
> If you don't have a primary key value, you can also update rows using alternate keys. More information: [Update with Alternate Key](#update-with-alternate-key)
@@ -106,7 +106,7 @@ svc.Update(account);
Instead of using the [IOrganizationService.Update method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Update%2A), you can use either the late-bound [Entity class](xref:Microsoft.Xrm.Sdk.Entity) or the generated early-bound entity classes with the [UpdateRequest class](xref:Microsoft.Xrm.Sdk.Messages.UpdateRequest) by setting the entity instance to the [UpdateRequest.Target property](xref:Microsoft.Xrm.Sdk.Messages.UpdateRequest.Target) and then using the [IOrganizationService.Execute method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A).
> [!NOTE]
-> The [UpdateResponse class](xref:Microsoft.Xrm.Sdk.Messages.UpdateResponse) has no properties. While it is returned by the [IOrganizationService.Execute method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A), it isn't necessary to refer to it.
+> The [UpdateResponse class](xref:Microsoft.Xrm.Sdk.Messages.UpdateResponse) has no properties. While it's returned by the [IOrganizationService.Execute method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A), it isn't necessary to refer to it.
```csharp
var request = new UpdateRequest()
@@ -135,7 +135,7 @@ In a similar manner to how you can [Create related table rows in one operation](
To update related table rows, you have to retrieve a row with the related rows so that you can access the ID values. More information: [Retrieve with related rows](entity-operations-retrieve.md#retrieve-with-related-rows)
> [!IMPORTANT]
-> Updates to rows are made in a specific order. First, primary table rows are processed, and then related table rows are processed. If a change is made by the primary row for a lookup or related row column, and then a related row updates the same column, the related row value is retained. In general, a lookup column value and its equivalent in the [Entity.RelatedEntities](xref:Microsoft.Xrm.Sdk.Entity.RelatedEntities) for the same relationship should not be used at the same time.
+> Updates to rows are made in a specific order. First, primary table rows are processed, and then related table rows are processed. If a change is made by the primary row for a lookup or related row column, and then a related row updates the same column, the related row value is retained. In general, a lookup column value and its equivalent in the [Entity.RelatedEntities](xref:Microsoft.Xrm.Sdk.Entity.RelatedEntities) for the same relationship shouldn't be used at the same time.
#### [Late-bound](#tab/late)
@@ -227,7 +227,7 @@ svc.Update(account);
## Check for duplicate records
-When updating a table row, you may change the values so that the row represents a duplicate of another row. More information: [Detect duplicate data using the SDK for .NET](detect-duplicate-data.md)
+When updating a table row, you might change the values so that the row represents a duplicate of another row. More information: [Detect duplicate data using the SDK for .NET](detect-duplicate-data.md)
## Update with Alternate Key
@@ -238,7 +238,7 @@ If you want to use early bound types, you can convert the [!IMPORTANT]
-> Most tables for business data do not have alternate keys defined. This method can only be used when the environment is configured to define an alternate key for a table.
+> Most tables for business data don't have alternate keys defined. This method can only be used when the environment is configured to define an alternate key for a table.
```csharp
var accountNumberKey = new KeyAttributeCollection();
@@ -260,9 +260,9 @@ If you're updating or deleting elastic table data stored in partitions, be sure
## Use Upsert
-Typically in data integration scenarios you need to create or update data in Dataverse from other sources. Dataverse may already have records with the same unique identifier, which may be an alternate key. If a table row exists, you want to update it. If it doesn't exist, you want to create it so that the data being added is synchronized with the source data. This is the scenario when you want to use upsert.
+Typically in data integration scenarios you need to create or update data in Dataverse from other sources. Dataverse might already have records with the same unique identifier, which might be an alternate key. If a table row exists, you want to update it. If it doesn't exist, you want to create it so that the data being added is synchronized with the source data. This scenario is when you want to use upsert.
-The following example uses twice. The first time the account row is created, and the second time it's updated because it has an `accountnumber` value and there's an alternate key using that column (attrbute).
+The following example uses twice. The first time the account row is created, and the second time it's updated because it has an `accountnumber` value and there's an alternate key using that column (attribute).
For both calls, the [UpsertResponse.RecordCreated property](xref:Microsoft.Xrm.Sdk.Messages.UpsertResponse.RecordCreated) indicates whether the operation created a row or not.
@@ -313,7 +313,7 @@ svc.Delete("account", new Guid("e5fa5509-2582-e811-a95e-000d3af40ae7"));
```
> [!IMPORTANT]
-> Delete operations can initiate cascading operations that may delete child rows to maintain data integrity depending on logic defined for the relationships in the environment. More information: [Table relationship behavior](../../../maker/data-platform/create-edit-entity-relationships.md#table-relationship-behavior)
+> Delete operations can initiate cascading operations that might delete child rows to maintain data integrity depending on logic defined for the relationships in the environment. More information: [Table relationship behavior](../../../maker/data-platform/create-edit-entity-relationships.md#table-relationship-behavior)
## Use the DeleteRequest class
@@ -340,9 +340,9 @@ svc.Execute(request);
You can specify the optimistic concurrency behavior for the operation by setting the `ConcurrencyBehavior` property of the or classes.
-The logic to update or delete the row may be based on stale data. If the current data is different because it has changed since it was retrieved, optimistic concurrency provides a way to cancel an update or delete operation so you might retrieve it again and use the current data to determine whether to proceed.
+The logic to update or delete the row might be based on stale data. If the current data is different because it has changed since it was retrieved, optimistic concurrency provides a way to cancel an update or delete operation so you might retrieve it again and use the current data to determine whether to proceed.
-To determine whether the row has been changed, you don't need to compare all the values, you can use the property to see if it has changed.
+To determine whether the row has changed, you don't need to compare all the values. You can use the property to see if it has changed.
The following example succeeds only when:
diff --git a/powerapps-docs/developer/data-platform/org-service/entity-operations.md b/powerapps-docs/developer/data-platform/org-service/entity-operations.md
index 1f52c1eaec..98b8dd18bb 100644
--- a/powerapps-docs/developer/data-platform/org-service/entity-operations.md
+++ b/powerapps-docs/developer/data-platform/org-service/entity-operations.md
@@ -1,11 +1,11 @@
---
-title: "Entity class operations using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Learn about the Entity class used for data operations using the Microsoft Dataverse SDK for .NET" # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 09/16/2022
+title: "Entity class operations using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs"
+description: "Learn about the Entity class used for data operations using the Microsoft Dataverse SDK for .NET"
+ms.date: 06/20/2025
ms.reviewer: pehecke
ms.topic: article
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -17,29 +17,29 @@ contributors:
[!INCLUDE[cc-terminology](../includes/cc-terminology.md)]
-When you work with Microsoft Dataverse data using the SDK for .NET you will use the class with the late-bound style or with generated entity classes using the early-bound style. The generated entity classes inherit from the class, so understanding the class is important for either style.
+When you work with Microsoft Dataverse data using the SDK for .NET, use the class with the late-bound style or with generated entity classes using the early-bound style. The generated entity classes inherit from the class, so understanding the class is important for either style.
-This topic will describe some of the most frequently used properties and methods of the class.
+This article describes some of the most frequently used properties and methods of the class.
## Entity.LogicalName
-When you instantiate a new class instance using the late-bound style you must provide a valid string value to specify what entity type it is. The `LogicalName` is defined in the entity metadata (table definition).
+When you instantiate a new class instance using the late-bound style, you must provide a valid string value to specify what entity type it is. The `LogicalName` is defined in the entity metadata (table definition).
-When using the early-bound style, this value is set by the constructor of the generated class. For example: `var account = new Entity("account");`
+When you use the early-bound style, the constructor of the generated class sets this value. For example: `var account = new Entity("account");`
-In your code, if you later want to retrieve the string value that describes the entity type, you can use the property. This is useful for the many APIs that require an entity logical name as a parameter.
+In your code, if you later want to retrieve the string value that describes the entity type, you can use the property. This property is useful for the many APIs that require an entity logical name as a parameter.
## Entity.Id
-When you instantiate the `Entity` class, whether using the late-bound or early-bound style, it doesn't have a unique id set. If you are creating an entity, you shouldn't set it, but allow it to be set by the system when you create (save) it.
+When you instantiate the `Entity` class, whether using the late-bound or early-bound style, it doesn't have a unique ID set. If you're creating an entity, you shouldn't set it, but let the system set it when you create (save) the record.
-If you are retrieving an entity, it will include the primary key attribute value whether you request it or not. The primary key attribute name is different for each type of entity. Generally, the name of the primary key attribute is the entity `logicalname` + `id`. For an account it is `accountid` and for contact it is `contactid`.
+If you're retrieving an entity, it includes the primary key attribute value whether you request it or not. The primary key attribute name is different for each type of entity. Generally, the name of the primary key attribute is the entity `logicalname` + `id`. For an account, it's `accountid` and for contact it's `contactid`.
While you can get or set the primary key value using the primary key attribute, you can also use the property to access the value without having to remember the name of the primary key attribute.
## Early bound access to table columns
-If you are using the early-bound style with generated classes, you will find typed properties for each attribute in the class. The properties for the attributes use the . and they can be accessed directly on the `Entity` class instance.
+If you're using the early-bound style with generated classes, you'll find typed properties for each attribute in the class. The properties for the attributes use the . and they can be accessed directly on the `Entity` class instance.
For example:
diff --git a/powerapps-docs/developer/data-platform/org-service/execute-multiple-requests.md b/powerapps-docs/developer/data-platform/org-service/execute-multiple-requests.md
index 1c11a31dcf..6d91d70c9c 100644
--- a/powerapps-docs/developer/data-platform/org-service/execute-multiple-requests.md
+++ b/powerapps-docs/developer/data-platform/org-service/execute-multiple-requests.md
@@ -1,11 +1,11 @@
---
-title: "Execute multiple requests using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "ExecuteMultipleRequest message supports higher throughput bulk message passing scenarios in Microsoft Dataverse." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 02/28/2023
+title: "Execute multiple requests using the SDK for .NET (Microsoft Dataverse) | Microsoft Docs"
+description: "ExecuteMultipleRequest message supports higher throughput bulk message passing scenarios in Microsoft Dataverse."
+ms.date: 06/20/2025
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -19,13 +19,13 @@ contributors:
The primary purpose of executing multiple requests it so improve performance in high-latency environments by reducing the total volume of data that is transmitted over the network.
-You can use the message to support higher throughput bulk message passing scenarios in Microsoft Dataverse. accepts an input collection of message , executes each of the message requests in the order they appear in the input collection, and optionally returns a collection of containing each message's response or the error that occurred. Each message request in the input collection is processed in a separate database transaction. is executed by using the . method.
+You can use the message to support higher throughput bulk message passing scenarios in Microsoft Dataverse. accepts an input collection of message , executes each of the message requests in the order they appear in the input collection, and optionally returns a collection of containing each message's response or the error that occurred. Each message request in the input collection is processed in a separate database transaction. is executed by using the [IOrganizationService.Execute](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2a) method.
-In general, behaves the same as if you executed each message request in the input request collection separately, except with better performance. Use of the parameter of the service proxy is honored and will apply to the execution of every message in the input request collection. Plug-ins and workflow activities are executed as you would expect for each message processed.
+In general, behaves the same as if you executed each message request in the input request collection separately, except with better performance. Use of the parameter of the service proxy is honored and applies to the execution of every message in the input request collection. Plug-ins and workflow activities are executed as you would expect for each message processed.
-Plug-ins and custom workflow activities are not blocked from using . However, this is not recommended. Any failures in the synchronous step must rollback all data operations to maintain data integrity. Each operation performed within `ExecuteMultiple` must be rolled back. `ExecuteMultiple` also causes issues when the operations exceed the maximum plug-in timeout duration.
+Plug-ins and custom workflow activities aren't blocked from using . However, this isn't recommended. Any failures in the synchronous step must roll back all data operations to maintain data integrity. Each operation performed within `ExecuteMultiple` must be rolled back. `ExecuteMultiple` also causes issues when the operations exceed the maximum plug-in timeout duration.
-More information: [Do not use batch request types in plug-ins and workflow activities](../best-practices/business-logic/avoid-batch-requests-plugin.md)
+More information: [Don't use batch request types in plug-ins and workflow activities](../best-practices/business-logic/avoid-batch-requests-plugin.md)
@@ -86,8 +86,8 @@ The parameter
|ExecuteMultipleSettings Member|Description|
|------------------------------------|-----------------|
-||When `true`, continue processing the next request in the collection even if a fault has been returned from processing the current request in the collection. When `false`, do not continue processing the next request.|
-||When `true`, return responses from each message request processed. When `false`, do not return responses.
If set to `true` and a request does not return a response, because that is its design, the for that request is set to `null`.
However, even when `false`, the collection will not be empty if errors are returned. If errors are returned, there will be one response item in the collection for each processed request that returned a fault and will be set to the actual fault that occurred.|
+||When `true`, continue processing the next request in the collection even if a fault is returned from processing the current request in the collection. When `false`, don't continue processing the next request.|
+||When `true`, return responses from each message request processed. When `false`, don't return responses.
If set to `true` and a request doesn't return a response, because that is its design, the for that request is set to `null`.
However, even when `false`, the collection won't be empty if errors are returned. When errors are returned, there is one response item in the collection for each processed request that returns a fault and is set to the actual fault that occurred.|
For example, in a request collection that contains six requests where the third and fifth request return faults, the following table indicates what the collection would contain.
@@ -106,20 +106,20 @@ The parameter
There are several constraints related to the use of the as described in the following list.
-- **No recursion is allowed** cannot invoke . An found in the request collection will generate a fault for that request item.
-- **Maximum batch size** There is a limit to how many requests can be added to a request collection. If that limit is exceeded, a fault is thrown before the first request is ever executed. A limit of 1000 requests is typical though this maximum amount can be set for the Dataverse deployment.
+- **No recursion is allowed** can't invoke . An found in the request collection generates a fault for that request item.
+- **Maximum batch size** There's a limit to how many requests can be added to a request collection. If that limit is exceeded, a fault is thrown before the first request is ever executed. A limit of 1,000 requests is typical though this maximum amount can be set for the Dataverse deployment.
> [!NOTE]
-> There was once a limit on the number of concurrent ExecuteMultiple requests. The limit was 2. This was removed because service protection limits made it unnecessary. For more information: [Service Protection API Limits](../api-limits.md).
+> There was once a limit on the number of concurrent ExecuteMultiple requests. The limit was 2. This limit was removed because service protection limits made it unnecessary. For more information: [Service Protection API Limits](../api-limits.md).
## Handle a batch size fault
-What should you do when your input request collection exceeds the maximum batch size? Your code can't directly query the maximum batch size through the deployment web service unless it is run under an account that has the deployment administrator role.
+What should you do when your input request collection exceeds the maximum batch size? Your code can't directly query the maximum batch size through the deployment web service unless it's run under an account that has the deployment administrator role.
-Fortunately, there is another method that you can use. When the number of requests in the input collection exceeds the maximum batch size allowed for an organization, a fault is returned from the call. The maximum batch size is returned in the fault. Your code can check for that value, resize the input request collection to be within the indicated limit, and re-submit the . The following code snippet demonstrates some of this logic.
+Fortunately, there's another method that you can use. When the number of requests in the input collection exceeds the maximum batch size allowed for an organization, a fault is returned from the call. The maximum batch size is returned in the fault. Your code can check for that value, resize the input request collection to be within the indicated limit, and resubmit the . The following code snippet demonstrates some of this logic.
```csharp
catch (FaultException fault)
diff --git a/powerapps-docs/developer/data-platform/org-service/handle-exceptions-code.md b/powerapps-docs/developer/data-platform/org-service/handle-exceptions-code.md
index 716ce3580c..2eac7c1b13 100644
--- a/powerapps-docs/developer/data-platform/org-service/handle-exceptions-code.md
+++ b/powerapps-docs/developer/data-platform/org-service/handle-exceptions-code.md
@@ -5,8 +5,8 @@ ms.collection: get-started
ms.date: 03/22/2022
ms.reviewer: "pehecke"
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/iorganizationservice-interface.md b/powerapps-docs/developer/data-platform/org-service/iorganizationservice-interface.md
index a0dd924d2f..467042dd34 100644
--- a/powerapps-docs/developer/data-platform/org-service/iorganizationservice-interface.md
+++ b/powerapps-docs/developer/data-platform/org-service/iorganizationservice-interface.md
@@ -1,12 +1,12 @@
---
-title: "IOrganizationService Interface (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Learn about the common web service methods exposed to perform data operations in Microsoft Dataverse." # 115-145 characters including spaces. This abstract displays in the search result.
+title: "IOrganizationService Interface (Microsoft Dataverse) | Microsoft Docs"
+description: "Learn about the common web service methods exposed to perform data operations in Microsoft Dataverse."
ms.collection: get-started
-ms.date: 09/30/2022
-ms.reviewer: "pehecke"
-ms.topic: "article"
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+ms.reviewer: pehecke
+ms.topic: article
+author: MsSQLGirl
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -22,7 +22,7 @@ The interface exposes methods used
## Client applications
-This interface is implemented by a couple of classes that you can use in your code when creating client applications.
+A couple of classes that you can use in your code when creating client applications implement the `IOrganizationService` interface:
|Class|Description|
|--|--|
@@ -31,23 +31,23 @@ This interface is implemented by a couple of classes that you can use in your co
## Plug-ins
-When you write plug-ins, there is also an object returned from the . which implements the interface but is not any of the types in the service client classes above.
+When you write plug-ins, there's also an object returned from the [IOrganizationServiceFactory.CreateOrganizationService method](xref:Microsoft.Xrm.Sdk.IOrganizationServiceFactory.CreateOrganizationService(System.Nullable{System.Guid})) that implements the interface but isn't any of the types in the client classes described in the previous section.
## IOrganizationService Methods
-Each of the classes which implement the interface may include additional properties and methods, but the interface has just 8 methods.
+Each of the classes that implement the interface might include additional properties and methods, but the interface has just eight methods.
|Method |Description |
|---------|---------|
-||Link two table rows using a table relationship|
-||Create a table row.|
-||Delete a table row|
-||Remove the link between two table rows using a table relationship|
-||Invoke an operation defined as a message by passing an instance of an or a class derived from it.|
-||Retrieve an instance of a table row.|
-||Retrieve a collection of table rows that match the criteria set in a query.|
-||Change the column values of a table row.|
+||Link two table rows using a table relationship|
+||Create a table row.|
+||Delete a table row|
+||Remove the link between two table rows using a table relationship|
+||Invoke an operation defined as a message by passing an instance of an or a class derived from it.|
+||Retrieve an instance of a table row.|
+||Retrieve a collection of table rows that match the criteria set in a query.|
+||Change the column values of a table row.|
> [!NOTE]
> The Organization service exposes only the `Execute` method. The other methods in the interface are simply wrappers around the `Execute` method. These other methods are provided for convenience. You can perform all operations using only the `Execute` method. More information: [Use messages with the SDK for .NET](use-messages.md)
diff --git a/powerapps-docs/developer/data-platform/org-service/linq-query-examples.md b/powerapps-docs/developer/data-platform/org-service/linq-query-examples.md
index bc4e74dfc4..4cdfdb5764 100644
--- a/powerapps-docs/developer/data-platform/org-service/linq-query-examples.md
+++ b/powerapps-docs/developer/data-platform/org-service/linq-query-examples.md
@@ -1,11 +1,11 @@
---
-title: "Linq query examples (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "Browse code samples of LINQ queries." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+title: "Linq query examples (Microsoft Dataverse) | Microsoft Docs"
+description: "Browse code samples of LINQ queries."
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
-ms.topic: "article"
+ms.topic: article
search.audienceType:
- developer
contributors:
@@ -17,13 +17,13 @@ contributors:
[!INCLUDE[cc-terminology](../includes/cc-terminology.md)]
-This topic contains many code samples of LINQ queries.
+This article contains many code samples of LINQ queries.
## Simple Where clause
- The following sample shows how to retrieve a list of accounts where the Name contains “Contoso”.
+ The following sample shows how to retrieve a list of accounts where the Name contains "Contoso".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -38,7 +38,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
}
```
- The following sample shows how to retrieve a list of accounts where the Name contains “Contoso” and Address1_City is “Redmond”.
+ The following sample shows how to retrieve a list of accounts where the Name contains "Contoso" and Address1_City is "Redmond".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -59,7 +59,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Join and simple Where clause
- The following sample shows how to retrieve the account Name and the contact LastName where the account Name contains “Contoso” and the contact LastName contains “Smith” and the contact is the Primary Contact for the account.
+The following sample shows how to retrieve the account Name and the contact LastName where the account Name contains "Contoso" and the contact LastName contains "Smith" and the contact is the Primary Contact for the account.
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -90,7 +90,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the Distinct Operator
- The following sample shows how to retrieve a distinct list of contact last names. Although there may be duplicates, each name will be listed only once.
+ The following sample shows how to retrieve a distinct list of contact last names. Although there might be duplicates, each name is listed only once.
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -240,7 +240,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Late-binding left join
- The following sample shows a left join. A left join is designed to return parents with and without children from two sources. There is a correlation between parent and child, but no child may actually exist.
+ The following sample shows a left join. A left join is designed to return parents with and without children from two sources. There's a correlation between parent and child, but no child might actually exist.
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -266,7 +266,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the Equals operator
- The following sample shows how to retrieve a list of contacts where the FirstName is “Colin”.
+ The following sample shows how to retrieve a list of contacts where the FirstName is "Colin".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -314,7 +314,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the Not Equals operator
- The following sample shows how to retrieve a list of contacts where the Address1_City is not “Redmond”.
+ The following sample shows how to retrieve a list of contacts where the Address1_City isn't "Redmond".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -335,7 +335,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
}
```
- The following sample shows how to retrieve a list of contacts where the FirstName is not “Colin”.
+ The following sample shows how to retrieve a list of contacts where the FirstName isn't "Colin".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -361,7 +361,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use a method-based LINQ query with a Where clause
- The following sample shows how to retrieve a list of contacts where the LastName is “Smith” or contains “Smi”.
+ The following sample shows how to retrieve a list of contacts where the LastName is "Smith" or contains "Smi".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -463,7 +463,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the Contains operator
- The following sample shows how to retrieve contacts where the Description contains “Alpine”.
+ The following sample shows how to retrieve contacts where the Description contains "Alpine".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -486,7 +486,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the Does Not Contain operator
- The following sample shows how to retrieve contacts where the Description does not contain “Coho”.
+ The following sample shows how to retrieve contacts where the Description doesn't contain "Coho".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -509,7 +509,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the StartsWith and EndsWith operators
- The following sample shows how to retrieve contacts where FirstName starts with “Bri”.
+ The following sample shows how to retrieve contacts where FirstName starts with "Bri".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -528,7 +528,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
}
```
- The following sample shows how to retrieve contacts where LastName ends with “cox”.
+ The following sample shows how to retrieve contacts where LastName ends with "cox".
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -551,7 +551,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the And and Or operators
- The following sample shows how to retrieve contacts where Address1_City is “Redmond” or “Bellevue” and a CreditLimit that is greater than $200.
+ The following sample shows how to retrieve contacts where Address1_City is "Redmond" or "Bellevue" and a CreditLimit that is greater than $200.
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -661,7 +661,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the Skip and Take operators without paging
- The following sample shows how to retrieve just two rows after skipping two rows where the LastName is not “Parker” using the [Skip](/dotnet/api/system.linq.enumerable.skip) and [Take](/dotnet/api/system.linq.enumerable.take)operators.
+ The following sample shows how to retrieve just two rows after skipping two rows where the LastName isn't "Parker" using the [Skip](/dotnet/api/system.linq.enumerable.skip) and [Take](/dotnet/api/system.linq.enumerable.take)operators.
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -686,7 +686,7 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
## Use the FirstOrDefault and SingleOrDefault operators
- The [FirstOrDefault](/dotnet/api/system.linq.enumerable.firstordefault) operator returns the first element of a sequence, or a default value if no element is found. The [SingleOrDefault](/dotnet/api/system.linq.enumerable.singleordefault) operator returns a single, specific element of a sequence, or a default value if that element is not found. The following sample shows how to use these operators.
+ The [FirstOrDefault](/dotnet/api/system.linq.enumerable.firstordefault) operator returns the first element of a sequence, or a default value if no element is found. The [SingleOrDefault](/dotnet/api/system.linq.enumerable.singleordefault) operator returns a single, specific element of a sequence, or a default value if that element isn't found. The following sample shows how to use these operators.
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
@@ -836,9 +836,9 @@ using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
-## Use .value to retrieve the value of a column (attribute)
+## Accessing the value of a column (attribute)
- The following sample shows usage of Value to access the value of an attribute.
+ The following sample shows usage of `Value` to access the value of an attribute.
```csharp
using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
diff --git a/powerapps-docs/developer/data-platform/org-service/order-results-entity-attributes-linq.md b/powerapps-docs/developer/data-platform/org-service/order-results-entity-attributes-linq.md
index a740055c9c..179fb640f7 100644
--- a/powerapps-docs/developer/data-platform/org-service/order-results-entity-attributes-linq.md
+++ b/powerapps-docs/developer/data-platform/org-service/order-results-entity-attributes-linq.md
@@ -2,8 +2,8 @@
title: "Order results using table columns with LINQ (Microsoft Dataverse) | Microsoft Docs"
description: "Read how you can use lookup or choices (picklist) columns to order results within a LINQ query."
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: how-to
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/organizationservicecontext.md b/powerapps-docs/developer/data-platform/org-service/organizationservicecontext.md
index 377e608067..753cddcfab 100644
--- a/powerapps-docs/developer/data-platform/org-service/organizationservicecontext.md
+++ b/powerapps-docs/developer/data-platform/org-service/organizationservicecontext.md
@@ -2,8 +2,8 @@
title: "Use OrganizationServiceContext (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "The OrganizationServiceContext class lets you track changes, manage identities and relationships, and gives you access to the LINQ provider." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 11/10/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: how-to
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/overview.md b/powerapps-docs/developer/data-platform/org-service/overview.md
index 676a080452..4d7eea3141 100644
--- a/powerapps-docs/developer/data-platform/org-service/overview.md
+++ b/powerapps-docs/developer/data-platform/org-service/overview.md
@@ -1,9 +1,9 @@
---
title: "Use the SDK for .NET"
description: "Learn how you can use the Microsoft Dataverse SDK for .NET to work with business data."
-ms.date: 09/27/2022
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: overview
ms.custom: bap-template
@@ -28,25 +28,25 @@ After adding the NuGet package to your Visual Studio project, you then have acce
## Interacting with the Organization service
-In this section we cover some key concepts about using provided SDK classes to connect with the web services and perform operations.
+In this section, we cover some key concepts about using provided SDK classes to connect with the web services and perform operations.
### Establishing a web service connection
-The interface provides a connection to the Organization service enabling applications to work with business data, and table and column definitions. There are two implementations of this interface in the SDK: and . For new application development, you should be using the `ServiceClient` class which supports newer authentication technologies (MSAL) and has a few additional features not available in `CrmServiceClient`. However, both client classes are mostly the same from an API perspective. You will see code samples in this documentation using either of these classes, and it is fairly easy to convert code that uses `CrmServiceClient` to use `ServiceClient`.
+The interface provides a connection to the Organization service enabling applications to work with business data, and table and column definitions. There are two implementations of this interface in the SDK: and . For new application development, you should be using the `ServiceClient` class that supports newer authentication technologies (MSAL) and has a few more features not available in `CrmServiceClient`. However, both client classes are mostly the same from an API perspective. You'll see code samples in this documentation using either of these classes, and it's fairly easy to convert code that uses `CrmServiceClient` to use `ServiceClient`.
More information: [Transition apps to Dataverse ServiceClient](../sdk-client-transition.md), [IOrganizationService Interface](iorganizationservice-interface.md)
### Web service operations
-In the Dataverse SDK for .NET, web service operations are initiated by sending *messages* or *message requests* to the service. Each message has a name which indicates the purpose of the message, and the corresponding request class name is based on that message name. For example, to create a row of data in a table, you populate a create request with data and have the service client send (Execute) this request to the Organization service. The operation is 'create' and the message request is named . After executing a request, the service returns a response class object (e.g., ) which contains an execution status and results data. This pattern is the same for the other operations that the service supports.
+In the Dataverse SDK for .NET, web service operations are initiated by sending *messages* or *message requests* to the service. Each message has a name that indicates the purpose of the message, and the corresponding request class name is based on that message name. For example, to create a row of data in a table, you populate a create request with data and have the service client send (Execute) this request to the Organization service. The operation is 'create' and the message request is named . When you execute a request, the service returns a response class object (for example, ) which contains an execution status and results data. This pattern is the same for the other operations that the service supports.
Take a look at the available message request and response classes in the and namespaces.
## About the legacy SOAP endpoint
-The Organization service endpoint that was introduced in 2011, known as the SOAP endpoint, has been deprecated for some time now. This means that it will continue to work and be supported until we remove it. We have also announced that we will update the SDK for .NET assemblies so that they will continue to work after the endpoint is removed. This means that there will be updated SDK for .NET assemblies available before the endpoint is removed. Developers will be required to update their code to use these new assemblies at some point in the future. The key takeaway is that developers will access the Organization service using the SDK for .NET and ignore the endpoint and its protocol. More information: [Transition apps to Dataverse ServiceClient](../sdk-client-transition.md)
+The Organization service endpoint, known as the SOAP endpoint, was introduced in 2011. This endpoint is deprecated. This means that it continues to work and be supported until we remove it. We also announced that we'll update the SDK for .NET assemblies so that they'll continue to work after the endpoint is removed. This means that updated SDK for .NET assemblies will be available before the endpoint is removed. Developers will be required to update their code to use these new assemblies at some point in the future. The key takeaway is that developers access the Organization service using the SDK for .NET and ignore the endpoint and its protocol. More information: [Transition apps to Dataverse ServiceClient](../sdk-client-transition.md)
-Since the Web API uses a different endpoint, it is not affected by this 2011 SOAP endpoint deprecation.
+Since the Web API uses a different endpoint, it isn't affected by this 2011 SOAP endpoint deprecation.
## Next steps
diff --git a/powerapps-docs/developer/data-platform/org-service/page-large-result-sets-linq.md b/powerapps-docs/developer/data-platform/org-service/page-large-result-sets-linq.md
index 4de9ca078e..59b048f033 100644
--- a/powerapps-docs/developer/data-platform/org-service/page-large-result-sets-linq.md
+++ b/powerapps-docs/developer/data-platform/org-service/page-large-result-sets-linq.md
@@ -2,8 +2,8 @@
title: "Page large result sets with LINQ (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Read how you can page the results of a large .NET Language-Integrated Query (LINQ) query by using the Take and Skip operators." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: "article"
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/queryexpression/filter-rows.md b/powerapps-docs/developer/data-platform/org-service/queryexpression/filter-rows.md
index 7cf0729278..ed2577ca8f 100644
--- a/powerapps-docs/developer/data-platform/org-service/queryexpression/filter-rows.md
+++ b/powerapps-docs/developer/data-platform/org-service/queryexpression/filter-rows.md
@@ -4,9 +4,9 @@ description: Learn how to use QueryExpression to filter rows when you retrieve d
ms.date: 05/12/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/queryexpression/join-tables.md b/powerapps-docs/developer/data-platform/org-service/queryexpression/join-tables.md
index ee8e32723b..445c6b6cba 100644
--- a/powerapps-docs/developer/data-platform/org-service/queryexpression/join-tables.md
+++ b/powerapps-docs/developer/data-platform/org-service/queryexpression/join-tables.md
@@ -4,9 +4,9 @@ description: Learn how to use QueryExpression to join tables when you retrieve d
ms.date: 05/12/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/queryexpression/optimize-performance.md b/powerapps-docs/developer/data-platform/org-service/queryexpression/optimize-performance.md
index a0abc069b3..53a52eb16c 100644
--- a/powerapps-docs/developer/data-platform/org-service/queryexpression/optimize-performance.md
+++ b/powerapps-docs/developer/data-platform/org-service/queryexpression/optimize-performance.md
@@ -4,9 +4,9 @@ description: Learn how to optimize performance when you retrieve data from Micro
ms.date: 01/06/2025
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/queryexpression/order-rows.md b/powerapps-docs/developer/data-platform/org-service/queryexpression/order-rows.md
index db5bd8d841..8e4e92d7af 100644
--- a/powerapps-docs/developer/data-platform/org-service/queryexpression/order-rows.md
+++ b/powerapps-docs/developer/data-platform/org-service/queryexpression/order-rows.md
@@ -4,9 +4,9 @@ description: Learn how to use QueryExpression to order rows when you retrieve da
ms.date: 05/12/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/queryexpression/sample.md b/powerapps-docs/developer/data-platform/org-service/queryexpression/sample.md
index 7b56f04f49..63e19ec7e2 100644
--- a/powerapps-docs/developer/data-platform/org-service/queryexpression/sample.md
+++ b/powerapps-docs/developer/data-platform/org-service/queryexpression/sample.md
@@ -4,9 +4,9 @@ description: Try using QueryExpression to retrieve Dataverse data using this sam
ms.date: 12/04/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
@@ -240,6 +240,6 @@ When you run the program using the `OutputQueryExpression` method, the output sh
### Related articles
-[Query data using QueryExpression](overview.md)
-[Sample: Retrieve multiple with the QueryExpression class](../samples/retrieve-multiple-queryexpression-class.md)
+[Query data using QueryExpression](overview.md)
+[Sample: Retrieve multiple with the QueryExpression class](../samples/retrieve-multiple-queryexpression-class.md)
[Sample: Use QueryExpression with a paging cookie](../samples/use-queryexpression-with-a-paging-cookie.md)
diff --git a/powerapps-docs/developer/data-platform/org-service/queryexpression/select-columns.md b/powerapps-docs/developer/data-platform/org-service/queryexpression/select-columns.md
index 72831ce1d1..70adc18028 100644
--- a/powerapps-docs/developer/data-platform/org-service/queryexpression/select-columns.md
+++ b/powerapps-docs/developer/data-platform/org-service/queryexpression/select-columns.md
@@ -4,9 +4,9 @@ description: Learn how to use QueryExpression to select columns when you retriev
ms.date: 05/12/2024
ms.reviewer: jdaly
ms.topic: how-to
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/quick-start-org-service-console-app.md b/powerapps-docs/developer/data-platform/org-service/quick-start-org-service-console-app.md
index 61f8bc31a5..0cb6806b11 100644
--- a/powerapps-docs/developer/data-platform/org-service/quick-start-org-service-console-app.md
+++ b/powerapps-docs/developer/data-platform/org-service/quick-start-org-service-console-app.md
@@ -1,9 +1,9 @@
---
title: "Quickstart: Execute an SDK for .NET request (C#) (Microsoft Dataverse) | Microsoft Docs"
description: "Demonstrates how to connect to the SDK for .NET of Microsoft Dataverse and execute a request."
-ms.date: 12/04/2024
-author: MicroSri
-ms.author: sriknair
+ms.date: 06/20/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: quickstart
search.audienceType:
@@ -17,12 +17,12 @@ contributors:
[!INCLUDE[cc-terminology](../includes/cc-terminology.md)]
-This topic shows you how to begin using classes in the SDK for .NET assemblies to work with Microsoft Dataverse business data. You will create a minimal console application to connect to your environment's Organization service using the class and execute a web service operation.
+This article shows you how to begin using classes in the SDK for .NET assemblies to work with Microsoft Dataverse business data. You'll create a minimal console application to connect to your environment's Organization service using the class and execute a web service operation.
-Your application will call the [IOrganizationService.Execute method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A) passing an instance of the class. The result returned from the web service is a populated [WhoAmIResponse.UserId](xref:Microsoft.Crm.Sdk.Messages.WhoAmIResponse.UserId) value which is the unique identifier of your Dataverse system user account.
+Your application calls the [IOrganizationService.Execute method](xref:Microsoft.Xrm.Sdk.IOrganizationService.Execute%2A) passing an instance of the class. The result returned from the web service is a populated [WhoAmIResponse.UserId](xref:Microsoft.Crm.Sdk.Messages.WhoAmIResponse.UserId) value that is the unique identifier of your Dataverse system user account.
> [!NOTE]
-> This quick start example does not include exception handling for brevity. This is a minimum code example of what you need to connect to and use the SDK for .NET.
+> This quick start example doesn't include exception handling for brevity. This quick start is a minimum code example of what you need to connect to and use the SDK for .NET.
You can obtain the complete code sample from GitHub [GetStarted](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/orgsvc/CSharp-NETCore/GetStarted/ConsoleApp%20(public)/Program.cs). Consult the program's [README](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/orgsvc/CSharp-NETCore/GetStarted/README.md) for more details.
@@ -39,7 +39,7 @@ Read the following important information about using a connection string or user
## Create Visual Studio project
-1. Create a new .NET console app project. For this project we are using Visual Studio 2022 and targeting .NET 6.
+1. Create a new .NET console app project. For this project, we're using Visual Studio 2022 and targeting .NET 6.

@@ -52,7 +52,7 @@ Read the following important information about using a connection string or user

> [!NOTE]
-> Your will be prompted to OK the preview changes, and then select **I Accept** in the **Licence Acceptance** dialog.
+> You are prompted to OK the preview changes, and then select **I Accept** in the **Licence Acceptance** dialog.
## Add application code
@@ -104,7 +104,7 @@ Read the following important information about using a connection string or user
> [!NOTE]
> You can find your environment URL in the legacy web application under **Settings > Customization > Developer Resources** or in Power Apps **Settings** (gear icon) > **Developer Resources**.
>
- > While this code sample places the username/password information in the code for simplicity, other code samples will use the more recommended approach of prompting for that information or storing it in a separate App.config or appsettings.json file.
+ > While this code sample places the username/password information in the code for simplicity, other code samples use the more recommended approach of prompting for that information or storing it in a separate App.config or appsettings.json file.
>
> You can find supported values for *AuthType* listed in [Connection string parameters](../xrm-tooling/use-connection-strings-xrm-tooling-connect.md#connection-string-parameters).
@@ -177,7 +177,7 @@ Now that you have a simple console program that connects to Dataverse, use this
### Try other IOrganizationService interface methods
> [!TIP]
-> In our documentation you can find many example methods like this `WhoAmIExample` which accept an `IOrganizationService service` parameter.
+> In our documentation, you can find many example methods like this `WhoAmIExample` that accept an `IOrganizationService service` parameter.
Try the examples for these [IOrganizationService methods](xref:Microsoft.Xrm.Sdk.IOrganizationService) methods:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/assign-records-to-team.md b/powerapps-docs/developer/data-platform/org-service/samples/assign-records-to-team.md
index dd1d138f05..6cd8868b00 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/assign-records-to-team.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/assign-records-to-team.md
@@ -2,8 +2,8 @@
title: " Assign a record to a team (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample showcases how to assign records to a team." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/basic-followup-plugin.md b/powerapps-docs/developer/data-platform/org-service/samples/basic-followup-plugin.md
index 7a85e51a64..bd74294d35 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/basic-followup-plugin.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/basic-followup-plugin.md
@@ -2,8 +2,8 @@
title: "Sample: Create a basic plug-in (Microsoft Dataverse) | Microsoft Docs"
description: "Learn how to write a simple plug-in that creates a follow-up activity."
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/column-level-security.md b/powerapps-docs/developer/data-platform/org-service/samples/column-level-security.md
new file mode 100644
index 0000000000..3f0080fb3c
--- /dev/null
+++ b/powerapps-docs/developer/data-platform/org-service/samples/column-level-security.md
@@ -0,0 +1,147 @@
+---
+title: "Sample: Column-level security using Dataverse SDK for .NET"
+description: "This sample shows how to work with column-level security using the Dataverse SDK for .NET."
+ms.date: 07/30/2025
+author: paulliew
+ms.subservice: dataverse-developer
+ms.author: paulliew
+ms.reviewer: jdaly
+ms.topic: sample
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+ - phecke
+---
+# Sample: Column-level security using Dataverse SDK for .NET
+
+This sample shows how to perform [column-level security](../../column-level-security.md) operations using [Dataverse SDK for .NET](../overview.md).
+
+> [!div class="nextstepaction"]
+> [View this sample on Github](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity)
+
+## Prerequisites
+
+- Microsoft Visual Studio 2022
+- Access to Dataverse with system administrator privileges.
+
+## How to run this sample
+
+1. Download or clone the [Samples](https://github.com/Microsoft/PowerApps-Samples) repo so that you have a local copy.
+1. Follow the instructions in the [Configure users](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/README.md#configure-users) section to create a second application user account without the system administrator role.
+1. Edit the [/ColumnLevelSecurity/appsettings.json](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/orgsvc/CSharp-NETCore/ColumnLevelSecurity/appsettings.json) file to define a connection string specifying the Microsoft Dataverse instance you want to connect to for both the system administrator and second application user.
+1. Open the sample solution in Visual Studio and press **F5** to run the sample.
+
+## What this sample does
+
+This sample demonstrates the capabilities described in [Column-level security with code](../../column-level-security.md):
+
+- Discover which columns can be secured in a Dataverse environment
+- Discover which columns are currently secured
+- Secure columns in a Dataverse environment
+- Grant read or write access to selected fields to individual users
+- Modify access to secured fields for individual users
+- Revoke access to selected fields for individual users
+- Provide read and write access to specific groups of users
+- Enable masking of secured columns
+- Retrieve unmasked values for secured columns
+
+## Sample files
+
+The code for this sample is in the following files:
+
+|File|Description|
+|---------|---------|
+|`Program.cs`|Controls the flow of the sample. Contains definition of `Setup`, `Run`, and `Cleanup` methods and calls them in the `Main` method.|
+|`Examples.cs`|Contains methods that demonstrate operations related to column-level security operations.|
+|`Helpers.cs`|Contains methods used by the sample to manage setting up and running the sample. These methods aren't the focus of this sample.|
+
+This sample is designed to be resilient when errors occur so you should be able to run the sample again if it failed previously.
+
+## How this sample works
+
+In order to create the scenario described in [What this sample does](#what-this-sample-does), the sample does the following operations:
+
+### Setup
+
+The static `Setup` method in this sample does the following operations:
+
+1. Create a solution publisher named `ColumnLevelSecuritySamplePublisher` with customization prefix of `sample` if it doesn't exist.
+1. Create a solution named `ColumnLevelSecuritySampleSolution` associated with the publisher if it doesn't exist.
+
+ All subsequent solution-aware items are created in the context of this solution.
+
+1. Create a table named `sample_Example` if it doesn't exist.
+1. Create four string columns in the `sample_Example` table if they don't exist. The table schema names are:
+
+ - `sample_Email`
+ - `sample_GovernmentId`
+ - `sample_TelephoneNumber`
+ - `sample_DateOfBirth`
+
+1. Remove any existing sample data in the `sample_Example` table.
+1. Add three rows of sample data with information in each column of the `sample_Example` table.
+1. Create a new security role named **Column-level security sample role**.
+1. Add privileges for the `sample_Example` table to the security role.
+1. Associate the user to the security role.
+1. Create a [Field Security Profile](../../reference/entities/fieldsecurityprofile.md) record named **Example Field Security Profile** that is used in the [Manage access to secure column data to groups](#manage-access-to-secure-column-data-to-groups) section of the sample.
+1. Associate the application user to the field security profile.
+1. Wait 30 seconds for the cache to catch up with the new objects created.
+
+### Demonstrate
+
+The static `Run` method in this sample does the following operations:
+
+#### Retrieve information about columns
+
+1. Use the `Examples.DumpColumnSecurityInfo` method to download a CSV file with data about which columns in the system can be secured.
+1. Use the `Examples.GetSecuredColumnList` method to retrieve and show a list of environment columns that are already secured.
+
+#### Secure columns
+
+1. Demonstrate that the application user can retrieve data from all the columns in the `sample_Example` table.
+1. Use the `Examples.SetColumnIsSecured` method to secure the four columns
+1. Demonstrate that the application user can no longer retrieve data from the secured columns in the `sample_Example` table.
+
+#### Grant access to secure column data to individuals
+
+1. Use the `Examples.GrantColumnAccess` method to grant the application users read access to specific record field values by creating a [Field Sharing (PrincipalObjectAttributeAccess)](../../reference/entities/principalobjectattributeaccess.md) record.
+1. Demonstrate that the application user can now retrieve data from specific secured record fields in the `sample_Example` table.
+1. Demonstrate that the application user isn't allowed to write data to the secured columns.
+1. Use the `Examples.ModifyColumnAccess` method to grant write access to a specific record field.
+1. Demonstrate that the application user is now allowed to write data to the specific record field.
+1. Use the `Examples.RevokeColumnAccess` method to delete the `PrincipalObjectAttributeAccess` records that gave the application user access to the secured columns.
+
+#### Manage access to secure column data to groups
+
+1. Add field permissions to the **Example Field Security Profile** record that was created in `Setup` by creating [Field Permission (FieldPermission)](../../reference/entities/fieldpermission.md) records
+1. Demonstrate that the application user can view only the secured columns specified in the field permission records.
+1. Demonstrate that the application user isn't allowed to write data to the specific record field not enabled with field permissions.
+
+#### Masking
+
+1. Retrieve ID values for existing masking rules. Create new [Secured Masking Column (AttributeMaskingRule)](../../reference/entities/attributemaskingrule.md) records to specify masking rules for columns of the `sample_Example` table.
+1. Update the `canreadunmasked` column values of the [Field Permission (FieldPermission)](../../reference/entities/fieldpermission.md) records created earlier.
+1. Wait 30 seconds for the cache to catch up with the new objects created.
+1. Demonstrate that the application user can now retrieve data with masked values.
+1. Demonstrate that the application user can now retrieve unmasked values with [RetrieveMultipleRequest class](/dotnet/api/microsoft.xrm.sdk.messages.retrievemultiplerequest) when using the [UnMaskedData optional parameter](../../optional-parameters.md#return-unmasked-data).
+1. Demonstrate that the application user can now retrieve unmasked values with [RetrieveRequest class](/dotnet/api/microsoft.xrm.sdk.messages.retrieverequest) when using the [UnMaskedData optional parameter](../../optional-parameters.md#return-unmasked-data).
+
+#### Export solution
+
+Use an exported solution to test the functionality of the sample configurations outside of this sample.
+
+1. Export the solution created with all the configurations as an unmanaged solution.
+1. Export the solution created with all the configurations as a managed solution
+
+### Clean up
+
+The static `Cleanup` method in this sample does the following operations:
+
+When the `SampleSettings.DeleteCreatedObjects` setting in `appsettings.json` is `true`, the `Cleanup` method tries to delete all components created during `Setup` or `Run`. The goal is to return the environment to the original state. If you don't want the items to be deleted, you can change the setting to `false`.
+
+### Related samples
+
+[Sample: Column-level security using Dataverse Web API (PowerShell)](../../webapi/samples/column-level-security-powershell.md)
+
+[!INCLUDE[footer-include](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/convert-queries-fetch-queryexpression.md b/powerapps-docs/developer/data-platform/org-service/samples/convert-queries-fetch-queryexpression.md
index 06dc0fe718..ee3eda0e71 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/convert-queries-fetch-queryexpression.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/convert-queries-fetch-queryexpression.md
@@ -2,8 +2,8 @@
title: "Sample: Convert queries between Fetch and QueryExpression"
description: This sample shows how to convert queries between FetchXML and QueryExpression
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/create-update-multiple.md b/powerapps-docs/developer/data-platform/org-service/samples/create-update-multiple.md
index 512415a606..f7a72ab75d 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/create-update-multiple.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/create-update-multiple.md
@@ -2,8 +2,8 @@
title: "Sample: SDK for .NET Use bulk operations (Microsoft Dataverse) | Microsoft Docs"
description: "This sample shows how to perform bulk create and update operations using several different approaches including the use of CreateMultipleRequest and UpdateMultipleRequest classes. The messages for these request classes are optimized to provide the most performant way to create or update records with Dataverse."
ms.date: 06/01/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/create-update-records-with-related-records.md b/powerapps-docs/developer/data-platform/org-service/samples/create-update-records-with-related-records.md
index bf164f18d6..161f872938 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/create-update-records-with-related-records.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/create-update-records-with-related-records.md
@@ -2,8 +2,8 @@
title: "Sample: Create and update records with related records (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample showcases how to create and update records with related records." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/createmultiple-updatemultiple-plugin.md b/powerapps-docs/developer/data-platform/org-service/samples/createmultiple-updatemultiple-plugin.md
index d5d7b0190c..12a5eb28d1 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/createmultiple-updatemultiple-plugin.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/createmultiple-updatemultiple-plugin.md
@@ -2,8 +2,8 @@
title: "Sample: CreateMultiple and UpdateMultiple plug-ins (Microsoft Dataverse) | Microsoft Docs"
description: "This sample shows how to write plug-ins for the CreateMultiple and UpdateMultiple messages"
ms.date: 06/01/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/early-bound-entity-operations.md b/powerapps-docs/developer/data-platform/org-service/samples/early-bound-entity-operations.md
index b07eb16a87..734326868a 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/early-bound-entity-operations.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/early-bound-entity-operations.md
@@ -2,8 +2,8 @@
title: "Sample: Create, update related records early bound(Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to create, retrieve, update, and delete operations on an account using the early bound class. " # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/enable-field-security-entity.md b/powerapps-docs/developer/data-platform/org-service/samples/enable-field-security-entity.md
deleted file mode 100644
index ffbd4b0070..0000000000
--- a/powerapps-docs/developer/data-platform/org-service/samples/enable-field-security-entity.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-title: "Sample: Enable field security for a table (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "This sample shows how to enable field security for a table" # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 04/03/2022
-author: paulliew
-ms.author: paulliew
-ms.reviewer: jdaly
-ms.topic: sample
-search.audienceType:
- - developer
-contributors:
- - JimDaly
- - phecke
----
-
-# Sample: Enable field security for a table
-
-[!INCLUDE[cc-terminology](../../includes/cc-terminology.md)]
-
-This sample shows how to enable field security for a table.
-
-> [!div class="nextstepaction"]
-> [SDK for .NET: Enable field security for a table sample code](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/orgsvc/CSharp/FieldSecurity)
-
-[!INCLUDE[cc-terminology](../../includes/cc-terminology.md)]
-
-This sample requires additional users that are not in your system. Create the required users manually in **Microsoft 365** in order to run the sample without any errors. For this sample, create a user profile **as is** shown below.
-
-**First Name**: Samantha
-**Last Name**: Smith
-**Security Role**: Marketing Manager
-**UserName**: ssmith@yourorg.onmicrosoft.com
-
-## How to run this sample
-
-[!include[cc-how-to-run-samples](../../includes/cc-how-to-run-samples.md)]
-
-## How this sample works
-
-In order to simulate the scenario described above, the sample will do the following:
-
-### Setup
-
-1. Checks for the current version of the org.
-2. Gets the user that you have created manually in **Microsoft 365**.
-3. Retrieve the security role needed to assign to the user.
-4. Retrieve the default business unit needed to create the team.
-5. Instantiate a team record and set its property values.
-
-### Demonstrate
-
-1. Creates field security profile and create the request object and set the monikers with the teamprofiles_assocation relationship.
-2. Creates custom activity table and columns using the `CreateEntityRequest` and `CreateAttributeRequest` message.
-3. Create the field permission for the identity column.
-
-### Clean up
-
-Display an option to delete the records in [Setup](#setup). The deletion is optional in case you want to examine the tables and data created by the sample. You can manually delete the records to achieve the same result.
-
-[!INCLUDE[footer-include](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-requests.md b/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-requests.md
index d1a4e052c4..7e9bb24fe7 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-requests.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-requests.md
@@ -2,8 +2,8 @@
title: "Sample: Execute multiple requests (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to execute multiple organization messages requests by using a single web service method call." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-transaction.md b/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-transaction.md
index fa8647fd9a..7f0ea2c780 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-transaction.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/execute-multiple-transaction.md
@@ -2,8 +2,8 @@
title: "Sample: Execute multiple requests in transaction (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to execute multiple request in transaction." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/file-operations.md b/powerapps-docs/developer/data-platform/org-service/samples/file-operations.md
index aa96995a87..fa80e0f554 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/file-operations.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/file-operations.md
@@ -2,8 +2,8 @@
title: "Sample: File Operations using Dataverse SDK for .NET (Microsoft Dataverse) | Microsoft Learn" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample demonstrates how to perform operations with file columns using the Dataverse SDK for .NET." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 12/04/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/insert-update-record-upsert.md b/powerapps-docs/developer/data-platform/org-service/samples/insert-update-record-upsert.md
index ba88818641..7c097fa3de 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/insert-update-record-upsert.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/insert-update-record-upsert.md
@@ -2,8 +2,8 @@
title: "Sample: Insert or update record using Upsert (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to insert or update records using the Upsert message." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/issystemadmin-customapi-sample-plugin.md b/powerapps-docs/developer/data-platform/org-service/samples/issystemadmin-customapi-sample-plugin.md
index 91b225e3c2..deec243d16 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/issystemadmin-customapi-sample-plugin.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/issystemadmin-customapi-sample-plugin.md
@@ -2,8 +2,8 @@
title: "Sample: IsSystemAdmin custom API plug-in (Microsoft Dataverse) | Microsoft Docs"
description: "Learn how to write a plug-in to support a custom API"
ms.date: 09/27/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/late-bound-entity-operations.md b/powerapps-docs/developer/data-platform/org-service/samples/late-bound-entity-operations.md
index 230dcbdecc..5b3b585e42 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/late-bound-entity-operations.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/late-bound-entity-operations.md
@@ -2,8 +2,8 @@
title: "Sample: Create, retrieve, update, and delete (late bound) (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample demonstrates the create, retrieve, update, and delete operations on an account using the late bound table class." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/merge-two-records.md b/powerapps-docs/developer/data-platform/org-service/samples/merge-two-records.md
index 91304dfbe2..de2561ef98 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/merge-two-records.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/merge-two-records.md
@@ -2,8 +2,8 @@
title: "Sample: Merge two records (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample showcases how to merge two records." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/modify-query-preoperation-stage.md b/powerapps-docs/developer/data-platform/org-service/samples/modify-query-preoperation-stage.md
index 6b7806a89e..f6e4c8b49c 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/modify-query-preoperation-stage.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/modify-query-preoperation-stage.md
@@ -2,8 +2,8 @@
title: "Sample: Modify query in PreOperation stage (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to write a plug-in that modifies a query defined within the PreOperation stage of a RetrieveMultiple request." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-permissions.md b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-permissions.md
deleted file mode 100644
index 9c36623486..0000000000
--- a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-permissions.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-title: "Sample: Retrieve field permissions (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "This sample shows how to retrieve secured columns for a user" # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 04/03/2022
-author: paulliew
-ms.author: paulliew
-ms.reviewer: jdaly
-ms.topic: sample
-search.audienceType:
- - developer
-contributors:
- - JimDaly
- - phecke
----
-
-# Sample: Retrieve field permissions
-
-This sample shows how to retrieve secured columns for a user according to the steps outlined in [Field security tables](/dynamics365/customer-engagement/developer/field-security-entities).
-
-> [!div class="nextstepaction"]
-> [SDK for .NET: Retrieve field permissions sample code](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/orgsvc/CSharp/RetrieveFieldPermission)
-
-This sample requires additional users that are not in your system. Create the required users manually in **Microsoft 365** in order to run the sample without any errors. For this sample create a user profile **as is** shown below. Replace `yourorg` with the organization name.
-
-**First Name**: Samantha
-**Last Name**: Smith
-**Security Role**: Marketing Manager
-**UserName**: ssmith@yourorg.onmicrosoft.com
-
-## How to run this sample
-
-[!include[cc-how-to-run-samples](../../includes/cc-how-to-run-samples.md)]
-
-## What this sample does
-
-The `FieldPermission` class is intended to be used in a scenario where it contains the data that defines the possible permission types.
-
-## How this sample works
-
-In order to simulate the scenario described in [What this sample does](#what-this-sample-does), the sample will do the following:
-
-### Setup
-
-1. Checks for the current version of the org.
-1. Gets the user information that you have created manually in **Microsoft 365**.
-1. The `QueryExpression` method retrieves the security role needed to assign to the user.
-1. The `Team` method instantiate a team record and set its property values.
-
-### Demonstrate
-
-1. The `FieldSecurityProfile` method creates field security profile.
-1. The `AssociateRequest` method adds team and user to the profile.
-1. The `CreateEntityRequest` method creates a new custom activity table for the sample.
-1. The `RolePrivilege` method adds privileges for the new custom table.
-1. The `AddPrivilegeRoleRequest` method creates and execute the `RolePrivilege` method.
-1. The `FieldPermission` method creates field permission object for identity.
-
-### Clean up
-
-Display an option to delete the records created in the [Setup](#setup). The deletion is optional in case you want to examine the tables and data created by the sample. You can manually delete the records to achieve the same result.
-
-[!INCLUDE[footer-include](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-sharing-records.md b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-sharing-records.md
deleted file mode 100644
index c63454e1b1..0000000000
--- a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-field-sharing-records.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-title: "Sample: Retrieve field sharing records (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
-description: "This sample shows how to retrieve the field sharing records for a table." # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 04/03/2022
-author: paulliew
-ms.author: paulliew
-ms.reviewer: jdaly
-ms.topic: sample
-search.audienceType:
- - developer
-contributors:
- - JimDaly
- - phecke
----
-
-# Sample: Retrieve field sharing records
-
-This sample shows how to retrieve the `PrincipalObjectAttributeAccess` (field sharing) records for a table.
-
-> [!div class="nextstepaction"]
-> [SDK for .NET: Retrieve field sharing records sample code](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/orgsvc/CSharp/RetrieveFieldSharing)
-
-## How to run this sample
-
-[!include[cc-how-to-run-samples](../../includes/cc-how-to-run-samples.md)]
-
-## What this sample does
-
-The `PrincipleObjectAttributeAccess` message is intended to be used in a scenario where it retrieves the field sharing records for a table.
-
-## How this sample works
-
-In order to simulate the scenario described in [What this sample does](#what-this-sample-does), the sample will do the following:
-
-### Setup
-
-1. Checks for the current version of the org.
-2. The `CreateAttributeRequest` method creates the custom columns required for the sample.
-
-### Demonstrate
-
-1. The `WhoAMIRequest` retrieves the current user's information.
-2. The `RetrieveUserPrivilegesRequest` message checks if the current user has `prvReadPOAA`.
-3. The `PrincipalObjectAttributeAccess` creates POAA table for the custom columns created in the Setup(#setup).
-4. Using the `QueryExpression` retrieve user shared column permissions.
-
-### Clean up
-
-Display an option to delete the sample data that is created in [Setup](#setup). The deletion is optional in case you want to examine the tables and data created by the sample. You can manually delete the records to achieve the same result.
-
-[!INCLUDE[footer-include](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-querybyattribute-class.md b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-querybyattribute-class.md
index 8054f83ce5..4f35b2f404 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-querybyattribute-class.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-querybyattribute-class.md
@@ -2,8 +2,8 @@
title: "Sample: Retrieve multiple with the QueryByAttribute class(Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to use QueryByAttribute class" # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-queryexpression-class.md b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-queryexpression-class.md
index 1b0aa6bad3..417dd8b028 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-queryexpression-class.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-multiple-queryexpression-class.md
@@ -2,8 +2,8 @@
title: "Sample: Retrieve multiple with QueryExpression (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to retrieve multiple using QueryExpression" # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-records-intersect-table.md b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-records-intersect-table.md
index d3f17b5ff2..6e29349209 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/retrieve-records-intersect-table.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/retrieve-records-intersect-table.md
@@ -2,8 +2,8 @@
title: "Sample: Retrieve records from an intersect table(Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to retrieve record from an intersect table." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/serialize-deserialize-entity.md b/powerapps-docs/developer/data-platform/org-service/samples/serialize-deserialize-entity.md
index 0570806143..fde532525b 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/serialize-deserialize-entity.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/serialize-deserialize-entity.md
@@ -2,8 +2,8 @@
title: "Sample: Serialize and deserialize entity instances (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample showcases how to serialize and deserialize entity instances." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/toc.yml b/powerapps-docs/developer/data-platform/org-service/samples/toc.yml
index 09bdbbc6a3..ee6413c235 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/toc.yml
+++ b/powerapps-docs/developer/data-platform/org-service/samples/toc.yml
@@ -187,14 +187,8 @@ items:
href: attachment-annotation-files.md
- name: Use optimistic concurrency with update and delete operations
href: use-optimistic-concurrency-update-delete-operations.md
- - name: Field Level Security
- items:
- - name: Enable field security for a table
- href: enable-field-security-entity.md
- - name: Retrieve field permissions
- href: retrieve-field-permissions.md
- - name: Retrieve field sharing records
- href: retrieve-field-sharing-records.md
+ - name: Column-Level Security
+ href: column-level-security.md
- name: Files and images
items:
- name: File Operations
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/use-aggregation-fetchxml.md b/powerapps-docs/developer/data-platform/org-service/samples/use-aggregation-fetchxml.md
index 6366d602b0..74505a877b 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/use-aggregation-fetchxml.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/use-aggregation-fetchxml.md
@@ -2,8 +2,8 @@
title: "Sample: Use aggregation in FetchXML (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to retrieve aggregate record data using FetchXML." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/use-duplicate-detection-when-creating-and-updating-records.md b/powerapps-docs/developer/data-platform/org-service/samples/use-duplicate-detection-when-creating-and-updating-records.md
index d8d2fcfada..f6c182fb1d 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/use-duplicate-detection-when-creating-and-updating-records.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/use-duplicate-detection-when-creating-and-updating-records.md
@@ -2,8 +2,8 @@
title: "Sample: Use duplicate detection when creating and updating records (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to invoke duplicate detection for creating and updating table records" # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/use-fetchxml-paging-cookie.md b/powerapps-docs/developer/data-platform/org-service/samples/use-fetchxml-paging-cookie.md
index 0324becf82..ce967c5361 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/use-fetchxml-paging-cookie.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/use-fetchxml-paging-cookie.md
@@ -2,8 +2,8 @@
title: "Sample: Use FetchXML with a paging cookie (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to use the paging cookie in a FetchXML" # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/use-optimistic-concurrency-update-delete-operations.md b/powerapps-docs/developer/data-platform/org-service/samples/use-optimistic-concurrency-update-delete-operations.md
index f0627053ec..6aee4c1dd0 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/use-optimistic-concurrency-update-delete-operations.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/use-optimistic-concurrency-update-delete-operations.md
@@ -2,8 +2,8 @@
title: "Sample: Use optimistic concurrency with update and delete operations (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to use optimistic concurrency for update and delete operations." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/use-queryexpression-with-a-paging-cookie.md b/powerapps-docs/developer/data-platform/org-service/samples/use-queryexpression-with-a-paging-cookie.md
index 278771140c..eda8298a9b 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/use-queryexpression-with-a-paging-cookie.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/use-queryexpression-with-a-paging-cookie.md
@@ -2,8 +2,8 @@
title: "Sample: Use QueryExpresion with a paging cookie (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This sample shows how to use the paging cookie in a QueryExpresion" # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/samples/web-access-plugin.md b/powerapps-docs/developer/data-platform/org-service/samples/web-access-plugin.md
index 6a7a3f0a66..10663ee3a4 100644
--- a/powerapps-docs/developer/data-platform/org-service/samples/web-access-plugin.md
+++ b/powerapps-docs/developer/data-platform/org-service/samples/web-access-plugin.md
@@ -2,8 +2,8 @@
title: "Sample: Web access from a plug-in (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Learn how to write a plug-in that can access resources on the World Wide Web." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 01/24/2025
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: sample
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/subscribe-sdk-assembly-updates-using-nuget.md b/powerapps-docs/developer/data-platform/org-service/subscribe-sdk-assembly-updates-using-nuget.md
index 2b5544b763..f3104bc447 100644
--- a/powerapps-docs/developer/data-platform/org-service/subscribe-sdk-assembly-updates-using-nuget.md
+++ b/powerapps-docs/developer/data-platform/org-service/subscribe-sdk-assembly-updates-using-nuget.md
@@ -5,8 +5,8 @@ ms.collection: get-started
ms.date: 04/14/2023
ms.reviewer: pehecke
ms.topic: article
-author: MicroSri # GitHub ID
-ms.author: sriknair # MSFT alias of Microsoft employees only
+author: MsSQLGirl # GitHub ID
+ms.author: jukoesma # MSFT alias of Microsoft employees only
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/org-service/use-executeAsync.md b/powerapps-docs/developer/data-platform/org-service/use-executeAsync.md
index 875a801fdf..30c2cfff72 100644
--- a/powerapps-docs/developer/data-platform/org-service/use-executeAsync.md
+++ b/powerapps-docs/developer/data-platform/org-service/use-executeAsync.md
@@ -2,8 +2,8 @@
title: "Use ExecuteAsync to execute messages asynchronously (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "You can use the ExecuteAsync message to import solutions asynchronously." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: "article"
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/use-executetransaction.md b/powerapps-docs/developer/data-platform/org-service/use-executetransaction.md
index b534a58f2d..34965c7d76 100644
--- a/powerapps-docs/developer/data-platform/org-service/use-executetransaction.md
+++ b/powerapps-docs/developer/data-platform/org-service/use-executetransaction.md
@@ -2,8 +2,8 @@
title: "Execute messages in a single database transaction (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "You can execute two or more requests in a single database transaction using the ExecuteTransactionRequest class." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 05/21/2025
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: "article"
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/use-late-bound-entity-class-linq-query.md b/powerapps-docs/developer/data-platform/org-service/use-late-bound-entity-class-linq-query.md
index 7544ac44fe..9e60678fde 100644
--- a/powerapps-docs/developer/data-platform/org-service/use-late-bound-entity-class-linq-query.md
+++ b/powerapps-docs/developer/data-platform/org-service/use-late-bound-entity-class-linq-query.md
@@ -2,8 +2,8 @@
title: "Use late-bound Entity class with a LINQ query (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Read how you can use late binding with .NET Language-Integrated Query (LINQ) queries." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: how-to
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/use-linq-construct-query.md b/powerapps-docs/developer/data-platform/org-service/use-linq-construct-query.md
index 594e2381df..a0f09d3a36 100644
--- a/powerapps-docs/developer/data-platform/org-service/use-linq-construct-query.md
+++ b/powerapps-docs/developer/data-platform/org-service/use-linq-construct-query.md
@@ -2,8 +2,8 @@
title: "Use LINQ to construct a query (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Describes how to use the .NET Language-Integrated Query (LINQ) query provider to construct a Microsoft Dataverse query." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: how-to
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/use-messages.md b/powerapps-docs/developer/data-platform/org-service/use-messages.md
index 8d1f14baa3..3d28694983 100644
--- a/powerapps-docs/developer/data-platform/org-service/use-messages.md
+++ b/powerapps-docs/developer/data-platform/org-service/use-messages.md
@@ -3,8 +3,8 @@ title: "Use messages with the SDK for .NET (Microsoft Dataverse) | Microsoft Doc
description: "Understand how messages are used to invoke operations using the SDK for .NET."
ms.collection: get-started
ms.date: 03/26/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: how-to
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/use-querybyattribute-class.md b/powerapps-docs/developer/data-platform/org-service/use-querybyattribute-class.md
index 228e00041c..035ef3d81c 100644
--- a/powerapps-docs/developer/data-platform/org-service/use-querybyattribute-class.md
+++ b/powerapps-docs/developer/data-platform/org-service/use-querybyattribute-class.md
@@ -2,8 +2,8 @@
title: "Use the QueryByAttribute class (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "You can use the QueryByAttribute class to build queries that test a set of columns against a set of values"
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: "article"
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/org-service/visual-studio-dot-net-framework.md b/powerapps-docs/developer/data-platform/org-service/visual-studio-dot-net-framework.md
index 0492cec766..024be707e1 100644
--- a/powerapps-docs/developer/data-platform/org-service/visual-studio-dot-net-framework.md
+++ b/powerapps-docs/developer/data-platform/org-service/visual-studio-dot-net-framework.md
@@ -3,8 +3,8 @@ title: "Visual Studio and the .NET Framework (Microsoft Dataverse) | Microsoft D
description: "Learn about managed code development tools and requirements."
ms.collection: get-started
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: "article"
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/organization-table.md b/powerapps-docs/developer/data-platform/organization-table.md
index 739a0a54c9..fa32b8c35c 100644
--- a/powerapps-docs/developer/data-platform/organization-table.md
+++ b/powerapps-docs/developer/data-platform/organization-table.md
@@ -1,12 +1,12 @@
---
title: "Read and update environment settings (Microsoft Dataverse)"
description: "Change environment settings in the organization table."
-ms.date: 06/28/2023
-ms.reviewer: jdaly
+ms.date: 06/10/2025
ms.topic: article
-author: MicroSri
+author: MsSQLGirl
+ms.author: jukoesma
+ms.reviewer: jdaly
ms.subservice: dataverse-developer
-ms.author: sriknair
search.audienceType:
- developer
contributors:
@@ -28,7 +28,7 @@ For example, the following columns are supported because they're mentioned in th
|Setting|Link to documentation|
|---------|---------|
-|[IsAuditEnabled](reference/entities/organization.md#BKMK_IsAuditEnabled)
[AuditRetentionPeriodV2](reference/entities/organization.md#BKMK_AuditRetentionPeriodV2)
[IsUserAccessAuditEnabled](reference/entities/organization.md#BKMK_IsUserAccessAuditEnabled)
[UserAccessAuditingInterval](reference/entities/organization.md#BKMK_UserAccessAuditingInterval)|[Configure auditing](auditing/configure.md)|
+|[AuditSettings](reference/entities/organization.md#BKMK_AuditSettings)
[IsAuditEnabled](reference/entities/organization.md#BKMK_IsAuditEnabled)
[AuditRetentionPeriodV2](reference/entities/organization.md#BKMK_AuditRetentionPeriodV2)
[IsUserAccessAuditEnabled](reference/entities/organization.md#BKMK_IsUserAccessAuditEnabled)
[UserAccessAuditingInterval](reference/entities/organization.md#BKMK_UserAccessAuditingInterval)|[Configure auditing](auditing/configure.md)|
|[ExpireSubscriptionsInDays](reference/entities/organization.md#BKMK_ExpireSubscriptionsInDays)|[Cache Schema data](cache-schema-data.md)|
|[MaxUploadFileSize](reference/entities/organization.md#BKMK_MaxUploadFileSize)
[BlockedAttachments](reference/entities/organization.md#BKMK_BlockedAttachments)
[BlockedMimeTypes](reference/entities/organization.md#BKMK_BlockedMimeTypes)
[AllowedMimeTypes](reference/entities/organization.md#BKMK_AllowedMimeTypes)|[Files and images overview](files-images-overview.md)|
|[PluginTraceLogSetting](reference/entities/organization.md#BKMK_PluginTraceLogSetting)|[Tracing and logging](logging-tracing.md)|
diff --git a/powerapps-docs/developer/data-platform/plug-ins.md b/powerapps-docs/developer/data-platform/plug-ins.md
index bdce3b0762..0ecd458be2 100644
--- a/powerapps-docs/developer/data-platform/plug-ins.md
+++ b/powerapps-docs/developer/data-platform/plug-ins.md
@@ -5,9 +5,9 @@ ms.collection: get-started
ms.date: 01/24/2024
ms.reviewer: pehecke
ms.topic: article
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/query-antipatterns.md b/powerapps-docs/developer/data-platform/query-antipatterns.md
index e8a1ab640c..f6daf292df 100644
--- a/powerapps-docs/developer/data-platform/query-antipatterns.md
+++ b/powerapps-docs/developer/data-platform/query-antipatterns.md
@@ -3,8 +3,8 @@ title: "Query anti-patterns (Microsoft Dataverse)"
description: "Read about patterns to avoid when constructing queries to retrieve data from Dataverse."
ms.date: 01/06/2025
ms.topic: how-to
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.subservice: dataverse-developer
search.audienceType:
@@ -96,7 +96,7 @@ Database collation unicode sorting rules make some search strings that start wit
## Avoid using formula or calculated columns in filter conditions
-[Formula and calculated column](calculated-rollup-attributes.md#formula-and-calculated-columns) values are calculated in real-time when they're retrieved. Queries that use filters on these columns force Dataverse to calculate the value for each possible record that can be returned so the filter can be applied. Queries are slower because Dataverse can't improve the performance of these queries using SQL.
+[Formula and calculated column](specialized-columns.md#formula-and-calculated-columns) values are calculated in real-time when they're retrieved. Queries that use filters on these columns force Dataverse to calculate the value for each possible record that can be returned so the filter can be applied. Queries are slower because Dataverse can't improve the performance of these queries using SQL.
When queries time out and this pattern is detected, Dataverse returns a unique error to help identify which queries are using this pattern:
diff --git a/powerapps-docs/developer/data-platform/query-json-columns-elastic-tables.md b/powerapps-docs/developer/data-platform/query-json-columns-elastic-tables.md
index 395127f03f..c726a26154 100644
--- a/powerapps-docs/developer/data-platform/query-json-columns-elastic-tables.md
+++ b/powerapps-docs/developer/data-platform/query-json-columns-elastic-tables.md
@@ -3,8 +3,8 @@ title: Query JSON columns in elastic tables
description: Learn how to query data stored in JSON columns with Dataverse elastic tables with code.
ms.topic: how-to
ms.date: 12/04/2023
-author: pnghub
-ms.author: gned
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/query-throttling.md b/powerapps-docs/developer/data-platform/query-throttling.md
index 208833393d..2dbbfceac3 100644
--- a/powerapps-docs/developer/data-platform/query-throttling.md
+++ b/powerapps-docs/developer/data-platform/query-throttling.md
@@ -5,9 +5,9 @@ ms.date: 01/08/2025
ms.topic: article
applies_to:
- "Dynamics 365 (online)"
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
ms.reviewer: pehecke
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/quick-find.md b/powerapps-docs/developer/data-platform/quick-find.md
index 52c58bdb95..1f849f9644 100644
--- a/powerapps-docs/developer/data-platform/quick-find.md
+++ b/powerapps-docs/developer/data-platform/quick-find.md
@@ -4,9 +4,9 @@ description: "Learn how about Dataverse quick find queries and their limitations
ms.date: 01/30/2024
ms.reviewer: jdaly
ms.topic: article
-author: pnghub
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: gned
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/reference/web-service-error-codes.md b/powerapps-docs/developer/data-platform/reference/web-service-error-codes.md
index 2593b466c9..882a0e29d5 100644
--- a/powerapps-docs/developer/data-platform/reference/web-service-error-codes.md
+++ b/powerapps-docs/developer/data-platform/reference/web-service-error-codes.md
@@ -1,9 +1,9 @@
---
title: "Web service error codes (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This topic lists the error codes you might encounter when you debug your code. " # 115-145 characters including spaces. This abstract displays in the search result.
-ms.date: 02/24/2025
-author: MicroSri
-ms.author: sriknair
+ms.date: 07/21/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: generated-reference
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/register-plug-in.md b/powerapps-docs/developer/data-platform/register-plug-in.md
index 731c4d4c2c..5f8da99c56 100644
--- a/powerapps-docs/developer/data-platform/register-plug-in.md
+++ b/powerapps-docs/developer/data-platform/register-plug-in.md
@@ -4,9 +4,9 @@ description: "Learn how to register a plug-in assembly and step with the Microso
ms.date: 08/28/2024
ms.reviewer: "pehecke"
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/security-sharing-assigning.md b/powerapps-docs/developer/data-platform/security-sharing-assigning.md
index df49f8f2c7..52a767804b 100644
--- a/powerapps-docs/developer/data-platform/security-sharing-assigning.md
+++ b/powerapps-docs/developer/data-platform/security-sharing-assigning.md
@@ -1,7 +1,7 @@
---
title: Sharing and assigning
description: Learn about the security that applies to sharing and assigning records.
-ms.date: 06/06/2023
+ms.date: 04/06/2025
ms.reviewer: pehecke
ms.topic: concept-article
author: paulliew
@@ -43,6 +43,7 @@ assigned to that user. For example, if a user doesn't have **Read** privileges o
accounts and you share an account with that user, the user is unable to see
that account.
+
### GrantAccess example
These examples show the use of the `GrantAccess` message to share a record with another principal.
@@ -199,50 +200,7 @@ OData-Version: 4.0
---
-## Sharing and inheritance
-
-If a record is created and the parent record has certain sharing properties, the
-new record inherits those properties. For example, Joe and Mike are working on a
-high priority lead. Joe creates a new lead and two activities, shares the lead
-with Mike, and selects cascade sharing. Mike makes a telephone call and sends an
-email regarding the new lead. Joe sees that Mike has contacted the company two
-times, so Joe doesn't make another call.
-
-Sharing is maintained on individual records. A record inherits the sharing
-properties from its parent and maintains its own sharing properties. Therefore,
-a record can have two sets of sharing properties—one that it has on its own, and
-one that it inherits from its parent.
-
-Removing the share of a parent record removes the sharing properties of objects
-(records) that it inherited from the parent. That is, all users who previously
-had visibility into this record no longer have visibility. Child objects still
-could be shared to some of these users if they were shared individually, not
-from the parent record.
-
-## Assigning records
-
-Anyone with **Assign** access rights on a record can assign that record to
-another user. To assign a record, change the `ownerid` lookup value to refer to a new principal.
-
-> [!NOTE]
-> The SDK has an [AssignRequest class](xref:Microsoft.Crm.Sdk.Messages.AssignRequest) that is deprecated. More information: [Legacy update messages](org-service/entity-operations-update-delete.md#legacy-update-messages)
-
-When a record is assigned, the new user, team or organization becomes the owner
-of the record and its related records. The original user, team or organization loses ownership
-of the record, but automatically shares it with the new owner.
-
-In Microsoft Dataverse, the system administrator can decide for an organization
-whether records should be shared with previous owners or not after the assign
-operation. If **Share reassigned records with original owner** is selected (see **System Settings** > **General**), then the previous owner
-shares the record with all access rights after the assign operation. Otherwise,
-the previous owner doesn't share the record and may not have access to the
-record, depending on their privileges. The Organization table's
-[ShareToPreviousOwnerOnAssign](reference/entities/organization.md#BKMK_ShareToPreviousOwnerOnAssign) column controls this setting.
-
-> [!NOTE]
-> The [Appointment table](reference/entities/appointment.md) has special logic when an appointment is assigned to another user. If the current owner is still a participant, such as the organizer or an attendee, the appointment record is shared with this user when the appointment is reassigned. This behavior occurs even if the **Share reassigned records with original owner** setting is disabled. Because the appointment may be shared with the previous owner, the user assigning the meeting requires both the **Assign** and **Share** access rights on the record.
-
-## Revoking access
+### RevokeAccess example
The owner of the record can use the `RevokeAccess` message to revoke (remove) user access to the shared record.
@@ -310,6 +268,51 @@ OData-Version: 4.0
More information: [Shared access](/power-platform/admin/how-record-access-determined#shared-access.md)
+## Sharing and inheritance
+
+If a record is created and the parent record has certain sharing properties, the
+new record inherits those properties. For example, Joe and Mike are working on a
+high priority lead. Joe creates a new lead and two activities, shares the lead
+with Mike, and selects cascade sharing. Mike makes a telephone call and sends an
+email regarding the new lead. Joe sees that Mike has contacted the company two
+times, so Joe doesn't make another call.
+
+Sharing is maintained on individual records. A record inherits the sharing
+properties from its parent and maintains its own sharing properties. Therefore,
+a record can have two sets of sharing properties—one that it has on its own, and
+one that it inherits from its parent.
+
+Removing the share of a parent record removes the sharing properties of objects
+(records) that it inherited from the parent. That is, all users who previously
+had visibility into this record no longer have visibility. Child objects still
+could be shared to some of these users if they were shared individually, not
+from the parent record.
+
+## Assigning records
+
+Anyone with **Assign** access rights on a record can assign that record to
+another user. To assign a record, change the `ownerid` lookup value to refer to a new principal.
+
+> [!NOTE]
+> The SDK has an [AssignRequest class](xref:Microsoft.Crm.Sdk.Messages.AssignRequest) that is deprecated. More information: [Legacy update messages](org-service/entity-operations-update-delete.md#legacy-update-messages)
+
+When a record is assigned, the new user, team or organization becomes the owner
+of the record and its related records. The original user, team or organization loses ownership
+of the record, but automatically shares it with the new owner.
+
+In Microsoft Dataverse, the system administrator can decide for an organization
+whether records should be shared with previous owners or not after the assign
+operation. If **Share reassigned records with original owner** is selected (see **System Settings** > **General**), then the previous owner
+shares the record with all access rights after the assign operation. Otherwise,
+the previous owner doesn't share the record and may not have access to the
+record, depending on their privileges. The Organization table's
+[ShareToPreviousOwnerOnAssign](reference/entities/organization.md#BKMK_ShareToPreviousOwnerOnAssign) column controls this setting.
+
+> [!NOTE]
+> The [Appointment table](reference/entities/appointment.md) has special logic when an appointment is assigned to another user. If the current owner is still a participant, such as the organizer or an attendee, the appointment record is shared with this user when the appointment is reassigned. This behavior occurs even if the **Share reassigned records with original owner** setting is disabled. Because the appointment may be shared with the previous owner, the user assigning the meeting requires both the **Assign** and **Share** access rights on the record.
+
+
+
## Determine why a user has access
The [check access](/power-apps/user/access-checker) feature in model-driven apps provides information so that people can understand why a user has access to a record. To get this information with code, use the `RetrieveAccessOrigin` message. When passed information about a specific user and record, this message returns a sentence that describes why the user has access. The following are the possible responses when the operation succeeds:
@@ -408,6 +411,7 @@ OData-Version: 4.0
### See also
+[Share data in secured fields](column-level-security.md#share-data-in-secured-fields)
[Sample: Share records using GrantAccess, ModifyAccess and RevokeAccess messages](org-service/samples/share-records-using-grantaccess-modifyaccess-revokeaccess-messages.md)
[!INCLUDE[footer-include](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/send-parallel-requests.md b/powerapps-docs/developer/data-platform/send-parallel-requests.md
index 67186cc5ba..65c619170f 100644
--- a/powerapps-docs/developer/data-platform/send-parallel-requests.md
+++ b/powerapps-docs/developer/data-platform/send-parallel-requests.md
@@ -2,8 +2,8 @@
title: "Send parallel requests (Dataverse)| Microsoft Docs"
description: "When your application needs to send a large number of requests to Dataverse you can achieve much higher total throughput by sending requests in parallel using multiple threads."
ms.date: 01/02/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: how-to
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/special-update-operation-behavior.md b/powerapps-docs/developer/data-platform/special-update-operation-behavior.md
index 8dbc529c68..c1e01c4d3f 100644
--- a/powerapps-docs/developer/data-platform/special-update-operation-behavior.md
+++ b/powerapps-docs/developer/data-platform/special-update-operation-behavior.md
@@ -4,9 +4,9 @@ description: "Describes special behavior in plug-ins and workflows for update ev
ms.date: 03/22/2022
ms.reviewer: "pehecke"
ms.topic: "article"
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/calculated-rollup-attributes.md b/powerapps-docs/developer/data-platform/specialized-columns.md
similarity index 86%
rename from powerapps-docs/developer/data-platform/calculated-rollup-attributes.md
rename to powerapps-docs/developer/data-platform/specialized-columns.md
index b9db2f9bcb..353bdc05ab 100644
--- a/powerapps-docs/developer/data-platform/calculated-rollup-attributes.md
+++ b/powerapps-docs/developer/data-platform/specialized-columns.md
@@ -1,27 +1,28 @@
---
-title: Formula, calculated, and rollup columns using code
-description: "Learn about common elements and characteristics that formula, calculated, and rollup columns use. Learn how to retrieve a calculated rollup column value immediately, and about the SourceTypeMasks enumeration."
-ms.date: 09/15/2023
+title: Specialized columns using code
+description: "Learn about common elements and characteristics that formula, calculated, rollup, and prompt columns use. Learn how to retrieve a calculated rollup column value immediately, and about the SourceTypeMasks enumeration."
+ms.date: 07/23/2025
ms.reviewer: jdaly
ms.topic: article
-author: mkannapiran
-ms.author: kamanick
+author: MsSQLGirl
ms.subservice: dataverse-developer
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
- JimDaly
- sanjeevgoyalmsft
---
-# Formula, calculated, and rollup columns using code
+# Specialized columns using code
-*Formula*, *calculated*, and *rollup* columns free the user from having to manually perform calculations and focus on their work. System administrators can define a field to contain the value of many common calculations without having to work with a developer. Developers can also use the platform capabilities to perform these calculations rather than with code.
+*Formula*, *calculated*, *rollup*, and *prompt* columns free the user from having to manually perform calculations and focus on their work. System administrators can define a field to contain the value of many common calculations without having to work with a developer. Developers can also use the platform capabilities to perform these calculations rather than with code.
This article focuses on how these columns are defined in the column definitions and APIs to interact with rollup columns. We don't support defining the formulas with code. You need to use [Power Apps](https://make.powerapps.com/?utm_source=padocs&utm_medium=linkinadoc&utm_campaign=referralsfromdoc) to set the formulas for the respective type of column. Learn how:
- [Work with formula columns (preview)](../../maker/data-platform/formula-columns.md)
- [Define calculated columns to automate calculations](../../maker/data-platform/define-calculated-fields.md)
- [Define rollup columns that aggregate values](../../maker/data-platform/define-rollup-fields.md)
+- [Prompt columns (preview)](../../maker/data-platform/prompt-column.md)
@@ -42,9 +43,10 @@ All columns that inherit from . The following tables show the available column types and which source types are supported:
+Formula, calculated, rollup, and prompt columns are based on existing column types that inherit from . The following tables show the available column types and which source types are supported:
|Type|Supported source types|
@@ -52,7 +54,7 @@ Formula, calculated, and rollup columns are based on existing column types that
||Formula, Calculated, & Rollup|
| |Formula, Calculated, & Rollup|
||Formula, Calculated, & Rollup|
-||Formula, Calculated, & Rollup|
+||Formula, Calculated, Rollup, & Prompt|
||Calculated & Rollup only|
||Calculated & Rollup only|
||Calculated & Rollup only|
@@ -62,26 +64,21 @@ Each of these types of column has the following properties to support formulas,
| Property |Definition|
|---------|--------|
|`FormulaDefinition`| Contains the definition of the formula used to perform the calculation or rollup. Formula columns are defined using YAML. Calculated and rollup columns are defined using XAML. The only supported way to change this value is through the [Power Apps](https://make.powerapps.com/?utm_source=padocs&utm_medium=linkinadoc&utm_campaign=referralsfromdoc) editor.|
-|`SourceTypeMask`| The bitmask value of this read-only property describes the types of sources used in the formula of the column or if the formula of the column isn't valid.
- 0: `Undefined`. The default value for simple and rollup columns.
- 1: `Simple`. The formula or calculated column refers to a column in the same record.
- 2: `Related`. The formula or calculated column refers to a column in a related record.
- 4: `Logical`. The formula or calculated column refers to a column in the same record that is stored in a different database table. More information: [Logical columns](entity-attribute-metadata.md#logical-columns)
- 8: `Calculated`. The formula or calculated column refers to another formula or calculated column.
- 16: `Rollup`. The formula or calculated column refers a rollup column.
- 32: `Invalid`. The formula, calculated, or rollup column is invalid.
Typically, a column is invalid when it refers to a column that no longer exists.
**Note:** One or more of these conditions may be true for any calculated or rollup column. Because this is a bitmask value, you may find it useful to use the [SourceTypeMasks enumeration](calculated-rollup-attributes.md#BKMK_SourceTypeMasks) when performing bitwise operations. |
+|`SourceTypeMask`| The bitmask value of this read-only property describes the types of sources used in the formula of the column or if the formula of the column isn't valid.
- 0: `Undefined`. The default value for simple and rollup columns.
- 1: `Simple`. The formula or calculated column refers to a column in the same record.
- 2: `Related`. The formula or calculated column refers to a column in a related record.
- 4: `Logical`. The formula or calculated column refers to a column in the same record that is stored in a different database table. More information: [Logical columns](entity-attribute-metadata.md#logical-columns)
- 8: `Calculated`. The formula or calculated column refers to another formula or calculated column.
- 16: `Rollup`. The formula or calculated column refers a rollup column.
- 32: `Invalid`. The formula, calculated, or rollup column is invalid.
Typically, a column is invalid when it refers to a column that no longer exists.
**Note:** One or more of these conditions may be true for any calculated or rollup column. Because this is a bitmask value, you may find it useful to use the [SourceTypeMasks enumeration](specialized-columns.md#BKMK_SourceTypeMasks) when performing bitwise operations. |
## Formula and calculated columns
Formula and calculated columns are calculated in real-time when they're retrieved. Formula and calculated can be composed using different data types. For example, an Integer calculated column may reference values from Decimal or Currency columns.
Only calculated column values are available in the retrieve plug-in pipeline. Post image of a table record update or create contains the calculated column value in stage 40. More information: [Event execution pipeline](event-framework.md#event-execution-pipeline) and [Entity images](understand-the-data-context.md#entity-images)
-
-### Limitations
-
-Formula and calculated columns have the following limitations:
-#### Formula columns
+### Formula column limitations
- Formula columns don't have values when a user with mobile client is offline.
- `MaxValue` and `MinValue` column definitions properties can't be set on formula columns. More information:
[Guidelines and limitations](../../maker/data-platform/formula-columns.md#guidelines-and-limitations)
-
-#### Calculated columns
+### Calculated column limitations
You can't use values in calculated columns on a *[Logical value](entity-attribute-metadata.md#logical-columns)* in the same table to sort data returned by a query. Although your query can specify that the results should be ordered using a calculated column, the sort direction is ignored and doesn't throw an error. If the calculated column references only simple values in the same record, sorting works normally. You can determine the sources used in a calculated column using the `SourceTypeMask` property on the column definitions.
@@ -109,7 +106,7 @@ The **Mass Calculated Rollup Fields** job occurs immediately when a solution con
Each rollup column for a table will also include two supporting columns for the rollup column:
- *\* `_Date`: DateTime – When the rollup was last calculated.
-- *\* `_State`: Integer – The state of the rollup calculation. More information: [Rollup state values](calculated-rollup-attributes.md#BKMK_RollupStateValues)
+- *\* `_State`: Integer – The state of the rollup calculation. More information: [Rollup state values](specialized-columns.md#BKMK_RollupStateValues)
@@ -133,7 +130,7 @@ Rollup columns support a `CalculateRollupField` message that developers can use
This message is a synchronous operation for just the column identified in the request. If the value of that record is included as part of other rollup columns, the values of those columns don't take the possible value change caused by calling this method into consideration until the regularly scheduled asynchronous jobs that perform those calculations occur.
-### Limitations
+### Rollup column limitations
- Rollup columns can't be used as a workflow event or wait condition. These columns don't raise the event to trigger workflows.
- The `ModifiedBy` and `ModifiedOn` columns for the table aren't updated when the rollup column is updated.
@@ -145,6 +142,15 @@ This message is a synchronous operation for just the column identified in the re
+## Prompt columns
+
+Prompt column values are populated when records are created and when the input column values are updated. When prompt columns are added to tables with records, the existing records' new prompt columns aren't populated automatically. Outputs persist in the database and can be used for filtering and sorting like regular columns.
+
+### Prompt column limitations
+
+- Create and update for prompt column using API is not supported at this time.
+- Importing and exporting solutions with prompt columns is not supported at this time.
+
## SourceTypeMasks enumeration
The `SourceTypeMask` property for those columns that support calculated and rollup columns contains a bitmask value. To extract the relevant information from the value, it helps to have an enumeration when performing bitwise operations. Use the following `SourceTypeMasks` enumeration when comparing the `SourceTypeMask` property value.
@@ -187,9 +193,10 @@ The `SourceTypeMask` property for those columns that support calculated and roll
### See also
[Column definitions](entity-attribute-metadata.md)
-[Work with formula columns (preview)](../../maker/data-platform/formula-columns.md)
+[Work with formula columns](../../maker/data-platform/formula-columns.md)
[Define calculated columns](../../maker/data-platform/define-calculated-fields.md)
[Define rollup columns](../../maker/data-platform/define-rollup-fields.md)
[Sample: Rollup records related to a specific record](org-service/samples/rollup-records-related-to-specificed-record.md)
+[Prompt columns (preview)](../../maker/data-platform/prompt-column.md)
[!INCLUDE[footer-include](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/tutorial-debug-plug-in.md b/powerapps-docs/developer/data-platform/tutorial-debug-plug-in.md
index bcb940abaf..26bd4aa3a6 100644
--- a/powerapps-docs/developer/data-platform/tutorial-debug-plug-in.md
+++ b/powerapps-docs/developer/data-platform/tutorial-debug-plug-in.md
@@ -4,9 +4,9 @@ description: "The second of three tutorials that will show you how to work with
ms.date: 03/22/2022
ms.reviewer: "pehecke"
ms.topic: tutorial
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/tutorial-update-plug-in.md b/powerapps-docs/developer/data-platform/tutorial-update-plug-in.md
index aac934590f..1d53c458f4 100644
--- a/powerapps-docs/developer/data-platform/tutorial-update-plug-in.md
+++ b/powerapps-docs/developer/data-platform/tutorial-update-plug-in.md
@@ -4,9 +4,9 @@ description: "The third of three tutorials that will show you how to work with p
ms.date: 07/12/2022
ms.reviewer: "pehecke"
ms.topic: tutorial
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/tutorial-write-plug-in.md b/powerapps-docs/developer/data-platform/tutorial-write-plug-in.md
index 27639f10dc..76cb8d4188 100644
--- a/powerapps-docs/developer/data-platform/tutorial-write-plug-in.md
+++ b/powerapps-docs/developer/data-platform/tutorial-write-plug-in.md
@@ -4,9 +4,9 @@ description: "Learn how to write plug-in code and then register the compiled ass
ms.date: 02/14/2025
ms.reviewer: "pehecke"
ms.topic: tutorial
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/understand-the-data-context.md b/powerapps-docs/developer/data-platform/understand-the-data-context.md
index 7f63350a50..3e2cd71da1 100644
--- a/powerapps-docs/developer/data-platform/understand-the-data-context.md
+++ b/powerapps-docs/developer/data-platform/understand-the-data-context.md
@@ -2,8 +2,8 @@
title: "Understand the execution context (Microsoft Dataverse) | Microsoft Docs"
description: "Learn about the data that is passed to your plug-in when it is executed."
ms.date: 04/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: concept-article
ms.subservice: dataverse-developer
diff --git a/powerapps-docs/developer/data-platform/use-alternate-key-reference-record.md b/powerapps-docs/developer/data-platform/use-alternate-key-reference-record.md
index f2384fffc8..66adf65b79 100644
--- a/powerapps-docs/developer/data-platform/use-alternate-key-reference-record.md
+++ b/powerapps-docs/developer/data-platform/use-alternate-key-reference-record.md
@@ -4,9 +4,9 @@ description: Alternate keys can be used to create instances of Entity and Entity
ms.date: 05/30/2023
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/use-elastic-tables.md b/powerapps-docs/developer/data-platform/use-elastic-tables.md
index 481e27a673..48583fb739 100644
--- a/powerapps-docs/developer/data-platform/use-elastic-tables.md
+++ b/powerapps-docs/developer/data-platform/use-elastic-tables.md
@@ -1106,11 +1106,12 @@ You can use the `DeleteMultiple` message with either the SDK for .NET or Web API
#### [SDK for .NET](#tab/sdk)
-> [!NOTE]
-> With the SDK, you must use the [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest) because the SDK doesn't currently have a `DeleteMultipleRequest` class. [Learn more about using messages with the SDK for .NET](org-service/use-messages.md).
The following `DeleteMultipleExample` static method uses the `DeleteMultiple` message with the [OrganizationRequest class](xref:Microsoft.Xrm.Sdk.OrganizationRequest) to delete multiple rows from the `contoso_SensorData` elastic table. The alternate key is used to include the `partitionid` value to uniquely identify the rows.
+> [!NOTE]
+> The [DeleteMultipleRequest Class](/dotnet/api/microsoft.xrm.sdk.messages.deletemultiplerequest) is now available to use.
+
```csharp
public static void DeleteMultipleExample(IOrganizationService service)
{
@@ -1147,10 +1148,7 @@ public static void DeleteMultipleExample(IOrganizationService service)
#### [Web API](#tab/webapi)
-This example shows how to use the `DeleteMultiple` action to delete multiple rows from `contoso_SensorData` elastic table. The `partitionid` value is included to uniquely identify the rows.
-
-> [!NOTE]
-> Currently, the Web API `DeleteMultiple` action is a private action. You won't find it in the [CSDL $metadata document](webapi/web-api-service-documents.md#csdl-metadata-document) or in the Dataverse . This action will become public in the coming weeks. You can use it while it's private.
+This example shows how to use the [DeleteMultiple action](xref:Microsoft.Dynamics.CRM.DeleteMultiple) to delete multiple rows from `contoso_SensorData` elastic table. The `partitionid` value is included to uniquely identify the rows.
**Request:**
diff --git a/powerapps-docs/developer/data-platform/use-metadata-generate-entity-diagrams.md b/powerapps-docs/developer/data-platform/use-metadata-generate-entity-diagrams.md
index ff886a49f2..ad3d4cb95e 100644
--- a/powerapps-docs/developer/data-platform/use-metadata-generate-entity-diagrams.md
+++ b/powerapps-docs/developer/data-platform/use-metadata-generate-entity-diagrams.md
@@ -4,8 +4,8 @@ description: "Learn about using the Metadata Diagram tool to visually show entit
ms.date: 01/04/2023
ms.reviewer: jdaly
ms.topic: article
-author: MicroSri # GitHub ID
-ms.author: sriknair # MSFT alias of Microsoft employees only
+author: MsSQLGirl # GitHub ID
+ms.author: jukoesma # MSFT alias of Microsoft employees only
ms.subservice: dataverse-developer
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/use-open-types.md b/powerapps-docs/developer/data-platform/use-open-types.md
index b3abdb4a74..3fd20680fb 100644
--- a/powerapps-docs/developer/data-platform/use-open-types.md
+++ b/powerapps-docs/developer/data-platform/use-open-types.md
@@ -3,8 +3,8 @@ title: Use open types with custom APIs
description: Learn how to use open types with Microsoft Dataverse custom APIs.
ms.date: 08/02/2023
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.subservice: dataverse-developer
ms.reviewer: jdaly
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/use-upsert-insert-update-record.md b/powerapps-docs/developer/data-platform/use-upsert-insert-update-record.md
index bd25e70968..7166e0aef7 100644
--- a/powerapps-docs/developer/data-platform/use-upsert-insert-update-record.md
+++ b/powerapps-docs/developer/data-platform/use-upsert-insert-update-record.md
@@ -4,9 +4,9 @@ description: "When loading data into Dataverse from an external system, you may
ms.date: 05/30/2023
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/view-download-developer-resources.md b/powerapps-docs/developer/data-platform/view-download-developer-resources.md
index 1ede84f3d8..f6d6af6120 100644
--- a/powerapps-docs/developer/data-platform/view-download-developer-resources.md
+++ b/powerapps-docs/developer/data-platform/view-download-developer-resources.md
@@ -6,9 +6,9 @@ ms.date: 09/07/2021
ms.custom:
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
ms.reviewer: pehecke
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/virtual-entities/get-started-ve.md b/powerapps-docs/developer/data-platform/virtual-entities/get-started-ve.md
index 2dd6b98424..6bdd656529 100644
--- a/powerapps-docs/developer/data-platform/virtual-entities/get-started-ve.md
+++ b/powerapps-docs/developer/data-platform/virtual-entities/get-started-ve.md
@@ -70,6 +70,7 @@ The following are limitations of virtual tables that should be considered.
- A virtual table can't represent an activity and don't support business process flows.
- Once created, a virtual table can't be changed to be a standard (nonvirtual) table. The reverse is also true whereas a standard table can't be converted into a virtual table.
- Selecting attributes in Retrieve and RetrieveMultiple queries won't be applied since all attributes are returned
+- Reduce and limit including virtual table lookup columns in your grid view. It can take a while to read the virtual table lookup columns.
For more information about how these limitations are reflected in the Dataverse API, see [API considerations of virtual tables](api-considerations-ve.md).
diff --git a/powerapps-docs/developer/data-platform/webapi/associate-disassociate-entities-using-web-api.md b/powerapps-docs/developer/data-platform/webapi/associate-disassociate-entities-using-web-api.md
index 928e39946e..8e4cda125d 100644
--- a/powerapps-docs/developer/data-platform/webapi/associate-disassociate-entities-using-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/associate-disassociate-entities-using-web-api.md
@@ -2,8 +2,8 @@
title: "Associate and disassociate table rows using the Web API (Microsoft Dataverse)| Microsoft Docs"
description: "How to relate and unrelate records using the Web API"
ms.date: 08/15/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/authenticate-web-api.md b/powerapps-docs/developer/data-platform/webapi/authenticate-web-api.md
index 33a2d37210..5a371116f7 100644
--- a/powerapps-docs/developer/data-platform/webapi/authenticate-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/authenticate-web-api.md
@@ -2,8 +2,8 @@
title: "Authenticate to Microsoft Dataverse with the Web API (Dataverse)| Microsoft Docs"
description: "Learn about the different ways to manage authentication when using the Web API"
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/compose-http-requests-handle-errors.md b/powerapps-docs/developer/data-platform/webapi/compose-http-requests-handle-errors.md
index a94f058d6d..3d1675846a 100644
--- a/powerapps-docs/developer/data-platform/webapi/compose-http-requests-handle-errors.md
+++ b/powerapps-docs/developer/data-platform/webapi/compose-http-requests-handle-errors.md
@@ -3,8 +3,8 @@ title: Compose HTTP requests and handle errors
description: Learn about the HTTP methods and headers that form a part of HTTP requests for the Web API and how to identify and handle errors returned in the response.
ms.topic: how-to
ms.date: 08/29/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/create-entity-web-api.md b/powerapps-docs/developer/data-platform/webapi/create-entity-web-api.md
index 45a6654b49..f961812b4b 100644
--- a/powerapps-docs/developer/data-platform/webapi/create-entity-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/create-entity-web-api.md
@@ -4,8 +4,8 @@ description: Learn how to use the Web API to send a POST request to create a tab
ms.date: 12/16/2024
ms.service: powerapps
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/execute-batch-operations-using-web-api.md b/powerapps-docs/developer/data-platform/webapi/execute-batch-operations-using-web-api.md
index cb6ac501f4..01a28b06c6 100644
--- a/powerapps-docs/developer/data-platform/webapi/execute-batch-operations-using-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/execute-batch-operations-using-web-api.md
@@ -2,8 +2,8 @@
title: "Execute batch operations using the Web API (Microsoft Dataverse)| Microsoft Docs"
description: "Batch operation lets you group multiple operations in a single HTTP request. Read how to execute batch operations using the Web API"
ms.date: 11/17/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/get-started-web-api-client-side-javascript.md b/powerapps-docs/developer/data-platform/webapi/get-started-web-api-client-side-javascript.md
index 9a77c585a1..0f531fb614 100644
--- a/powerapps-docs/developer/data-platform/webapi/get-started-web-api-client-side-javascript.md
+++ b/powerapps-docs/developer/data-platform/webapi/get-started-web-api-client-side-javascript.md
@@ -2,8 +2,8 @@
title: "Client-side JavaScript using Web API in model-driven apps | Microsoft Docs"
description: "JavaScript can be used in HTML web resources, form scripts or ribbon commands to perform operations on Microsoft Dataverse for Apps data using Web API"
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/impersonate-another-user-web-api.md b/powerapps-docs/developer/data-platform/webapi/impersonate-another-user-web-api.md
index b96917fc05..6c70ebf5b2 100644
--- a/powerapps-docs/developer/data-platform/webapi/impersonate-another-user-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/impersonate-another-user-web-api.md
@@ -2,8 +2,8 @@
title: "Impersonate another user using the Web API (Microsoft Dataverse)| Microsoft Docs"
description: "Impersonation is used to execute business logic(code) on behalf of another Microsoft Dataverse user to provide a desired feature or service using the appropriate role and object-based security of that impersonated user. Read how you can impersonate another user in Dataverse using the Web API"
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/insomnia.md b/powerapps-docs/developer/data-platform/webapi/insomnia.md
index a12a4a9d6a..0083690398 100644
--- a/powerapps-docs/developer/data-platform/webapi/insomnia.md
+++ b/powerapps-docs/developer/data-platform/webapi/insomnia.md
@@ -2,8 +2,8 @@
title: "Use Insomnia with Dataverse Web API"
description: "Learn how to set up and configure Insomnia local Scratch Pad with environments that connect with Microsoft Dataverse environments."
ms.date: 03/15/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.topic: how-to
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/webapi/manage-duplicate-detection-create-update.md b/powerapps-docs/developer/data-platform/webapi/manage-duplicate-detection-create-update.md
index acb8e86559..9366f2e088 100644
--- a/powerapps-docs/developer/data-platform/webapi/manage-duplicate-detection-create-update.md
+++ b/powerapps-docs/developer/data-platform/webapi/manage-duplicate-detection-create-update.md
@@ -3,8 +3,8 @@ title: "Detect duplicate data using the Web API (Microsoft Dataverse)| Microsoft
description: "Read how to detect duplicates using MSCRM.SuppressDuplicateDetection header and Microsoft Dataverse Web API"
ms.date: 12/31/2022
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/merge-entity-using-web-api.md b/powerapps-docs/developer/data-platform/webapi/merge-entity-using-web-api.md
index cb48c69269..3b6f3c7781 100644
--- a/powerapps-docs/developer/data-platform/webapi/merge-entity-using-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/merge-entity-using-web-api.md
@@ -2,8 +2,8 @@
title: "Merge table rows using the Web API (Microsoft Dataverse)| Microsoft Docs"
description: "Read how to use the Merge unbound action to merge two table rows"
ms.date: 08/30/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/perform-conditional-operations-using-web-api.md b/powerapps-docs/developer/data-platform/webapi/perform-conditional-operations-using-web-api.md
index 9bd27f0bd5..908a932432 100644
--- a/powerapps-docs/developer/data-platform/webapi/perform-conditional-operations-using-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/perform-conditional-operations-using-web-api.md
@@ -2,8 +2,8 @@
title: "Perform conditional operations using the Web API (Microsoft Dataverse)| Microsoft Docs"
description: "Read how to create conditions that decide whether and how to perform certain operations using the Web API"
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/perform-operations-web-api.md b/powerapps-docs/developer/data-platform/webapi/perform-operations-web-api.md
index 6f3b4115c6..44648bd151 100644
--- a/powerapps-docs/developer/data-platform/webapi/perform-operations-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/perform-operations-web-api.md
@@ -2,8 +2,8 @@
title: "Perform operations using the Web API (Microsoft Dataverse)| Microsoft Docs"
description: "Microsoft Dataverse Web API provides a RESTful web service interface that you can use to interact with data in Dataverse using a wide variety of programming languages. Read about the operations that can be performed using the Web API"
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/query/select-columns.md b/powerapps-docs/developer/data-platform/webapi/query/select-columns.md
index e5e33677d6..093e8545fa 100644
--- a/powerapps-docs/developer/data-platform/webapi/query/select-columns.md
+++ b/powerapps-docs/developer/data-platform/webapi/query/select-columns.md
@@ -2,8 +2,8 @@
title: Select columns using OData
description: Learn how to use OData to select columns when you retrieve data from Microsoft Dataverse Web API.
ms.date: 07/11/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.subservice: dataverse-developer
search.audienceType:
diff --git a/powerapps-docs/developer/data-platform/webapi/quick-start-console-app-csharp.md b/powerapps-docs/developer/data-platform/webapi/quick-start-console-app-csharp.md
index 9e208e3ec6..d278f1baf4 100644
--- a/powerapps-docs/developer/data-platform/webapi/quick-start-console-app-csharp.md
+++ b/powerapps-docs/developer/data-platform/webapi/quick-start-console-app-csharp.md
@@ -3,8 +3,8 @@ title: "Quick Start: Web API sample (C#) (Microsoft Dataverse)| Microsoft Docs"
description: "Walks you through creating a program to authenticate with the Microsoft Dataverse Server and then call a Web API function."
ms.topic: quickstart
ms.date: 06/22/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/retrieve-and-execute-predefined-queries.md b/powerapps-docs/developer/data-platform/webapi/retrieve-and-execute-predefined-queries.md
index 77891224df..f6f451c68f 100644
--- a/powerapps-docs/developer/data-platform/webapi/retrieve-and-execute-predefined-queries.md
+++ b/powerapps-docs/developer/data-platform/webapi/retrieve-and-execute-predefined-queries.md
@@ -2,8 +2,8 @@
title: "Retrieve and execute predefined queries (Microsoft Dataverse)| Microsoft Docs"
description: "Microsoft Dataverse provides a way for administrators to create system views that are available to all users. Read how you can use a predefined query to retrieve table data."
ms.date: 09/27/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/retrieve-entity-using-web-api.md b/powerapps-docs/developer/data-platform/webapi/retrieve-entity-using-web-api.md
index d01e257048..3d0fe83700 100644
--- a/powerapps-docs/developer/data-platform/webapi/retrieve-entity-using-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/retrieve-entity-using-web-api.md
@@ -3,8 +3,8 @@ title: Retrieve a table row using the Web API
description: Learn how to compose a GET request using the Microsoft Dataverse Web API to retrieve table data specified as the resource with a unique identifier.
ms.topic: how-to
ms.date: 05/30/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/basic-operations-powershell.md b/powerapps-docs/developer/data-platform/webapi/samples/basic-operations-powershell.md
index ea6c67c195..8bd16a88d1 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/basic-operations-powershell.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/basic-operations-powershell.md
@@ -2,8 +2,8 @@
title: "Web API Basic Operations Sample (PowerShell)"
description: "This sample demonstrates how to perform basic CRUD (Create, Retrieve, Update, and Delete) and association and dissociation operations on Microsoft Dataverse table rows, using the Dataverse Web API with PowerShell and Visual Studio Code."
ms.date: 01/20/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/column-level-security-powershell.md b/powerapps-docs/developer/data-platform/webapi/samples/column-level-security-powershell.md
new file mode 100644
index 0000000000..a9be04edfa
--- /dev/null
+++ b/powerapps-docs/developer/data-platform/webapi/samples/column-level-security-powershell.md
@@ -0,0 +1,179 @@
+---
+title: "Sample: Column-level security using Dataverse Web API (PowerShell)"
+description: "This sample shows how to work with column-level security using the Dataverse Web API with PowerShell."
+ms.date: 07/30/2025
+author: paulliew
+ms.subservice: dataverse-developer
+ms.author: paulliew
+ms.reviewer: jdaly
+ms.topic: sample
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+---
+# Sample: Column-level security using Dataverse Web API (PowerShell)
+
+This sample shows how to perform [column-level security](../../column-level-security.md) operations using [Dataverse Web API](../overview.md) with PowerShell.
+
+> [!div class="nextstepaction"]
+> [View this sample on Github](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/webapi/PS/ColumnLevelSecurity)
+
+## Prerequisites
+
+Before running this sample, you should read these articles that explain concepts and patterns used by Dataverse PowerShell samples:
+
+- [Quick Start Web API with PowerShell and Visual Studio Code](../quick-start-ps.md)
+- [Use PowerShell and Visual Studio Code with the Dataverse Web API](../use-ps-and-vscode-web-api.md)
+
+This sample requires:
+
+- Visual Studio Code. [Download Visual Studio Code](https://code.visualstudio.com/download)
+- PowerShell extension for Visual Studio Code. [Install PowerShell for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell)
+- PowerShell 7.4 or higher. See [Install PowerShell on Windows, Linux, and macOS](/powershell/scripting/install/installing-powershell)
+- Az PowerShell module version 11.1.0 or higher. See [How to install Azure PowerShell](/powershell/azure/install-azure-powershell)
+
+ To update an existing installation to the latest version, use `Update-Module -Name Az -Force`
+
+- Access to Dataverse with system administrator privileges.
+- An application user account with **Basic User** access. See the [Configure users section](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/webapi/PS/ColumnLevelSecurity#configure-users) for instructions about how to create this user.
+
+## How to run this sample
+
+1. Download or clone the [Samples](https://github.com/Microsoft/PowerApps-Samples) repo so that you have a local copy.
+1. Open the [ColumnLevelSecurity folder](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/webapi/PS/ColumnLevelSecurity) using Visual Studio Code.
+1. Create a file named `.env` using the data found in the [.env.example](https://github.com/microsoft/PowerApps-Samples/blob/master/dataverse/webapi/PS/ColumnLevelSecurity/.env.example) file.
+1. In the `.env` file, replace the placeholder values:
+
+ ```env
+ # The environment this application will connect to.
+ BASE_URL=https://.api.crm.dynamics.com/
+ # The application user application id
+ CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444
+ # The application user secret
+ CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
+ # The Entra tenant id
+ TENANT_ID=aaaabbbb-0000-cccc-1111-dddd2222eeee
+ ```
+
+1. Set the `BASE_URL` to the URL of the environment you want to run the sample against
+1. See the [Configure users section](https://github.com/microsoft/PowerApps-Samples/tree/master/dataverse/webapi/PS/ColumnLevelSecurity#configure-users) for instructions to set the `CLIENT_ID`, `CLIENT_SECRET`, and `TENANT_ID` values.
+1. Press F5 to run the sample. The `.vscode/launch.json` file is configured to execute the `ColumnLevelSecurity.ps1` file.
+
+When the sample runs, you're prompted in the default browser to select an environment user account and enter a password.
+
+## What this sample does
+
+This sample demonstrates the capabilities described in [Column-level security with code](../../column-level-security.md):
+
+- Discover which columns can be secured in a Dataverse environment
+- Discover which columns are currently secured
+- Secure columns in a Dataverse environment
+- Grant read or write access to selected fields to individual users
+- Modify access to secured fields for individual users
+- Revoke access to selected fields for individual users
+- Provide read and write access to specific groups of users
+- Enable masking of secured columns
+- Retrieve unmasked values for secured columns
+
+## Sample files
+
+The code for this sample is in the following files:
+
+|File|Description|
+|---------|---------|
+|`ColumnLevelSecurity.ps1`|Controls the flow of the sample. Contains definition of `Setup`, `Run`, and `Cleanup` functions and calls them at the end.|
+|`Examples.ps1`|Contains 12 functions that demonstrate operations related to column-level security operations.|
+|`Helpers.ps1`|Contains constants and functions used by the sample to manage setting up and running the sample. These functions aren't the focus of this sample.|
+
+This sample is designed to be resilient when errors occur so you should be able to run the sample again if it failed previously.
+
+## How this sample works
+
+In order to create the scenario described in [What this sample does](#what-this-sample-does), the sample does the following operations:
+
+### Setup
+
+The `Setup` function in this sample does the following operations:
+
+1. Create a solution publisher named `ColumnLevelSecuritySamplePublisher` with customization prefix of `sample` if it doesn't exist.
+1. Create a solution named `ColumnLevelSecuritySampleSolution` associated to the publisher if it doesn't exist.
+
+ All subsequent solution-aware items are created in the context of this solution.
+
+1. Create a table named `sample_Example` if it doesn't exist.
+1. Create four string columns in the `sample_Example` table if they don't exist.
+
+ The table schema names are:
+
+ - `sample_Email`
+ - `sample_GovernmentId`
+ - `sample_TelephoneNumber`
+ - `sample_DateOfBirth`
+
+1. Remove any existing sample data in the `sample_Example` table.
+1. Add three rows of sample data with information in each column of the `sample_Example` table.
+1. Create a new security role named **Column-level security sample role**.
+1. Add privileges for the `sample_Example` table to the security role.
+1. Associate the user to the security role.
+1. Create a [Field Security Profile](../../reference/entities/fieldsecurityprofile.md) record named **Example Field Security Profile** that is used in the [Manage access to secure column data to groups](#manage-access-to-secure-column-data-to-groups) section of the sample.
+1. Associate the application user to the field security profile.
+1. Wait 30 seconds for the cache to catch up with the new objects created.
+
+### Demonstrate
+
+The `Run` function in this sample does the following operations:
+
+#### Retrieve information about columns
+
+1. Use the `Dump-ColumnSecurityInfo-Example` function to download a CSV file with data about which columns in the system can be secured.
+1. Use the `Get-SecuredColumnList-Example` function to retrieve and show a list of environment columns that are already secured.
+
+#### Secure columns
+
+1. Demonstrate that the application user can retrieve data from all the columns in the `sample_Example` table.
+1. Use the `Set-ColumnIsSecured-Example` function to secure the four columns
+1. Demonstrate that the application user can no longer retrieve data from the secured columns in the `sample_Example` table.
+
+#### Grant access to secure column data to individuals
+
+1. Use the `Grant-ColumnAccess-Example` function to grant the application users read access to specific record field values by creating a [Field Sharing (PrincipalObjectAttributeAccess)](../../reference/entities/principalobjectattributeaccess.md) record.
+1. Demonstrate that the application user can now retrieve data from specific secured record fields in the `sample_Example` table.
+1. Demonstrate that the application user isn't allowed to write data to the secured columns.
+1. Use the `Modify-ColumnAccess-Example` function to grant write access to a specific record field.
+1. Demonstrate that the application user is now allowed to write data to the specific record field.
+1. Use the `Revoke-ColumnAccess-Example` function to delete the `PrincipalObjectAttributeAccess` records that gave the application user access to the secured columns.
+
+#### Manage access to secure column data to groups
+
+1. Add field permissions to the **Example Field Security Profile** record that was created in `Setup` by creating [Field Permission (FieldPermission)](../../reference/entities/fieldpermission.md) records
+1. Demonstrate that the application user can view only the secured columns specified in the field permission records.
+1. Demonstrate that the application user isn't allowed to write data to the specific record field not enabled with field permissions.
+
+#### Masking
+
+1. Retrieve ID values for existing masking rules. Create new [Secured Masking Column (AttributeMaskingRule)](../../reference/entities/attributemaskingrule.md) records to specify masking rules for columns of the `sample_Example` table.
+1. Update the `canreadunmasked` column values of the [Field Permission (FieldPermission)](../../reference/entities/fieldpermission.md) records created earlier.
+1. Wait 30 seconds for the cache to catch up with the new objects created.
+1. Demonstrate that the application user can now retrieve data with masked values.
+1. Demonstrate that the application user can now retrieve unmasked values with a `GET` requests on the `sample_examples` collection to return multiple records when using the [UnMaskedData optional parameter](../../optional-parameters.md#return-unmasked-data).
+1. Demonstrate that the application user can now retrieve unmasked values with a `GET` request to retrieve a single record when using the [UnMaskedData optional parameter](../../optional-parameters.md#return-unmasked-data).
+
+#### Export solution
+
+Use an exported solution to test the functionality of the sample configurations outside of this sample.
+
+1. Export the solution created with all the configurations as an unmanaged solution.
+1. Export the solution created with all the configurations as a managed solution
+
+### Clean up
+
+The static `Cleanup` function in this sample does the following operations:
+
+When the `$DELETE_CREATED_OBJECTS` setting in `Helpers.ps1` is `true`, the `Cleanup` function tries to delete all components created during `Setup` or `Run`. The goal is to return the environment to the original state. If you don't want the items to be deleted, you can change the setting to `false`.
+
+### Related samples
+
+[Sample: Column-level security using Dataverse SDK for .NET](../../org-service/samples/column-level-security.md)
+
+[!INCLUDE [footer-banner](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/create-update-multiple.md b/powerapps-docs/developer/data-platform/webapi/samples/create-update-multiple.md
index 310fe0c4fd..a0daa974ce 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/create-update-multiple.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/create-update-multiple.md
@@ -2,8 +2,8 @@
title: "Sample: Web API Use bulk operations"
description: "This sample shows how to perform bulk create and update operations using the Web API CreateMultiple and UpdateMultiple actions. The messages for these actions are optimized to provide the most performant way to create or update records with Dataverse."
ms.date: 02/08/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/file-operations.md b/powerapps-docs/developer/data-platform/webapi/samples/file-operations.md
index a8df843776..3965825865 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/file-operations.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/file-operations.md
@@ -2,8 +2,8 @@
title: "Sample: File Operations using Dataverse Web API (Microsoft Dataverse) | Microsoft Learn"
description: "This sample demonstrates how to perform operations with file columns using the Dataverse Web API."
ms.date: 10/28/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/toc.yml b/powerapps-docs/developer/data-platform/webapi/samples/toc.yml
index cf6d2a58b6..a7c31ade19 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/toc.yml
+++ b/powerapps-docs/developer/data-platform/webapi/samples/toc.yml
@@ -51,6 +51,8 @@ items:
href: basic-operations-powershell.md
- name: Metadata Operations
href: metadata-operations-powershell.md
+ - name: Column-level security
+ href: column-level-security-powershell.md
- name: (JavaScript) samples
items:
- name: About the client-side samples
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-basic-operations.md b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-basic-operations.md
index 96fa967a21..b36dc03e38 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-basic-operations.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-basic-operations.md
@@ -2,8 +2,8 @@
title: "Web API Basic Operations Sample (C#) (Microsoft Dataverse)| Microsoft Docs"
description: "This sample demonstrates how to perform basic CRUD (Create, Retrieve, Update, and Delete) and association and dissociation operations on Microsoft Dataverse table rows, using the Dataverse Web API with the WebAPIService class library."
ms.date: 08/29/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-conditional-operations.md b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-conditional-operations.md
index 68af30620e..61ece2aa9b 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-conditional-operations.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-conditional-operations.md
@@ -2,8 +2,8 @@
title: "Web API Conditional Operation sample (C#) (Microsoft Dataverse)| Microsoft Docs"
description: "This sample shows how to perform conditional message operations when accessing table rows of the Microsoft Dataverse."
ms.date: 09/02/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-functions-and-actions.md b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-functions-and-actions.md
index 67a00bad27..d3073b633b 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-functions-and-actions.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-functions-and-actions.md
@@ -2,8 +2,8 @@
title: "Web API Functions and Actions Sample (C#) (Microsoft Dataverse)| Microsoft Docs"
description: "This sample demonstrates how to call bound and unbound functions and actions, including custom actions, using the Microsoft Dataverse Web API and C#."
ms.date: 09/02/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-parallel-operations.md b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-parallel-operations.md
index f09155b4d5..be2cb51711 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-parallel-operations.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-parallel-operations.md
@@ -2,8 +2,8 @@
title: "Web API WebApiService Parallel Operations Sample (C#) (Microsoft Dataverse)| Microsoft Docs"
description: "This sample demonstrates sending requests in parallel using the .NET Task Parallel Library (TPL)."
ms.date: 09/02/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-query-data.md b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-query-data.md
index 6242b29c16..7754d85cb6 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-query-data.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-query-data.md
@@ -2,8 +2,8 @@
title: "Web API Query Data sample (C#) (Microsoft Dataverse)| Microsoft Docs"
description: "This sample demonstrates how to query data of Microsoft Dataverse entity instances, using the Dataverse Web API along with the WebApiService class."
ms.date: 03/28/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-tpl-dataflow-parallel-operations.md b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-tpl-dataflow-parallel-operations.md
index 7c71ff918d..cb762ecad2 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-tpl-dataflow-parallel-operations.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice-tpl-dataflow-parallel-operations.md
@@ -2,8 +2,8 @@
title: "Web API Parallel Operations with TPL Dataflow components Sample (C#) (Microsoft Dataverse)| Microsoft Docs"
description: "This sample demonstrates using Task Parallel Library (TPL) dataflow components with asynchronous requests."
ms.date: 09/02/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice.md b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice.md
index 9e47a26e73..2f45740ffa 100644
--- a/powerapps-docs/developer/data-platform/webapi/samples/webapiservice.md
+++ b/powerapps-docs/developer/data-platform/webapi/samples/webapiservice.md
@@ -2,8 +2,8 @@
title: "WebApiService class library (C#) (Microsoft Dataverse) | Microsoft Docs"
description: "This sample .NET 6.0 class library project that demonstrates several important capabilities that you should include when you use the Dataverse Web API"
ms.date: 08/29/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/update-delete-entities-using-web-api.md b/powerapps-docs/developer/data-platform/webapi/update-delete-entities-using-web-api.md
index b4e124d95f..e4108bcd2e 100644
--- a/powerapps-docs/developer/data-platform/webapi/update-delete-entities-using-web-api.md
+++ b/powerapps-docs/developer/data-platform/webapi/update-delete-entities-using-web-api.md
@@ -2,8 +2,8 @@
title: "Update and delete table rows using the Web API (Microsoft Dataverse)| Microsoft Docs"
description: "Read how to perform update and delete operations on tables using the Web API"
ms.date: 07/22/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/use-web-api-actions.md b/powerapps-docs/developer/data-platform/webapi/use-web-api-actions.md
index 103cf81cd7..614ac0a067 100644
--- a/powerapps-docs/developer/data-platform/webapi/use-web-api-actions.md
+++ b/powerapps-docs/developer/data-platform/webapi/use-web-api-actions.md
@@ -2,8 +2,8 @@
title: "Use Web API actions (Microsoft Dataverse)| Microsoft Docs"
description: "Actions are reusable operations that can be performed using the Web API. Actions are used with a POST request to modify data on Microsoft Dataverse."
ms.date: 07/22/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/use-web-api-functions.md b/powerapps-docs/developer/data-platform/webapi/use-web-api-functions.md
index ad9f62b30c..351bf50bd2 100644
--- a/powerapps-docs/developer/data-platform/webapi/use-web-api-functions.md
+++ b/powerapps-docs/developer/data-platform/webapi/use-web-api-functions.md
@@ -3,8 +3,8 @@ title: Use Web API functions
description: Learn how to use functions, which are reusable operations used with a GET request to retrieve data from Microsoft Dataverse Web API.
ms.topic: how-to
ms.date: 08/29/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-actions.md b/powerapps-docs/developer/data-platform/webapi/web-api-actions.md
index ffee8243f6..95549826d2 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-actions.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-actions.md
@@ -2,8 +2,8 @@
title: "Web API Actions (Microsoft Dataverse)| Microsoft Docs"
description: "Describes OData Action elements defined for the Dataverse Web API."
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.service: powerapps
applies_to:
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-basic-operations-sample.md b/powerapps-docs/developer/data-platform/webapi/web-api-basic-operations-sample.md
index 20e5fcbb46..85c6e2884d 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-basic-operations-sample.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-basic-operations-sample.md
@@ -3,8 +3,8 @@ title: "Web API basic operations sample "
description: "Code samples that demonstrate how to perform CRUD (Create, Retrieve, Update, and Delete) operations using the Dataverse Web API. The samples are coded using C#, PowerShell, and client-side JavaScript."
ms.topic: sample
ms.date: 03/22/2025
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-complex-enum-types.md b/powerapps-docs/developer/data-platform/webapi/web-api-complex-enum-types.md
index 7f52af43a4..895bbf5eb6 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-complex-enum-types.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-complex-enum-types.md
@@ -2,8 +2,8 @@
title: "Web API Complex and Enumeration types (Microsoft Dataverse)| Microsoft Docs"
description: "Describes OData Complex and Enumeration types elements defined for the Dataverse Web API."
ms.date: 08/30/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.service: powerapps
applies_to:
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-conditional-operations-sample.md b/powerapps-docs/developer/data-platform/webapi/web-api-conditional-operations-sample.md
index b8fe734ee9..14f6050705 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-conditional-operations-sample.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-conditional-operations-sample.md
@@ -3,8 +3,8 @@ title: "Web API Conditional Operations Sample (Microsoft Dataverse)| Microsoft D
description: "This collection of samples demonstrate how to perform operations that are conditionally based upon the version of the table row contained on the Microsoft Dataverse server and/or currently maintained by the client."
ms.topic: sample
ms.date: 03/22/2025
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-entitytypes.md b/powerapps-docs/developer/data-platform/webapi/web-api-entitytypes.md
index 3661f2a265..49048d26ab 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-entitytypes.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-entitytypes.md
@@ -2,8 +2,8 @@
title: Web API EntityTypes
description: Learn about OData EntityTypes, which are named structured types with a key. EntityTypes describe the data types available in Dataverse Web API.
ms.date: 05/18/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.service: powerapps
applies_to:
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-functions-actions-sample.md b/powerapps-docs/developer/data-platform/webapi/web-api-functions-actions-sample.md
index fbdd332be9..fb1fd62568 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-functions-actions-sample.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-functions-actions-sample.md
@@ -3,8 +3,8 @@ title: Web API Functions and Actions Sample
description: This collection of code samples demonstrates how to perform bound and unbound functions and actions, including custom actions, using the Microsoft Dataverse Web API. These samples are implemented using client-side JavaScript and C#.
ms.topic: sample
ms.date: 09/02/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-functions.md b/powerapps-docs/developer/data-platform/webapi/web-api-functions.md
index 23be1f3b55..02f2652093 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-functions.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-functions.md
@@ -2,8 +2,8 @@
title: "Web API Functions (Microsoft Dataverse)| Microsoft Docs"
description: "Describes OData Function elements defined for the Dataverse Web API."
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.service: powerapps
applies_to:
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-navigation-properties.md b/powerapps-docs/developer/data-platform/webapi/web-api-navigation-properties.md
index fa7d9faea8..718ae7c24f 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-navigation-properties.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-navigation-properties.md
@@ -3,8 +3,8 @@ title: Web API navigation properties
description: Learn about OData navigation property elements that are defined for EntityTypes in the Microsoft Dataverse Web API.
ms.topic: how-to
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.service: powerapps
applies_to:
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-properties.md b/powerapps-docs/developer/data-platform/webapi/web-api-properties.md
index 7bce1e1045..48b233a87b 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-properties.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-properties.md
@@ -3,8 +3,8 @@ title: Web API Properties
description: Learn about OData property elements that are defined for EntityTypes in the Microsoft Dataverse Web API.
ms.topic: article
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.service: powerapps
applies_to:
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-query-data-sample.md b/powerapps-docs/developer/data-platform/webapi/web-api-query-data-sample.md
index ef3701615e..35980005e8 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-query-data-sample.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-query-data-sample.md
@@ -3,8 +3,8 @@ title: Web API query data sample
description: Use this sample code to learn how to query data using the Dataverse Web API. These samples use C# and client-side JavaScript.
ms.topic: sample
ms.date: 04/14/2023
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-samples-csharp.md b/powerapps-docs/developer/data-platform/webapi/web-api-samples-csharp.md
index 318bb15abb..f1f13788e9 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-samples-csharp.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-samples-csharp.md
@@ -3,8 +3,8 @@ title: "Web API Data operations Samples (C#) (Microsoft Dataverse)| Microsoft
description: "This article provides a description of various Web API samples that are implemented using C#"
ms.topic: sample
ms.date: 09/03/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-samples-powershell.md b/powerapps-docs/developer/data-platform/webapi/web-api-samples-powershell.md
index ac01e7e3a7..73141a3a1c 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-samples-powershell.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-samples-powershell.md
@@ -1,10 +1,10 @@
---
-title: "Web API Data operations Samples PowerShell"
+title: "Web API Data operations Samples PowerShell"
description: "This article provides a description of Web API samples that are implemented using PowerShell"
ms.topic: sample
-ms.date: 05/14/2024
-author: MicroSri
-ms.author: sriknair
+ms.date: 07/16/2025
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
@@ -14,7 +14,7 @@ contributors:
# Web API Data operations Samples (PowerShell)
-This article provides common understanding about Web API samples using PowerShell. Currently, there's only one sample, but we plan to add more. While each sample focuses on a different aspect of Microsoft Dataverse Web API, they all follow similar process and structure described in this article.
+This article provides common understanding about Web API samples using PowerShell. While each sample focuses on a different aspect of Microsoft Dataverse Web API, they all follow similar process and structure described in this article.
## Web API Samples using PowerShell
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-samples.md b/powerapps-docs/developer/data-platform/webapi/web-api-samples.md
index 88f2245719..2036174ff5 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-samples.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-samples.md
@@ -3,8 +3,8 @@ title: "Web API data operation samples"
description: "See C#, PowerShell, and JavaScript sample code that demonstrates how to use the Microsoft Dataverse Web API for basic table row operations, data query, conditional operations, and functions and actions."
ms.topic: sample
ms.date: 01/20/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-service-documents.md b/powerapps-docs/developer/data-platform/webapi/web-api-service-documents.md
index d16e5fb2ae..148f086c50 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-service-documents.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-service-documents.md
@@ -2,8 +2,8 @@
title: Web API Service Documents
description: Describes OData service documents you can use to understand the Dataverse Web API capabilities available in your environment.
ms.date: 01/10/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.service: powerapps
applies_to:
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-types-operations.md b/powerapps-docs/developer/data-platform/webapi/web-api-types-operations.md
index cf5315f90e..6fffeb0c20 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-types-operations.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-types-operations.md
@@ -2,8 +2,8 @@
title: "Web API types and operations (Microsoft Dataverse)| Microsoft Docs"
description: "Describes how you can find information you need from the Web API service and metadata documents, including documentation of the Web API system entity types, functions, and actions"
ms.date: 01/10/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/webapi/web-api-versions.md b/powerapps-docs/developer/data-platform/webapi/web-api-versions.md
index 94e6b2c9e8..7a23713459 100644
--- a/powerapps-docs/developer/data-platform/webapi/web-api-versions.md
+++ b/powerapps-docs/developer/data-platform/webapi/web-api-versions.md
@@ -2,8 +2,8 @@
title: "Microsoft Dataverse Web API versions (Dataverse)| Microsoft Docs"
description: "Read how versioning of Microsoft Dataverse Web API works. Dataverse Web API versions support version specific differences in the same environment which is different from the behavior in the v8.x releases in which new capabilities were additive"
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/work-data-azure-solution.md b/powerapps-docs/developer/data-platform/work-data-azure-solution.md
index 4154fd3c3f..2ce9ab013f 100644
--- a/powerapps-docs/developer/data-platform/work-data-azure-solution.md
+++ b/powerapps-docs/developer/data-platform/work-data-azure-solution.md
@@ -1,7 +1,7 @@
---
-title: "Work with Microsoft Dataverse data in your Azure solution (Microsoft Dataverse) | Microsoft Docs"
-description: "Provides an overview of passing data from Dataverse to an Azure cloud hosted solution."
-ms.date: 07/19/2024
+title: Work with Microsoft Dataverse data in your Azure solution
+description: Discover how pass data from Microsoft Dataverse to an Azure cloud-hosted solution.
+ms.date: 06/18/2025
author: swylezol
ms.author: swylezol
ms.reviewer: pehecke
diff --git a/powerapps-docs/developer/data-platform/work-with-data.md b/powerapps-docs/developer/data-platform/work-with-data.md
index 6e938ae66f..0b367386ae 100644
--- a/powerapps-docs/developer/data-platform/work-with-data.md
+++ b/powerapps-docs/developer/data-platform/work-with-data.md
@@ -4,9 +4,9 @@ description: "Microsoft Dataverse provides web services and APIs that you can us
ms.date: 05/20/2024
ms.reviewer: pehecke
ms.topic: article
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/workflow-custom-actions.md b/powerapps-docs/developer/data-platform/workflow-custom-actions.md
index 77aa1ded8c..46ee917b8b 100644
--- a/powerapps-docs/developer/data-platform/workflow-custom-actions.md
+++ b/powerapps-docs/developer/data-platform/workflow-custom-actions.md
@@ -4,9 +4,9 @@ description: "Learn about how to create your own custom actions that extend the
ms.date: 03/22/2022
ms.reviewer: "pehecke"
ms.topic: "article"
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/workflow/debug-workflow-activites.md b/powerapps-docs/developer/data-platform/workflow/debug-workflow-activites.md
index fd7f571671..16c6989fb6 100644
--- a/powerapps-docs/developer/data-platform/workflow/debug-workflow-activites.md
+++ b/powerapps-docs/developer/data-platform/workflow/debug-workflow-activites.md
@@ -2,8 +2,8 @@
title: "Debug Workflow Activities (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Describes how to debug workflow activities using the Plug-in Registration tool." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/workflow/sample-calculate-credit-score-custom-workflow-activity.md b/powerapps-docs/developer/data-platform/workflow/sample-calculate-credit-score-custom-workflow-activity.md
index 80d148bedd..153bbff5c3 100644
--- a/powerapps-docs/developer/data-platform/workflow/sample-calculate-credit-score-custom-workflow-activity.md
+++ b/powerapps-docs/developer/data-platform/workflow/sample-calculate-credit-score-custom-workflow-activity.md
@@ -2,8 +2,8 @@
title: "Sample: Calculate a credit score with a custom workflow activity (Microsoft Dataverse) | Microsoft Docs"
description: "The sample demonstrates workflow activity calculates the credit score based on the Social Security Number (SSN) and name."
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/workflow/sample-create-custom-workflow-activity.md b/powerapps-docs/developer/data-platform/workflow/sample-create-custom-workflow-activity.md
index 1d71a1807a..3dea50a0e2 100644
--- a/powerapps-docs/developer/data-platform/workflow/sample-create-custom-workflow-activity.md
+++ b/powerapps-docs/developer/data-platform/workflow/sample-create-custom-workflow-activity.md
@@ -2,8 +2,8 @@
title: "Sample: Create a custom workflow activity (Microsoft Dataverse) | Microsoft Docs"
description: "The sample demonstrates how to write a custom workflow activity that can create an account and a task for the account. This sample uses early binding."
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/workflow/sample-update-next-birthday-using-custom-workflow-activity.md b/powerapps-docs/developer/data-platform/workflow/sample-update-next-birthday-using-custom-workflow-activity.md
index fbabad91ac..f065995841 100644
--- a/powerapps-docs/developer/data-platform/workflow/sample-update-next-birthday-using-custom-workflow-activity.md
+++ b/powerapps-docs/developer/data-platform/workflow/sample-update-next-birthday-using-custom-workflow-activity.md
@@ -2,8 +2,8 @@
title: "Sample: Update next birthday using a custom workflow activity (Microsoft Dataverse) | Microsoft Docs"
description: "The sample demonstrates workflow activity returns the next birthday. Use this in a workflow that sends a birthday greeting to a customer. "
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/workflow/tutorial-create-workflow-extension.md b/powerapps-docs/developer/data-platform/workflow/tutorial-create-workflow-extension.md
index ba04cd0069..7bce99f355 100644
--- a/powerapps-docs/developer/data-platform/workflow/tutorial-create-workflow-extension.md
+++ b/powerapps-docs/developer/data-platform/workflow/tutorial-create-workflow-extension.md
@@ -2,8 +2,8 @@
title: "Tutorial: Create workflow extension (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "This tutorial will show you the process to extend the workflow designer to add custom activities and logic using a workflow assembly" # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/workflow/workflow-extensions.md b/powerapps-docs/developer/data-platform/workflow/workflow-extensions.md
index aa2be8e3a0..ee453c28e1 100644
--- a/powerapps-docs/developer/data-platform/workflow/workflow-extensions.md
+++ b/powerapps-docs/developer/data-platform/workflow/workflow-extensions.md
@@ -2,8 +2,8 @@
title: "Workflow Extensions (Microsoft Dataverse) | Microsoft Docs" # Intent and product brand in a unique string of 43-59 chars including spaces
description: "Learn how to add custom workflow activities to the workflow designer." # 115-145 characters including spaces. This abstract displays in the search result.
ms.date: 04/06/2022
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
search.audienceType:
- developer
diff --git a/powerapps-docs/developer/data-platform/write-custom-azure-aware-plugin.md b/powerapps-docs/developer/data-platform/write-custom-azure-aware-plugin.md
index b02aeaf887..3550a98c91 100644
--- a/powerapps-docs/developer/data-platform/write-custom-azure-aware-plugin.md
+++ b/powerapps-docs/developer/data-platform/write-custom-azure-aware-plugin.md
@@ -2,8 +2,8 @@
title: "Write a custom Azure-aware plug-in (Microsoft Dataverse) | Microsoft Docs"
description: "Learn how to write plug-in code that can post a message or the execution context of the current database transaction to the Azure Service Bus."
ms.date: 07/19/2024
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: pehecke
ms.topic: article
ms.subservice: dataverse-developer
diff --git a/powerapps-docs/developer/data-platform/write-plug-in.md b/powerapps-docs/developer/data-platform/write-plug-in.md
index 514661a489..0bac08cbc3 100644
--- a/powerapps-docs/developer/data-platform/write-plug-in.md
+++ b/powerapps-docs/developer/data-platform/write-plug-in.md
@@ -4,9 +4,9 @@ description: "Learn how to write custom code to be executed in response to data
ms.date: 03/26/2024
ms.reviewer: pehecke
ms.topic: how-to
-author: MicroSri
+author: MsSQLGirl
ms.subservice: dataverse-developer
-ms.author: sriknair
+ms.author: jukoesma
search.audienceType:
- developer
contributors:
diff --git a/powerapps-docs/developer/data-platform/write-plugin-multiple-operation.md b/powerapps-docs/developer/data-platform/write-plugin-multiple-operation.md
index 1390796718..6bc1c285d6 100644
--- a/powerapps-docs/developer/data-platform/write-plugin-multiple-operation.md
+++ b/powerapps-docs/developer/data-platform/write-plugin-multiple-operation.md
@@ -3,8 +3,8 @@ title: Write plug-ins for CreateMultiple and UpdateMultiple
description: Learn how to write plug-ins that use the bulk operation messages CreateMultiple and UpdateMultiple to operate on multiple rows of data in a Microsoft Dataverse table.
ms.date: 08/02/2023
ms.topic: how-to
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.reviewer: jdaly
ms.subservice: dataverse-developer
search.audienceType:
diff --git a/powerapps-docs/developer/model-driven-apps/TOC.yml b/powerapps-docs/developer/model-driven-apps/TOC.yml
index b355044549..ddd30f827c 100644
--- a/powerapps-docs/developer/model-driven-apps/TOC.yml
+++ b/powerapps-docs/developer/model-driven-apps/TOC.yml
@@ -73,6 +73,8 @@
href: clientapi/walkthrough-write-your-first-client-script.md
- name: Debug JavaScript code for model-driven apps
href: clientapi/debug-JavaScript-code.md
+ - name: Bring intelligence into your app using Agent Xrm APIs
+ href: clientapi/bring-intelligence-using-agent-apis.md
- name: Troubleshoot form issues in Unified Interface
href: troubleshoot-forms.md
- name: Navigating to and from a custom page
@@ -750,6 +752,15 @@
href: clientapi/reference/Xrm-App/Xrm-App-sidePanes/getPane.md
- name: getSelectedPane
href: clientapi/reference/Xrm-App/Xrm-App-sidePanes/getSelectedPane.md
+ - name: Xrm.Copilot
+ href: clientapi/reference/xrm-copilot.md
+ items:
+ - name: executeEvent
+ href: clientapi/reference/Xrm-Copilot/executeevent.md
+ - name: executePrompt
+ href: clientapi/reference/Xrm-Copilot/executeprompt.md
+ - name: MCSResponse
+ href: clientapi/reference/Xrm-Copilot/mcsresponse.md
- name: Xrm.Device
href: clientapi/reference/xrm-device.md
items:
diff --git a/powerapps-docs/developer/model-driven-apps/best-practices/business-logic/do-not-use-odata-v2-endpoint.md b/powerapps-docs/developer/model-driven-apps/best-practices/business-logic/do-not-use-odata-v2-endpoint.md
index 742ab033d5..d03eabbec3 100644
--- a/powerapps-docs/developer/model-driven-apps/best-practices/business-logic/do-not-use-odata-v2-endpoint.md
+++ b/powerapps-docs/developer/model-driven-apps/best-practices/business-logic/do-not-use-odata-v2-endpoint.md
@@ -2,8 +2,8 @@
title: Do not use the OData v2.0 endpoint
description: Learn about the requirement to upgrade your code to use the Web API OData v4.0 endpoint rather than the deprecated OData v2.0 endpoint.
suite: powerapps
-author: MicroSri
-ms.author: sriknair
+author: MsSQLGirl
+ms.author: jukoesma
ms.date: 04/12/2023
ms.reviewer: jdaly
ms.topic: how-to
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/bring-intelligence-using-agent-apis.md b/powerapps-docs/developer/model-driven-apps/clientapi/bring-intelligence-using-agent-apis.md
new file mode 100644
index 0000000000..574192cd5e
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/bring-intelligence-using-agent-apis.md
@@ -0,0 +1,42 @@
+---
+title: "Bring intelligence into your app using Agent Xrm APIs (preview)"
+description: "Learn about how you can integrate Copilot Studio topics into your model-driven apps using Agent Xrm APIs."
+author: adrianorth
+ms.author: aorth
+ms.date: 07/07/2025
+ms.reviewer: jdaly
+ms.topic: conceptual
+ms.subservice: mda-developer
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+---
+
+# Bring intelligence into your app using Agent Xrm APIs (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+Agent APIs are a set of interfaces introduced in Microsoft Power Apps that allow model-driven apps to interact with topics created in Microsoft Copilot Studio. These APIs are available in two forms:
+
+- `Xrm.Copilot` namespace used for client scripts in model-driven apps. This article describes these APIs.
+- [PCF (for use in custom controls)](../../component-framework/bring-intelligence-using-agent-apis.md).
+
+These APIs are designed to enhance integration with Microsoft Copilot Studio, enabling more intelligent and responsive app experiences. The APIs use a single Copilot Studio agent that is either:
+- Interactive agent selected in the model app designer of custom apps. See more at [Working with an interactive agent](../../../maker/model-driven-apps/add-agents-to-app.md#working-with-an-interactive-agent).
+- Model app containing lead or opportunity table, which implicitly uses the "Copilot in Dynamics 365 Sales" agent.
+
+|API|Description|
+|---------|---------|
+|[Xrm.Copilot.executeEvent](reference/Xrm-Copilot/executeevent.md)|[!INCLUDE [executeevent-description](reference/Xrm-Copilot/includes/executeevent-description.md)]|
+|[Xrm.Copilot.executePrompt](reference/Xrm-Copilot/executeprompt.md)|[!INCLUDE [executeprompt-description](reference/Xrm-Copilot/includes/executeprompt-description.md)]|
+
+
+### Related articles
+
+[FAQ for Agent APIs and Agent Response component](../../../maker/common/faq-agent-api-component.md)
+[Xrm.Copilot (Client API reference)](reference/xrm-copilot.md)
+[Xrm.Copilot.executeEvent (Client API reference)](reference/Xrm-Copilot/executeevent.md)
+[Xrm.Copilot.executePrompt (Client API reference)](reference/Xrm-Copilot/executeprompt.md)
+[Working with an interactive agent](../../../maker/model-driven-apps/add-agents-to-app.md#working-with-an-interactive-agent)
+[Copilot (Power Apps component framework API reference)](../../component-framework/reference/copilot.md)
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/clientapi-xrm.md b/powerapps-docs/developer/model-driven-apps/clientapi/clientapi-xrm.md
index ef0512ec6e..07059b1b9d 100644
--- a/powerapps-docs/developer/model-driven-apps/clientapi/clientapi-xrm.md
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/clientapi-xrm.md
@@ -3,7 +3,7 @@ title: "Client API Xrm object for model-driven apps "
description: "Describes the client API Xrm object"
author: sriharibs-msft
ms.author: srihas
-ms.date: 04/01/2022
+ms.date: 07/29/2025
ms.reviewer: jdaly
ms.topic: article
applies_to:
@@ -24,12 +24,14 @@ The **Xrm** object is globally available to use in your code without having to u
The following illustration displays the Xrm object model:
-
+:::image type="content" source="media/client-api-xrm-model.png" alt-text="Xrm Object Model":::
Here's the information about each of the namespaces in the Xrm object:
| Namespace| Description|
| ---| ---|
+| [Xrm.App](reference/xrm-app.md)|[!INCLUDE [xrm-app-description](reference/Xrm-App/includes/xrm-app-description.md)]|
+| [Xrm.Copilot](reference/xrm-copilot.md)| [!INCLUDE [xrm-copilot-description](reference/Xrm-Copilot/includes/xrm-copilot-description.md)]|
| [Xrm.Device](reference/xrm-device.md)| Provides methods to use native device capabilities. |
| [Xrm.Encoding](reference/xrm-encoding.md) | Provides methods to encode strings.|
| [Xrm.Navigation](reference/xrm-navigation.md) | Provides methods for navigating forms and items in model-driven apps.|
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/includes/accessing-event-parameters-response.md b/powerapps-docs/developer/model-driven-apps/clientapi/includes/accessing-event-parameters-response.md
new file mode 100644
index 0000000000..715720366e
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/includes/accessing-event-parameters-response.md
@@ -0,0 +1,34 @@
+#### Response
+
+```json
+[
+ {
+ "type": "event",
+ "timestamp": "2025-02-05T16:05:53.4074714+00:00",
+ "replyToId": "bbbbbbbb-1111-2222-3333-cccccccccccc",
+ "attachments": [],
+ "value": {
+ "@odata.context": "https://*.dynamics.com/api/data/v9.2/$metadata#activitypointers(subject,prioritycode)",
+ "value": [
+ {
+ "@odata.etag": "W/\"6825587\"",
+ "@odata.type": "#Microsoft.Dynamics.CRM.phonecall",
+ "activityid": "cccccccc-2222-3333-4444-dddddddddddd",
+ "activitytypecode": "phonecall",
+ "prioritycode": 2,
+ "subject": "Discuss new opportunity (sample)"
+ },
+ {
+ "@odata.etag": "W/\"6826236\"",
+ "@odata.type": "#Microsoft.Dynamics.CRM.phonecall",
+ "activityid": "dddddddd-3333-4444-5555-eeeeeeeeeeee",
+ "activitytypecode": "phonecall",
+ "prioritycode": 2,
+ "subject": "Likes our new products (sample)"
+ }
+ ]
+ },
+ "name": "MS.CopilotApiDemo.RelatedActivities"
+ }
+]
+```
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/includes/accessing-event-parameters.md b/powerapps-docs/developer/model-driven-apps/clientapi/includes/accessing-event-parameters.md
new file mode 100644
index 0000000000..93da3a616b
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/includes/accessing-event-parameters.md
@@ -0,0 +1,3 @@
+## Accessing eventParameters
+
+Within the Copilot Studio topic, the `eventParameters` from the API call can be accessed using the variable `Activity.Value`. Use [Parse value node](/microsoft-copilot-studio/authoring-variables?tabs=webApp#parse-value-node) to convert the JSON into a record with one or more fields. Selecting **From sample data** for **Data type** allows providing a JSON example to create the record.
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/includes/app-context-table.md b/powerapps-docs/developer/model-driven-apps/clientapi/includes/app-context-table.md
new file mode 100644
index 0000000000..ee0f53424b
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/includes/app-context-table.md
@@ -0,0 +1,7 @@
+| Variable | Description |
+| --- | --- |
+| `Global.PA__Copilot_Model_PageContext.pageContext.id.guid` | ID of the table record on the main form |
+| `Global.PA__Copilot_Model_PageContext.pageContext.entityTypeName` | Logical name of the table in the main page |
+| `Global.PA__Copilot_Model_PageContext.pageContext.pageName` | Name of the main page |
+| `Global.PA__Copilot_Model_PageContext.pageContext.pageType` | Type of the main page |
+| `Global.PA__Copilot_Model_AppUniqueNameContext.appUniqueNameContext.appUniqueName` | Unique name of the model-driven app |
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/media/client-api-xrm-model.png b/powerapps-docs/developer/model-driven-apps/clientapi/media/client-api-xrm-model.png
new file mode 100644
index 0000000000..9ec8d4c1c3
Binary files /dev/null and b/powerapps-docs/developer/model-driven-apps/clientapi/media/client-api-xrm-model.png differ
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/media/src/client-api-xrm-model.vsdx b/powerapps-docs/developer/model-driven-apps/clientapi/media/src/client-api-xrm-model.vsdx
new file mode 100644
index 0000000000..64ca414d1c
Binary files /dev/null and b/powerapps-docs/developer/model-driven-apps/clientapi/media/src/client-api-xrm-model.vsdx differ
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference.md
index 6688f83edc..99a6524871 100644
--- a/powerapps-docs/developer/model-driven-apps/clientapi/reference.md
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference.md
@@ -1,7 +1,7 @@
---
title: "Client API Reference for model-driven apps "
description: "The topic provides client API reference for model-driven apps."
-ms.date: 05/13/2024
+ms.date: 06/16/2025
author: sriharibs-msft
ms.author: srihas
ms.reviewer: jdaly
@@ -47,6 +47,7 @@ The topics under this section are organized as follows:
- Finally provides reference for namespaces in the **Xrm** object model.
- [Xrm.App](reference/xrm-app.md)
+ - [Xrm.Copilot](reference/xrm-copilot.md)
- [Xrm.Device](reference/xrm-device.md)
- [Xrm.Encoding](reference/xrm-encoding.md)
- [Xrm.Navigation](reference/xrm-navigation.md)
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-App/includes/xrm-app-description.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-App/includes/xrm-app-description.md
new file mode 100644
index 0000000000..aaa24954bb
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-App/includes/xrm-app-description.md
@@ -0,0 +1 @@
+Provides app-related methods.
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/executeevent.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/executeevent.md
new file mode 100644
index 0000000000..982b0dfece
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/executeevent.md
@@ -0,0 +1,66 @@
+---
+title: "executeEvent (Client API reference) in model-driven apps (preview)"
+description: Includes description and supported parameters for the executeEvent method.
+author: adrianorth
+ms.author: aorth
+ms.date: 07/07/2025
+ms.reviewer: jdaly
+ms.topic: reference
+applies_to: "Dynamics 365 (online)"
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+---
+
+# executeEvent (Client API reference) (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+[!INCLUDE[./includes/executeevent-description.md](./includes/executeevent-description.md)]
+
+## Syntax
+
+`Xrm.Copilot.executeEvent(eventName, eventParameters).then(successCallback, errorCallback); `
+
+## Parameters
+
+| Parameter Name| Type| Required | Description|
+| --- | --- | --- | --- |
+| `eventName` | string | Yes | Event Name registered in the Microsoft Copilot Studio topic |
+| `eventParameters` | Unknown | Yes | Parameters needed for the event execution. These depend on what the topic does.|
+| `successCallback` | Function | Yes | A function to call when the operation succeeds.|
+| `errorCallback` | Function | Yes | A function to call when the operation fails.|
+
+## Return Value
+
+An array of [MCSResponse](mcsresponse.md)
+
+## Accessing app context
+
+When an Agent API is called, context for the app is passed to the Copilot Studio topic through a set of variables. The following are context variables available as [Copilot Studio global variables](/microsoft-copilot-studio/authoring-variables-bot).
+
+[!INCLUDE [app-context-table](../../includes/app-context-table.md)]
+
+For example, using `Global.PA__Copilot_Model_PageContext.pageContext.id.guid` and `Global.PA__Copilot_Model_PageContext.pageContext.entityTypeName`, the form's record can be retrieved from Dataverse.
+
+[!INCLUDE [accessing-event-parameters](../../includes/accessing-event-parameters.md)]
+
+### Example
+
+In Microsoft Copilot Studio, where a topic is registered that accepts an ID (entity record ID) as an input parameter. Based on the input, it retrieves the related activities of that entity record and returns the results as an Copilot Studio event activity.
+
+```javascript
+const response = await Xrm.Copilot.executeEvent(
+ "Microsoft.PowerApps.Copilot.RelatedActivities",
+ { id:"aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"});
+```
+
+[!INCLUDE [accessing-event-parameters-response](../../includes/accessing-event-parameters-response.md)]
+
+
+### Related articles
+
+[Xrm.Copilot (Client API reference)](../xrm-copilot.md)
+
+[!INCLUDE[footer-include](../../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/executeprompt.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/executeprompt.md
new file mode 100644
index 0000000000..19abd30319
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/executeprompt.md
@@ -0,0 +1,68 @@
+---
+title: "executePrompt (Client API reference) in model-driven apps (preview)"
+description: Includes description and supported parameters for the executePrompt method.
+author: adrianorth
+ms.author: aorth
+ms.date: 06/16/2025
+ms.reviewer: jdaly
+ms.topic: reference
+applies_to: "Dynamics 365 (online)"
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+---
+
+# executePrompt (Client API reference) (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+[!INCLUDE[./includes/executeprompt-description.md](./includes/executeprompt-description.md)]
+
+## Syntax
+
+`Xrm.Copilot.executePrompt(promptText).then(successCallback, errorCallback);`
+
+## Parameters
+
+| Parameter Name| Type| Required | Description|
+| --- | --- | --- | --- |
+| `promptText` | string | Yes | The text that is registered as a trigger query in the MCS topic. |
+| `successCallback` | Function | Yes | A function to call when the operation succeeds.|
+| `errorCallback` | Function | Yes | A function to call when the operation fails.|
+
+## Return Value
+
+An array of [MCSResponse](mcsresponse.md)
+
+## Example
+
+In Microsoft Copilot Studio, a topic is triggered by queries like "hello" or "hi." When `executePrompt` runs with matching promptText, it activates the topic and returns a Message activity with the response text.
+
+```javascript
+const response = await Xrm.Copilot.executePrompt("hello");
+```
+
+### Response
+
+This is an example of the response that may be returned.
+
+```json
+[
+ {
+ "type": "message",
+ "timestamp": "2025-02-05T16:46:07.7799759+00:00",
+ "replyToId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
+ "attachments": [],
+ "textFormat": "markdown",
+ "text": "Hello, how can I help you today?",
+ "speak": "Hello, how can I help?"
+ }
+]
+```
+
+### Related articles
+
+[Xrm.Copilot (Client API reference)](../xrm-copilot.md)
+
+[!INCLUDE[footer-include](../../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/executeevent-description.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/executeevent-description.md
new file mode 100644
index 0000000000..f14865b3a6
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/executeevent-description.md
@@ -0,0 +1 @@
+Executes a Microsoft Copilot Studio topic based on the registered Event Name. Returns an array of type [MCSResponse](../mcsresponse.md).
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/executeprompt-description.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/executeprompt-description.md
new file mode 100644
index 0000000000..4a026fda4f
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/executeprompt-description.md
@@ -0,0 +1 @@
+Executes a Microsoft Copilot Studio topic based on the trigger queries registered in the topic. Returns the array of type [MCSResponse](../mcsresponse.md).
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/xrm-copilot-description.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/xrm-copilot-description.md
new file mode 100644
index 0000000000..81c6808b1b
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/includes/xrm-copilot-description.md
@@ -0,0 +1 @@
+Provides methods to execute registered Microsoft Copilot Studio Topics.
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/mcsresponse.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/mcsresponse.md
new file mode 100644
index 0000000000..5a3ab6cd08
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/Xrm-Copilot/mcsresponse.md
@@ -0,0 +1,50 @@
+---
+title: MCSResponse Interface (Client API reference) (preview)
+description: The interface that describes the properties of contains data returned by the Xrm.Copilot.executeEvent and Xrm.Copilot.executePrompt methods.
+author: adrianorth
+ms.author: aorth
+ms.date: 06/16/2025
+ms.reviewer: jdaly
+ms.topic: reference
+ms.subservice: pcf
+contributors:
+ - JimDaly
+---
+
+# MCSResponse Interface (Client API reference) (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+An interface that describes the data returned by the [executeEvent](executeevent.md) and [executePrompt](executeprompt.md) methods.
+
+
+
+## Properties
+
+The following table describes the `MCSResponse` properties. Only the `type` property will always be present.
+
+
+| Name| Type| Description|
+|---|---|---|
+| `type`| `string`| **Required.** The type of the response.|
+| `id`| `string`| Unique identifier for the response.|
+| `locale`| `string`| Locale information (e.g., language or region).|
+| `replyToId`| `string`| ID of the message this is replying to.|
+| `timestamp`| `string`| Timestamp of the response.|
+| `speak`| `string`| Text to be spoken by a speech synthesizer.|
+| `text`| `string`| Text content of the response.|
+| `textFormat`| `plain` \| `markdown` \| `xml` | Format of the text content.|
+| `suggestedActions` | `{ actions: any[]; to?: string[] }` | Suggested actions for the user to take.|
+| `value`| `unknown`| Custom payload or data.|
+| `valueType`| `string`| Type of the value payload.|
+| `name`| `string`| Name of the response or action.|
+| `attachmentLayout` | `list` \| `carousel`| Layout style for displaying attachments.|
+| `attachments`| [Attachment](#attachment-interface)[]| Array of attachments included in the response.|
+
+### Attachment Interface
+
+| Name| Type| Description|
+|---|---|---|
+| `content`| `unknown` | **Required.** The content of the attachment. |
+| `contentType`| `string` | Describes the type of content. |
\ No newline at end of file
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-app.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-app.md
index c387de66d0..15e96f7ae1 100644
--- a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-app.md
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-app.md
@@ -14,7 +14,7 @@ contributors:
---
# Xrm.App (Client API reference)
-Provides app-related methods.
+[!INCLUDE [xrm-app-description](Xrm-App/includes/xrm-app-description.md)]
|Method |Description |
|---|---|
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-copilot.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-copilot.md
new file mode 100644
index 0000000000..a6f0b5df01
--- /dev/null
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-copilot.md
@@ -0,0 +1,35 @@
+---
+title: "Xrm.Copilot (Client API reference) in model-driven apps (preview)"
+description: Provides methods to execute registered Microsoft Copilot Studio Topics..
+author: adrianorth
+ms.author: aorth
+ms.date: 06/16/2025
+ms.reviewer: jdaly
+ms.topic: reference
+applies_to: "Dynamics 365 (online)"
+ms.subservice: mda-developer
+search.audienceType:
+ - developer
+contributors:
+ - JimDaly
+---
+
+# Xrm.Copilot (Client API reference) (preview)
+
+[!INCLUDE [preview-note-pp](~/../shared-content/shared/preview-includes/preview-note-pp.md)]
+
+[!INCLUDE [xrm-copilot-description](Xrm-Copilot/includes/xrm-copilot-description.md)]
+
+| Method| Description|
+| --- | --- |
+|[executeEvent](Xrm-Copilot/executeevent.md)|[!INCLUDE [executeevent-description](Xrm-Copilot/includes/executeevent-description.md)]|
+|[executePrompt](Xrm-Copilot/executeprompt.md)|[!INCLUDE [executeprompt-description](Xrm-Copilot/includes/executeprompt-description.md)]|
+
+
+
+### Related articles
+
+[MCSResponse](Xrm-Copilot/mcsresponse.md)
+[Client API Xrm object](../clientapi-xrm.md)
+
+[!INCLUDE[footer-include](../../../../includes/footer-banner.md)]
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-device.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-device.md
index b6041481dc..f9278e7b1d 100644
--- a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-device.md
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-device.md
@@ -1,5 +1,5 @@
---
-title: "Xrm.Device"
+title: "Xrm.Device (Client API reference) in model-driven apps"
description: Provides methods to use native device capabilities via Xrm.Device.
author: sriharibs-msft
ms.author: srihas
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-encoding.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-encoding.md
index 6c117e48b2..8003903d4c 100644
--- a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-encoding.md
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-encoding.md
@@ -1,5 +1,5 @@
---
-title: "Xrm.Encoding"
+title: "Xrm.Encoding (Client API reference) in model-driven apps"
description: "Xrm.Encoding provides Client API methods to encode and decode strings."
author: sriharibs-msft
ms.author: srihas
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-panel.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-panel.md
index dbfcf37272..7ce50a148e 100644
--- a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-panel.md
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-panel.md
@@ -1,5 +1,5 @@
---
-title: "Xrm.Panel"
+title: "Xrm.Panel (Client API reference) in model-driven apps"
description: "Provides the loadPanel method to display a web page in the side pane of model-driven apps form."
author: sriharibs-msft
ms.author: srihas
@@ -23,7 +23,7 @@ Provides a method to display a web page in the side pane of model-driven apps fo
|[loadPanel](xrm-panel/loadPanel.md) |[!INCLUDE[xrm-panel/includes/loadPanel-description.md](xrm-panel/includes/loadPanel-description.md)] |
> [!NOTE]
-> The **Xrm.Panel** namespace was introduced in the December 2016 update for Dynamics 365 (online and on-premises), and the method under this namespace is a preview feature. A preview feature is a feature that is not complete, but is made available before it's officially in a release so customers can get early access and provide feedback. Preview features aren't meant for production use and may have limited or restricted functionality. We expect changes to this feature, so you shouldn't use it in production. Use it only in test and development environments. Microsoft doesn't provide support for this preview feature. Microsoft Dynamics 365 Technical Support won't be able to help you with issues or questions. Preview features aren't meant for production use and are subject to a separate [supplemental terms of use](https://www.microsoft.com/dynamics/Preview_Supplement_License_Terms_CRMOL_English.htm).
+> The **Xrm.Panel** namespace was introduced in the December 2016 update for Dynamics 365 (online and on-premises), and the method under this namespace is a preview feature. A preview feature is a feature that isn't complete, but is made available before it's officially in a release so customers can get early access and provide feedback. Preview features aren't meant for production use and might have limited or restricted functionality. We expect changes to this feature, so you shouldn't use it in production. Use it only in test and development environments. Microsoft doesn't provide support for this preview feature. Microsoft Dynamics 365 Technical Support isn't able to help you with issues or questions. Preview features aren't meant for production use and are subject to a separate [supplemental terms of use](https://go.microsoft.com/fwlink/?linkid=2189520).
### Related articles
diff --git a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-utility.md b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-utility.md
index 68254e01a4..b565cab59f 100644
--- a/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-utility.md
+++ b/powerapps-docs/developer/model-driven-apps/clientapi/reference/xrm-utility.md
@@ -1,5 +1,5 @@
---
-title: "Xrm.Utility (Client API reference)"
+title: "Xrm.Utility (Client API reference) in model-driven apps"
description: Provides container for useful methods.
author: sriharibs-msft
ms.author: srihas
diff --git a/powerapps-docs/developer/model-driven-apps/media/ClientAPI-XrmModel.png b/powerapps-docs/developer/model-driven-apps/media/ClientAPI-XrmModel.png
deleted file mode 100644
index 60708b18dc..0000000000
Binary files a/powerapps-docs/developer/model-driven-apps/media/ClientAPI-XrmModel.png and /dev/null differ
diff --git a/powerapps-docs/guidance/coding-guidelines/code-optimization.md b/powerapps-docs/guidance/coding-guidelines/code-optimization.md
index 97efbad7cb..348468a8f5 100644
--- a/powerapps-docs/guidance/coding-guidelines/code-optimization.md
+++ b/powerapps-docs/guidance/coding-guidelines/code-optimization.md
@@ -1,7 +1,7 @@
---
title: Power Apps code optimization
description: Learn about how to optimize code in Power Apps.
-ms.date: 06/25/2024
+ms.date: 06/19/2025
ms.topic: concept-article
ms.subservice: guidance
ms.service: powerapps
@@ -11,21 +11,23 @@ ms.author: rachaudh
# Code optimization
-As canvas apps evolve to meet diverse business requirements, the challenge of maintaining optimal performance becomes a critical consideration. The intricacies of data handling, user interface design, and functionality within canvas apps necessitate a nuanced approach to code optimization.
+As canvas apps evolve to meet different business needs, keeping performance optimal is critical. Data handling, user interface design, and app functionality all require a careful approach to code optimization.
-As canvas apps become more intricate, developers encounter challenges related to data retrieval, formula complexity, and rendering speeds. The need to strike a balance between robust functionality and responsive user interfaces underscores the importance of adopting a systematic approach to code optimization.
+When canvas apps get more complex, you can run into issues with data retrieval, formula complexity, and rendering speed. Balancing strong functionality and a responsive user interface means you need a systematic approach to code optimization.
## Power Fx formulas optimization
### With function
-The `With` function evaluates a formula for a single record. The formula can calculate a value and/or perform actions, such as modifying data or working with a connection. Use With to improve the readability of complex formulas by dividing it into smaller named sub-formulas. These named values act like simple local variables confined to the scope of the With. Using With is preferred over context or global variables as it is self contained, easy to understand, and can be used in any declarative formula context. [Learn more](/power-platform/power-fx/reference/function-with) about the `With` function.
+The `With` function evaluates a formula for a single record. The formula can calculate a value or perform actions, like modifying data or working with a connection. Use `With` to make complex formulas easier to read by dividing them into smaller named subformulas. These named values act like simple local variables limited to the scope of `With`. Using `With` is better than context or global variables because it's self-contained, easy to understand, and works in any declarative formula context. [Learn more](/power-platform/power-fx/reference/function-with) about the `With` function.
-
+
### Concurrent function
-The `Concurrent` function allows multiple formulas specified within the same property to be evaluated at the same time if they have connector or Dataverse calls. Normally, multiple formulas are evaluated by chaining them together with the `;` (semi-colon) operator, which evaluates each formula sequentially. With the `Concurrent` function, the app will evaluate all formulas within a property concurrently even after using the `;` operator. This concurrency helps users wait less for the same result. When data calls don't start until the previous calls finish, the app must wait for the sum of all request times. If data calls start at the same time, the app needs to wait only for the longest request time. [Learn more](/power-platform/power-fx/reference/function-concurrent) about the `Concurrent` function.
+
+The `Concurrent` function lets multiple formulas in the same property to be evaluated at the same time if they have connector or Dataverse calls. Normally, multiple formulas are evaluated at the same time when you chain them with the `;` (semicolon) operator. With `Concurrent`, the app evaluates all formulas in a property at the same time, even after using the `;` operator. This concurrency means users wait less for results. When data calls don't start until the previous calls finish, the app waits for the sum of all request times. If data calls start at the same time, the app waits only for the longest request time. [Learn more](/power-platform/power-fx/reference/function-concurrent) about the `Concurrent` function.
+
```powerappsfl
Concurrent(
@@ -38,7 +40,8 @@ Concurrent(
### Coalesce Function
-The `Coalesce` function evaluates its arguments in order and returns the first value that isn't blank or an empty string. Use this function to replace a blank value or empty string with a different value but leave nonblank and nonempty string values unchanged. If all the arguments are blank or empty strings, then the function returns blank, making Coalesce a good way to convert empty strings to blank values.
+The `Coalesce` function evaluates its arguments in order and returns the first value that's not blank or an empty string. Use this function to replace a blank value or empty string with a different value, but leave nonblank and nonempty string values unchanged. If all arguments are blank or empty strings, the function returns blank. `Coalesce` is a good way to convert empty strings to blank values.
+
For example:
@@ -54,9 +57,10 @@ Coalesce(value1, value2)
### IsMatch function
-The `IsMatch` function tests whether a text string matches a pattern that can comprise ordinary characters, predefined patterns, or a regular expression. [Learn more](/power-platform/power-fx/reference/function-ismatch) about the `IsMatch` function.
+The `IsMatch` function tests if a text string matches a pattern made up of ordinary characters, predefined patterns, or a regular expression. [Learn more](/power-platform/power-fx/reference/function-ismatch) about the `IsMatch` function.
+
+For example, this formula matches a United States Social Security number:
-For example, this formula matches a United States Social Security Number:
```powerappsfl
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
@@ -83,7 +87,7 @@ IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]
## Optimize app OnStart
-The `OnStart` property for cavas apps plays a crucial role in defining actions that occur when the app is launched. This property allows app developers to execute global initialization tasks, set up variables, and perform actions that should happen only once during the app's startup process. understanding and effectively utilizing the `OnStart` property is essential for creating responsive and efficient canvas apps.
+The `OnStart` property for cavas apps plays a crucial role in defining actions that occur when the app is launched. This property allows app developers to execute global initialization tasks, set up variables, and perform actions that should happen only once during the app's startup process. Understanding and effectively utilizing the `OnStart` property is essential for creating responsive and efficient canvas apps.
A recommended approach is to streamline the `App.OnStart` function by migrating variable setups to named formulas. Named formulas, especially those configured early in the app lifecycle, prove to be advantageous. These formulas handle the initialization of variables based on data calls, providing a cleaner and more organized structure for your code. More details [Build large and complex canvas apps - Power Apps | Microsoft Learn](/power-apps/maker/canvas-apps/working-with-large-apps#split-up-long-formulas).
@@ -113,8 +117,8 @@ App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)
Refer to for more details.
> [!WARNING]
-> Avoid dependencies between `StartScreen` and `OnStart`. Referencing a named formulat that in turn references a global variable may cause a race condition in which `StartScreen` is not applied correctly.
-**Note**: we should not have dependencies between StartScreen and OnStart. We block referencing global variables in StartScreen, but we can reference a named formula, that in turn references a global variable, and that may cause a race condition in which the StartScreen is not applied correctly.
+> Avoid dependencies between `StartScreen` and `OnStart`. Referencing a named formula that in turn references a global variable may cause a race condition in which `StartScreen` isn't applied correctly.
+**Note**: we shouldn't have dependencies between StartScreen and OnStart. We block referencing global variables in StartScreen, but we can reference a named formula, that in turn references a global variable, and that may cause a race condition in which the StartScreen isn't applied correctly.
### Named formulas
@@ -179,9 +183,9 @@ Named Formulas in the `App.Formulas` property provide a more flexible and declar
### User defined functions
-User Defined Functions is an experimental functionality in Power Apps Authoring Studio that enables users to create their own custom function.
+User Defined Functions in Power Apps Authoring Studio enables users to create their own custom function.
-To use this feature, under experimental settings, select New analysis engine and User-defined function (UDFs)
+To use this feature, under preview settings, turn on User-defined function (UDFs). Preview functionality should not be used in production, which is why it is disabled by default, but will become generally available soon.
Define a formula under `App.Formulas` as follows:
@@ -193,7 +197,7 @@ The code works as so:
- `Parameter` is the name of the input. One or more inputs are allowed
-- `DataType` is an argument passed into the function must match this data type. Available data types include Boolean, Color, Date, Datetime, GUID, Hyperlink, Text, Time, Untyped Object
+- `DataType` is an argument passed into the function must match this data type. Available data types include Boolean, Color, Date, Datetime, Dynamic, GUID, Hyperlink, Text, and Time
- `OutputDataType` is the data type the output of the function will be in
@@ -216,9 +220,9 @@ Call the defined function from text/label control.
## Optimize variables
-Variables are used to define and set local and global values to be used everywhere in the apps. While they're convenient too many of them can cause the app to be less optimized.
+Variables define and set local and global values you use throughout your app. While they're convenient, using too many variables can make your app less efficient.
-The following example demonstrates setting a variable for each attribute of an object, which requires using `Set` for every property.
+The following example demonstrates how to set a variable for each attribute of an object, which requires using `Set` for every property.
```powerappsfl
Set(varEmpName, Office365Users.MyProfile().DisplayName);
@@ -228,20 +232,21 @@ Set(varEmpUPN, Office365Users.MyProfile().UserPrincipalName);
Set(varEmpMgrName, Office365Users.ManagerV2(varEmpUPN).DisplayName);
```
-A more optimized approach is to use the property when you need it:
+A more efficient approach is to use the property only when you need it:
```powerappsfl
Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName
```
-Use context variables and global variables wisely. If a variable's scope expands beyond a single screen, then consider using global variables instead of context variables.
+Use context variables and global variables wisely. If a variable's scope goes beyond a single screen, use global variables instead of context variables.
+
-Too many unused variables contribute to increased memory usage and slightly slower app initialization. This is because resources are allocated for these variables even though they aren't actively used. Too many unused variables can also lead to overall complexity of the app's logic. While the impact of unused variables might not be severe, it's a good practice to maintain a clean and well-organized Power App to ensure optimal performance and ease of development.
+Too many unused variables increase memory usage and can slow app initialization. Resources are allocated for these variables even if you don't use them. Unused variables also add complexity to your app's logic. While the impact might not be severe, it's a good practice to keep your Power App clean and organized for better performance and easier development.
## Optimize collections
-Collections are temporary data storage structures that can be used to store and manipulate data within a Power Apps app. However, there's a fine line on when collections can lead to performance overhead. Therefore, limit your use of collections. Try to use them only when they're necessary.
+Collections are temporary data storage structures you use to store and manipulate data in a Power Apps app. But collections can cause performance overhead if you use them too much. Limit your use of collections and use them only when necessary.
```powerappsfl
// Use this pattern
@@ -252,11 +257,11 @@ Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});
```
-To count the records in a local collection, use `CountIf` instead of `Count(Filter())`.
+To count records in a local collection, use `CountIf` instead of `Count(Filter())`.
Consider this guidance when working with collections:
-**Limit the size and number of collections**. Since collections are local to the app, they're stored in the mobile device memory. The more data the collections hold or more the number of collections, the poorer the performance. Use `ShowColumns` function to get only the specific columns. Add `Filter` function to get only the relevant data.
+**Limit the size and number of collections**. Because collections are local to the app, they're stored in the mobile device memory. The more data collections hold, or the more collections you use, the worse the performance. Use the `ShowColumns` function to get only specific columns. Add the `Filter` function to get only relevant data.
The following example function returns the entire dataset.
@@ -264,7 +269,7 @@ The following example function returns the entire dataset.
ClearCollect(colDemoAccount, Accounts);
```
-Compare to the below code that is going to return only specific records and columns:
+Compare this to the following code, which returns only specific records and columns:
```powerappsfl
ClearCollect(colAcc,
@@ -273,15 +278,15 @@ ClearCollect(colAcc,
"name","address1_city"))
```
-The example code returns this dataset:
+This example returns the following dataset:
-
+
-**Set a data source refresh frequency**. If you're adding new records to the collection, you need to refresh it or collect to it to get the new or changed records into the collection. If your data source is updated by multiple users, you need to refresh the collection to get the new or changed records. More refresh calls mean more interaction with the server.
+**Set a data source refresh frequency**. If you add new records to the collection, refresh it or collect to it to get the new or changed records. If multiple users update your data source, refresh the collection to get the new or changed records. More refresh calls mean more interaction with the server.
### Cache data in collections and variables
-A collection, essentially a table variable, is distinct in that it stores rows and columns of data rather than a single data item. Their utility lies in two main purposes: firstly, for aggregating data before transmitting it to the data source, and secondly, for caching information, eliminating the need for frequent queries to the data source. As collections align with the tabular structure of both the data source and Power Apps, they offer an efficient means of interacting with data, even in offline scenarios.
+A collection is a table variable that stores rows and columns of data, not just a single data item. Collections are useful for two main reasons: aggregating data before sending it to the data source, and caching information to avoid frequent queries. Because collections match the tabular structure of the data source and Power Apps, they let you interact with data efficiently, even when you're offline.
```powerappsfl
// Clear the contents of EmployeeCollection, it already contains data
@@ -302,11 +307,11 @@ ClearCollect(
### Remove unused variables and media
-While unused media and variables may not create a drastic impact on app performance, it's important to clean up your app from any unused media or variables.
+While unused media and variables might not have a significant impact on app performance, it's important to clean up your app by removing any unused media or variables.
-- Unused media files contribute to overall increase in app size. This can lead to slower app load times.
+- Unused media files increase app size, which can slow down app load times.
-- Unused variables contribute to increased memory usage and slightly slower app initialization. This is because resources are allocated for these variables even though they aren't actively used. Additionally too many unused variables can make lead to overall complexity of the app's logic.
+- Unused variables increase memory usage and can slightly slow down app initialization. Resources are allocated for these variables even if they aren't used. Too many unused variables can also make the app's logic more complex.
- Use App Checker to review unused media and variables.
@@ -314,27 +319,27 @@ While unused media and variables may not create a drastic impact on app performa
### Avoid cross referencing controls
-Controls that reference controls on other screens can slow down app loading and navigation. Doing this may force the app to load the other screens immediately, rather than waiting until the user navigates to that screen. To address this issue, use variables, collections, and navigation context to share state across screens instead.
+Controls that reference controls on other screens can slow down app loading and navigation. Doing this can force the app to load the other screens immediately, rather than waiting until the user goes to that screen. To fix this issue, use variables, collections, and navigation context to share state across screens instead.
-Power Apps App checker within authoring studio, shows controls that are cross referenced. Review App checker regularly to address this issue.
+The App checker in Power Apps Studio shows controls that are cross-referenced. Review App checker regularly to fix this issue.
-Here's an example of Cross-referenced controls. In the image below Gallery 1 controls is cross referenced in Screen 2, Label 2 control.
+Here's an example of cross-referenced controls. In the image below, the Gallery 1 control is cross-referenced in Screen 2, Label 2 control.
-
+
-If you reference a control from the first screen in the app in the second screen, there will be no performance hit as the first screen has already been loaded and this may actually be a good thing as the app declarative instead of using variables.
+If you reference a control from the first screen in the app in the second screen, there isn't a performance hit because the first screen is already loaded. This can actually be a good thing because the app is declarative instead of using variables.
-If you reference controls that have yet to be loaded, such as the first screen referencing a control named `Label 3` from screen 3, will require the screen to be loaded in memory.
+If you reference controls that aren't loaded yet, such as the first screen referencing a control named `Label 3` from screen 3, the app loads that screen into memory.
### Enable DelayOutput for text controls
-Delay output setting When set to true, user input is registered after half a second delay. Useful for delaying expensive operations until user completes inputting text, like filtering when input is used in other formulas.
+The DelayOutput setting, when set to true, registers user input after a half-second delay. This is useful for delaying expensive operations until the user finishes entering text, like filtering when input is used in other formulas.
-For example, for a Gallery whose Items are Filtered depending on what is inputted into the TextInput control:
+For example, for a Gallery whose Items are Filtered depending on what the user enters in the TextInput control:
-- With DelayOutput set to false, which is default, the Gallery is filtered as soon as any text is typed. If you have a gallery with lots of items, reloading the Gallery with changes right away slows down performance; it would be more advantageous to wait a little. This is practical when you're using the TextInput for a search string (See [Search](https://PowerApps.microsoft.com/en-us/tutorials/function-filter-lookup/) or the new StartsWith functions).
+- With DelayOutput set to false, which is the default, the gallery is filtered as soon as any text is typed. If you have a gallery with lots of items, reloading the gallery with changes right away slows down performance. It's better to wait a little. This is practical when you're using the TextInput for a search string (see [Search](https://PowerApps.microsoft.com/en-us/tutorials/function-filter-lookup/) or the new StartsWith functions).
-- With DelayOutput set to true, there's a second delay before the changes are detected. This is done to give you time to finish typing what you want. The delay works well when used to aid the TextInput.OnChange property. If you have actions tied to changes, you don't want them triggered until everything you want is typed into the field.
+- With DelayOutput set to true, there's a short delay before the changes are detected. This gives you time to finish typing. The delay works well with the TextInput.OnChange property. If you have actions tied to changes, you don't want them triggered until you've finished typing in the field.
## Delegation and server side processing
@@ -348,9 +353,9 @@ Delegation has several advantages such as Query optimization and adds supports f
### Reduce API calls to data source
-Sometimes, it may be convenient to just follow coding practices such as creating collections by performing joins within canvas app. Refer to the code below:
+Sometimes, it can seem convenient to create collections by performing joins within your canvas app. Here's an example:
-In this example, there are two tables, Drivers and Trucks. The developer writes the code to create a collection of drivers and truck details and for each truck, they're calling drivers who own the trucks.
+In this example, there are two tables: Drivers and Trucks. The code creates a collection of drivers and truck details, and for each truck, it calls the driver who owns the truck.
```powerappsfl
// Bad code
@@ -361,7 +366,8 @@ ClearCollect(vartruckdata, AddColumns('Truck Details',
"STATE",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],State)));
```
-Performing such join operations from within canvas app can generate numerous calls to data source leading to very slow loading times.
+Performing such join in the canvas app can generate many calls to the data source, which leads to slow loading times.
+
A better approach is:
@@ -394,13 +400,13 @@ Set(
)
```
-In the real time scenario, it's possible to reduce loading times from 5 minutes to under 10 seconds by just correcting the data at the data source level.
+In the real time scenario, you can reduce loading times from five minutes to under 10 seconds by fixing the data at the source.
### Server side processing
-Different data sources such as SQL and Dataverse enable you to delegate data processing such as Filter and Lookups to the data source. In SQL Server, users can create views, which have content defined by a query. Similarly, with Dataverse, users can create low-code plugins to write logic for data processing at the server side and only get the final results in canvas apps.
+Different data sources, like SQL and Dataverse, let you delegate data processing, such as filters and lookups, to the data source. In SQL Server, you can create views defined by a query. In Dataverse, you can create low-code plugins to process data on the server and return only the final results to your canvas app.
-Delegating data processing to server can improve overall performance, reduce code on the client side and are easy to maintain.
+Delegating data processing to the server can improve performance, reduce client-side code, and make your app easier to maintain.
Learn more about [plugins in Dataverse](/power-apps/maker/data-platform/low-code-plug-ins).
@@ -408,7 +414,7 @@ Learn more about [plugins in Dataverse](/power-apps/maker/data-platform/low-code
### Use explicit column selection
-The Explicit Column Selection (ECS) feature is enabled by default for all new apps. If it isn't enabled for your app, you should enable it. ECS automatically reduces the number of columns retrieved to only the ones that are used in the application. If ECS isn't enabled, you might be retrieving more data than you need, which can affect performance. Occasionally, when an app pulls data in through collections, the original lineage or source of a column can be lost. We don't know if it's being used and we drop it using ECS. You can usually force ECS to work for a missing column by using the PowerFx expression `ShowColumns` after a collection reference or by using it in a control.
+The Explicit Column Selection (ECS) feature is on by default for all new apps. If it isn't on for your app, turn it on. ECS automatically reduces the number of columns retrieved to only those used in the app. If ECS isn't on, you might get more data than you need, which can affect performance. Sometimes, when an app gets data through collections, the original source of a column can be lost. ECS drops columns if it can't tell they're used. To force ECS to keep a missing column, use the PowerFx expression `ShowColumns` after a collection reference or in a control.
### Avoid calling Power Automate to populate a collection
@@ -480,7 +486,7 @@ Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
);
```
-Has better performance than:
+Performs better than:
```powerappsfl
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
diff --git a/powerapps-docs/guidance/coding-guidelines/code-readability.md b/powerapps-docs/guidance/coding-guidelines/code-readability.md
index 1e862ab7a0..dc07b2b52c 100644
--- a/powerapps-docs/guidance/coding-guidelines/code-readability.md
+++ b/powerapps-docs/guidance/coding-guidelines/code-readability.md
@@ -1,7 +1,7 @@
---
title: Power Apps code readability
description: Learn about how to optimize code readability in Power Apps.
-ms.date: 06/12/2024
+ms.date: 06/19/2025
ms.topic: concept-article
ms.subservice: guidance
ms.service: powerapps
@@ -168,8 +168,6 @@ PowerApps uses DataTables in Microsoft Excel to connect to data in Excel workshe
- Use descriptive column names in the DataTables.
- Use Pascal casing. Each word of the DataTable name should begin with a capital letter, such as `EmployeeLeaveRequests`.
-### Untyped and dynamic objects
-
### Variable names
Naming conventions for variables in canvas apps are important for maintaining readability, consistency, and clarity in your Power Apps projects. While no strict standard is enforced, adopting a consistent naming convention across your canvas app can make it easier for you and other collaborators to understand, use, and manage the variables.
@@ -238,21 +236,21 @@ These examples don't follow the collection name conventions:
- `tempCollection`
> [!TIP]
-> When there are many collections in the app, you can just type the prefix in the formula bar to see a list of the available collections. As for variables, if you follow these guidelines to name your collections, you'll be able to find them very easily in the formula bar as you develop your app. Ultimately, this approach leads to quicker app development.
+> When there are many collections in the app, you can just type the prefix in the formula bar to see a list of the available collections. As for variables, if you follow these guidelines to name your collections, you'll be able to find them easily in the formula bar as you develop your app. Ultimately, this approach leads to quicker app development.
## Comments and documentation
-As you write code for your application, emphasize the importance of comprehensive commenting. These comments not only serve as a helpful guide when you revisit the application months later but also extend a gesture of gratitude to the next developer who collaborates on the project.
+When you write code for your application, focus on adding clear comments. Comments help you understand your code later and make it easier for the next developer to work on the project.
-There are two primary types of comments to enhance code clarity: Power Apps supports two comment styles: line comments, denoted by double forward slashes (`//`) for single-line remarks, and block comments enclosed within `/*` and `*/` for multi-line annotations.
+Power Apps supports two comment styles to make your code clearer: line comments, which use double forward slashes (`//`) for single-line notes, and block comments, which use `/*` and `*/` for multi-line notes.
### Line comments
-Adding a double forward slash (`//`) to any line of code in PowerApps designates the rest of the line (including the `//`) as a comment.
+Add a double forward slash (`//`) to any line of code in Power Apps to make the rest of the line a comment.
-Utilize line comments to elucidate the functionality of the subsequent code. They can also serve to temporarily disable a line of code, making them beneficial for testing purposes.
+Use line comments to explain what the next line of code does. You can also use them to temporarily disable a line of code for testing.
-This example shows the use of line comments.
+Here's an example of a line comment.
```powerappsfl
// ClearCollect function populates the Expenses2 collection with sample data
@@ -269,11 +267,11 @@ ClearCollect(
### Block comments
-Text enclosed within `/*` and `*/` is recognized as a block comment. Unlike line comments that apply to a single line, block comments can span multiple lines.
+Text between `/*` and `*/` is a block comment. Block comments can cover several lines, unlike line comments, which only cover one line.
-Block comments are useful for multiline explanations, such as documenting a code module header. They also facilitate temporarily disabling multiple lines of code during testing or debugging.
+Use block comments for longer explanations, like documenting a code module header. You can also use them to temporarily disable several lines of code during testing or debugging.
-For optimal code organization, it's advisable to add comments after utilizing the Format Text feature. This is beneficial if your comments precede a code block.
+For better code organization, add comments after you use the Format Text feature. This helps if your comments come before a code block.
```powerappsfl
/*
@@ -293,47 +291,47 @@ Patch(
)
```
-The Format Text feature follows these rules for existing comments:
+The Format Text feature follows these rules for comments:
-1. If a property begins with a block comment, the next line of code will be appended to it.
-1. If a property begins with a line comment, the next line of code won't be appended to it. Otherwise, the code is commented out.
-1. Line and block comments elsewhere in the property will be appended to the previous line of code.
+1. If a property starts with a block comment, the next line of code is added to it.
+1. If a property starts with a line comment, the next line of code isn't added to it. Otherwise, the code is commented out.
+1. Line and block comments elsewhere in the property are added to the previous line of code.
-Don't worry about adding too many comments or comments that are too long. All comments are stripped out when PowerApps creates the client app package. Therefore, they won't affect the package size or slow down the app download or loading times.
+Don't worry about adding too many or too long comments. Power Apps removes all comments when it creates the client app package, so comments don't affect package size or slow down app downloads or loading times.
### Modern app designer with comments
-In Power Apps, it's considered the best practice for makers to effectively utilize commenting features within both Power Apps Studio and Modern app designer.
+In Power Apps, it's best to use commenting features in both Power Apps Studio and Modern app designer.
-For optimal engagement in the Power Apps Studio, makers are advised to add comments using the following methods:
+To add comments in Power Apps Studio, use these methods:
1. Right-click the ellipsis ("...") of any item in the Tree View.
2. Right-click a component in the canvas area.
3. Select the "Comments" button located on the command bar in the top right-hand corner of the screen.
-When mentioning colleagues in comments, it's recommended to use the "@" symbol followed by their name. This prompts a notification email for the tagged colleague, ensuring swift access to the comment. In cases where a tagged user lacks access to the app, the maker is prompted to share the app with them.
+When you mention a colleague in a comment, use the "@" symbol followed by their name. This sends a notification email to the person you tag. If the tagged user doesn't have access to the app, Power Apps prompts you to share the app with them.
-
+
### Indentation and formatting
-In Power Apps, indentation and formatting are crucial for maintaining a clear and organized structure in your app. Following best practices improve the readability of your formulas and controls.
+In Power Apps, indentation and formatting help keep your app clear and organized. Following best practices makes your formulas and controls easier to read.
#### Formula bar
##### Indentation
-Although Power Apps doesn't enforce strict indentation, you can use spaces to visually separate different sections of your formulas. Press the space bar multiple times to create an indentation effect.
+Power Apps doesn't enforce strict indentation, but you can use spaces to separate different sections of your formulas. Press the space bar several times to create an indentation.
##### Line breaks
-You can break long formulas into multiple lines to enhance readability. Press Enter to create a line break within the formula bar.
+Break long formulas into multiple lines to make them easier to read. Press Enter to add a line break in the formula bar.
#### Use the Format text command
-The "Format Text" command in the formula bar is designed to apply indentation, spacing, and line breaks to your Power Apps code. Utilize the "Format Text" command to establish a uniform coding style across your entire canvas app, ensuring a more efficient and error-resistant development process.
+The "Format Text" command in the formula bar adds indentation, spacing, and line breaks to your Power Apps code. Use the "Format Text" command to keep a consistent coding style in your canvas app and help prevent errors.
-
+
## Next step
diff --git a/powerapps-docs/guidance/coding-guidelines/error-handling.md b/powerapps-docs/guidance/coding-guidelines/error-handling.md
index 4e7128acbe..b7b0b33557 100755
--- a/powerapps-docs/guidance/coding-guidelines/error-handling.md
+++ b/powerapps-docs/guidance/coding-guidelines/error-handling.md
@@ -1,26 +1,29 @@
---
title: Handling errors in Power Apps
-description: Learn about best practices for error handling in Power Apps
-ms.date: 06/12/2024
+description: Discover best practices for error handling in Power Apps, including validation, patching, and custom error messages.
+ms.date: 07/15/2025
ms.topic: concept-article
ms.subservice: guidance
-ms.service: power-platform
+ms.service: powerapps
author: robstand
ms.author: rstand
-manager:
+ms.custom:
+ - ai-gen-docs-bap
+ - ai-gen-description
+ - ai-seo-date:07/15/2025
---
# Error handling
-Power Fx language has a new preview feature to enable Formula level error handling. This is by default turned On in the Settings.
+Power Fx includes a preview feature that enables formula-level error handling. By default, this feature is turned on in Settings.
-
+:::image type="content" source="media/image28.png" alt-text="Screenshot of Upcoming features in Settings showing Formula-level error management set to On.":::
-This setting gives access to formulas like `IfError`, `IsError`, `Error`, and `IsBlankorError`. These functions allow you to detect errors, provide alternative values, or take specific actions based on the encountered error.
+This setting provides access to formulas like `IfError`, `IsError`, `Error`, and `IsBlankorError`. These functions allow you to detect errors, provide alternative values, or take specific actions based on the error.
-## Validation Error Handling
+## Validation error handling
-Above functions can help with validating inputs such as incorrect format or required fields. Use `If` statements or functions like `IsBlank` and `IsError` to validate user input. Provide clear error messages and prevent further processing until the input is corrected.
+These functions help validate inputs like incorrect formats or required fields. Use `If` statements or functions like `IsBlank` and `IsError` to validate user input. Provide clear error messages and prevent further processing until the input is corrected.
```powerappsfl
If( IsBlank(TextInput.Text),
@@ -30,9 +33,9 @@ If( IsBlank(TextInput.Text),
)
```
-## Patch Function Error Handling
+## Patch function error handling
-Similar to the previous example, `Error` functions can help catch errors while patching data to data source. `Patch` function reports errors in 2 ways.
+Similar to the previous example, `Error` functions help catch errors while patching data to a data source. The `Patch` function reports errors in two ways.
It can return an error value as the result of the operations.
@@ -52,7 +55,7 @@ UpdateContext(
)
```
-Errors can be detected with `IsError` and replaced or suppressed with `IfError`
+You can detect errors with `IsError` and replace or suppress them with `IfError`.
```powerappsfl
IfError(result, Notify("There was an issue saving data" , NotificationType.Error));
@@ -74,9 +77,9 @@ If(
)
```
-### Forms Error Handling
+### Forms error handling
-When using Forms to submit data via `SubmitForm` function, using Form control property `OnFailure` to notify the error message.
+When you use Forms to submit data with the `SubmitForm` function, use the Form control property `OnFailure` to notify users of error messages.
```powerappsfl
// OnSelect property of the form's submit button
@@ -89,9 +92,9 @@ Navigate('Success Screen');
Notify("Error: the invoice could not be created", NotificationType.Error);
```
-### Custom Error Message with OnError Property
+### Custom error message with OnError property
-Power Apps `OnError` is a property on your app which lets you capture all your unhandled errors. The `OnError` property gives you the ability to execute an expression that runs every time an error is not handled by the app (such as storing it in a variable or using a function such as `IfError` to replace it with some other value). To use the [`OnError` property](/power-platform/power-fx/reference/object-app#onerror-property), you need to add it to the app that you want to apply it to. Then, you can specify the error message that you want to display by writing a formula in the `OnError` property box.
+The Power Apps `OnError` property lets you capture all unhandled errors in your app. The `OnError` property gives you the ability to execute an expression that runs every time an error isn't handled by the app (such as storing it in a variable or using a function such as `IfError` to replace it with some other value). To use the [`OnError` property](/power-platform/power-fx/reference/object-app#onerror-property), you need to add it to the app that you want to apply it to. Then, you can specify the error message that you want to display by writing a formula in the `OnError` property box.
It's important to note that `App.OnError` can't replace the error in the same way that `IfError` can. At the point that `App.OnError` is executed, the error has already happened, and the result has propagated through other formulas. `App.OnError` only controls how the error is reported to the end user and provides a hook for the maker to log the error if desired.
@@ -109,6 +112,11 @@ Notify(
NotificationType.Error
)
```
+
+## Related information
+
+[Power Fx error handling](/power-platform/power-fx/error-handling)
+
## Next step
> [!div class="nextstepaction"]
diff --git a/powerapps-docs/index.yml b/powerapps-docs/index.yml
index a5f6f5bf27..4f5b51c3cf 100644
--- a/powerapps-docs/index.yml
+++ b/powerapps-docs/index.yml
@@ -62,7 +62,7 @@ additionalContent:
links:
- text: Get started with AI copilot (preview)
url: maker/canvas-apps/ai-overview.md
- - text: Build apps through conversation (preview)
+ - text: Build apps through conversation
url: maker/canvas-apps/ai-conversations-create-app.md
- text: Add a Copilot control to a canvas app (preview)
url: maker/canvas-apps/add-ai-copilot.md
diff --git a/powerapps-docs/limits-and-config.md b/powerapps-docs/limits-and-config.md
index 0ea8b8e946..b7eb9cacae 100644
--- a/powerapps-docs/limits-and-config.md
+++ b/powerapps-docs/limits-and-config.md
@@ -5,7 +5,8 @@ author: lancedMicrosoft
ms.topic: article
ms.custom: canvas
ms.reviewer: mkaur
-ms.date: 5/21/2025
+ms.date: 07/28/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
ms.author: gregli
search.audienceType:
@@ -27,6 +28,10 @@ This article contains information on supported device platforms, web browser req
## Supported platforms for running apps using the Power Apps mobile app
+> [!NOTE]
+> - To ensure optimal user experience, we recommend that you test your app on the specific devices intended for production deployment.
+> - Performance testing and results may vary between device types such as mobile, desktop, and laptops due to processing power, memory capacity, network connectivity, app complexity and other apps running in parallel in a device. Make sure the test results meet your business requirements before you roll out the solutions in production.
+
| **Platform** | **Version**
| --- | --- |
| iOS |The latest version of iOS is always the recommended version to run Power Apps mobile. The previous version is the minimum required.|
diff --git a/powerapps-docs/maker/TOC.yml b/powerapps-docs/maker/TOC.yml
index 5c1c22b379..464b037731 100644
--- a/powerapps-docs/maker/TOC.yml
+++ b/powerapps-docs/maker/TOC.yml
@@ -51,17 +51,21 @@
href: ../user/modern-fluent-design.md
- name: Unified Interface
href: ../user/unified-interface.md
- - name: Supervise agents using agent feed (preview)
- href: ../user/supervise-agents-with-agent-feed.md
- - name: Copilot features
+ - name: AI features
items:
+ - name: AI in apps overview
+ href: ../user/ai-in-apps.md
+ - name: Supervise agents using agent feed (preview)
+ href: ../user/supervise-agents-with-agent-feed.md
- name: Use form fill assistance
href: ../user/form-filling-assistance.md
- name: Use row summary
href: ../user/record-summaries.md
- name: Use Copilot chat
href: ../user/use-copilot-model-driven-apps.md
- - name: Use Copilot to visualize data in a view (preview)
+ - name: Find data in a view (preview)
+ href: ../user/find-data-with-ai.md
+ - name: Visualize data in a view (preview)
href: ../user/visualize-data-in-copilot.md
- name: Use Copilot case summary in model-driven apps
href: ../user/copilot-case-summary.md
@@ -314,7 +318,7 @@
items:
- name: Connections overview
href: ./canvas-apps/connections-list.md
- - name: Working with untyped and dynamic objects
+ - name: Working with dynamic values
href: ./canvas-apps/untyped-and-dynamic-objects.md
- name: Manage expired tokens
href: ./canvas-apps/working-with-tokens.md
@@ -396,7 +400,7 @@
href: ./canvas-apps/inline-actions.md
- name: Add comments
href: ./canvas-apps/comments.md
- - name: Understand coauthoring
+ - name: Understand coauthoring and copresence
href: ./canvas-apps/copresence-power-apps-studio.md
- name: Add and configure controls
href: ./canvas-apps/add-configure-controls.md
@@ -1244,6 +1248,8 @@
href: ./common/wrap/code-sign-ios.md
- name: Code sign for Android
href: ./common/wrap/code-sign-android.md
+ - name: Code signing process for AAB file
+ href: ./common/wrap/code-sign-aab-file.md
- name: Azure key vault for wrap
href: ./common/wrap/create-key-vault-for-code-signing.md
- name: Use deep links with wrapped mobile apps
@@ -1439,8 +1445,6 @@
href: ./model-driven-apps/model-driven-app-overview.md
- name: The benefits of the model-driven approach
href: ./model-driven-apps/app-value-proposition.md
- - name: Build an app in three steps (preview)
- href: ./model-driven-apps/build-app-three-steps.md
- name: Release channels for model-driven apps
items:
- name: Release channel overview
@@ -1509,8 +1513,10 @@
href: ./model-driven-apps/custom-page-localize.md
- name: Known issues with custom pages
href: ./model-driven-apps/model-app-page-issues.md
- - name: Use monitor to troubleshoot custom pages
+ - name: Use live monitor to troubleshoot custom pages
href: ./model-driven-apps/monitor-page-checker.md
+ - name: Create a generative page
+ href: ./model-driven-apps/generative-pages.md
- name: Create, add, or remove forms and views
href: ./model-driven-apps/create-add-remove-forms-views-dashboards.md
- name: Work with views
@@ -1597,6 +1603,8 @@
href: ./model-driven-apps/form-designer-add-configure-quickview.md
- name: Configure lookup component
href: ./model-driven-apps/form-designer-add-configure-lookup.md
+ - name: Add the agent response component
+ href: ./model-driven-apps/form-designer-add-configure-agent-response.md
- name: Add a chart to a form
href: ./model-driven-apps/add-chart-to-form.md
- name: Add a map on a form
@@ -1671,7 +1679,7 @@
href: ./model-driven-apps/form-component-control.md
- name: Troubleshoot forms
items:
- - name: Use Monitor to troubleshoot forms
+ - name: Use live monitor to troubleshoot forms
href: ./model-driven-apps/monitor-form-checker.md#filter-live-monitor-for-form-related-issues
- name: Use custom pages within model-driven apps
items:
@@ -1691,7 +1699,7 @@
href: ./model-driven-apps/page-code-components.md
- name: Known issues with custom pages
href: ./model-driven-apps/model-app-page-issues.md
- - name: Use monitor to troubleshoot custom pages
+ - name: Use live monitor to troubleshoot custom pages
href: ./model-driven-apps/monitor-page-checker.md
- name: Customize app commands
href: ./model-driven-apps/command-designer-overview.md
@@ -2104,6 +2112,8 @@
href: ./data-platform/create-edit-global-option-sets.md
- name: Autonumber columns
href: ./data-platform/autonumber-fields.md
+ - name: Prompt columns (preview)
+ href: ./data-platform/prompt-column.md
- name: Work with Power Fx formula columns
items:
- name: Power Fx formula columns
@@ -2415,6 +2425,8 @@
href: ./data-platform/data-platform-mcp.md
- name: Connect to Dataverse with MCP FAQ
href: ./data-platform/data-platform-mcp-faq.md
+ - name: Disable the Dataverse MCP server
+ href: ./data-platform/data-platform-mcp-disable.md
- name: License requirements for tables
href: ./data-platform/data-platform-entity-licenses.md
items:
@@ -2629,3 +2641,7 @@
href: ./common/faq-rename-control.md
- name: FAQ about Copilot visualizations on a view
href: ./common/faq-visualize-view.md
+ - name: FAQ for Agent APIs in model-driven apps
+ href: ./common/faq-agent-api-component.md
+ - name: FAQ about generative pages in model-driven apps
+ href: ./common/faq-generative-pages-model-driven.md
diff --git a/powerapps-docs/maker/canvas-apps/add-ai-copilot.md b/powerapps-docs/maker/canvas-apps/add-ai-copilot.md
index 6e0aeb9537..3b3cba2448 100644
--- a/powerapps-docs/maker/canvas-apps/add-ai-copilot.md
+++ b/powerapps-docs/maker/canvas-apps/add-ai-copilot.md
@@ -11,6 +11,7 @@ ms.collection:
- get started
ms.reviewer:
ms.date: 5/25/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
ms.author: tapanm
search.audienceType:
diff --git a/powerapps-docs/maker/canvas-apps/add-app-solution-default.md b/powerapps-docs/maker/canvas-apps/add-app-solution-default.md
index e6c7bada0f..d3abd96e11 100644
--- a/powerapps-docs/maker/canvas-apps/add-app-solution-default.md
+++ b/powerapps-docs/maker/canvas-apps/add-app-solution-default.md
@@ -9,7 +9,7 @@ ms.author: cgarty
ms.reviewer: angieandrews
ms.topic: how-to
ms.custom: canvas, bap-template
-ms.date: 11/18/2024
+ms.date: 7/28/2025
ms.subservice: canvas-maker
search.audienceType:
- maker
@@ -90,6 +90,10 @@ To view canvas app and cloud flow objects in a solution, use the [solution view]
Once the feature is enabled, use solutions [export](../data-platform/export-solutions.md) and [import](../data-platform/import-update-export-solutions.md) instead of [exporting and importing legacy packages of canvas apps and flows](export-import-app.md). Legacy packages can be imported in environments with the environment setting turned off.
+## Move flows into a solution with PowerShell
+
+Use the [Add-AdminFlowsToSolution](/powershell/module/microsoft.powerapps.administration.powershell/add-adminflowstosolution) cmdlet to move non-solution Power Automate flows into a solution for better lifecycle management and deployment. This command lets you migrate multiple flows by specifying environment and solution IDs, and targeting flows by name or ID. For more information, see [Microsoft.PowerApps.Administration.PowerShell Module](/powershell/module/microsoft.powerapps.administration.powershell).
+
## Considerations
Take the following considerations into account before you decide to create canvas apps and cloud flows in a solution by default.
diff --git a/powerapps-docs/maker/canvas-apps/ai-conversations-create-app.md b/powerapps-docs/maker/canvas-apps/ai-conversations-create-app.md
index 49dee27f32..1f91092045 100644
--- a/powerapps-docs/maker/canvas-apps/ai-conversations-create-app.md
+++ b/powerapps-docs/maker/canvas-apps/ai-conversations-create-app.md
@@ -8,6 +8,7 @@ ms.collection:
- get started
ms.reviewer:
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
ms.author: tapanm
search.audienceType:
diff --git a/powerapps-docs/maker/canvas-apps/ai-edit-app.md b/powerapps-docs/maker/canvas-apps/ai-edit-app.md
index 6b37686f7b..1a7075f08b 100644
--- a/powerapps-docs/maker/canvas-apps/ai-edit-app.md
+++ b/powerapps-docs/maker/canvas-apps/ai-edit-app.md
@@ -8,6 +8,7 @@ ms.collection:
- get started
ms.reviewer:
ms.date: 5/27/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
ms.author: mkaur
search.audienceType:
diff --git a/powerapps-docs/maker/canvas-apps/ai-field-suggestions.md b/powerapps-docs/maker/canvas-apps/ai-field-suggestions.md
index 5b6c159614..1c929281ed 100644
--- a/powerapps-docs/maker/canvas-apps/ai-field-suggestions.md
+++ b/powerapps-docs/maker/canvas-apps/ai-field-suggestions.md
@@ -4,6 +4,7 @@ description: Learn how to use field suggestions by Copilot, an AI feature in Mic
author: norliu
ms.author: norliu
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.topic: article
ms.reviewer: mkaur
ms.subservice: canvas-maker
diff --git a/powerapps-docs/maker/canvas-apps/ai-formulas-formulabar.md b/powerapps-docs/maker/canvas-apps/ai-formulas-formulabar.md
index 28f4031053..103a86eaf0 100644
--- a/powerapps-docs/maker/canvas-apps/ai-formulas-formulabar.md
+++ b/powerapps-docs/maker/canvas-apps/ai-formulas-formulabar.md
@@ -4,6 +4,7 @@ description: Learn how to use Copilot, an AI feature in Power Apps, to create an
author: warrenbryant-msft
ms.author: warrenbryant
ms.date: 5/27/2025
+ms.update-cycle: 180-days
ms.topic: how-to
ms.reviewer: mkaur
ms.subservice: canvas-maker
diff --git a/powerapps-docs/maker/canvas-apps/ai-overview.md b/powerapps-docs/maker/canvas-apps/ai-overview.md
index e29d81110b..53aff0f34e 100644
--- a/powerapps-docs/maker/canvas-apps/ai-overview.md
+++ b/powerapps-docs/maker/canvas-apps/ai-overview.md
@@ -12,7 +12,8 @@ ms.custom:
- ai-seo-date: 5/25/2025
ai-usage: ai-assisted
ms.reviewer:
-ms.date: 12/20/2024
+ms.date: 06/27/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
search.audienceType:
- maker
@@ -61,7 +62,7 @@ The following articles can help you build various apps in different scenarios us
- [Create a plan using Plan designer](../plan-designer/create-plan.md)
-### Copilot in canvas apps
+## Copilot in canvas apps
- [Build apps through conversation](ai-conversations-create-app.md)
- [Edit your app with Copilot (preview)](ai-edit-app.md)
@@ -72,22 +73,17 @@ The following articles can help you build various apps in different scenarios us
- [Build an agent to automate your business process (preview)](agent-builder.md)
- [Rename controls in canvas apps with Copilot (preview)](./controls/copilot-rename-controls.md)
+## Copilot in model-driven apps
-### Copilot in model-driven apps
+Model-driven apps support [AI features](../../user/ai-in-apps.md) to improve the efficiency and productivity of business processes with intelligent automation and assistance.
-- [Add the Copilot control to the rich text editor](../model-driven-apps/copilot-control.md)
-- [Use Copilot in the email rich text editor](../model-driven-apps/use-copilot-email-assist.md)
-- [Add Copilot for app users in model-driven apps](../model-driven-apps/add-ai-copilot.md)
-
-### Copilot feature use
+## Copilot feature use
- [Filter, sort, and search galleries with Copilot (preview)](../../user/smartgrid.md)
- [Draft well-written input text with Copilot (preview)](../../user/well-written-input-text-copilot.md)
- [Visualize data in a view with Copilot (preview)](../../user/visualize-data-in-copilot.md)
-### Microsoft Dataverse
-
-
+## Microsoft Dataverse
- [Add knowledge to an existing copilot: Dataverse](../data-platform/data-platform-copilot.md)
@@ -116,7 +112,7 @@ Preview Copilot features are enabled by default, but your admin can turn them of
> [!NOTE]
> Turning off Copilot for your tenant disables Copilot for makers only. It doesn't disable the [Copilot control for canvas apps](add-ai-copilot.md) or [Copilot for model-driven apps](../model-driven-apps/add-ai-copilot.md).
-## Related information
+### Related information
- [FAQ about using AI responsibly in Power Apps](../common/transparency-note.md)
- [Language availability for Power Platform](https://dynamics.microsoft.com/availability-reports/languagereport/)
diff --git a/powerapps-docs/maker/canvas-apps/app-from-sharepoint.md b/powerapps-docs/maker/canvas-apps/app-from-sharepoint.md
index db2906af24..ef3675ad96 100644
--- a/powerapps-docs/maker/canvas-apps/app-from-sharepoint.md
+++ b/powerapps-docs/maker/canvas-apps/app-from-sharepoint.md
@@ -7,7 +7,7 @@ ms.topic: how-to
ms.custom: canvas
ms.collection: get-started
ms.reviewer:
-ms.date: 3/1/2025
+ms.date: 6/17/2025
ms.subservice: canvas-maker
ms.author: tapanm
search.audienceType:
@@ -21,64 +21,91 @@ contributors:
# Create a canvas app with data from a list
-In this article, you can create a canvas app in Power Apps from Lists or SharePoint. You can create the app from within Power Apps or SharePoint. Alternatively, you can create the app based on a list in an on-premises SharePoint site if you [connect to it](connections/connection-sharepoint-online.md#create-a-sharepoint-connection) through a data gateway.
+This article explains how to create a canvas app using data from Microsoft Lists or SharePoint. By following this method, you can build an app from a list and customize it to efficiently manage your data.
-The app you create contains three screens:
+You can also [connect to on-premises SharePoint lists](connections/connection-sharepoint-online.md#create-a-sharepoint-connection) through a data gateway.
-- **Browse screen**: scroll through all items in the list.
-- **Details screen**: show all information about a single item in the list.
-- **Edit screen**: create an item or update information about an existing item.
+You can create an app by using a list in SharePoint or Lists in two ways:
+
+- Sign in to Power Apps and then [create an app by connecting to list in SharePoint from Power Apps.](app-from-sharepoint.md#use-a-list-in-sharepoint-or-lists-to-create-an-app)
+- [Create an app directly from a list in SharePoint or Lists.](app-from-sharepoint.md#create-an-app-directly-from-a-list-in-sharepoint-or-lists)
+
+When the app is created, Power Apps Studio opens and shows an app with three screens:
+
+- **Browse screen**: Scroll through all items in the list.
+- **Details screen**: Show all information about a single item in the list.
+- **Edit screen**: Create an item or update information about an existing item.
+
+Watch this video to learn how to create a canvas app from a list.
+> [!VIDEO https://learn-video.azurefd.net/vod/player?id=de3b0fbc-f5b6-4958-855e-109f9c3692ac]
> [!NOTE]
-> When you create or view a list in SharePoint, you're automatically redirected to Microsoft Lists. The list can always be found in both Lists and SharePoint. Learn more in [What is a list in Microsoft 365?](https://support.microsoft.com/en-us/office/what-is-a-list-in-microsoft-365-93262a88-20ad-4edc-8410-b6909b2f59a5)
+> When you create or view a list in SharePoint, you're automatically redirected to Microsoft Lists. The list is always available in both Microsoft Lists and SharePoint. Learn more in [What is a list in Microsoft 365?](https://support.microsoft.com/en-us/office/what-is-a-list-in-microsoft-365-93262a88-20ad-4edc-8410-b6909b2f59a5)
+
## Prerequisites
-You need access to SharePoint and Power Apps through a [subscription](https://www.microsoft.com/licensing/terms/productoffering) to [Microsoft 365](https://www.microsoft.com/licensing/terms/productoffering/Microsoft365/all) and [Microsoft Power Platform](https://www.microsoft.com/licensing/terms/productoffering/MicrosoftPowerPlatform/all).
+Use SharePoint and Power Apps with a [subscription](https://www.microsoft.com/licensing/terms/productoffering) to [Microsoft 365](https://www.microsoft.com/licensing/terms/productoffering/Microsoft365/all) and [Microsoft Power Platform](https://www.microsoft.com/licensing/terms/productoffering/MicrosoftPowerPlatform/all).
## Create a list
-1. [Create a list](https://support.microsoft.com/office/create-a-list-0d397414-d95f-41eb-addd-5e6eff41b083) in Sharepoint or Lists named **SimpleList**.
-1. In the list's **Title** column, add items for **Vanilla**, **Chocolate**, and **Strawberry**.
+Before you create an app from a list, you need to [create a list](https://support.microsoft.com/office/create-a-list-0d397414-d95f-41eb-addd-5e6eff41b083).
-Watch this video to learn how to create a canvas app from a list:
-> [!VIDEO https://learn-video.azurefd.net/vod/player?id=de3b0fbc-f5b6-4958-855e-109f9c3692ac]
+For this example, lets create a list to track device orders for your company and include the following columns with sample data:
-## Create an app in Power Apps
+1. Employee name
+1. Device type
+1. Request date
+1. Reason for the order
+1. Approved or denied
+1. Status
+
+ :::image type="content" source="media/app-from-sharepoint/sample-list.png" alt-text="Screenshot of a sample list in Microsoft Lists that tracks device orders." lightbox="media/app-from-sharepoint/sample-list.png":::
+
+## Use a list in SharePoint or Lists to create an app
+
+Now lets use the list that we created to build an app from the list.
1. Sign in to [Power Apps](https://make.powerapps.com/).
-1. To create a single-page gallery app select **Start with a page design** > **Gallery connected to external data** > **From SharePoint**.
-1. To create a three screen mobile app, select **Start with an app template** > **From SharePoint**.
+1. In the left navigation pane, select **Create** > **Start with a page design** > **Gallery connected to external data**.
+
+1. Select **From SharePoint**.
- You see a SharePoint connection appear or are prompted to create a connection. To select a different connection, select on the **...** option to switch accounts or create a new connection.
-1. Enter the SharePoint URL and then select **Connect**. Or, select a recent site.
-1. Select a list and then select, **Create app**.
+1. Enter the SharePoint URL, and then select **Connect**. Or, select a recent site.
+
+1. Select a list or select the [sample list](app-from-sharepoint.md#create-a-list) we created earlier, and then select **Create app**.
- Your app opens in Power Apps Studio where you can design, build, and manage your app. Learn more in [Understand Power Apps Studio](power-apps-studio.md).
+ The app opens in Power Apps Studio, where you design, build, and manage the app. Learn more in [Understand Power Apps Studio](power-apps-studio.md).
-1. Save your work by selecting the **Save** icon in the upper-right corner. Give your app a name, and then select **Save**.
+1. Select the **Preview the app** icon to see how the app works.
-## Create an app from a list
+1. [Save and publish](save-publish-app.md) your app.
-If you create an app from a list in SharePoint or Microsoft Lists, the app appears as a view of that list. You can also run the app on an iOS or Android device, in addition to a web browser.
+ When you add or edit information in the app, the information in SharePoint or Lists also updates.
+
+## Create an app directly from a list in SharePoint or Lists
+
+ Before you create the app, make sure you [create a list](app-from-sharepoint.md#create-a-list).
1. Sign in to SharePoint: `https://yourorganizationname.sharepoint.com`
-1. Open a list in either SharePoint or Microsoft Lists. If you open the list from SharePoint, you're taken to Lists to view the list.
+1. Open a list in either SharePoint or Lists. If you open the list from SharePoint, you're taken to Lists to view the list.
1. Select **Integrate** > **Power Apps** > **Create an app**.
- :::image type="content" source="./media/app-from-sharepoint/generate-new-app.png" alt-text="Screenshot that shows the Integrate menu in Lists that lets you create an app in Power Apps.":::
+ :::image type="content" source="./media/app-from-sharepoint/generate-new-app.png" alt-text="Screenshot of the Integrate menu in Lists, showing the option to create an app in Power Apps.":::
+
+1. Select the **Preview the app** icon to see how the app works.
- You're taken to Power Apps Studio and can see your list in an app as a vertical gallery on the **BrowseScreen1** screen.
+1. [Save and publish](save-publish-app.md) your app.
-1. Select the **Save** icon in the upper-right menu bar and name your app **SimpleApp**. Select **Save**.
+ When you add or edit information in the app, the information in SharePoint or Lists also updates.
## Manage your app
-Once you create an app, you can play it, save, share, and publish it.
+After you create an app, you can play, save, share, and publish it.
-Learn more about these [App actions](power-apps-studio.md#2--app-actions) in the Power Apps Studio interface.
+Learn more about these [app actions](power-apps-studio.md#2--app-actions) in the Power Apps Studio interface.
## Related information
diff --git a/powerapps-docs/maker/canvas-apps/connections-list.md b/powerapps-docs/maker/canvas-apps/connections-list.md
index 1a5c69411c..2cf2059401 100644
--- a/powerapps-docs/maker/canvas-apps/connections-list.md
+++ b/powerapps-docs/maker/canvas-apps/connections-list.md
@@ -6,7 +6,7 @@ ms.topic: overview
ms.custom: canvas
ms.collection: get-started
ms.reviewer: mkaur
-ms.date: 10/30/2024
+ms.date: 06/26/2025
ms.subservice: canvas-maker
ms.author: lanced
search.audienceType:
@@ -19,62 +19,62 @@ contributors:
# Overview of connectors for canvas apps
-Data is at the core of most apps, including the data you build in Power Apps. Data is stored in a *data source*, and you bring that data into your app by creating a *connection*. The connection uses a specific *connector* to talk to the data source. Power Apps has connectors for many popular services and on-premises data sources, including SharePoint, SQL Server, Office 365, Salesforce, and Twitter. To get started adding data to a canvas app, see [Add a data connection in Power Apps](add-data-connection.md).
+Data is at the core of most apps, including apps you build in Power Apps. Data is stored in a *data source*, and you bring that data into your app by creating a *connection*. The connection uses a specific *connector* to talk to the data source. Power Apps has connectors for many popular services and on-premises data sources, including SharePoint, SQL Server, Office 365, Salesforce, and Twitter. To get started adding data to a canvas app, see [Add a data connection in Power Apps](add-data-connection.md).
A connector might provide **tables** of data or **actions**. Some connectors provide only tables, some provide only actions, and some provide both. Also your connector might be either a standard or custom connector.
> [!NOTE]
- > It's recommended to keep the number of connectors in a canvas app to a maximum of 10 and connection references to no more than 20. Going beyond these limits might lead to longer loading times for users when launching the app and could cause issues when saving the app.
+> Keep the number of connectors in a canvas app to a maximum of 10, and connection references to no more than 20. Going beyond these limits can lead to longer loading times for users when launching the app and can cause issues when saving the app.
## Tables
-If your connector provides tables, you add your data source, and then select the table in the data source that you want to manage. Power Apps both retrieve table data into your app and updates data in your data source automatically for you. For example, you can add a data source that contains a table named **Lessons** and then set the **Items** property of a control, such as a gallery or a form, to this value in the formula bar:
+If your connector provides tables, add your data source, and then select the table in the data source that you want to manage. Power Apps retrieves table data into your app and updates data in your data source automatically. For example, add a data source that has a table named **Lessons**, and then set the **Items** property of a control, such as a gallery or a form, to this value in the formula bar:
- 
+
-You can specify the data that your app retrieves by customizing the **Items** property of the control that shows your data. Continuing the previous example, you can sort or filter the data in the **Lessons** table by using that name as an argument for the **Search** and **SortByColumn** functions. In this graphic, the formula to which the **Items** property is set specifies that the data is sorted and filtered based on the text in **TextSearchBox1**.
+Specify the data that your app retrieves by customizing the **Items** property of the control that shows your data. Continuing the previous example, sort or filter the data in the **Lessons** table by using that name as an argument for the **Search** and **SortByColumn** functions. In this graphic, the formula set for the **Items** property specifies that the data is sorted and filtered based on the text in **TextSearchBox1**.
- 
+
-For more information about how to customize your formula with tables, see these articles:
+For more information about customizing your formula with tables, see these articles:
- [Understand data sources in Power Apps](working-with-data-sources.md)
- [Generate an app from Excel data](get-started-create-from-data.md)
- [Create an app from scratch](get-started-create-from-blank.md)
- [Understand tables and records in Power Apps](working-with-tables.md)
+[Understand data sources in Power Apps](working-with-data-sources.md)
+[Generate an app from Excel data](get-started-create-from-data.md)
+[Create an app from scratch](get-started-create-from-blank.md)
+[Understand tables and records in Power Apps](working-with-tables.md)
- > [!NOTE]
- > To connect to data in an Excel workbook, it must be hosted in a cloud-storage service such as OneDrive. For more information, see [Connect to cloud-storage from Power Apps](connections/cloud-storage-blob-connections.md).
+> [!NOTE]
+> To connect to data in an Excel workbook, host it in a cloud storage service like OneDrive. For more information, see [Connect to cloud-storage from Power Apps](connections/cloud-storage-blob-connections.md).
## Actions
-If your connector provides actions, you must still select your data source as you did before. Instead of selecting a table as the next step, however, you manually connect a control to an action by editing the **Items** property of the control that will show your data. The formula to which you set the **Items** property specifies the action that retrieves data. For example, the app doesn't retrieve any data if you connect to Yammer and then set the **Items** property to the name of the data source. To populate a control with data, specify an action such as **GetMessagesInGroup(5033622).messages**.
+If your connector provides actions, select your data source as you did before. Instead of selecting a table as the next step, manually connect a control to an action by editing the **Items** property of the control that shows your data. The formula you set for the **Items** property specifies the action that retrieves data. For example, the app doesn't retrieve any data if you connect to Yammer and then set the **Items** property to the name of the data source. To populate a control with data, specify an action such as **GetMessagesInGroup(5033622).messages**.

-If you need to handle custom data updates for action connectors, build a formula that includes the **Patch** function. In the formula, identify the action and the fields that bind to the action.
+To handle custom data updates for action connectors, build a formula that includes the **Patch** function. In the formula, identify the action and the fields that bind to the action.
> [!NOTE]
-> For action-based connectors, galleries and other controls don't page in more data automatically the same way they do for tabular connectors. For instance, if you bind a tabular data source to a gallery then it retrieves the first set or page of records (for example, 100 records.) And, then it will page in more data as the control requests it. For an action based connector however, it retrieves a "page" of data. However, if the data requested exceeds the size for a page of data, then the control won't automatically fetch the next page.
+> For action-based connectors, galleries and other controls don't page in more data automatically like they do for tabular connectors. For example, if you bind a tabular data source to a gallery, it retrieves the first set or page of records (for example, 100 records), and then pages in more data as the control requests it. For an action-based connector, it retrieves a "page" of data, but if the data requested exceeds the page size, the control doesn't automatically get the next page.
For more information about how to customize your formula for custom updates, see these articles:
[Patch](functions/function-patch.md)
[Collect](functions/function-clear-collect-clearcollect.md)
[Update](functions/function-update-updateif.md)
-Dynamic schema is a common type of result for action based connectors. Dynamic schema refers to the possibility that the same action might return a table with different columns depending on how it is called. Conditions that might cause the columns in the table to differ include input parameters, the user/role executing the action, and the group in which the user is working, among others. For example, SQL Server stored procedures might return different columns if run with different inputs, or an Azure DevOps instance might use custom fields that aren't available by default.
+Dynamic schema is a common type of result for action based connectors. Dynamic schema refers to the possibility that the same action might return a table with different columns depending on how it's called. Conditions that might cause the columns in the table to differ include input parameters, the user/role executing the action, and the group in which the user is working, among others. For example, SQL Server stored procedures might return different columns if run with different inputs, or an Azure DevOps instance might use custom fields that aren't available by default.
> [!NOTE]
> The [connector documentation](/connectors) shows dynamic schema results with this message **"The outputs of this operation are dynamic."** as the return value.
-For more information about how to work with dynamic schema in Power Apps, see [Working with Untyped and Dynamic objects](untyped-and-dynamic-objects.md) for an overview and [Connect to Azure DevOps from Power Apps](connections/azure-devops.md) for a detailed example.
+For more information about how to work with dynamic schema in Power Apps, see [Working with Dynamic values](untyped-and-dynamic-objects.md) for an overview and [Connect to Azure DevOps from Power Apps](connections/azure-devops.md) for a detailed example.
## Popular connectors
-This table has links to more information about our most popular connectors. For a complete list of connectors, see [All connectors](/connectors/connector-reference/).
+This table links to more information about popular connectors. For a complete list, see [All connectors](/connectors/connector-reference/).
-| | |
-| --- | --- |
-| [**Microsoft Dataverse**](connections/connection-common-data-service.md) |[**Cloud storage**](connections/cloud-storage-blob-connections.md) **
+| | |
+| --- | --- |
+| [**Microsoft Dataverse**](connections/connection-common-data-service.md) | [**Cloud storage**](connections/cloud-storage-blob-connections.md) ** |
| [**Dynamics AX**](connections/connection-dynamicsax.md)|[**Excel**](connections/connection-excel.md)|
| [**Microsoft Translator**](connections/connection-microsoft-translator.md)| [**Office 365 Outlook**](connections/connection-office365-outlook.md)|
| [**Office 365 Users**](connections/connection-office365-users.md) |[**Oracle**](connections/connection-oracledb.md)|
@@ -85,22 +85,23 @@ This table has links to more information about our most popular connectors. For
## Standard and custom connectors
-Power Apps provides *standard* connectors for many commonly used data sources. If Power Apps has a standard connector for the type of data source that you want to use, you should use that connector. If you want to connect to other types of data sources, such as a service that you built, see [Register and use custom connectors](../canvas-apps/register-custom-api.md).
+Power Apps provides *standard* connectors for many commonly used data sources. If Power Apps has a standard connector for the type of data source you want to use, use that connector. To connect to other types of data sources, like a service you built, see [Register and use custom connectors](../canvas-apps/register-custom-api.md).
## All standard connectors
-Standard connectors don't require special licensing. For more information, see [Power Apps Plans](https://powerapps.microsoft.com/pricing/).
+Standard connectors don't require special licensing. For more information, see [Power Apps plans](https://powerapps.microsoft.com/pricing/).
-You can ask questions about a specific connector in the [Power Apps forums](https://powerusers.microsoft.com/t5/PowerApps-Community/ct-p/PowerApps1), and you can suggest connectors that you want to add or other improvements to make in [Power Apps Ideas](https://ideas.powerapps.com/).
+Ask questions about a specific connector in the [Power Apps forums](https://powerusers.microsoft.com/t5/PowerApps-Community/ct-p/PowerApps1), and suggest connectors you want to add or other improvements in [Power Apps Ideas](https://ideas.powerapps.com/).
## Security and types of authentication
As you author your app and create a connection to a data source, you might see that your choice of connector allows you to use different ways to authenticate. For instance, the SQL Server connector allows you to use Microsoft Entra Integrated, SQL Server Authentication, and Windows Authentication. Each type of authentication has different levels of security associated with it. It's important to understand what information and rights you share with users who use your application. The primary example in this article is SQL Server however, the principles apply to all types of connections.
> [!NOTE]
-> - For detailed information about security considerations when using a relational database server, such as Microsoft SQL Server or Oracle, as the data source for an app, see [Use Microsoft SQL Server securely with Power Apps](connections\sql-server-security.md).
-> - Power Apps doesn't support **External member** identities. For more information, see [Properties of a Microsoft Entra B2B collaboration user](/azure/active-directory/external-identities/user-properties).
-
+> - For detailed information about security considerations when using a relational database server, such as Microsoft SQL Server or Oracle, as the data source for an app, see [Use Microsoft SQL Server securely with Power Apps](connections\sql-server-security.md).
+> - Power Apps doesn't support **External member** identities. For more information, see [Properties of a Microsoft Entra B2B collaboration user](/azure/active-directory/external-identities/user-properties).
+> - Gateway selection is not supported for custom connectors that use the anonymous authentication type.
+
### Microsoft Entra ID
This authentication is a secure type of connection. For example, SharePoint uses this type of authentication. SQL Server also allows for this type of authentication. When you connect, the Microsoft Entra service identifies you separately to SharePoint on your behalf. You don't have to supply a username or password. As an author, you can create and work with the data source with your credentials. When you publish your application and your application user logs in, they do so with their credentials. If the data is appropriately secured on a back-end, your users can only see what they're authorized to see based on their credentials. This type of security allows you to change rights for specific application users on the back-end data source after the application is published. For instance you can grant access, deny access, or refine what a user or set of users can see all on the back-end data source.
@@ -111,29 +112,26 @@ This type of connection is also secure. For example, Twitter uses this type of a
### Shared connections / Secure Implicit Connections
-In a shared connection, the user name and password for the connection is supplied by the Power Apps author at the time the data source is created in the application. The connection authentication to the data source is then **Implicitly Shared** with end users. Once the application is published, the connection is also published and available to your users.
+In a shared connection, the user name and password for the connection is supplied by the Power Apps author at the time the data source is created in the application. The connection authentication to the data source is then **Implicitly Shared** with end users. Once the application is published, the connection is also published and available to your users.
Before January 2024, your end users could take the connection that is shared with them and create separate new applications. Your users can't see the user name or password, but the connection would be available to them. However, **after January 2024, all newly created shared connections are secured.** The old apps must be republished to be secure. The connection is no longer shared with end users. The published Power App talks to a connection proxy. The connection proxy only talks to the specific Power App for which it's linked. The connection proxy limits the actions that are sent to the connections to the ones in the Power App **{Get, Put/Patch, Delete}** for a given data source. If you have an app using the connections published before January 2024, you should republish your application and unshare any connections with end users that shouldn't have them.
-In SQL Server, an example this type of connection is **SQL Server Authentication**. Many other database data sources provide a similar capability. When you publish your application, your users don't need to supply a unique user name and password.
-
+In SQL Server, an example this type of connection is **SQL Server Authentication**. Many other database data sources provide a similar capability. When you publish your application, your users don't need to supply a unique user name and password.
> [!NOTE]
> **You do not have correct permissions to use this connection** is an error message your end-users may encounter in the consent dialog. There are two situations that may cause this. First, the application may have a shared implicit connection that **isn't** a secure implicit connection. Sharing the connection with the end user resolves this issue but is **not** recommended because all shared connections should be secure implicit connections. The author should convert all connections in the application to be secure implicit connections to resolve this issue. Second, the connection may already be a secure implicit connection. Republishing may resolve this issue. If it doesn't, then a product bug should be filed.
#### Notification to update your apps (secure implicit connections)
-If you have applications that might be upgraded to use this feature then you see a message on the Apps page. It indicates the number of apps that need your attention.
+If you have applications that might be upgraded to use this feature then you see a message on the Apps page. It indicates the number of apps that need your attention.
- > [!div class="mx-imgBorder"]
- > 
+
-Select the link and it opens a side panel that lists all of the apps that need attention.
+Select the link and it opens a side panel that lists all of the apps that need attention.
- > [!div class="mx-imgBorder"]
- > 
+
-Select the *open* icon to the right of the app name to open and republish it. Continue with the following directions.
+Select the *open* icon to the right of the app name to open and republish it. Continue with the following directions.
#### Enable secure implicit connections for an existing app
@@ -149,15 +147,13 @@ Once the app is published follow these steps to verify that sharing works correc
- Check if connections are shared with co-owners. If you don't want an end-user to get a connection, then uncheck the **Co-owner** checkbox.
- > [!div class="mx-imgBorder"]
- > 
+
- To verify the feature works correctly, share the app with a different user who isn't an owner. Once you share the app, check the **Connections** list in the **Dataverse** tab in [Power Apps](https://make.powerapps.com) for that user. Verify that the user doesn't have a connection available.
- Open the **Sharing** panel to change the end-user's right to the connection. Choosing the **X** removes the user's access to the connection.
- > [!div class="mx-imgBorder"]
- > 
+
#### Use apps with a new secure implicit connection
@@ -170,7 +166,7 @@ When your app is republished and shared, then end-users don't have access to the
3. For tabular connectors, we only limit CRUD actions such as Get, Post, Put, or Delete. If you have permissions to **Put**, then you have access to **Post**.
4. Action based connectors limit based on the specific API being used in the application.
5. Warnings are still enabled in sharing. The warning around implicitly shared connections still warns while in preview. However, your connection with this feature is secure – despite the warning.
-6. Publishing to an entire tenant, as opposed to specific groups or individuals isn't supported.
+6. Publishing to an entire tenant, as opposed to specific groups or individuals isn't supported.
7. There's a known issue when importing an implicitly shared secure connection via a connection reference. The security isn't set properly in the target environment.
8. There's a known issue importing a solution using a service principal, causing import failure. A workaround is to share the connection with the service principal.
@@ -180,35 +176,33 @@ This type of connection isn't secure because it doesn't rely on end-user authent
## Data sources in solutions
-Solutions are used for [application lifecycle management](/power-platform/alm/overview-alm) and provide other capabilities for managing the lifecycle of **data sources**. If a canvas app is in a solution, [connection references](../data-platform/create-connection-reference.md) and [environment variables](../data-platform/environmentvariables.md) might be created to store information about the data sources. This process ensures data sources can be changed or re-established when solutions are migrated to different environments.
+Solutions help with [application lifecycle management](/power-platform/alm/overview-alm) and offer other ways to manage the lifecycle of **data sources**. If a canvas app is in a solution, [connection references](../data-platform/create-connection-reference.md) and [environment variables](../data-platform/environmentvariables.md) can be created to store information about the data sources. This setup makes it easy to change or reconnect data sources when you move solutions to different environments.
## Rename data sources in apps
-To learn about renaming data sources in an app, and the difference between tabular and action-based data sources, go to [Rename Power Apps action-based data sources](rename-data-source.md).
+Learn how to rename data sources in an app, and understand the difference between tabular and action-based data sources. For more information, see [Rename Power Apps action-based data sources](rename-data-source.md).
## Connection consent dialog
When users open an app that uses connectors for the first time, they see a "connection consent" dialog for the following purposes.
1. To inform users about the data sources accessed by the app.
+2. To outline the actions, a connector might or might not perform in an app. For example, for apps using the **Office 365 Users** connector:
-1. To outline the actions, a connector might or might not perform in an app. For example, for apps using the **Office 365 Users** connector:
-
- - This app is able to:
- - Read your full user profile
- - Read the full profile of all users
- - The app can't:
- - Modify or delete any user-profile information
-
-1. To capture end-user consent to connect to the data sources that the app uses.
+ - This app is able to:
+ - Read your full user profile
+ - Read the full profile of all users
+ - The app can't:
+ - Modify or delete any user-profile information
-1. To facilitate manual end-user authentication, when needed.
+3. To capture end-user consent to connect to the data sources that the app uses.
+4. To facilitate manual end-user authentication, when needed.
For some connections, Power Platform can automatically authenticate a user to access a data source. However, if the automatic sign-in fails, this dialog prompts users to fix a connection by manually signing in. Power Platform can only attempt automatic sign-in for a connection when a data source preauthorizes Microsoft’s Azure API connections service principal, granting it permission to perform single sign-on for a user when a connection is created. For more information on single sign-on, see [What is single sign-on (SSO)?](/azure/active-directory/manage-apps/what-is-single-sign-on)
-Note that for model driven apps that use custom pages, when there are multiple custom pages in an app, the consent dialog asks for data permissions for all of the connectors in all the custom pages even if they aren't opened.
+For model-driven apps that use custom pages, when there are multiple custom pages in an app, the consent dialog asks for data permissions for all of the connectors in all the custom pages even if they aren't opened.
-The following image is an example of the connection consent dialog for an app connecting to a SharePoint site.
+The following image is an example of the connection consent dialog for an app connecting to a SharePoint site.

@@ -217,18 +211,18 @@ For select connectors, admins can suppress this dialog, and consent on behalf of
> [!NOTE]
> If an admin suppresses the consent dialog but the platform can’t perform single-sign-on for an end-user, the dialog is presented to the user when they launch the app.
-| Connector type | Consent dialog suppressible? | Reference |
-|----------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------|-------------------------|
-| Microsoft connectors that support single sign-on (such as SharePoint, Office 365 users) | Yes | [Power Apps admin cmdlet](/powershell/module/microsoft.powerapps.administration.powershell/set-adminpowerappapistobypassconsent) |
-| Connector accessing a non-Microsoft, partner service, such as Salesforce | No | Not applicable |
-| Custom connectors using OAuth with Microsoft Entra ID as the identity provider. These custom connectors are built by organizations, and are only accessible by the users within the organization (for example, built by Contoso for only Contoso users) | Yes | [Manage Connections](add-manage-connections.md#manage-the-consent-dialog-appearance-for-custom-connectors-using-microsoft-entra-id-oauth) |
+| Connector type | Consent dialog suppressible? | Reference |
+|---|---|---|
+| Microsoft connectors that support single sign-on (such as SharePoint, Office 365 users) | Yes | [Power Apps admin cmdlet](/powershell/module/microsoft.powerapps.administration.powershell/set-adminpowerappapistobypassconsent) |
+| Connector accessing a non-Microsoft, partner service, such as Salesforce | No | Not applicable |
+| Custom connectors using OAuth with Microsoft Entra ID as the identity provider. These custom connectors are built by organizations, and are only accessible by the users within the organization (for example, built by Contoso for only Contoso users) | Yes | [Manage Connections](add-manage-connections.md#manage-the-consent-dialog-appearance-for-custom-connectors-using-microsoft-entra-id-oauth) |
Microsoft Power Platform is only able to suppress the consent dialog for connections to data sources where:
1. There isn’t an obligation by the data source to show an explicit consent UI.
-1. The data source preauthorizes Microsoft’s Azure API connections service principal to enable single-sign-on.
-1. An admin configures an app to suppress the consent for the preceding connections.
+2. The data source preauthorizes Microsoft’s Azure API connections service principal to enable single-sign-on.
+3. An admin configures an app to suppress the consent for the preceding connections.
-The preauthorization of Microsoft’s Azure API connections service principal exists for Microsoft's first-party data sources, and might be configured by custom applications registered in a Microsoft Entra tenant that are used by custom connectors. An admin manages consent suppression on a per-app basis (as opposed to connector basis), so suppression is managed at the most granular app experience level—this level of granularity prevents consent suppression for an organization’s "approved apps" from inadvertently suppressing consent for apps that aren't approved or reviewed.
+The preauthorization of Microsoft’s Azure API connections service principal exists for Microsoft's first-party data sources, and might be configured by custom applications registered in a Microsoft Entra tenant that are used by custom connectors. An admin manages consent suppression on a per-app basis (as opposed to connector basis), so suppression is managed at the most granular app experience level—this level of granularity prevents consent suppression for an organization’s "approved apps" from inadvertently suppressing consent for apps that aren't approved or reviewed.
[!INCLUDE[footer-include](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/maker/canvas-apps/connections/azure-devops.md b/powerapps-docs/maker/canvas-apps/connections/azure-devops.md
index 4b9962b1ec..a3493aed59 100644
--- a/powerapps-docs/maker/canvas-apps/connections/azure-devops.md
+++ b/powerapps-docs/maker/canvas-apps/connections/azure-devops.md
@@ -4,7 +4,7 @@ description: See how to connect to Azure DevOps projects, display the queries an
author: lancedMicrosoft
ms.topic: reference
ms.custom: canvas
-ms.date: 03/17/2022
+ms.date: 06/19/2025
ms.subservice: canvas-maker
ms.author: lanced
ms.reviewer: mkaur
@@ -17,192 +17,187 @@ contributors:
# Connect to Azure DevOps from Power Apps
-Power Apps connector for [Azure DevOps](/connectors/visualstudioteamservices/) allows you to work with Azure DevOps instance. You can view Azure DevOps queries, select work items based on different work item types, and view, or edit details all from inside a canvas app that connects to Azure DevOps.
+The Power Apps connector for [Azure DevOps](/connectors/visualstudioteamservices/) lets you work with your Azure DevOps instance. View Azure DevOps queries, select work items by type, and view or edit details—all from inside a canvas app connected to Azure DevOps.
> [!TIP]
> For a complete list of all actions, see [Azure DevOps connector actions](/connectors/visualstudioteamservices/#actions).
-The objective of this article is to guide you in building a canvas app that can connect with Azure DevOps to gather a list of queries and interact with the work items in the project.
+This article guides you through building a canvas app that connects to Azure DevOps to get a list of queries and interact with work items in your project.
## Prerequisites
-The following requirements are necessary:
+You need the following:
-- A Power Apps license. If you don't have a license, use a [30-day trial](../../signup-for-powerapps.md), or sign up for a [developer plan](../../developer-plan.md) for non-production use.
-- If you're new to Power Apps, familiarize yourself with Power Apps basics by [generating an app](../get-started-test-drive.md) and then customizing that app's [controls](../add-configure-controls.md), [gallery](../add-gallery.md), [forms](../working-with-forms.md), and [cards](../working-with-cards.md).
-- A [blank canvas app](../create-blank-app.md) to use to connect to Azure DevOps.
-- To create the app featured in this article, you'll require an [Azure DevOps](/azure/devops/user-guide/what-is-azure-devops) instance that includes an organization, a project, and a shared query with a few sample work items available for editing.
-- The Azure DevOps instance must be enabled for **Third-party application access via OAuth**. For more information, see [Manage access policies for Azure DevOps](/azure/devops/organizations/accounts/change-application-access-policies#manage-a-policy).
+- A Power Apps license. If you don't have one, use a [30-day trial](../../signup-for-powerapps.md), or sign up for a [developer plan](../../developer-plan.md) for non-production use.
+- If you're new to Power Apps, learn the basics by [generating an app](../get-started-test-drive.md), then customize the app's [controls](../add-configure-controls.md), [gallery](../add-gallery.md), [forms](../working-with-forms.md), and [cards](../working-with-cards.md).
+- A [blank canvas app](../create-blank-app.md) to connect to Azure DevOps.
+- To create the app in this article, you need an [Azure DevOps](/azure/devops/user-guide/what-is-azure-devops) instance with an organization, a project, and a shared query that has a few sample work items available for editing.
+- The Azure DevOps instance must let **Third-party application access via OAuth**. For more information, see [Manage access policies for Azure DevOps](/azure/devops/organizations/accounts/change-application-access-policies#manage-a-policy).
## Step 1 - Add Azure DevOps data source
-To connect to Azure DevOps, [edit](../edit-app.md) the [blank canvas app](../create-blank-app.md), and add **Azure DevOps** data source.
+To connect to Azure DevOps, [edit](../edit-app.md) the [blank canvas app](../create-blank-app.md), and add the **Azure DevOps** data source.
-> [!div class="mx-imgBorder"]
->
-If you don't have an Azure DevOps connection already, select **Connect** and follow the prompts to provide your details, and then allow the app to connect.
+:::image type="content" source="./media/azure-devops/add-data-source.png" alt-text="Screenshot of connecting to Azure DevOps in the data source selection pane.":::
+
+If you don't have an Azure DevOps connection, select **Connect**, follow the prompts to enter your details, and allow the app to connect.
## Step 2 - List shared queries
-In this section, we'll use the [ListQueriesInFolder](/connectors/visualstudioteamservices/#list-queries-within-folder) action for the Azure DevOps connector to list the available queries.
+In this section, you use the [ListQueriesInFolder](/connectors/visualstudioteamservices/#list-queries-within-folder) action for the Azure DevOps connector to list the available queries.
-1. From the left pane, select **Insert** > **Layout** > **Blank vertical gallery**.
+1. In the left pane, select **Insert** > **Layout** > **Blank vertical gallery**.
-1. Enter the following formula for the **Items** property of the gallery, replacing the example parameter values as appropriate.
+1. Enter the following formula for the **Items** property of the gallery. Replace the example parameter values with your own values.
```power-fx
- AzureDevOps.ListQueriesInFolder("Project","Organization","Folder").value
+ AzureDevOps.ListQueriesInFolder("Project", "Organization", "Folder").value
```
-> [!div class="mx-imgBorder"]
->
+:::image type="content" source="./media/azure-devops/list-queries-in-folder.png" alt-text="Screenshot of list queries in folder using formula added to Items property of the vertical gallery.":::
+
+The example uses the variables "Project", "Organization", and "Folder". The actual values are in the text boxes below the formula bar (highlighted). You find your Project and Organization values in the URL used to connect to Azure DevOps. The Folder is usually "Shared Queries" or "My Queries".
+
+
+:::image type="content" source="./media/azure-devops/find-azuredevops-project-name.png" alt-text="Screenshot of locating the project and organization name for your Azure DevOps instance.":::
-If the example uses the variables "Project", "Organization", and "Folder" and the actual values are in the text boxes below the formula bar (highlighted). You can find your Project and Organization values from the URL used to connect to Azure Dev Ops. The Folder will usually be "Shared Queries" or "My Queries".
+If you get the following error in the above formula, [enable third-party app access using OAuth](/azure/devops/organizations/accounts/change-application-access-policies#manage-a-policy) in your Azure DevOps organization, and try again.
-> [!div class="mx-imgBorder"]
->
+"AzureDevOps.ListQueriesInFolder failed:{\"status\":401,\"message\":\"TF400813:The user 'GUID' isn't authorized to access this resource.\"}"
-If you get the following error in the above formula, [enable third-party app access using OAuth](/azure/devops/organizations/accounts/change-application-access-policies#manage-a-policy) in your Azure DevOps organization, and try again.
-"AzureDevOps.ListQueriesInFolder failed:{"status":401,"message":"TF400813:The user 'GUID' isn't authorized to access this resource."}
+1. Set the **Layout** for the gallery to **Title and subtitle**.
-1. Select the **Layout** for the gallery to **Title and subtitle**.
+1. Choose the fields appropriate for Azure DevOps as **Name** and **FolderOptions** for the title and subtitles.
-1. Choose the fields appropriate for Azure Dev Ops as **Name** and **FolderOptions** for the title and subtitles.
-> [!div class="mx-imgBorder"]
->
+:::image type="content" source="./media/azure-devops/query-list-fields.png" alt-text="Screenshot of gallery fields for listing queries.":::
## Step 3 - List work items
-Now we use [GetQueryResultsV2](/connectors/visualstudioteamservices/#get-query-results) action for the Azure DevOps connector to list all work items for the selected query. This binds the gallery to the data source.
+Use the [GetQueryResultsV2](/connectors/visualstudioteamservices/#get-query-results) action for the Azure DevOps connector to list all work items for the selected query. This action binds the gallery to the data source.
-1. Insert another blank vertical gallery, and place it on the right-side of the existing gallery.
+1. Insert another blank vertical gallery and place it next to the existing gallery.
-1. Enter the following formula for the **Items** property of the gallery, replacing the example parameter values as appropriate. Substitute your Project and Organization names as appropriate.
+1. Enter the following formula for the **Items** property of the gallery. Replace the example parameter values with your project and organization names.
```power-fx
- AzureDevOps.GetQueryResultsV2("Project", Text(Gallery1.Selected.Id),"Organization").value
+ AzureDevOps.GetQueryResultsV2("Project", Text(Gallery1.Selected.Id), "Organization").value
```
-> [!div class="mx-imgBorder"]
->
-This formula uses the [GetQueryResultsV2](/connectors/visualstudioteamservices/#get-query-results) action with the project name, query ID, and the organization name. The query ID in this example (`Gallery2.Selected.Id`) refers to the query selected from the list of queries available through the gallery added earlier. Replace the gallery name as appropriate.
+:::image type="content" source="./media/azure-devops/get-query-results.png" alt-text="Screenshot of get query results from existing gallery based on the query selected.":::
+This formula uses the [GetQueryResultsV2](/connectors/visualstudioteamservices/#get-query-results) action with the project name, query ID, and organization name. The query ID in this example (`Gallery2.Selected.Id`) refers to the query selected from the list of queries available through the gallery added earlier. Replace the gallery name as needed.
-### Adding untyped return values to your gallery
-The returned result of **GetQueryResultsV2** is dynamic. And the values are therefore untyped as well.
+### Add dynamic return values to your gallery
-> [!div class="mx-imgBorder"]
-> 
+The result of **GetQueryResultsV2** is dynamic, so the values are dynamic as well.
-However you can access some of the values. Azure Dev Ops returns a basic set of values for all items that are typed. Select the data card in the gallery and insert two text label. Set the text property of the labels as follows:
+
+:::image type="content" source="./media/azure-devops/dynamic-return-results-message.png" alt-text="Screenshot of work item fields of title, work item type.":::
+
+But you can access some of the values. Azure DevOps returns a basic set of values for all typed items. Select the data card in the gallery and insert two text labels. Set the text property of the labels as follows:
```power-fx
- ThisItem.Value.'System.WorkItemType'
- ThisItem.Value.'System.Title'
+ThisItem.Value.'System.WorkItemType'
+ThisItem.Value.'System.Title'
```
## Step 4 - Display work items
-The app shows a list of all queries, and the list of work items for the selected query. Now we can add an edit form that we'll use to simply display data.
+The app shows a list of all queries and the list of work items for the selected query. Now, add an edit form to display data.
-1. Arrange the two galleries on screen to make room for the edit form that we add by moving both galleries to the left of the screen.
+1. Move both galleries to the left side of the screen to make room for the edit form.
-1. Add **Edit form** to the screen, and move it to the right side of the galleries.
+1. Add **Edit form** to the screen and move it to the right side of the galleries.
- > [!div class="mx-imgBorder"]
- > 
+:::image type="content" source="./media/azure-devops/add-edit-form.png" alt-text="Screenshot of adding an edit form.":::
-1. Set the **DataSource** property of the edit form to `AzureDevOps.GetQueryResultsV2("Project", Text(Gallery1.Selected.Id),"Organization").value`. Substitute your Project and Organization names as appropriate.
-
+1. Set the **DataSource** property of the edit form to `AzureDevOps.GetQueryResultsV2("Project", Text(Gallery1.Selected.Id),"Organization").value`. Replace "Project" and "Organization" with your project and organization names.
1. Set the **Item** property of the edit form to `Gallery2.Selected`.
- This formula sets the **Item** property for the edit form to the work item that's selected in the list of work items.
-
-1. Select **Edit fields** from the properties pane on the right-side of the screen.
+This formula sets the **Item** property for the edit form to the work item that is selected.
1. Select **...** (ellipsis) > **Add a custom card**.
- 
-
-2. Rearrange the data card within the edit form at the top.
+:::image type="content" source="./media/azure-devops/add-custom-card.png" alt-text="Screenshot of adding a custom card in the edit form.":::
- :::image type="content" source="media/azure-devops/custom-card-top.png" alt-text="Custom card moved to the top section inside the edit form.":::
+1. Move the data card to the top of the edit form.
-3. Keeping the custom card selected, insert a **Text input** control. Once selected, the control is added inside the custom card.
-4. Increase the size of the text input control.
+:::image type="content" source="./media/azure-devops/custom-card-top.png" alt-text="Screenshot of a custom card moved to the top section inside the edit form.":::
-> [!div class="mx-imgBorder"]
->
+1. Increase the size of the text input control.
-5. Set the **Default** property of the text input control to `Text(ThisItem.Value.'System.Title')`. The Text function 'types' the return as Text.
+:::image type="content" source="./media/azure-devops/text-input-inside-custom-card.png" alt-text="Screenshot of a text input control inside a custom card.":::
-> [!div class="mx-imgBorder"]
-> 
+1. Set the **Default** property of the text input control to `Text(ThisItem.Value.'System.Title')`. The Text function returns the value as text.
- This formula sets the default text inside the text input control to the **Title** field from the selected Azure DevOps work item.
+
+:::image type="content" source="./media/azure-devops/title-custom-card.png" alt-text="Screenshot of a text input control referring to the title of the work item.":::
+
+This formula sets the default text inside the text input control to the **Title** field from the selected Azure DevOps work item.
> [!TIP]
-> If your Azure DevOps project uses **Description** field with HTML or rich text, you can also use the [Rich text editor](../controls/control-richtexteditor.md) input control instead of the [Text input](../controls/control-text-input.md) or label controls. Using the **Rich text editor** control in this case also helps resolve any issues such as the description being displayed with HTML code instead of plain or rich text.
+> If your Azure DevOps project uses the **Description** field with HTML or rich text, use the [Rich text editor](../controls/control-richtexteditor.md) input control instead of the [Text input](../controls/control-text-input.md) or label controls. The **Rich text editor** control helps display the description as rich text instead of HTML code.
-6. Repeat the previous steps to add another custom card, with a text input control inside with the **Default** property set to `Text(ThisItem.Value.'System.State')`.
+1. Repeat the previous steps to add another custom card, with a text input control inside with the **Default** property set to `Text(ThisItem.Value.'System.State')`.
- This formula sets the default text inside the text input control to the **State** field from the selected Azure DevOps work item.
+This formula sets the default text inside the text input control to the **State** field from the selected Azure DevOps work item.
-7. Rearrange the data cards inside the edit form to create space where we'll add the save icon.
+1. Rearrange the data cards inside the edit form to create space for the save icon.
-### Adding untyped and dynamic return values to your forms
-So far we have been using the Edit form which simplifies the data access story by providing a common DataSource and Item property which all of the data cards in the form can work with. If you use the Edit form, to access the untyped values make sure you set **both** the data source and the item properties as follows: (Substituting in your values for Organization and Project.)
+### Add dynamic return values to your forms
- ```power-fx
- AzureDevOps.GetWorkItemDetails(Gallery2.Selected.Value.'System.Id',Organization, Project, Gallery2.Selected.Value.'System.WorkItemType')
- ```
-When you pass the text property "WorkItemType", for instance, "Feature", it allows you to switch from items such as Features and Work Items. Since the set of fields for these items differ from one another, the return type from this call is dynamic.
+So far, you use the Edit form, which simplifies data access by providing a common DataSource and Item property for all data cards in the form. To access dynamic values, set **both** the data source and the item properties as follows (replace Organization and Project with your values):
-You can access specific values using the common method Text(ThisItem.Value.'System.Id'). Alternatively, you may access them through the more general dynamic response using Text(ThisItem.fields.System_Id). These dynamic value names are not typically documented. To find the correct names for these fields, including non-standard fields, open the monitor tool and examine the data response for the GetWorkItemDetails call. Refer to the image below for further guidance.
+```power-fx
+AzureDevOps.GetWorkItemDetails(Gallery2.Selected.Value.'System.Id',Organization, Project, Gallery2.Selected.Value.'System.WorkItemType')
+```
-If you're not utilizing an Edit form, but instead using a container, then you can retrieve these values by using a formula such as the one below, which retrieves information from a custom team field.
+When you pass the text property "WorkItemType", such as "Feature", you can switch between items like Features and Work Items. Because the set of fields for these items differs, the return type from this call is dynamic.
+Access specific values using the common method Text(ThisItem.Value.'System.Id'). Alternatively, access them through the more general dynamic response using Text(ThisItem.fields.System_Id). These dynamic value names aren't typically documented. To find the correct names for these fields, including non-standard fields, open the monitor tool and examine the data response for the GetWorkItemDetails call. See the image below for guidance.
+
+If you aren't using an Edit form but are using a container, retrieve these values with a formula like the one below, which gets information from a custom team field.
```power-fx
Text(AzureDevOps.GetWorkItemDetails(Gallery2.Selected.Value.'System.Id',Organization, Project, Gallery2.Selected.Value.'System.WorkItemType').fields.One_custom_CustomField1)
```
-> [!div class="mx-imgBorder"]
-> 
->
->
+
+:::image type="content" source="./media/azure-devops/monitor-workitem-details.png" alt-text="Screenshot of the monitor tool showing work item details.":::
+
## Updating values in Azure DevOps
-To update a value in Azure Dev ops use the UpdateWorkItem in the OnSelect of a button.
+To update a value in Azure DevOps, use the `UpdateWorkItem` function in the `OnSelect` property of a button.
```power-fx
AzureDevOps.UpdateWorkItem(
- Gallery2.Selected.Value.'System.Id',
- Organization,
- { description: "This is a new description",
- dynamicFields: ParseJSON(JSON({'Custom Field 1': "This is new custom text" }))
+ Gallery2.Selected.Value.'System.Id',
+ Organization,
+ {
+ description: "This is a new description",
+ dynamicFields: ParseJSON(JSON({'Custom Field 1': "This is new custom text" }))
}
-);
+)
```
-The formula adds new sample text but you can also use a PowerFx expression.
-Ensure that the formula uses lower case for the *non-custom* or built-in field names. For example, when referring to "Description" field, use `description: "This is a new description"` instead of `Description:"This is a new description"`. Incorrect casing might result in the error "400 Required parameter missing for requested operation: 'UpdateWorkItem'". For custom / dynamic values, you can use the normal casing of display field. For instance the field name for the custom field is just the display name 'Custom Field 1'. This naming convention of the return values is specific to Azure DevOps and may differ from other services.
+The formula adds new sample text, but you can also use a Power Fx expression.
+Make sure the formula uses lowercase for built-in field names. For example, when you refer to the Description field, use `description: "This is a new description"` instead of `Description: "This is a new description"`. Incorrect casing can result in the error "400 Required parameter missing for requested operation: 'UpdateWorkItem'". For custom or dynamic values, use the display name as shown in the UI, such as 'Custom Field 1'. This naming convention is specific to Azure DevOps and might differ from other services.
## Next steps
-Play the app. Select a query from the list of queries. And then, choose a work item that you want to update the title or description of. Make a change, and then select the save button. The changes are saved to the Azure DevOps work item. Switch to another query and switch back to see the changes show inside the app.
+Run the app. Select a query from the list of queries. Then, choose a work item you want to update the title or description of. Make a change, and then select the save button. The app saves your changes to the Azure DevOps work item. Switch to another query, and then switch back to see the changes in the app.
-Similarly, customize the app further or create an app with additional data cards on forms. You can also use display form instead of edit form to just show data inside different data cards. When using display form, ensure you use the [Text label](../controls/control-text-box.md) control to display text. When using rich text or HTML format (such as the **Description** field in Azure DevOps), use the [HTML text](../controls/control-html-text.md) control. For more information about customizing that app, see [controls](../add-configure-controls.md), [gallery](../add-gallery.md), [forms](../working-with-forms.md), and [cards](../working-with-cards.md).
+You can also customize the app further or create an app with more data cards on forms. Use a display form instead of an edit form to show data in different data cards. When you use a display form, use the [Text label](../controls/control-text-box.md) control to show text. When you use rich text or HTML format (like the **Description** field in Azure DevOps), use the [HTML text](../controls/control-html-text.md) control. For more information about customizing the app, see [controls](../add-configure-controls.md), [gallery](../add-gallery.md), [forms](../working-with-forms.md), and [cards](../working-with-cards.md).
### See also
diff --git a/powerapps-docs/maker/canvas-apps/connections/connection-common-data-service.md b/powerapps-docs/maker/canvas-apps/connections/connection-common-data-service.md
index 00d2839102..b10df92dae 100644
--- a/powerapps-docs/maker/canvas-apps/connections/connection-common-data-service.md
+++ b/powerapps-docs/maker/canvas-apps/connections/connection-common-data-service.md
@@ -5,7 +5,7 @@ author: mduelae
ms.topic: reference
ms.custom: canvas
ms.reviewer: mkaur
-ms.date: 3/14/2025
+ms.date: 06/19/2025
ms.subservice: canvas-maker
ms.author: lanced
search.audienceType:
@@ -17,15 +17,15 @@ contributors:
# Connect to Microsoft Dataverse
-You can securely store your business data in Dataverse and build rich apps in Power Apps so that users can manage that data. You can also integrate that data into solutions that include Power Automate, Power BI, and data from Dynamics 365.
+Securely store your business data in Dataverse and build rich apps in Power Apps so users can manage that data. You can also integrate that data into solutions that include Power Automate, Power BI, and data from Dynamics 365.
-By default, the app connects to the current environment for Dataverse tables. If your app moves to another environment, the connector connects to data in the new environment. This behavior works well for an app using a single environment or an app that follows an application lifecycle management (ALM) process for moving from development, to test, and then to production.
+By default, the app connects to the current environment for Dataverse tables. If your app moves to another environment, the connector connects to data in the new environment. This behavior works well for an app that uses a single environment or follows an application lifecycle management (ALM) process for moving from development, to test, and then to production.
-When you add data from Dataverse, you can change the environment, and then select one or more tables. By default, the app connects to data in the current environment.
+When you add data from Dataverse, change the environment, and then select one or more tables. By default, the app connects to data in the current environment.

-If you select **Change environment**, you can specify a different environment to pull data from it instead of or in addition to the current environment.
+If you select **Change environment**, specify a different environment to pull data from instead of, or in addition to, the current environment.

@@ -35,29 +35,29 @@ The name of the selected environment appears under the tables list.
## Visibility and access
-When you select **Change environment**, you're presented with a list of environments. Though you might see an environment in the list, the security roles in the environment govern what you can do in that environment. For example, if you don't have read privileges, you aren't able to see the tables and records in the environment.
+When you select **Change environment**, you see a list of environments. Even if you see an environment in the list, the security roles in the environment control what you can do there. For example, if you don't have read privileges, you can't see the tables and records in the environment.
> [!NOTE]
-> Connections listed in the app details pane outside of the app designer show connections that require user consent. Since native Dataverse connections used in the app don't require that additional consent, a native connection won't be in that list.
+> Connections listed in the app details pane outside of the app designer show connections that need user consent. Because native Dataverse connections used in the app don't need additional consent, a native connection isn't in that list.
## Power Apps data type mappings
-The Microsoft Dataverse connector is more robust than the Dynamics 365 connector and approaching feature parity. The following table lists the data types in Power Apps, and how they map to data types in Dataverse.
+The Microsoft Dataverse connector is more robust than the Dynamics 365 connector and is approaching feature parity. The following table lists the data types in Power Apps and how they map to data types in Dataverse.
-| Power Apps | Microsoft Dataverse |
-|-----------------------------------|---------------------------------------------------------------------------------------------|
-| Choice | Choice, Yes/No |
-| DateTime | Date Time, Date and Time, Date Only |
-| Image | Image |
-| Number | Floating Point Number, Currency, Decimal Number, Duration, Language, TimeZone, Whole Number |
-| Text | Email, Multiline Text, Phone, Text, Text Area, Ticker Symbol, URL |
-| Guid | Unique Identifier |
+| Power Apps | Microsoft Dataverse |
+| --- | --- |
+| Choice | Choice, Yes/No |
+| DateTime | Date Time, Date and Time, Date Only |
+| Image | Image |
+| Number | Floating Point Number, Currency, Decimal Number, Duration, Language, TimeZone, Whole Number |
+| Text | Email, Multiline Text, Phone, Text, Text Area, Ticker Symbol, URL |
+| Guid | Unique Identifier |
## Power Apps delegable functions and operations for Dataverse
-These Power Apps operations, for a given data type, might be delegated to
-Dataverse for processing (rather than processing locally within Power Apps).
+These Power Apps operations, for a given data type, can be delegated to
+Dataverse for processing instead of processing locally within Power Apps.
| **Item** | **Number [1]** | **Text [2]** | **Choice** | **DateTime [3]** | **Guid** |
|-----------------------------------------------------------------|----------------|--------------|------------|------------------|----------|
@@ -79,75 +79,75 @@ Dataverse for processing (rather than processing locally within Power Apps).
| UpdateIf/RemoveIf [10] | Yes | \- | \- | No | \- |
### Notes
-1. Numeric with arithmetic expressions (for example, `Filter(table, field + 10 > 100)` ) aren't delegable. Language and TimeZone aren't delegable. Casting to a column to a number isn't supported. When a value appears as a number in Power Apps but the back-end data source isn't a simple number such as currency then it isn't delegated.
-2. Doesn't support Trim[Ends] or Len. Does support other functions such as Left, Mid, Right, Upper, Lower, Replace, Substitute, etc. Also, casting such as Text(column) isn't supported for delegation.
+1. Numeric with arithmetic expressions (for example, `Filter(table, field + 10 > 100)`) aren't delegable. Language and TimeZone aren't delegable. Casting a column to a number isn't supported. If a value appears as a number in Power Apps but the backend data source isn't a simple number, such as currency, then it isn't delegated.
+2. Doesn't support Trim[Ends] or Len. Supports other functions like Left, Mid, Right, Upper, Lower, Replace, and Substitute. Also, casting such as Text(column) isn't supported for delegation.
3. DateTime is delegable except for DateTime functions Now() and
Today().
-4. CountRows on Dataverse uses a cached value. For non-cached values where the record count is expected to be under 50,000 records, use `CountIf(table, True)`.
+4. CountRows on Dataverse uses a cached value. For non-cached values where the record count is under 50,000 records, use `CountIf(table, True)`.
5. For CountRows, ensure that users have appropriate permissions to get totals for the table.
-6. All aggregate functions are limited to a collection of 50,000 rows. If needed, use the Filter function to select 50,000. Aggregate functions aren't supported on Views.
-7. FirstN isn't supported.
-8. `In` is subject to the 15 table query limit of Dataverse.
+6. All aggregate functions are limited to a collection of 50,000 rows. If needed, use the Filter function to select 50,000 rows. Aggregate functions aren't supported on views.
+7. The FirstN function isn't supported.
+8. The `In` operator is subject to the 15-table query limit of Dataverse.
9. Supports comparisons. For example, `Filter(TableName, MyCol = Blank())`.
-10. UpdateIf and RemoveIf work locally but simulate delegation to a limit of 500/2000 records. They successively bring down records beyond the non-delegation 500/2000 record limit. Records that meet the If condition are collected. Generally, a maximum of 500/2000 records are collected separately and then changed per execution. However, more records may be updated if the existing local data cache is large as the function may have access to more records for evaluation.
+10. UpdateIf and RemoveIf work locally but simulate delegation to a limit of 500 or 2,000 records. They successively bring down records beyond the nondelegation 500 or 2,000 record limit. Records that meet the If condition are collected. Generally, a maximum of 500 or 2,000 records are collected separately and then changed per execution. However, more records can be updated if the existing local data cache is large because the function can access more records for evaluation.
## Call Dataverse actions directly in Power Fx
-As a part of the Power Fx language, authors can now directly invoke a Dataverse action within a formula. Both unbound and bound actions are supported. Authors can add a Power Fx `Environment` language object to their app and access Dataverse actions.
+As part of the Power Fx language, you can now directly invoke a Dataverse action within a formula. Both unbound and bound actions are supported. Add a Power Fx `Environment` language object to your app to use Dataverse actions.
-Authors can work with untyped object fields for both inputs and outputs. On the input side, for instance, many Dataverse actions require an untyped object as an argument. Authors can now pass these arguments in by using ParseJSON to convert a Power Fx record into an untyped object. On the output side, for actions that return untyped objects, you can simply `dot` into returned objects properties. You need to cast specific values for use in specific contexts for use in Power Apps such as a label.
+You can work with dynamic fields for both inputs and outputs. For inputs, many Dataverse actions require a dynamic value as an argument. Pass these arguments by using ParseJSON to convert a Power Fx record into a dynamic value. For outputs, if an action returns dynamic values, just use dot notation to access object properties. Cast specific values for use in Power Apps, such as in a label.
-Without this feature, it was common for authors to use Power Automate to call Dataverse directly. However, calling Dataverse directly from Power Fx provides significant performance benefits (and ease of use) and should be preferred for direct transactional reads and updates. If you have an app that uses Power Automate to call Dataverse actions, you see a banner suggesting you use this direct action approach instead.
+Before this feature, you often used Power Automate to call Dataverse directly. Calling Dataverse from Power Fx gives you significant performance benefits and is easier to use, so use this approach for direct transactional reads and updates. If your app uses Power Automate to call Dataverse actions, you see a banner suggesting you use this direct action approach instead.
-Working with untyped fields isn't restricted to Dataverse. It works for all types of connectors and provides basic ad-hoc dynamic schema support.
+Working with dynamic fields isn't limited to Dataverse. This feature works with all types of connectors and provides basic ad hoc dynamic schema support.
> [!NOTE]
-> 1. We do not fully support DV actions in Power Fx commanding (specific to any actions call with parameters.)
-> 2. We do not support direct references to an Entity or an Entity collections.
-> 3. For parameters of object type that are nested (2 or more levels deep), the second level attributes are treated required in PowerApps.
+> 1. DV actions aren't fully supported in Power Fx commanding (for any action call with parameters).
+> 2. Direct references to an entity or entity collections aren't supported.
+> 3. For parameters of object type that are nested two or more levels deep, Power Apps treats the second-level attributes as required.
### Enable access to Microsoft Dataverse actions
-For new apps, this feature is automatically enabled. For apps created previously, you need to enable access to Dataverse actions.
+For new apps, this feature is automatically enabled. For apps you created earlier, enable access to Dataverse actions.
-For older apps, open your canvas app for editing and navigate to **Settings** > **Upcoming features** > **Retired** and enable Dataverse actions.
+For older apps, open your canvas app for editing. Go to **Settings** > **Upcoming features** > **Retired**, and enable Dataverse actions.
### Add the Power Fx Environment language object to your app
-To use Dataverse actions in your Power Fx formulas, select **Add data** and search for **Environment** and add it to your application.
+To use Dataverse actions in your Power Fx formulas, select **Add data**, search for **Environment**, and add it to your app.
-
+
-This adds the Power Fx `Environment` language object to your application.
+This step adds the Power Fx `Environment` language object to your app.
-
+
-### Accessing Dataverse actions
+### Access Dataverse actions
-When the Power Fx `Environment` object is added to your application, you can access Dataverse actions by adding `Environment` to your formula and then dotting into the actions.
+After you add the Power Fx `Environment` object to your app, access Dataverse actions by adding `Environment` to your formula and then using dot notation for the actions.
-
+
-Unbound Dataverse actions are peer level to tables and need the parenting scope of the **Environment** language object. All actions in your environment are available – both system level and custom. Both bound and unbound actions are available. The 2-level call limit was removed.
+Unbound Dataverse actions are at the same level as tables and need the parent scope of the **Environment** language object. All actions in your environment are available—both system and custom. Both bound and unbound actions are available. The two-level call limit is removed.
-
+
-For more details on how to use Dataverse actions in your formulas, see [Working with untyped and dynamic objects](../untyped-and-dynamic-objects.md).
+For more details on how to use Dataverse actions in your formulas, see [Working with dynamic values](../untyped-and-dynamic-objects.md).
[!INCLUDE[footer-include](../../../includes/footer-banner.md)]
-### Passing Entity type arguments for bound/unbound actions
+### Pass entity type arguments for bound and unbound actions
-To pass entity type arguments for Dataverse actions, start by setting the entity type argument value to a variable. Additionally, ensure that any missing values such as ***activityId** are filled in. This is particularly important for entities that do not have defined types in the swagger.
+To pass entity type arguments for Dataverse actions, set the entity type argument value to a variable. Make sure to fill in any missing values, such as ***activityId**. This step is important for entities that don't have defined types in the swagger.
```power-fx
Set(MyArgVar, {
- name: first(systemUser).name,
- Id: First(systemUser).Id
+ name: First(systemUser).name,
+ Id: First(systemUser).Id
... })
```
-### Rename, refresh, and actions in other environments
+### Rename, refresh, and use actions in other environments
-You can rename an Environment by choosing the ellipses and selecting "Rename". If you add a new Dataverse action in Dataverse and need Power Apps to see it, you can choose "Refresh". And, if you need to use an action in a different environment you first need to change the environment and then once there, search for 'Environment', select and add it to your application.
+To rename an Environment, select the ellipses and then select "Rename". If you add a new Dataverse action in Dataverse and want Power Apps to see it, select "Refresh". To use an action in a different environment, change the environment, then search for 'Environment', select it, and add it to your app.
diff --git a/powerapps-docs/maker/canvas-apps/connections/sql-connection-access-data.md b/powerapps-docs/maker/canvas-apps/connections/sql-connection-access-data.md
index 9323e8deae..aef5409068 100644
--- a/powerapps-docs/maker/canvas-apps/connections/sql-connection-access-data.md
+++ b/powerapps-docs/maker/canvas-apps/connections/sql-connection-access-data.md
@@ -5,7 +5,7 @@ author: lancedMicrosoft
ms.topic: reference
ms.custom: canvas
-ms.date: 12/6/2024
+ms.date: 06/19/2025
ms.subservice: canvas-maker
ms.author: lanced
ms.reviewer: mkaur
@@ -22,9 +22,9 @@ contributors:
**Direct access**:
-If you choose the *Start with data* option when creating an app, the **Items** property of your gallery has a Power Fx formula with a data source name that points directly to your database table.
+If you select the *Start with data* option when you create an app, the **Items** property of your gallery uses a Power Fx formula with a data source name that points directly to your database table.
-For example, if you have a `BOOKLENDING` table, you see the following formula:
+For example, if you have a `BOOKLENDING` table, you see this formula:
```power-fx
Search([@'[dbo].[BOOKLENDING]'], SearchInput1.Text, author, author,book_name,category)
@@ -32,43 +32,43 @@ Search([@'[dbo].[BOOKLENDING]'], SearchInput1.Text, author, author,book_name,cat
**Views and stored procedures**:
-A common professional data access pattern is to use views and then stored procedures for create, update, and delete rather than allow direct access. If you want to use views or stored procedures, you must change the example formula. Similarly, the form for the record doesn't use the built-in direct approach of the `SubmitForm()` formula either.
+A common professional data access pattern is to use views and then stored procedures for create, update, and delete instead of allowing direct access. If you want to use views or stored procedures, change the example formula. Similarly, the form for the record doesn't use the built-in direct approach of the `SubmitForm()` formula.
**Triggers**:
-One database pattern is to use triggers on tables. If a table has a trigger, then you can't use the direct pattern `Submit()` for create, update, and delete. `Submit()` has a conflict between the handling of SQL triggers and the built-in Power Apps behavior, which uses the same output parameter.
+One database pattern is to use triggers on tables. If a table has a trigger, you can't use the direct pattern `Submit()` for create, update, and delete. `Submit()` conflicts with SQL trigger handling and the built-in Power Apps behavior, which use the same output parameter.
-You can, however, directly access the table for query purposes, but to handle `Create`, `Update`, or `Delete` you must call a stored procedure.
+You can directly access the table for queries, but to handle `Create`, `Update`, or `Delete`, call a stored procedure.
> [!NOTE]
-> The SQL Server connector, like all of the connectors that work with relational data, assumes that tables have a primary key. A primary key is critical for finding specific records to update. If a SQL Server table doesn't have a primary key then the data will be treated as read-only. If you have access and edit rights to the SQL Server table, consider adding an auto-generated key.
+> The SQL Server connector, like all connectors that work with relational data, assumes that tables have a primary key. A primary key is critical for finding specific records to update. If a SQL Server table doesn't have a primary key, the data is read-only. If you have access and edit rights to the SQL Server table, consider adding an auto-generated key.
>
## Use a view
-A *view* is a saved query that displays as a single table of data.
+A *view* is a saved query that shows as a single table of data.
-Views show up in the list of tables you can select when you add a data source. Views only support queries—not updates. You must use a [stored procedure](#use-stored-procedures) for updates.
+Views appear in the list of tables you can select when you add a data source. Views only support queries—not updates. To update data, use a [stored procedure](#use-stored-procedures).
-If you create a table with the `Start with data` option, you get screens and formulas that display records in a gallery and form. You can see formulas and functionality for creation, editing, and deletion. However, if you use a view, you only see a display screen for the gallery and form.
+If you create a table with the `Start with data` option, you get screens and formulas that show records in a gallery and form. You see formulas and functionality for creating, editing, and deleting records. But if you use a view, you only see a display screen for the gallery and form.
-You might want the autogenerated screens from `Start with data` for views.
+You might want autogenerated screens from `Start with data` for views.
-For this autogenerated option:
+To use this autogenerated option:
1. Choose `Start with data` with a *basic table*.
1. Delete and replace the table data source.
**Example**:
-For example, if you had a `BOOKLENDINGVIEW` table and added it as a data source for Power Apps, the formula could be as simple as:
+For example, if you have a `BOOKLENDINGVIEW` table and add it as a data source for Power Apps, the formula can be as simple as:
```power-fx
BOOKLENDINGVIEW
```
-You can also replace other create, update, and delete formulas with a view data source and stored procedure calls.
+You can also replace other create, update, and delete formulas with a view data source and calls to stored procedures.
## Use stored procedures
@@ -79,32 +79,32 @@ When you add a SQL Server connection to your app, you can add stored procedures
:::image type="content" source="media/connection-azure-sqldatabase/tables-views-stored-proc-selector.png" alt-text="Screenshot that shows lists of tables, views, and stored procedures available to be added to your app.":::
-Once you select a stored procedure, a child node appears and you can designate the stored procedure as **Safe to use for galleries and tables**.
+After you select a stored procedure, a child node appears, and you can designate the stored procedure as **Safe to use for galleries and tables**.
-A stored procedure is *safe* if it has no action it performs that might be unwanted in certain scenarios. For example, if a stored procedure collected all accounts from a given city, then sent them an email. You might not always want emails to be sent every time the stored procedure is called. Therefore, the stored procedure shouldn't be marked as safe.
+A stored procedure is *safe* if it doesn't perform any action that might be unwanted in certain scenarios. For example, if a stored procedure collects all accounts from a given city and then sends them an email, you might not always want emails sent every time the stored procedure is called. In that case, don't mark the stored procedure as safe.
**Check a stored procedure as safe only if**:
1. There are **no side effects** to calling this procedure on demand.
- You should be able to call the procedure multiple times or whenever Power Apps refreshes the control. When used with an **Items** property of a gallery or table, Power Apps calls the stored procedure whenever the system determines a refresh is needed. You can't control when the stored procedure is called.
+ You can call the procedure multiple times or whenever Power Apps refreshes the control. When you use it with an **Items** property of a gallery or table, Power Apps calls the stored procedure whenever the system determines a refresh is needed. You can't control when the stored procedure is called.
-1. You return a modest amount of data in the stored procedure.
+1. The stored procedure returns a modest amount of data.
- Action calls, such as stored procedures, don't have a limit on the number of rows retrieved. They aren't automatically paged in 100 record increments like tabular data sources such as tables or views.
+ Action calls, like stored procedures, don't have a limit on the number of rows retrieved. They aren't automatically paged in 100-record increments like tabular data sources such as tables or views.
- If the stored procedure returns too much data (many thousands of records), then your app might slow down or crash. For performance reasons, bring in less than 2,000 records.
+ If the stored procedure returns too much data (many thousands of records), your app might slow down or crash. For performance reasons, bring in fewer than 2,000 records.
-If you check a stored procedure as safe, you can assign your stored procedure as an **Items** property in galleries for tables to use in your app.
+If you check a stored procedure as safe, you can assign it as an **Items** property in galleries or tables in your app.
> [!IMPORTANT]
-> The schema of the return values of the stored procedure should be *static*, so the values don't change from call to call. For example, if a stored procedure returns two tables, then it *always* returns two tables. You can work with either typed or untyped results.
+> The schema of the return values of the stored procedure should be *static*, so the values don't change from call to call. For example, if a stored procedure returns two tables, it *always* returns two tables. You can work with either specific or dynamic results.
>
-> The structure of the results also need to be static. For example, if the schema of the results are *dynamic*, then results are untyped and you must provide a type in order to use them in Power Apps. For more information, see [Untyped results](sql-connection-view-results.md#untyped-results).
+> The structure of the results also needs to be static. For example, if the schema of the results is *dynamic*, then results are dynamic and you must provide a specific type to use them in Power Apps. For more information, see [dynamic results](sql-connection-view-results.md#dynamic-results).
### SQL namespace prepended to stored procedure name
-The SQL Server namespace name, where you store the procedure, is prepended to the stored procedure name. For example, all stored procedures in the **'DBO'** SQL Server namespace have **'dbo'** at the start of the name.
+The SQL Server namespace name, where you store the procedure, is added to the start of the stored procedure name. For example, all stored procedures in the **'DBO'** SQL Server namespace have **'dbo'** at the start of the name.
For example, when you add a stored procedure, you might see more than one data source in your project.
@@ -112,10 +112,10 @@ For example, when you add a stored procedure, you might see more than one data s
### Calling a stored procedure
-To use a stored procedure in Power Apps, prefix the stored procedure name with the name of connector associated with it followed by the stored procedure name, such as `Paruntimedb.dbonewlibrarybook`.
+To use a stored procedure in Power Apps, add the connector name before the stored procedure name, such as `Paruntimedb.dbonewlibrarybook`.
> [!NOTE]
-> When Power Apps brings in the stored procedure, it concatenates the namespace and procedure name so that `dbo.newlibrarybook` becomes `dbonewlibrarybook`.
+> When Power Apps brings in the stored procedure, it combines the namespace and procedure name so that `dbo.newlibrarybook` becomes `dbonewlibrarybook`.
Arguments are passed as a Power Apps record with named value pairs:
@@ -124,7 +124,7 @@ Arguments are passed as a Power Apps record with named value pairs:
```
> [!TIP]
-> Remember to convert values if needed as you pass them into your stored procedure, since you're reading from a text value in Power Apps. For example, if you're updating an integer in SQL you must convert the text in the field using `Value()`.
+> Convert values if needed as you pass them into your stored procedure, since you're reading from a text value in Power Apps. For example, if you're updating an integer in SQL, convert the text in the field using `Value()`.
Here's an example of what stored procedures could look like when assigning them to an `OnSelect` property.
@@ -132,22 +132,22 @@ Here's an example of what stored procedures could look like when assigning them
### Variables and all stored procedures
-You can access a stored procedure for the **Items** property of a gallery after you declare it safe for the UI. Reference the data source name and the name of the stored procedure followed by `ResultSets`. You can access multiple results by referencing the set of tables returned such as Table 1, Table 2, etc.
+Access a stored procedure for the **Items** property of a gallery after you declare it safe for the UI. Reference the data source name and the name of the stored procedure followed by `ResultSets`. Access multiple results by referencing the set of tables returned, such as Table 1, Table 2, and so on.
-For example, a stored procedure accessed from the table `Paruntimedb` with the name `dbo.spo_show_all_library_books()` looks like:
+For example, a stored procedure from the table `Paruntimedb` with the name `dbo.spo_show_all_library_books()` looks like this:
```power-fx
Paruntimedb.dbospshowalllibrarybooks().ResultSets.Table1
```
-This query populates the gallery with records. However, stored procedures are *action* behaviors on the tabular model. `Refresh()` only works with tabular data sources and can't be used with stored procedures. You must refresh the gallery when a record is created, updated, or deleted.
+This query populates the gallery with records. However, stored procedures are *action* behaviors on the tabular model. `Refresh()` only works with tabular data sources and doesn't work with stored procedures. Refresh the gallery when a record is created, updated, or deleted.
> [!NOTE]
> When you use a `Submit()` on a form for a tabular data source, it effectively calls `Refresh()` under the hood and updates the gallery.
### Use a variable to populate and refresh the gallery
-Use a variable in the `OnVisible` property for the screen and set the stored procedure to the variable.
+Use a variable in the `OnVisible` property for the screen, and set the stored procedure to the variable.
```power-fx
Set(SP_Books, Paruntimedb.dbospshowalllibrarybooks().ResultSets.Table1);
@@ -159,7 +159,7 @@ You can then set the `Items` property of the gallery to the variable name.
SP_Books
```
-After you create, update, or delete a record with a call to the stored procedure, set the variable again to update the gallery.
+After you create, update, or delete a record with a call to the stored procedure, set the variable again to refresh the gallery.
```power-fx
Paruntimedb.dbonewlibrarybook({
@@ -172,9 +172,9 @@ Set(SP_Books, Paruntimedb.dbospshowalllibrarybooks().ResultSets.Table1);
### Use Power Automate to call stored procedures
-Power Automate handles asynchronous actions best. You can call stored procedures as part of a series of calls in a business process.
+Power Automate handles asynchronous actions best. Call stored procedures as part of a series of calls in a business process.
-To call Power Automate followed by a call to stored procedures, create input variables as part of your flow.
+To call Power Automate and then call stored procedures, create input variables as part of your flow.
:::image type="content" source="media/connection-azure-sqldatabase/pa-input.png" alt-text="Screenshot that shows the Power Automate input.":::
@@ -182,6 +182,6 @@ Then pass your input variables into the call of your stored procedure.
:::image type="content" source="media/connection-azure-sqldatabase/pa-execute-procedure.png" alt-text="Execute stored procedure":::
-Add this Power Automate flow to your app and call it. The optional arguments are passed as a record “{ … }”. The following example has all optional arguments.
+Add this Power Automate flow to your app and call it. Pass optional arguments as a record “{ … }”. The following example includes all optional arguments.
:::image type="content" source="media/connection-azure-sqldatabase/pa-example.png" alt-text="Power Automate flow":::
diff --git a/powerapps-docs/maker/canvas-apps/connections/sql-connection-view-results.md b/powerapps-docs/maker/canvas-apps/connections/sql-connection-view-results.md
index cd121a153e..1308575ff7 100644
--- a/powerapps-docs/maker/canvas-apps/connections/sql-connection-view-results.md
+++ b/powerapps-docs/maker/canvas-apps/connections/sql-connection-view-results.md
@@ -5,7 +5,7 @@ author: lancedMicrosoft
ms.topic: reference
ms.custom: canvas
-ms.date: 10/25/2024
+ms.date: 06/19/2025
ms.subservice: canvas-maker
ms.author: lanced
ms.reviewer: mkaur
@@ -18,24 +18,24 @@ contributors:
# View results in SQL Server
-If you're using a direct table access pattern or a view, the query result is bound to the control or table. Power Fx automatically enables the paging of data in your app into the gallery or table. However, stored procedures can return a query result, a return code, or values from `Out` parameters.
+If you use a direct table access pattern or a view, the query result binds to the control or table. Power Fx automatically lets your app page data into the gallery or table. However, stored procedures can return a query result, a return code, or values from `Out` parameters.
-To use these varying result types in your application, use the following patterns.
+To use these different result types in your app, follow these patterns.
## Formulas for different controls
-Typical formulas for views and stored procedures:
+Here are typical formulas for views and stored procedures:
| Control | Property | Formula| Description |
| ------- | -------- | ------- | ----------- |
-| Gallery or Table | Items | `DataSource` | The table or view data source can be further refined with a [Filter](/power-platform/power-fx/reference/function-filter-lookup) and a [StartsWith](/power-platform/power-fx/reference/function-startswith). The other generated query clauses are appended onto the existing query. |
-| Form | DataSource | `DataSource` | The table or view data source |
-| Submit button on a form | [OnSelect](/power-apps/maker/canvas-apps/controls/properties-core) | `DataSource.dboSPName({ args}); Refresh (‘DataSource’)` | The first `DataSource` in this formula is the stored procedure data source—the one that holds your stored procedure. The `DataSource` in the refresh formula is the view data source. |
-| Delete button on a form | [OnSelect](/power-apps/maker/canvas-apps/controls/properties-core) | `SP DataSource.dboSPName({ args}); Refresh (‘View DataSource’)` | The first `DataSource` in this formula is the stored procedure data source—the one that holds your stored procedure. The `DataSource` in the refresh formula is the view data source. |
+| Gallery or Table | Items | `DataSource` | You can further refine the table or view data source with a [Filter](/power-platform/power-fx/reference/function-filter-lookup) and a [StartsWith](/power-platform/power-fx/reference/function-startswith). The other generated query clauses are appended to the existing query. |
+| Form | DataSource | `DataSource` | The table or view data source. |
+| Submit button on a form | [OnSelect](/power-apps/maker/canvas-apps/controls/properties-core) | `DataSource.dboSPName({ args}); Refresh (‘DataSource’)` | The first `DataSource` in this formula is the stored procedure data source, which holds your stored procedure. The `DataSource` in the refresh formula is the view data source. |
+| Delete button on a form | [OnSelect](/power-apps/maker/canvas-apps/controls/properties-core) | `SP DataSource.dboSPName({ args}); Refresh (‘View DataSource’)` | The first `DataSource` in this formula is the stored procedure data source, which holds your stored procedure. The `DataSource` in the refresh formula is the view data source. |
## Return code
-Use this return code for accessing the results of a return statement.
+Use this return code to get the result of a return statement.
```power-fx
.({}).ReturnCode
@@ -51,39 +51,40 @@ Use the parameter name as it appears in the JSON payload.
## Result Sets
-Other tables can be accessed through their name, for example, `Table1`, `Table2`, or `Table3`.
+You can use other tables by their name, like `Table1`, `Table2`, or `Table3`.
```power-fx
.({}).ResultSets.Table1
```
-## Untyped results
+## Dynamic results
-Some complicated stored procedures return untyped results. This result is common for stored procedures that use temporary tables. Power Apps can't easily determine the results ahead of time. Therefore, the return is marked as *untyped* and you can't access these results directly. You must first provide a type.
+Some complicated stored procedures return dynamic results. This result is common for stored procedures that use temporary tables. Power Apps can't easily determine the results ahead of time. So, the return is marked as *dynamic* and you can't access these results directly. First, provide a type.
You can access the data with the following data access example pattern.
### Data access example
-1. Pull the results into a variable named `MyUntypedObject`.
+1. Pull the results into a variable named `MyDynamicValue`.
1. Pull `Table1` from that variable and put it into a variable named `table1`.
> [!TIP]
- > This step isn't strictly necessary. It's useful however to put all the results in a variable and then pull out the parts you need, later.
-1. Iterate through `table1` and extract the JSON elements in named value pairs.
-1. Match the names with names returned in the JSON payload.
-1. To validate, open a Power Apps monitor and look at the body section of the data node for a record.
+ > This step isn't strictly necessary. It's useful, though, to put all the results in a variable and then pull out the parts you need later.
+
+1. Iterate through `table1` and extract the JSON elements as named value pairs.
+1. Match the names with those returned in the JSON payload.
+1. To validate, open Power Apps monitor and look at the body section of the data node for a record.
```power-fx
Set(
- , // pull results into variable
+ , // pull results into variable
.(
{ : "someString" }
).ResultSets
);
Set(
table1, // put Table1 into table1
- .Table1
+ .Table1
);
Set(
TypedTable,
diff --git a/powerapps-docs/maker/canvas-apps/controls/copilot-rename-controls.md b/powerapps-docs/maker/canvas-apps/controls/copilot-rename-controls.md
index cd23f61fe3..a76839ff83 100644
--- a/powerapps-docs/maker/canvas-apps/controls/copilot-rename-controls.md
+++ b/powerapps-docs/maker/canvas-apps/controls/copilot-rename-controls.md
@@ -8,6 +8,7 @@ ms.collection:
- get started
ms.reviewer: mkaur
ms.date: 5/29/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
ms.author: mamali
search.audienceType:
diff --git a/powerapps-docs/maker/canvas-apps/controls/properties-core.md b/powerapps-docs/maker/canvas-apps/controls/properties-core.md
index b0f9bce3ea..5649f2b65f 100644
--- a/powerapps-docs/maker/canvas-apps/controls/properties-core.md
+++ b/powerapps-docs/maker/canvas-apps/controls/properties-core.md
@@ -6,7 +6,7 @@ author: gregli-msft
ms.topic: reference
ms.custom: canvas
ms.reviewer: mkaur
-ms.date: 10/25/2016
+ms.date: 7/25/2025
ms.subservice: canvas-maker
ms.author: gregli
search.audienceType:
@@ -22,7 +22,7 @@ Configure whether the user can see and interact with a control.
### Properties
**Default** – The initial value of a control before it is changed by the user.
-* Applies to **[Card](control-card.md)**, **[Check box](control-check-box.md)**, **[Drop down](control-drop-down.md)**, **[Gallery](control-gallery.md)**, **[List Box](control-list-box.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, and **[Toggle](control-toggle.md)** controls.
+* Applies to **[Card](control-card.md)**, **[Check box](control-check-box.md)**, **[Drop down](control-drop-down.md)**, **[Gallery](control-gallery.md)**, **[List Box](control-list-box.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Rich Text Editor](control-richtexteditor.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, and **[Toggle](control-toggle.md)** controls.
**DelayOutput** – Set to true to delay action during text input.
@@ -30,23 +30,23 @@ Configure whether the user can see and interact with a control.
**DisplayMode** – Values can be **Edit, View,** or **Disabled**. Configures whether the control allows user input (**Edit**), only displays data (**View**) or is disabled (**Disabled**). In **View** mode, input controls such as **[Text input](control-text-input.md)**, **[Drop down](control-drop-down.md)**, **[Date Picker](control-date-picker.md)** will only display the text value and will not render any interactive elements or decorations. This makes them suitable to be displayed in Forms or as readable output.
-* Applies to **[Add picture](control-add-picture.md)**, **[Audio](control-audio-video.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Check box](control-check-box.md)**, **[Column chart](control-column-line-chart.md)**, **[Date Picker](control-date-picker.md)**, **[Drop down](control-drop-down.md)**, **[Export](control-export-import.md)**, **[Gallery](control-gallery.md)**, **[HTML text](control-html-text.md)**, **[Icon](control-shapes-icons.md)**, **[Image](control-image.md)**, **[Import](control-export-import.md)**, **[Label](control-text-box.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Pie chart](control-pie-chart.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Shape](control-shapes-icons.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
+* Applies to **[Add picture](control-add-picture.md)**, **[Audio](control-audio-video.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Check box](control-check-box.md)**, **[Column chart](control-column-line-chart.md)**, **[Combo box](control-combo-box.md)**, **[Date Picker](control-date-picker.md)**, **[Drop down](control-drop-down.md)**, **[Export](control-export-import.md)**, **[Gallery](control-gallery.md)**, **[HTML text](control-html-text.md)**, **[Icon](control-shapes-icons.md)**, **[Image](control-image.md)**, **[Import](control-export-import.md)**, **[Label](control-text-box.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Pie chart](control-pie-chart.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Rich text editor](control-richtexteditor.md)**, **[Shape](control-shapes-icons.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
**Items** – The source of data that appears in a control such as a gallery, a list, or a chart.
-* Applies to **[Column chart](control-column-line-chart.md)**, **[Drop down](control-drop-down.md)**, **[Gallery](control-gallery.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Pie chart](control-pie-chart.md)**, and **[Radio](control-radio.md)** controls.
+* Applies to **[Column chart](control-column-line-chart.md)**, **[Combo box](control-combo-box.md)**, **[Drop down](control-drop-down.md)**, **[Gallery](control-gallery.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Pie chart](control-pie-chart.md)**, and **[Radio](control-radio.md)** controls.
**OnChange** – Actions to perform when the user changes the value of a control (for example, by adjusting a slider).
-* Applies to **[Add picture](control-add-picture.md)**, **[Drop down](control-drop-down.md)**, **[List Box](control-list-box.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, and **[Toggle](control-toggle.md)** controls.
+* Applies to **[Add picture](control-add-picture.md)**, **[Combo box](control-combo-box.md)**, **[Drop down](control-drop-down.md)**, **[List Box](control-list-box.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Rich text editor](control-richtexteditor.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, and **[Toggle](control-toggle.md)** controls.
**OnSelect** – Actions to perform when the user taps or clicks a control.
-* Applies to **[Add picture](control-add-picture.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Check box](control-check-box.md)**, **[Column chart](control-column-line-chart.md)**, **[Date Picker](control-date-picker.md)**, **[Drop down](control-drop-down.md)**, **[Export](control-export-import.md)**, **[HTML text](control-html-text.md)**, **[Icon](control-shapes-icons.md)**, **[Image](control-image.md)**, **[Import](control-export-import.md)**, **[Label](control-text-box.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Pie chart](control-pie-chart.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Shape](control-shapes-icons.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, and **[Toggle](control-toggle.md)** controls.
+* Applies to **[Add picture](control-add-picture.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Check box](control-check-box.md)**, **[Column chart](control-column-line-chart.md)**, **[Combo box](control-combo-box.md)**, **[Date Picker](control-date-picker.md)**, **[Drop down](control-drop-down.md)**, **[Export](control-export-import.md)**, **[HTML text](control-html-text.md)**, **[Icon](control-shapes-icons.md)**, **[Image](control-image.md)**, **[Import](control-export-import.md)**, **[Label](control-text-box.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Pie chart](control-pie-chart.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Shape](control-shapes-icons.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, and **[Toggle](control-toggle.md)** controls.
**Reset** – Whether a control reverts to its default value. Also see the **[Reset](../functions/function-reset.md)** function.
-* Applies to **[Audio](control-audio-video.md)**, **[Check box](control-check-box.md)**, **[Drop down](control-drop-down.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
+* Applies to **[Audio](control-audio-video.md)**, **[Check box](control-check-box.md)**, **[Combo box](control-combo-box.md)**, **[Drop down](control-drop-down.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
**Text** – Text that appears on a control or that the user types into a control.
@@ -54,7 +54,7 @@ Configure whether the user can see and interact with a control.
**Tooltip** – Explanatory text that appears when the user hovers over a control.
-* Applies to **[Audio](control-audio-video.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Check box](control-check-box.md)**, **[Drop down](control-drop-down.md)**, **[HTML text](control-html-text.md)**, **[Image](control-image.md)**, **[Label](control-text-box.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
+* Applies to **[Audio](control-audio-video.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Check box](control-check-box.md)**, **[Combo box](control-combo-box.md)**, **[Drop down](control-drop-down.md)**, **[HTML text](control-html-text.md)**, **[Image](control-image.md)**, **[Label](control-text-box.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
**Value** – The value of an input control.
@@ -62,7 +62,7 @@ Configure whether the user can see and interact with a control.
**Visible** – Whether a control appears or is hidden.
-* Applies to **[Add picture](control-add-picture.md)**, **[Audio](control-audio-video.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Card](control-card.md)**, **[Check box](control-check-box.md)**, **[Column chart](control-column-line-chart.md)**, **[Date Picker](control-date-picker.md)**, **[Display form](control-form-detail.md)**, **[Drop down](control-drop-down.md)**, **[Edit form](control-form-detail.md)**, **[Export](control-export-import.md)**, **[Gallery](control-gallery.md)**, **[HTML text](control-html-text.md)**, **[Icon](control-shapes-icons.md)**, **[Image](control-image.md)**, **[Import](control-export-import.md)**, **[Label](control-text-box.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Pie chart](control-pie-chart.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Shape](control-shapes-icons.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
+* Applies to **[Add picture](control-add-picture.md)**, **[Audio](control-audio-video.md)**, **[Button](control-button.md)**, **[Camera](control-camera.md)**, **[Card](control-card.md)**, **[Check box](control-check-box.md)**, **[Column chart](control-column-line-chart.md)**, **[Combo box](control-combo-box.md)**, **[Date Picker](control-date-picker.md)**, **[Display form](control-form-detail.md)**, **[Drop down](control-drop-down.md)**, **[Edit form](control-form-detail.md)**, **[Export](control-export-import.md)**, **[Gallery](control-gallery.md)**, **[HTML text](control-html-text.md)**, **[Icon](control-shapes-icons.md)**, **[Image](control-image.md)**, **[Import](control-export-import.md)**, **[Label](control-text-box.md)**, **[Line chart](control-column-line-chart.md)**, **[List Box](control-list-box.md)**, **[Microphone](control-microphone.md)**, **[PDF viewer](control-pdf-viewer.md)**, **[Pen input](control-pen-input.md)**, **[Pie chart](control-pie-chart.md)**, **[Radio](control-radio.md)**, **[Rating](control-rating.md)**, **[Rich text editor](control-richtexteditor.md)**, **[Shape](control-shapes-icons.md)**, **[Slider](control-slider.md)**, **[Text input](control-text-input.md)**, **[Timer](control-timer.md)**, **[Toggle](control-toggle.md)**, and **[Video](control-audio-video.md)** controls.
diff --git a/powerapps-docs/maker/canvas-apps/copilot-answer-control-overview.md b/powerapps-docs/maker/canvas-apps/copilot-answer-control-overview.md
index c3dcfffdee..ed1967b029 100644
--- a/powerapps-docs/maker/canvas-apps/copilot-answer-control-overview.md
+++ b/powerapps-docs/maker/canvas-apps/copilot-answer-control-overview.md
@@ -9,6 +9,7 @@ ms.collection:
- get started
ms.reviewer: mkaur
ms.date: 5/27/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
ms.author: arijitba
search.audienceType:
diff --git a/powerapps-docs/maker/canvas-apps/copresence-power-apps-studio.md b/powerapps-docs/maker/canvas-apps/copresence-power-apps-studio.md
index 38f5a2a871..b120c2e970 100644
--- a/powerapps-docs/maker/canvas-apps/copresence-power-apps-studio.md
+++ b/powerapps-docs/maker/canvas-apps/copresence-power-apps-studio.md
@@ -3,7 +3,7 @@ title: Collaborate on canvas apps in Microsoft Power Apps Studio
description: Learn how to use copresence and coauthoring to view who's working on the same canvas app as you and edit it together in real time.
author: mkaur
ms.author: szlo
-ms.date: 5/29/2025
+ms.date: 6/17/2025
ms.topic: how-to
ms.reviewer: mkaur
ms.subservice: canvas-maker
@@ -18,19 +18,19 @@ ms.custom:
- canvas
---
-# Collaborate on canvas apps in Power Apps Studio
+# Understand coauthoring and copresence in canvas apps
-You can use two features in Power Apps Studio to collaborate with other makers on canvas apps: copresence and coauthoring.
+Collaborate on canvas apps in Power Apps Studio using copresence and coauthoring. These features let you work with other makers in real time, improving productivity and teamwork.
-**Copresence** lets you view who else is working on the same app as you, but only one person can edit the app at a time.
+- **[Copresence](copresence-power-apps-studio.md#use-copresence-to-see-whos-working-on-the-same-app)** shows who else is working on the same app, but only one person can edit the app at a time. The first person who opens the app gets editing control
-**Coauthoring** lets multiple people edit the app at the same time and view each other's changes in real time.
+- **[Coauthoring](copresence-power-apps-studio.md#use-coauthoring-to-edit-the-same-app-together)** lets multiple people edit the app at the same time and see each other's changes in real time.
-## Use copresence to view who's working on the same app
+## Use copresence to see who's working on the same app
When you open an app for editing in Power Apps Studio, indicators might show that other people are also working on the app. These indicators are part of the copresence feature.
-The first person who opens the app has editing control. If another person tries to open the app, a notification lets them know that someone else is editing the app and they're viewing it in read-only mode. In read-only mode, you can't add new screens, edit control properties, or use the command bar. You can save a copy of the app.
+The first person who opens the app gets editing control. If another person opens the app, a notification lets them know that someone else is editing the app, and they're viewing it in read-only mode. In read-only mode, you can't add new screens, edit control properties, or use the command bar. You can save a copy of the app.
The command bar shows the names and icons of other makers who are editing or viewing the app. The left navigation pane shows the app's structure and highlights which part of the app someone else is editing. You also get a notification to refresh the app when someone saves changes to the app.
@@ -39,40 +39,43 @@ The command bar shows the names and icons of other makers who are editing or vie
**Legend**:
1. The command bar shows the names and icons of other makers who are editing or viewing the app.
-1. A **Read-only** warning appears if someone already has editing control elsewhere. However, you can select **Override** to become the main author and regain editing rights.
+1. A **Read-only** warning appears if someone already has editing control elsewhere. You can select **Override** to become the main author and regain editing rights.
1. In **Tree view**, you see the app's structure and other people's profile pictures on the part of the app someone else is editing.
> [!TIP]
-> If you're inactive for two hours while editing an app, Power Apps asks if you want to continue editing or switch to read-only mode. If you don't respond, the system puts you in read-only mode so that other makers can become the editor.
+> If you're inactive for two hours while editing an app, Power Apps asks if you want to keep editing or switch to read-only mode. If you don't respond, the system puts you in read-only mode so other makers can become the editor.
>
-> If autosave is turned on, the changes you made are automatically saved. If autosave isn't turned on, Power Apps notifies you that you're no longer editing and lets you save a copy of your changes.
+> If autosave is on, your changes are automatically saved. If autosave isn't on, Power Apps notifies you that you're no longer editing and lets you save a copy of your changes.
## Use coauthoring to edit the same app together
-Coauthoring is a new feature that allows multiple makers to edit a canvas app at the same time. When you use coauthoring, you can tell where other makers are working on the app and view their changes in real time.
+Coauthoring lets multiple makers edit a canvas app at the same time. When you use coauthoring, you can tell where other makers are working on the app and view their changes in real time.
:::image type="content" source="media/copresence/coauthoring.png" alt-text="Screenshot of coauthoring indicators in Power Apps Studio with annotations." lightbox="media/copresence/coauthoring.png" :::
-When multiple editors are working on the app, their avatars are shown.
+When multiple editors work on the app, their avatars show.
-- The left navigation pane shows the app's structure in **Tree view** and reveals which part of the app someone else is editing. For example, you might be editing **Screen 1**, while someone else is editing **Screen 2**.
-- The area that another maker is editing is highlighted and shows their initials. For example, someone else might edit a part of a form, which is highlighted for the first user.
+- The left navigation pane shows the app's structure in **Tree view** and shows which part of the app someone else is editing. For example, you might edit **Screen 1**, while someone else edits **Screen 2**.
+- The area that another maker edits is highlighted and shows their initials. For example, someone else might edit a part of a form, which is highlighted for the first user.
> [!IMPORTANT]
-> Multiple makers can select and edit a control at the same time. Be careful not to overwrite each other's edits.
+> Multiple makers can select and edit a control at the same time. Be careful not to overwrite each other's changes.
-### Turn on coauthoring
+## Turn on coauthoring
-To use coauthoring, you need to turn it on for each app. If you turn on coauthoring, it overrides the copresence feature.
+To use coauthoring, you need to turn it on for each app. When you turn on coauthoring, it overrides the copresence feature.
-1. Open your app for editing in Power Apps Studio.
+1. [Open your app for editing](edit-app.md) in Power Apps Studio.
1. Go to **Settings** > **Updates** > **New**.
+1. In the search box, type **coauthor**.
1. Turn on the **Coauthoring** toggle.
-### Limitations of coauthoring
+ :::image type="content" source="media/copresence/coauthor-settings.png" alt-text="Screenshot of coauthoring settings":::
-- When more than one maker is editing an app, the following actions aren't available:
+## Limitations of coauthoring
+
+- When more than one maker edits an app, the following actions aren't available:
- Search
- Save as
@@ -80,15 +83,15 @@ To use coauthoring, you need to turn it on for each app. If you turn on coauthor
- Undo and redo
- Switch authoring versions
-- The maximum number of coauthors is 10, either in one session or across a total of 10 tabs, depending on which limit is reached first. Any other coauthors or tabs beyond 10 are in [copresence](#use-copresence-to-view-whos-working-on-the-same-app) and can't edit the app or view real-time updates.
+- The maximum number of coauthors is 10, either in one session or across a total of 10 tabs, depending on which limit is reached first. Any other coauthors or tabs beyond 10 are in [copresence](copresence-power-apps-studio.md#use-copresence-to-see-whos-working-on-the-same-app) and can't edit the app or view real-time updates.
-- The app language is locked to the locale of the first maker who opens the app for editing. Opening the same app in a different locale may lead to errors in formulas.
+- The app language is locked to the locale of the first maker who opens the app for editing. Opening the same app in a different locale can lead to errors in formulas.
- Cut isn't available.
- Coauthoring is turned off in the [Monitor tool](../monitor-overview.md).
-- You might encounter a problem with the following actions:
+- You can encounter a problem with the following actions:
- Renaming a control
- Adding AI Builder components
diff --git a/powerapps-docs/maker/canvas-apps/create-performant-apps-overview.md b/powerapps-docs/maker/canvas-apps/create-performant-apps-overview.md
index dd69b0b054..d7ef51bd7c 100644
--- a/powerapps-docs/maker/canvas-apps/create-performant-apps-overview.md
+++ b/powerapps-docs/maker/canvas-apps/create-performant-apps-overview.md
@@ -1,10 +1,10 @@
---
-title: Overview on how to create performant Power Apps
-description: Learn about how to create well performing Power Apps.
+title: How to create performant Power Apps
+description: Learn how to create performant Power Apps for faster, more efficient apps. Discover key principles and tips to optimize your app's performance.
author: lancedMicrosoft
ms.subservice: canvas-developer
ms.topic: how-to
-ms.date: 02/26/2025
+ms.date: 06/27/2025
ms.author: lanced
ms.reviewer: mkaur
search.audienceType:
@@ -17,39 +17,29 @@ contributors:
# Overview of creating performant apps
-## How and why to use performant patterns and avoid anti-patterns
+Creating performant Power Apps ensures your apps run efficiently and providing a better user experience. This article explains key patterns, anti-patterns to avoid, and design principles to help you build high-performing Power Apps for your organization.
-Performant patterns should be used to enhance the efficiency of an app, while anti-patterns should be avoided as they can decrease the effectiveness of an app. It's important to understand how and why to use performant patterns and avoid anti-patterns in order to optimize the performance of your app.
+- **App patterns and Power Apps productivity gain**: Power Apps makes it easier to build enterprise-grade apps by using established app patterns. Patterns are groups of Power Apps elements that work together, like data sources, collections, controls, Power Automate, and pages. Power Apps includes key performant patterns by default, so low-code developers quickly build functional enterprise apps. Deployment and administration tasks are also straightforward. With Power Apps, your team is more productive because many elements don't need your attention.
-### App patterns and Power Apps productivity gain
+- **Power Apps steers towards performant patterns**: Power Apps guides you toward well known performant patterns by default. These patterns include streamlined data loading at launch, automatic incremental paging, caching data for collections, and loading only essential data for each page. These proven patterns work well for data-heavy enterprise apps. Many successful Power Apps implementations use more than 100 tables and over 50 screens while keeping excellent performance.
-Power Apps simplifies the development of enterprise-grade apps by utilizing established app patterns. Patterns are collections of Power Apps elements that work cohesively together. These Power Apps elements include data sources, collections, controls, Power Automate, and pages. Key performant patterns are built into Power Apps as defaults, enabling low-code developers to quickly create functional enterprise-grade apps. Additionally, deployment and Power Apps administration tasks are straightforward. With Power Apps, you and your development team can be more productive, as there are many elements that no longer require your attention.
+- **Falling into anti-patterns**: When you build an app on any development platform, you risk making it perform poorly because of anti-patterns. These patterns can cause slow loading, slow page transitions, and make it hard to update or get data. Common anti-patterns include loading too much data, turning everything into collections, and overloading OnStart. People often use these patterns to work around real or perceived Power Apps limitations. Even with guidance, you might still use a bad pattern and end up with a slow app.
-### Power Apps steers towards performant patterns
+## Key performance design principles
-The default Power Apps behavior guides you towards well known performant patterns. These patterns include streamlined data loading at launch, automatic incremental paging of data, caching of data for collections, and loading only essential data for each page. These proven patterns are effective for data-heavy enterprise applications. Many successful Power Apps implementations follow these guidelines, utilizing more than 100 tables and over 50 screens while maintaining excellent performance.
+When building your app, consider these key performance principles to ensure it runs efficiently. These principles cover most aspects needed to enhance your app's speed. Some performance suggestions might appear in multiple sections due to their interrelated nature.
-### Falling into anti-patterns
+- [Optimize page loads](fast-app-page-load.md): Optimize your apps for app and page load speed. Minimize, delay, or eliminate actions that prevent fast app or page load.
+- [Small data payloads](small-data-payloads.md): Keep the amount of data that is bulk retrieved small.
+- [Optimize query data patterns](optimized-query-data-patterns.md): Do data mashups on the server, not in your app.
+- [Fast calculations](efficient-calculations.md): Work with Power Fx, not against it.
-When you create an app on any development platform, there's a risk of creating an app that performs poorly due to anti-patterns. These patterns can cause slow loading times, slow transitions between pages, and difficulty updating and retrieving data. Some common examples of anti-patterns include loading excessive amounts of data, transforming everything into collections, and overloading OnStart. These patterns are often adopted when attempting to work around perceived or real limitations in Power Apps. While we try to guide you towards the best patterns, it's still possible to unintentionally use a bad pattern, resulting in an app that performs poorly.
-
-## Four key performance design principles
-
-Below are four key performance principles to consider while building your app. These principles aren't fully independent of each other and therefore you'll find some performance suggestions repeated in different sections. To best understand these articles, it also is useful to understand the [Execution phases of a Power App](execution-phases-data-flow.md) article. If you have an existing app that doesn't perform well, use the principles below to examine your app.
-
-Each of the principles below links to a page with greater detail on the subject.
-
-1. [Optimize page loads](fast-app-page-load.md): Optimize your apps for app and page load speed. Minimize, delay, or eliminate actions that prevent fast app or page load.
-2. [Small data payloads](small-data-payloads.md): Keep the amount of data that is bulk retrieved small.
-3. [Optimize query data patterns](optimized-query-data-patterns.md): Do data mashups on the server, not in your app.
-4. [Fast calculations](efficient-calculations.md): Work with Power Fx, not against it.
-
-These principles should cover most of what is necessary to make your app fast.
+For a deeper understanding, also see [Execution phases of a Power App](execution-phases-data-flow.md) article.
## Additional performance guidance
-There are other performance considerations to keep in mind. For additional guidance, see these articles:
+Other performance considerations can affect your app. For more information, see these articles:
- * [Other performance considerations](app-performance-considerations.md): Discusses additional factors, which might affect performance.
- * [Build large complex apps](working-with-large-apps.md): Outlines key factors to consider while building a large app.
- * [Canvas apps coding standards and guidelines](https://www.microsoft.com/en-us/power-platform/blog/wp-content/uploads/2024/06/PowerApps-canvas-app-coding-standards-and-guidelines.pdf): Outlines general coding and development guidelines that can help in building an app.
+- [Other performance considerations](app-performance-considerations.md): Discusses other factors that might affect performance.
+- [Build large complex apps](working-with-large-apps.md): Lists key factors to consider when building a large app.
+- [Canvas app coding standards and guidelines](https://www.microsoft.com/power-platform/blog/wp-content/uploads/2024/06/PowerApps-canvas-app-coding-standards-and-guidelines.pdf): Lists general coding and development guidelines that help you build an app.
diff --git a/powerapps-docs/maker/canvas-apps/get-sessionid.md b/powerapps-docs/maker/canvas-apps/get-sessionid.md
index 3e57f6f07e..445a825fa1 100644
--- a/powerapps-docs/maker/canvas-apps/get-sessionid.md
+++ b/powerapps-docs/maker/canvas-apps/get-sessionid.md
@@ -2,17 +2,17 @@
title: Get the session or app ID
description: Learn about how to get a session ID or a canvas-app ID for troubleshooting.
author: mduelae
-
ms.subservice: troubleshoot
ms.topic: how-to
ms.custom: canvas
ms.reviewer:
-ms.date: 11/09/2021
+ms.date: 06/02/2025
ms.author: tapanm
search.audienceType:
- maker
contributors:
- mduelae
+ - vamseedillimsft
---
# Get session and app ID details
@@ -72,6 +72,17 @@ If you find a problem with an app in Power Apps, you can help Microsoft troubles
1. Select **About**.
:::image type="content" source="media/get-sessionid/session-details-mda.png" alt-text="Session ID displayed with session details":::
+### When running a model-driven app on a phone or a tablet
+
+1. In the upper left corner, select the hamburger icon (the three lines).
+:::image type="content" source="media/get-sessionid/navigation-option.png" alt-text="Hamburger icon at the top left corner with Enabled users list":::
+1. Select the settings icon (gear) in the lower left corner of the screen.
+:::image type="content" source="media/get-sessionid/setting-option.png" alt-text="Navigation pane showing different options icons along with settings icon":::
+1. Select **Session Details** at the bottom of the screen.
+:::image type="content" source="media/get-sessionid/setting-screen.png" alt-text="Setting screen showing session details option":::
+1. Review the session details.
+:::image type="content" source="media/get-sessionid/session-details-screen.png" alt-text="Session details":::
+
## Get the session ID for Power Apps (make.powerapps.com)
1. Sign into Power Apps (make.powerapps.com), and then, on the command bar, select **Settings** (gear).
@@ -95,6 +106,4 @@ Get the app ID for either a canvas or model-driven app:

-
-
[!INCLUDE[footer-include](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/maker/canvas-apps/index.yml b/powerapps-docs/maker/canvas-apps/index.yml
index c201c06f4b..6da3656d2b 100644
--- a/powerapps-docs/maker/canvas-apps/index.yml
+++ b/powerapps-docs/maker/canvas-apps/index.yml
@@ -12,7 +12,7 @@ metadata:
ms.collection: collection
author: mduelae
ms.author: tapanm
- ms.date: 09/04/2020
+ ms.date: 07/10/2025
# linkListType: architecture | concept | deploy | download | get-started | how-to-guide | learn | overview | quickstart | reference | tutorial | video | whats-new
@@ -35,16 +35,16 @@ landingContent:
url: /training/modules/get-started-with-powerapps/
# Card
- - title: Explore and create
+ - title: Create a canvas app
linkLists:
- - linkListType: quickstart
+ - linkListType: how-to-guide
links:
- - text: Explore sample apps
- url: open-and-run-a-sample-app.md
- - text: Create your first app
- url: get-started-test-drive.md
- - text: Create a canvas app from Dataverse
- url: data-platform-create-app.md
+ - text: Create a blank canvas app
+ url: create-blank-app.md
+ - text: Create an app from conversation
+ url: ai-conversations-create-app.md
+ - text: Create a canvas app using Dataverse
+ url: data-platform-create-app-scratch.md
- linkListType: learn
links:
- text: Create canvas apps in Power Apps
@@ -57,8 +57,8 @@ landingContent:
links:
- text: Add and configure controls
url: add-configure-controls.md
- - text: Screens and layouts
- url: set-aspect-ratio-portrait-landscape.md
+ - text: Add and navigate screens
+ url: add-screen-context-variables.md
- text: Add forms
url: add-form.md
- linkListType: learn
@@ -129,7 +129,7 @@ landingContent:
links:
- text: Test using Test Studio
url: test-studio.md
- - text: Debug using Monitor
+ - text: Debug using Live monitor
url: ../monitor-canvasapps.md
- text: Analyze app telemetry using Application Insights
url: application-insights.md
diff --git a/powerapps-docs/maker/canvas-apps/intro-maker-portal.md b/powerapps-docs/maker/canvas-apps/intro-maker-portal.md
index 5853be86a3..b08532a2e2 100644
--- a/powerapps-docs/maker/canvas-apps/intro-maker-portal.md
+++ b/powerapps-docs/maker/canvas-apps/intro-maker-portal.md
@@ -3,6 +3,7 @@ title: Get started with Power Apps| MicrosoftDocs
description: How to navigate the Power Apps home page.
ms.custom:
ms.date: 5/29/2025
+ms.update-cycle: 180-days
ms.reviewer: mkaur
ms.topic: overview
author: "mduelae"
diff --git a/powerapps-docs/maker/canvas-apps/keyboard-shortcuts.md b/powerapps-docs/maker/canvas-apps/keyboard-shortcuts.md
index 4161a9ce9a..6faecc9414 100644
--- a/powerapps-docs/maker/canvas-apps/keyboard-shortcuts.md
+++ b/powerapps-docs/maker/canvas-apps/keyboard-shortcuts.md
@@ -6,7 +6,7 @@ author: TashasEv
ms.topic: article
ms.custom: canvas
ms.reviewer: mkaur
-ms.date: 05/30/2025
+ms.date: 06/10/2025
ms.subservice: canvas-maker
ms.author: tashas
search.audienceType:
@@ -51,10 +51,9 @@ contributors:
| Ctrl+=, Ctrl+Shift+=, or Ctrl+Mouse wheel up | Zoom in |
| Ctrl+-, Ctrl+Shift+-, or Ctrl+Mouse wheel down | Zoom out |
| Ctrl+0 | Fit canvas to page |
-| Shift+Enter | Break a line in a formula |
-| Enter or Shift+Enter | Select a suggestion in a formula without adding a new line |
-| Enter | Select a suggestion in a formula and create a new line |
-| Shift+Enter | Create a new line in a formula without keeping the suggestion |
+| Enter or Shift+Enter | Select a suggestion in a formula without adding a new line (Enhanced formula bar shortcuts is turned off) |
+| Enter | Select a suggestion in a formula and create a new line (Enhanced formula bar shortcuts must be turned on)|
+| Shift+Enter | Create a new line in a formula without keeping the suggestion (Enhanced formula bar shortcuts must be turned on)| |
> [!IMPORTANT]
> To use keyboard shortcuts for the formula bar, turn on **Enhanced formula bar shortcuts**. In Power Apps, go to [**Settings**](intro-maker-portal.md#settings), and then select **Power App settings**. On the **Editing** tab, turn on **Enhanced formula bar shortcuts**.
diff --git a/powerapps-docs/maker/canvas-apps/media/app-from-sharepoint/sample-list.png b/powerapps-docs/maker/canvas-apps/media/app-from-sharepoint/sample-list.png
new file mode 100644
index 0000000000..d42ed1e439
Binary files /dev/null and b/powerapps-docs/maker/canvas-apps/media/app-from-sharepoint/sample-list.png differ
diff --git a/powerapps-docs/maker/canvas-apps/media/copresence/coauthor-settings.png b/powerapps-docs/maker/canvas-apps/media/copresence/coauthor-settings.png
new file mode 100644
index 0000000000..53942fb3a8
Binary files /dev/null and b/powerapps-docs/maker/canvas-apps/media/copresence/coauthor-settings.png differ
diff --git a/powerapps-docs/maker/canvas-apps/media/get-sessionid/navigation-option.png b/powerapps-docs/maker/canvas-apps/media/get-sessionid/navigation-option.png
new file mode 100644
index 0000000000..a87b3f2bc5
Binary files /dev/null and b/powerapps-docs/maker/canvas-apps/media/get-sessionid/navigation-option.png differ
diff --git a/powerapps-docs/maker/canvas-apps/media/get-sessionid/session-details-screen.png b/powerapps-docs/maker/canvas-apps/media/get-sessionid/session-details-screen.png
new file mode 100644
index 0000000000..ed045bfae1
Binary files /dev/null and b/powerapps-docs/maker/canvas-apps/media/get-sessionid/session-details-screen.png differ
diff --git a/powerapps-docs/maker/canvas-apps/media/get-sessionid/setting-option.png b/powerapps-docs/maker/canvas-apps/media/get-sessionid/setting-option.png
new file mode 100644
index 0000000000..7b1c74c93a
Binary files /dev/null and b/powerapps-docs/maker/canvas-apps/media/get-sessionid/setting-option.png differ
diff --git a/powerapps-docs/maker/canvas-apps/media/get-sessionid/setting-screen.png b/powerapps-docs/maker/canvas-apps/media/get-sessionid/setting-screen.png
new file mode 100644
index 0000000000..456568e893
Binary files /dev/null and b/powerapps-docs/maker/canvas-apps/media/get-sessionid/setting-screen.png differ
diff --git a/powerapps-docs/maker/canvas-apps/offline-apps.md b/powerapps-docs/maker/canvas-apps/offline-apps.md
index 1bd972c1f0..6d8d9bf9d8 100644
--- a/powerapps-docs/maker/canvas-apps/offline-apps.md
+++ b/powerapps-docs/maker/canvas-apps/offline-apps.md
@@ -47,6 +47,8 @@ These functions are limited by the amount of available app memory because they o
The functions also don't automatically resolve merge conflicts when a device comes online. Configuration on what data is saved and how to handle reconnection is up to the maker when writing expressions.
+After using **LoadData** to populate a collection, that collection cannot be used to update Dataverse data which includes a lookup field. Doing so will result in the lookup field not being updated.
+
For updates on offline capabilities, return to this topic, and subscribe to the [Power Apps blog](https://powerapps.microsoft.com/blog/).
## Overview
diff --git a/powerapps-docs/maker/canvas-apps/save-publish-app.md b/powerapps-docs/maker/canvas-apps/save-publish-app.md
index ecda47d392..6f7d28fa17 100644
--- a/powerapps-docs/maker/canvas-apps/save-publish-app.md
+++ b/powerapps-docs/maker/canvas-apps/save-publish-app.md
@@ -6,6 +6,7 @@ ms.topic: how-to
ms.custom: canvas
ms.reviewer: mkaur
ms.date: 5/27/2025
+ms.update-cycle: 180-days
ms.subservice: canvas-maker
ms.author: emcoope
search.audienceType:
diff --git a/powerapps-docs/maker/canvas-apps/share-app-guests.md b/powerapps-docs/maker/canvas-apps/share-app-guests.md
index 06c89b0926..e23dd7ca53 100644
--- a/powerapps-docs/maker/canvas-apps/share-app-guests.md
+++ b/powerapps-docs/maker/canvas-apps/share-app-guests.md
@@ -5,7 +5,7 @@ author: alaug
ms.topic: how-to
ms.custom: canvas
ms.reviewer: mkaur
-ms.date: 8/22/2023
+ms.date: 6/27/2025
ms.subservice: canvas-maker
ms.author: alaug
search.audienceType:
@@ -24,10 +24,10 @@ Watch this video to learn how to share an app with guests:
## Prerequisites
-- In Microsoft Entra ID, enable B2B external collaboration for the tenant. More information: [Enable B2B external collaboration and manage who can invite guests](/azure/active-directory/b2b/delegate-invitations)
+- In Microsoft Entra ID, enable B2B external collaboration for the tenant. More information: [Configure external collaboration settings for B2B in Microsoft Entra External ID](/entra/external-id/external-collaboration-settings-configure)
> [!NOTE]
- > B2B external collaboration is enabled by default. However, you need to verify that the settings weren't changed by a tenant admin. For more information about Microsoft Entra B2B, see [What is guest user access in Microsoft Entra B2B?](/azure/active-directory/b2b/what-is-b2b).
+ > B2B external collaboration is enabled by default. However, you need to verify that the settings weren't changed by a tenant admin. For more information about Microsoft Entra B2B, see [Overview: B2B collaboration with external guests for your workforce](/entra/external-id/what-is-b2b).
- Access to an account that can add guest users to a Microsoft Entra tenant. Admins and users with the Guest Inviter role can add guests to a tenant.
@@ -41,36 +41,21 @@ Watch this video to learn how to share an app with guests:
## Steps to grant guest access
-1. In Microsoft Entra ID, select **New guest user**. More information: [Quickstart: Add a new guest user in Microsoft Entra ID](/azure/active-directory/b2b/b2b-quickstart-add-guest-users-portal)
+1. In Microsoft Entra ID, select **New guest user**. More information: [Quickstart: Add a guest user and send an invitation](/entra/external-id/b2b-quickstart-add-guest-users-portal)

2. If the guest user doesn't already have a license in their home tenant, assign a license to the guest user.
- - To assign guest users from admin.microsoft.com, go to [Assign licenses to one user](/office365/admin/subscriptions-and-billing/assign-licenses-to-users).
+ - To assign guest users from admin.microsoft.com, go to [Add users and assign licenses at the same time](/microsoft-365/admin/add-users/add-users).
- - To assign guest users from portal.azure.com, go to [Assign or remove licenses](/azure/active-directory/fundamentals/license-users-groups).
+ - To assign guest users from portal.azure.com, go to [Assign or remove licenses](/entra/fundamentals/licensing).
> [!IMPORTANT]
> You might need to disable the Microsoft 365 admin center preview to assign a license to a guest.
-3. Share the canvas app by performing these steps:
+3. [Share an app from Power Apps](Share an app from Power Apps)
- 1. Sign in to [Power Apps](https://make.powerapps.com).
-
- 1. On the left pane, select **Apps**.
-
- 1. Select a canvas app.
-
- 1. On the command bar, select **Share**.
-
- 1. Enter an email address for a guest user from a Microsoft Entra tenant. More information: [What is guest user access in Microsoft Entra B2B?](/azure/active-directory/b2b/what-is-b2b)
-
- 
-
-After you share an app for guest access, guests can discover and access apps shared with them from the email sent to them as part of sharing. You can also share the app URL directly with the guest instead. To find the URL, go to [Power Apps](https://make.powerapps.com), select **Apps** on left pane, select the app, and then select the **Details** tab. The app URL is displayed under **Web link**.
-
-
## Considerations and limitations for guest access
@@ -168,11 +153,11 @@ No. Authorization capabilities can and should be used to control which users acc
### Why can an Azure B2B user without a license access a model driven app?
-The detection of a previously licensed user no longer having a license isn't immediate. If you expect a user to lose access to an app using Dataverse, their authorization to the app or data should be updated. For example, the app should be unshared with the user or Dataverse security roles should be removed from the user.
+The detection of a previously licensed user no longer having a license isn't immediate. If you expect a user to lose access to an app using Dataverse, then their authorization to the app or data should be updated. For example, the app should be unshared with the user or Dataverse security roles should be removed from the user.
### Which connectors create connections in the resource tenant by default?
-Users relying on Azure B2B to access an app only has implications on connectors that use Microsoft Entra ID for authentication. Some Microsoft Entra ID based connectors default to creating a connection in the resource tenant, while others default to creating a connection in the home tenant. Connectors that don't use any type of Microsoft Entra ID authentication work the same for guests and members in a tenant. The following table enumerates all connectors that do use Microsoft Entra ID authentication and default creates connections in the resource tenant. For more information on each connector as their may be restriction, see [List of all Power Apps connectors](/connectors/connector-reference/connector-reference-powerapps-connectors)
+Users relying on Azure B2B to access an app only has implications on connectors that use Microsoft Entra ID for authentication. Some Microsoft Entra ID based connectors default to creating a connection in the resource tenant, while others default to creating a connection in the home tenant. Connectors that don't use any type of Microsoft Entra ID authentication work the same for guests and members in a tenant. The following table enumerates all connectors that do use Microsoft Entra ID authentication and default creates connections in the resource tenant. For more information on each connector as there might be restriction, see [List of all Power Apps connectors](/connectors/connector-reference/connector-reference-powerapps-connectors)
| **Connector** | **Creates connection in resource tenant by default** |
|---------------------------------------------------|------------------------------------------------------------------------|
diff --git a/powerapps-docs/maker/canvas-apps/share-app-resources.md b/powerapps-docs/maker/canvas-apps/share-app-resources.md
index c3830c6593..b65fcb83b1 100644
--- a/powerapps-docs/maker/canvas-apps/share-app-resources.md
+++ b/powerapps-docs/maker/canvas-apps/share-app-resources.md
@@ -6,7 +6,7 @@ author: lancedMicrosoft
ms.topic: how-to
ms.custom: canvas
ms.reviewer: mkaur
-ms.date: 5/21/2025
+ms.date: 7/8/2025
ms.subservice: canvas-maker
ms.author: lanced
search.audienceType:
@@ -52,6 +52,9 @@ When you share an app that uses a connection that can be shared, the app connect
If you select **Confirm** and share the chosen app with other users, the app connection is implicitly shared with those users along with the app.
+> [!NOTE]
+> To ensure the app works properly, the user who is sharing the app needs to have sharing permission for all connections used by the app. Without these permissions, the user won't be able to access or use the connections correctly. This applies to all app-sharing activities, including app sharing, app publishing, and solution import.
+
## On-premises data gateways
If you create and share an app that includes data from an on-premises source, the [on-premises data gateway](gateway-management.md) itself and certain types of connections to that gateway will be shared automatically. For any connection that isn’t shared automatically, you can share it manually (as the previous section shows) or let the app prompt users to create their own connections. To show the connection or connections with which a gateway has been configured:
diff --git a/powerapps-docs/maker/canvas-apps/studio-versions.md b/powerapps-docs/maker/canvas-apps/studio-versions.md
index 3614fb2842..bd98bfbe44 100644
--- a/powerapps-docs/maker/canvas-apps/studio-versions.md
+++ b/powerapps-docs/maker/canvas-apps/studio-versions.md
@@ -74,6 +74,8 @@ You're now editing the app in the Power Apps Studio version you've selected. Sin
> [!NOTE]
> If you choose to restore the app to a previous version, you'll lose any changes made between your latest and previous app versions.
+- You cannot change authoring versions if coauthoring is enabled.
+
### See also
- [Setting an environment refresh cadence](/power-platform/admin/create-environment#setting-an-environment-refresh-cadence)
diff --git a/powerapps-docs/maker/canvas-apps/untyped-and-dynamic-objects.md b/powerapps-docs/maker/canvas-apps/untyped-and-dynamic-objects.md
index 4b44125b1b..363efc71c0 100644
--- a/powerapps-docs/maker/canvas-apps/untyped-and-dynamic-objects.md
+++ b/powerapps-docs/maker/canvas-apps/untyped-and-dynamic-objects.md
@@ -1,12 +1,12 @@
---
-title: Working with untyped and dynamic objects
-description: How to work with untyped and dynamic objects.
+title: Working with dynamic values
+description: How to work with dynamic values.
author: lancedMicrosoft
ms.topic: overview
ms.custom: canvas
ms.collection: get-started
ms.reviewer: mkaur
-ms.date: 03/2/2023
+ms.date: 06/19/2025
ms.subservice: canvas-maker
ms.author: lanced
search.audienceType:
@@ -15,48 +15,50 @@ contributors:
- lancedMicrosoft
- mduelae
---
-# Working with untyped and dynamic objects
+# Working with dynamic values
-When dealing with actions in Power Apps, it's possible to encounter untyped return values or input values for some actions. Before, Power Apps would ignore untyped or dynamic input fields, and they wouldn't be visible in PowerFX expressions but now, you can work directly with these fields. Before, when a return type was untyped, Power Apps would return a Boolean value. Now, it returns an untyped object instead.
+When you use actions in Power Apps, you can encounter dynamic return values or input values for some actions. Previously, Power Apps ignored dynamic input fields, and they weren't visible in Power Fx expressions. Now, you work directly with these fields. Previously, when a return type was dynamic, Power Apps returned a Boolean value. Now, it returns a dynamic value instead.
> [!NOTE]
-> Suppose your Power Fx expressions rely on a Boolean return value from these functions. In that case, you'll have to rewrite the formula and explicitly cast the untyped object to a Boolean. Certain functions, such as 'IfError,' don't fully support untyped objects yet. If your expression contains such a function, refer to the note at the end of this article for workarounds.
+> If your Power Fx expressions rely on a Boolean return value from these functions, rewrite the formula and explicitly cast the dynamic value to a Boolean. Certain functions, like 'IfError,' don't fully support dynamic values yet. If your expression uses one of these functions, see the note at the end of this article for workarounds.
-## Passing in untyped objects as parameters
+## Passing in dynamic values as parameters
-Certain actions necessitate an untyped object as a parameter value. If you have a Power Fx record, you can convert it to an untyped object, making it suitable for passing to the action.
+Certain actions necessitate using a dynamic value as a parameter. If you have a Power Fx record, convert it to a dynamic value to pass it to the action.
-In the example below, the merge action available on a Dataverse **Account** table requires several untyped arguments. To prepare, we'll define three variables to hold the TargetObject, SubordinateObject, and UpdateContextObject. We'll begin by assigning the text string **Microsoft.Dynamics.CRM.account** to a variable, which will be reuse throughout the example.
+In the following example, the merge action on a Dataverse **Account** table requires several dynamic arguments. To prepare, define three variables to hold the TargetObject, SubordinateObject, and UpdateContextObject. Start by assigning the text string **Microsoft.Dynamics.CRM.account** to a variable, which you reuse throughout the example.
```power-fx
Set (OdataType, “Microsoft.Dynamics.CRM.account”);
```
-Then TargetObject is assigned a Power Fx record with the properties of name, accountid, and @odata.type. We similarly assign Power Fx records to the Subordinate and UpdateContext objects as well.
+Then assign TargetObject a Power Fx record with the properties name, accountid, and @odata.type. Similarly, assign Power Fx records to the Subordinate and UpdateContext objects.
+
```power-fx
Set (TargetObject, {name: "Test 2", accountid: "145dc2ba-85a2-ed11-aado-0022482d76a5", '@odata.type': OdataType});
Set (SubordinateObject, {name: FirstRecord.’Account name’, accountid: FirstRecord.Account, ‘@odata.type’ : OdataType });
Set (UpdateContextObject, {telephone1: FirstRecord.’Main Phone’, address1_city: FirstRecord.’Address 1 : City’, ‘@odata.type’ : OdataType });
```
-Next, we'll create three more variables to store the untyped records after the conversion: TargetUntypedObject, SubordinateUntypedObject, and UpdateContextUntypedObject. To perform the conversion, we'll use the ParseJSON(JSON()) function on the original variables. This action will transform the Power Fx records into untyped objects.
+Next, create three more variables to store the dynamic records after the conversion: TargetDynamicValue, SubordinateDynamicValue, and UpdateContextDynamicValue. To convert, use the ParseJSON(JSON()) function on the original variables. This action transforms the Power Fx records into dynamic values.
```power-fx
-Set (TargetUntypedObject, ParseJSON(JSON(TargetObject)));
-Set (SubordinateUntypedObject, ParseJSON(JSON(SubordinateObject)));
-Set (UpdateContextUntypedObject, ParseJSON(JSON(UpdateContextObject)));
+Set (TargetDynamicValue, ParseJSON(JSON(TargetObject)));
+Set (SubordinateDynamicValue, ParseJSON(JSON(SubordinateObject)));
+Set (UpdateContextDynamicValue, ParseJSON(JSON(UpdateContextObject)));
```
-Lastly, we call the merge action by passing in the necessary parameters, including for both untyped and typed:
+Finally, call the merge action and pass in the necessary parameters for both dynamic and specific types:
```power-fx
-Environment.Merge({Target: TargetUntypedObject, Subordinate: SubordinateUntypedObject, UpdateContent: UpdateContextUntypedObject, PerformParentingChecks: false });
+Environment.Merge({Target: TargetDynamicValue, Subordinate: SubordinateDynamicValue, UpdateContent: UpdateContextDynamicValue, PerformParentingChecks: false });
```
-## Using untyped object returned via an action
-If an **Action** based connector returns an object, its properties can be accessed directly, regardless of whether they've been assigned a type. However, if you intend to use a property for a specific purpose in Power Apps, such as for labeling, you'll need to cast it first.
+## Using dynamic values returned via an action
+
+If an **Action** based connector returns an object, you can access its properties directly, even if they don't have a type. But if you want to use a property for something specific in Power Apps, like labeling, cast it first.
-In the following example, the httpRequest function returns an untyped object that has been previously cast as a Boolean.
+In this example, the `httpRequest` function returns a dynamic value that's already cast as a Boolean.
```power-fx
Set (response, Office365Groups.HttpRequest("/v1.0/me", "GET", ""));
@@ -65,24 +67,25 @@ One of the properties in the response is displayName. It can be accessed, and ca
```power-fx
Text(response.displayName)
```
-Cast to the object **Text** to use it in a Power Apps label control.
+Cast to the object **Text** to use it in a Power Apps label control.
## Working with Dynamic fields
-Action responses now capture dynamic output, and you can utilize the method described above to access these properties. Additionally, working with dynamic input fields is also possible.
+Action responses now capture dynamic output, and you can use the method described above to access these properties. You can also work with dynamic input fields.
-Consider the 'GetMessageDetails' action in Microsoft Teams that has a dynamic input body parameter. Previously, this parameter could not be viewed or specified. With the recent update, you can set a variable called 'body' with the appropriate Power Fx record structure.
+Consider the `GetMessageDetails` action in Microsoft Teams, which has a dynamic input `body` parameter. Previously, you couldn't view or specify this parameter. With the recent update, set a variable called `body` with the appropriate Power Fx record structure.
```power-fx
-Set ( body, ParseJSON(JSON( {recipient: { groupID: “7f733b36-7c7f-4f4c-9699-0a7b7a2b3897”, channelID: “19: 085d522328fb4a439220641006f7f25@thread.tacv2”}}));
+Set ( body, ParseJSON(JSON( {recipient: { groupID: “7f733b36-7c7f-4f4c-9699-0a7b7a2b3897”, channelID: “19: 085d522328fb4a439220641006f7f25@thread.tacv2”}})));
```
Then, we can call the GetMessageDetails action and assign the response to the teamsResponse variable.
```power-fx
Set (teamsResponse, MicrosoftTeams.GetMessageDetails ( 1661365068558, “channel”, body ));
```
-## Converting formulas that return untyped objects that previously returned Boolean.
-Power Fx takes a limited number of untyped objects so explicit conversion may be necessary for your formula. In particular, if your formula depends on a Boolean response then you will need to convert. If you need to simply know if an error exists, you can use the IsError function:
+## Converting formulas that return dynamic values that previously returned Boolean
+
+Power Fx takes a limited number of dynamic values so explicit conversion may be necessary for your formula. In particular, if your formula depends on a Boolean response then you need to convert. If you need to simply know if an error exists, you can use the IsError function:
```power-fx
If(
@@ -90,7 +93,7 @@ If(
Notify("An Outlook appointment could not be found or could not be deleted")
)
```
-To access error information that is exclusively available through IfError, you must transform the untyped object into a valid type using a conversion function such as Boolean, Text, or Value. These functions will produce an error if they are given one. The following example, illustrates this:
+To access error information that is exclusively available through IfError, you must transform the dynamic value into a specific type using a conversion function such as Boolean, Text, or Value. These functions will produce an error if they are given one. The following example, illustrates this:
```power-fx
With({result: Office365Outlook.CalendarDeleteItemV2("Calendar", 1)},
diff --git a/powerapps-docs/maker/canvas-apps/working-with-variables.md b/powerapps-docs/maker/canvas-apps/working-with-variables.md
index 7f33c9e524..afbe3c30e3 100644
--- a/powerapps-docs/maker/canvas-apps/working-with-variables.md
+++ b/powerapps-docs/maker/canvas-apps/working-with-variables.md
@@ -6,7 +6,7 @@ author: gregli-msft
ms.topic: how-to
ms.custom: canvas
ms.reviewer: mkaur
-ms.date: 01/25/2025
+ms.date: 07/30/2025
ms.subservice: canvas-maker
ms.author: gregli
search.audienceType:
@@ -184,6 +184,24 @@ Then you can simply use **Radius** anywhere that you can use a number, and it wi
If you give a context variable the same name as a global variable or a collection, the context variable takes precedence. However, you can still reference the global variable or collection if you use the [disambiguation operator](functions/operators.md#disambiguation-operator) **[@Radius]**.
+### Reserved variable names
+
+Avoid using any of the following variable names. These are names of app properties and using them can cause variable-name collisions that result in unexpected app behavior.
+
+- ActiveScreen
+- DesignHeight
+- DesignWidth
+- Height
+- MinScreenHeight
+- MinScreenWidth
+- SizeBreakpoints
+- StudioVersion
+- TestCaseId
+- Testing
+- TestSuiteId
+- Theme
+- Width
+
## Use a context variable
Let's look at how our adding machine would be created using a context variable instead of a global variable.
diff --git a/powerapps-docs/maker/common/ai-app-descriptions-faq.md b/powerapps-docs/maker/common/ai-app-descriptions-faq.md
index 12f312e944..33bf7efe1a 100644
--- a/powerapps-docs/maker/common/ai-app-descriptions-faq.md
+++ b/powerapps-docs/maker/common/ai-app-descriptions-faq.md
@@ -2,6 +2,7 @@
title: FAQ for generate app descriptions with Copilot
description: FAQ that discusses generating app descriptions with Copilot and the key considerations for making use of this technology responsibly.
ms.date: 05/28/2025
+ms.update-cycle: 180-days
ms.custom:
- transparency-note
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faq-agent-api-component.md b/powerapps-docs/maker/common/faq-agent-api-component.md
new file mode 100644
index 0000000000..2a92525488
--- /dev/null
+++ b/powerapps-docs/maker/common/faq-agent-api-component.md
@@ -0,0 +1,51 @@
+---
+title: FAQ for Agent APIs and Agent Response component in model-driven apps
+description: This FAQ provides information about the AI technology used in model-driven apps, along with key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
+ms.date: 06/18/2025
+ms.custom:
+ - responsible-ai-faqs
+ms.topic: article
+author: adrianorth
+ms.author: aorth
+ms.reviewer: jdaly
+---
+
+# FAQ for Agent APIs and Agent Response component
+
+These frequently asked questions (FAQ) describe the AI impact of Agent APIs feature in model-driven apps.
+
+## What is Agent APIs and Agent Response component?
+
+Microsoft Power Apps has introduced APIs and code components designed to interface with the topics created within Microsoft Copilot Studio (MCS) from model-driven apps. These APIs are available as XRM and PCF. The code component is available in the Form Designer to be added to forms.
+
+## What are capabilities of the Agent APIs and Agent Response component?
+
+The new APIs can either call a specific topic in MCS or send a prompt that MCS orchestrates. The response from both APIs is a JSON structure the caller can use within their model driven app. The APIs are available for use in the Xrm events of model driven apps and also use within custom PCF control.
+
+The Agent Response component provides a simplified component to call the Agent API with a topic for MCS. The component renders the results of the MCS response in the form.
+
+## What is the intended use of the Agent APIs and Agent Response component?
+
+The APIs are intended to allow customization of model driven apps to include application calls to MCS and allow the results to be integrated into the app. It provides a simplified process to call MCS.
+
+## How was Agent APIs and Agent Response component evaluated? What metrics are used to measure performance?
+
+In our evaluations, we look at how accurately the response is from MCS. MCS responses are evaluated for satisfying Microsoft's responsible AI principles.
+
+## What are the limitations of Agent APIs and Agent Response component? How can users minimize the impact of the Agent APIs limitations when using the system?
+
+The APIs and component are optional for makers to use and makers need to consider how best to use the APIs and component within their customizations.
+
+## What operational factors and settings allow for effective and responsible use of the feature?
+
+Makers are required to ensure that the MCS topics are returning accurate and appropriate responses. Makers using the API are responsible to handle the response as part of their customization.
+
+In addition, makers are strongly encouraged to indicate to users where AI has been used in the user experience. This is like how Microsoft shows "AI-generated content may be incorrect".
+
+## See also
+
+- [Bring intelligence into your component using Agent Xrm APIs (preview)](../../developer/component-framework/bring-intelligence-using-agent-apis.md)
+- [Bring intelligence into your app using Agent Xrm APIs (preview)](../../developer/model-driven-apps/clientapi/bring-intelligence-using-agent-apis.md)
+- [Use Agent Response component in the model-driven app forms (preview)](../model-driven-apps/form-designer-add-configure-agent-response.md)
+
+[!INCLUDE [footer-banner](../../includes/footer-banner.md)]
diff --git a/powerapps-docs/maker/common/faq-agent-builder.md b/powerapps-docs/maker/common/faq-agent-builder.md
index 3e91e1020f..ab75c5262b 100644
--- a/powerapps-docs/maker/common/faq-agent-builder.md
+++ b/powerapps-docs/maker/common/faq-agent-builder.md
@@ -2,6 +2,7 @@
title: FAQ about agent builder in canvas apps (preview)
description: This FAQ provides information about the AI technology used in agent builder with key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
ms.date: 4/28/2025
+ms.update-cycle: 180-days
author: noazarur-microsoft
ms.author: noazarur
ms.reviewer: mkaur
diff --git a/powerapps-docs/maker/common/faq-copilot-control.md b/powerapps-docs/maker/common/faq-copilot-control.md
index c25c4fd789..2ee3f94c82 100644
--- a/powerapps-docs/maker/common/faq-copilot-control.md
+++ b/powerapps-docs/maker/common/faq-copilot-control.md
@@ -2,6 +2,7 @@
title: FAQ for Copilot in canvas apps
description: FAQ for Copilot in canvas apps.
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.custom:
- transparency-note
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faq-field-suggestions.md b/powerapps-docs/maker/common/faq-field-suggestions.md
index 8942045907..a833a9a981 100644
--- a/powerapps-docs/maker/common/faq-field-suggestions.md
+++ b/powerapps-docs/maker/common/faq-field-suggestions.md
@@ -2,6 +2,7 @@
title: FAQs for field suggestions by Copilot
description: These FAQs provide information about the AI technology that uses to get field suggestions by Copilot, along with key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faq-filter-with-copilot.md b/powerapps-docs/maker/common/faq-filter-with-copilot.md
index d76d1c0c85..4f5bb29a7e 100644
--- a/powerapps-docs/maker/common/faq-filter-with-copilot.md
+++ b/powerapps-docs/maker/common/faq-filter-with-copilot.md
@@ -2,6 +2,7 @@
title: FAQ on filtering, sorting, and searching Power Apps galleries with Copilot
description: This FAQ outlines how AI filters, sorts, and searches Power Apps galleries with Copilot, addressing its usage, testing, evaluation, and limitations.
ms.date: 05/25/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faq-from-filling-assistance.md b/powerapps-docs/maker/common/faq-from-filling-assistance.md
index f03092aa16..0d1d7bc3f0 100644
--- a/powerapps-docs/maker/common/faq-from-filling-assistance.md
+++ b/powerapps-docs/maker/common/faq-from-filling-assistance.md
@@ -2,6 +2,7 @@
title: FAQ about form fill assistance
description: This FAQ provides information about the AI technology used in the form fill assistance feature with key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
ms.date: 05/28/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faq-generative-pages-model-driven.md b/powerapps-docs/maker/common/faq-generative-pages-model-driven.md
new file mode 100644
index 0000000000..378d3d434b
--- /dev/null
+++ b/powerapps-docs/maker/common/faq-generative-pages-model-driven.md
@@ -0,0 +1,54 @@
+---
+title: FAQ about generative pages in model-driven apps
+description: This FAQ provides information about the AI technology used in the generative pages feature with key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
+ms.date: 07/10/2025
+ms.custom:
+ - responsible-ai-faqs
+ms.topic: faq
+author: jasongre
+ms.author: jasongre
+ms.reviewer: matp
+ms.collection:
+ - bap-ai-copilot
+---
+# FAQ about generative pages in model-driven apps
+
+These frequently asked questions (FAQ) describe the AI impact of generative pages in model-driven apps.
+
+## What are generative pages?
+
+Generative pages simplify the app design process for model-driven app makers through AI code generation. By describing their needs in natural language, makers can create fully structured pages in their apps. The system processes these requirements and intelligently generates React code that covers both the frontend user experience and business logic, ensuring modern, consumer-grade UI experiences for enterprise applications. Makers must publish these pages before they're available to users in apps.
+
+## What can you do with generative pages?
+
+With generative pages, makers can create and refine app pages in real time through an interactive, conversational experience. They can adjust elements, layout, and functionality to perfectly match their vision. This capability helps ensure designs adhere to best practices and deliver high-quality user experiences, making the app development process more efficient and intuitive. When makers are satisfied with the generated page, they can publish them so they're available when playing the app.
+
+## What is the intended use of generative pages?
+
+The intended use of generative pages is to streamline the app design process for model-driven app makers. By leveraging AI to generate React code based on natural language descriptions, makers can quickly create pages that meet their specific requirements. This tool is designed to enhance productivity and ensure that app designs are both functional and visually appealing.
+
+## How were generative pages evaluated? What metrics are used to measure performance?
+
+In our evaluations, we measure how often the agent can generate syntactically correct code, and we also test how good the code generation is in terms of UX design and meeting functional requirements. Moreover, the agent is evaluated for satisfying Microsoft’s responsible AI principles.
+
+## What are the limitations of generative pages? How can users minimize the impact of generative page limitations when using the system?
+
+The current limitations of generative pages include:
+
+- Pages can only connect to Dataverse tables and perform CRUD operations.
+- There's no ability to manually edit the generated code.
+- Generated pages can't be moved between environments.
+- Must add all needed Dataverse tables in the first prompt.
+- Generative pages are only available in US environments and are not to be used in production systems yet.
+
+Makers can minimize the impact of these limitations by testing any generated code before publishing it to users.
+
+## What operational factors and settings allow for effective and responsible use of generative pages?
+
+Effective and responsible use of generative pages involves setting clear guidelines for app design requirements and ensuring that makers provide comprehensive descriptions. Regular training on best practices for using the tool and monitoring its performance can help maintain high standards. Additionally, incorporating user feedback and continuously improving the system based on real-world usage can enhance its effectiveness.
+
+Makers are always required to publish generative pages before they're made available to users. Extensive testing of any code before making it available to users in an app is always encouraged.
+
+## Related articles
+
+[Describe a page using natural language](../model-driven-apps/generative-pages.md)
diff --git a/powerapps-docs/maker/common/faq-plan-designer.md b/powerapps-docs/maker/common/faq-plan-designer.md
index 8d7de5e284..d4a03bf815 100644
--- a/powerapps-docs/maker/common/faq-plan-designer.md
+++ b/powerapps-docs/maker/common/faq-plan-designer.md
@@ -6,7 +6,8 @@ contributors: mduelae
ms.custom:
- responsible-ai-faqs
ms.topic: faq
-ms.date: 5/28/2025
+ms.date: 6/19/2025
+ms.update-cycle: 180-days
ms.author: norliu
ms.reviewer: mkaur
ms.collection:
@@ -37,12 +38,9 @@ We evaluate the feature both qualitatively and quantitatively. To check quality,
- To use this capability, you need a Microsoft Dataverse database in your environment.
- This capability is powered by Azure OpenAI Service.
-- This capability is rolling out and might not be available in your region yet.
- This capability can be subject to usage limits or capacity throttling.
- This feature lets you use a maximum input size of 4,000 tokens, including both text and images (about 3,000 words if your input only has text).
-- This feature is generally available and is still rolling out so it might not be available in your region yet. Confirm that this feature is available in your region. Learn more in [Explore Copilot features by geography and languages](https://releaseplans.microsoft.com/availability-reports/?report=copilotfeaturereport).
-
-
+
## What operational factors and settings allow for effective and responsible use of the Plan designer?
- Use these tips to get the most out of this feature:
@@ -54,7 +52,8 @@ We evaluate the feature both qualitatively and quantitatively. To check quality,
## How do I provide feedback on the Plan designer?
-- Select the Thumbs button in the Plan designer to give feedback. Add details to help us understand your feedback.
+- Select the thumbs up or thumbs down in the plan document to provide feedback on a specific section.
+- Select the **Give feedback** icon in the command bar to provide general feedback on the Plan designer experience.
### See also
[Overview of Plan designer](../plan-designer/plan-designer.md)
diff --git a/powerapps-docs/maker/common/faq-rename-control.md b/powerapps-docs/maker/common/faq-rename-control.md
index 8192f7b94c..986c4f82c2 100644
--- a/powerapps-docs/maker/common/faq-rename-control.md
+++ b/powerapps-docs/maker/common/faq-rename-control.md
@@ -2,6 +2,7 @@
title: FAQ for rename controls in canvas apps with Copilot
description: FAQ that discusses renaming canvas apps controls with Copilot.
ms.date: 5/25/2025
+ms.update-cycle: 180-days
ms.custom:
- transparency-note
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faq-visualize-view.md b/powerapps-docs/maker/common/faq-visualize-view.md
index 360ca08e80..dc349ab5d2 100644
--- a/powerapps-docs/maker/common/faq-visualize-view.md
+++ b/powerapps-docs/maker/common/faq-visualize-view.md
@@ -2,6 +2,7 @@
title: FAQ about Copilot visualizations on a view (preview)
description: This FAQ provides information about the AI technology used in visualizing data in a view with key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
ms.date: 05/28/2025
+ms.update-cycle: 180-days
author: sriharibs-msft
ms.author: srihas
reviewer: shwetamurkute
diff --git a/powerapps-docs/maker/common/faqs-build-apps-conversation.md b/powerapps-docs/maker/common/faqs-build-apps-conversation.md
index 922253464d..f2e1a47344 100644
--- a/powerapps-docs/maker/common/faqs-build-apps-conversation.md
+++ b/powerapps-docs/maker/common/faqs-build-apps-conversation.md
@@ -2,6 +2,7 @@
title: FAQ for building apps and tables through conversation
description: FAQ that discusses building apps through conversation and the key considerations for making use of this technology responsibly.
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faqs-copilot-model-driven-app.md b/powerapps-docs/maker/common/faqs-copilot-model-driven-app.md
index b5b07c46a1..69e633c11b 100644
--- a/powerapps-docs/maker/common/faqs-copilot-model-driven-app.md
+++ b/powerapps-docs/maker/common/faqs-copilot-model-driven-app.md
@@ -2,6 +2,7 @@
title: FAQ for Copilot chat in model-driven apps
description: FAQ that discusses model-driven apps with Copilot chat and the key considerations for making use of this technology responsibly.
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.custom:
- transparency-note
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faqs-copilot-panel.md b/powerapps-docs/maker/common/faqs-copilot-panel.md
index c99a954df8..5bf085f74c 100644
--- a/powerapps-docs/maker/common/faqs-copilot-panel.md
+++ b/powerapps-docs/maker/common/faqs-copilot-panel.md
@@ -2,6 +2,7 @@
title: FAQ for edit your app with Copilot
description: FAQ that discusses continuing to edit your app with Copilot and the key considerations for making use of this technology responsibly.
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.custom:
- transparency-note
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faqs-copilot-powerfx.md b/powerapps-docs/maker/common/faqs-copilot-powerfx.md
index e6f84ecafb..4d60bab326 100644
--- a/powerapps-docs/maker/common/faqs-copilot-powerfx.md
+++ b/powerapps-docs/maker/common/faqs-copilot-powerfx.md
@@ -2,6 +2,7 @@
title: FAQs about using Copilot with Power Fx
description: FAQ that discusses Copilot and Power Fx
ms.date: 5/28/2025
+ms.update-cycle: 180-days
ms.custom:
- transparency-note
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faqs-email-assist-rte.md b/powerapps-docs/maker/common/faqs-email-assist-rte.md
index 0ab7f3baac..5703ef9f46 100644
--- a/powerapps-docs/maker/common/faqs-email-assist-rte.md
+++ b/powerapps-docs/maker/common/faqs-email-assist-rte.md
@@ -2,6 +2,7 @@
title: FAQ about using Copilot in the rich text editor
description: Learn how to effectively and responsibly use Copilot in the rich text editor to generate tailored responses to your customers with AI assistance.
ms.date: 05/28/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
- ai-gen-docs-bap
diff --git a/powerapps-docs/maker/common/faqs-excel-to-table-app.md b/powerapps-docs/maker/common/faqs-excel-to-table-app.md
index 5d950a29aa..47a6782812 100644
--- a/powerapps-docs/maker/common/faqs-excel-to-table-app.md
+++ b/powerapps-docs/maker/common/faqs-excel-to-table-app.md
@@ -2,6 +2,7 @@
title: FAQ for Excel to table and app
description: This FAQ provides information about the AI technology that's used in Excel to table and app. This FAQ also includes key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
ms.date: 05/28/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
ms.topic: faq
diff --git a/powerapps-docs/maker/common/faqs-sharepoint-list-to-table-app.md b/powerapps-docs/maker/common/faqs-sharepoint-list-to-table-app.md
index 6cd0bbd856..1500a31333 100644
--- a/powerapps-docs/maker/common/faqs-sharepoint-list-to-table-app.md
+++ b/powerapps-docs/maker/common/faqs-sharepoint-list-to-table-app.md
@@ -2,6 +2,7 @@
title: FAQ for SharePoint List to table and app
description: This FAQ provides information about the AI technology that's used in SharePoint List to table and app. This FAQ also includes key considerations and details about how AI is used, how it was tested and evaluated, and any specific limitations.
ms.date: 05/28/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
ms.topic: faq
diff --git a/powerapps-docs/maker/common/responsible-ai-overview.md b/powerapps-docs/maker/common/responsible-ai-overview.md
index b7b61f6f9b..1dc7477a9f 100644
--- a/powerapps-docs/maker/common/responsible-ai-overview.md
+++ b/powerapps-docs/maker/common/responsible-ai-overview.md
@@ -1,7 +1,8 @@
---
title: FAQ about using AI responsibly in Power Apps
description: Find FAQ about how to use copilot AI responsibly with Power Apps to build apps through conversation, generate app descriptions, edit apps, and more.
-ms.date: 05/06/2025
+ms.date: 06/18/2025
+ms.update-cycle: 180-days
ms.custom:
- responsible-ai-faqs
- ai-gen-docs-bap
@@ -50,5 +51,9 @@ ms.collection:
- [Build an agent to automate your business process (preview)](../canvas-apps/agent-builder.md)
- [FAQ for the Plan designer](faq-plan-designer.md)
- [Overview of Plan designer](../plan-designer/plan-designer.md)
-- [FAQ for rename controls in canvas apps with Copilot ](faq-rename-control.md)
+- [FAQ for rename controls in canvas apps with Copilot](faq-rename-control.md)
- [Rename controls in canvas apps with Copilot (preview)](../canvas-apps/controls/copilot-rename-controls.md)
+- [FAQ for Agent APIs](faq-agent-api-component.md)
+- [Bring intelligence into your component using Agent Xrm APIs (preview)](../../developer/component-framework/bring-intelligence-using-agent-apis.md)
+- [Bring intelligence into your app using Agent Xrm APIs (preview)](../../developer/model-driven-apps/clientapi/bring-intelligence-using-agent-apis.md)
+- [Use Agent Response component in the model-driven app forms (preview)](../model-driven-apps/form-designer-add-configure-agent-response.md)
\ No newline at end of file
diff --git a/powerapps-docs/maker/common/wrap/code-sign-aab-file.md b/powerapps-docs/maker/common/wrap/code-sign-aab-file.md
new file mode 100644
index 0000000000..341a42cb9f
--- /dev/null
+++ b/powerapps-docs/maker/common/wrap/code-sign-aab-file.md
@@ -0,0 +1,61 @@
+---
+title: Code signing process for AAB files
+description: Learn how to manually code sign in Android App Bundle (AAB) files and convert them to APKs for debugging, including required tools and step-by-step commands.
+author: komala2019
+contributors:
+ms.topic: how-to
+ms.date: 06/05/2025
+ms.author: koagarwa
+ms.reviewer: smurkute
+ms.subservice: canvas-maker
+ms.custom: canvas
+search.audienceType:
+ - maker
+---
+# Code signing process for AAB file
+
+This article explains how to manually code sign an AAB file.
+
+## Prerequisite
+
+1. Set up [Android Studio](https://developer.android.com/studio).
+
+1. Install bundletool for converting AAB file to APK file. You can download the latest version from the [official site](https://github.com/google/bundletool/releases).
+
+1. Install jarsigner for signing in the AAB file. You can install jarsigner by downloading and setting up the [Java Development Kit (JDK)](https://www.oracle.com/java/technologies/javase-downloads.html).
+
+## Signing process for AAB file
+
+> [!NOTE]
+> You need to sign the AAB file even if you select the automatic signing process in the wrap wizard.
+
+To sign an AAB file, follow these steps:
+
+1. Open a terminal or command prompt.
+1. Go to the directory where `jarsigner` is installed.
+1. Run the commands shown in the image.
+ :::image type="content" source="media/code-sign-aab-file/jarsigner-code.png" alt-text="Screenshot of command prompt showing jarsigner usage for AAB file.":::
+ Replace the placeholders:
+ - `.jks` – Path to your .jks keystore file
+ - `.aab` – Output file name.
+ - `.aab` – Unsigned .aab file.
+ - `` – Bundle ID used while wrapping.
+
+## Convert AAB to APK file for manual debugging
+
+To convert an AAB file to an APK file, follow these steps:
+
+1. Open a terminal or command prompt.
+2. Run the commands shown in the screenshot.
+ :::image type="content" source="media/code-sign-aab-file/java-code.png" alt-text="Screenshot of command prompt showing java code for AAB file.":::
+ Replace the placeholders:
+ - `.aab` – Path to the signed AAB file.
+ - `` – Output directory for the .apks file.
+
+- Sign the APK if you use the manual signing process. For more information, see [Code sign for Android - Power Apps](/power-apps/maker/common/wrap/code-sign-android#manual-sign-the-apk-package).
+
+
+## See also
+
+- [Manual code sign for iOS](code-sign-ios.md)
+- [Manual code sign for Android](code-sign-android.md)
\ No newline at end of file
diff --git a/powerapps-docs/maker/common/wrap/code-sign-android.md b/powerapps-docs/maker/common/wrap/code-sign-android.md
index 08542a475b..bd62a0b04c 100644
--- a/powerapps-docs/maker/common/wrap/code-sign-android.md
+++ b/powerapps-docs/maker/common/wrap/code-sign-android.md
@@ -14,146 +14,189 @@ contributors:
- mduelae
---
-# Code sign for Android
+# Code sign for Android
-In this article, you'll learn about how to manually code sign for Android (APK). You need to sign your app for Android if you selected Android as one of the [platforms](overview.md#app-platforms) while creating and building your [wrap project](wrap-how-to.md#create-custom-branded-native-power-apps-for-ios-and-android-using-the-wrap-wizard).
+This article explains how to manually code sign your Android (APK) app for Power Apps wrap. Sign your app for Android if you select Android as one of the [platforms](overview.md#app-platforms) when you create and build your [wrap project](wrap-how-to.md#steps-to-create-a-custom-branded-native-app-using-the-wrap-wizard).
> [!IMPORTANT]
-> If you'd like to sign an AAB app for Google Play distribution instead, refer to [Sign your app](https://developer.android.com/studio/publish/app-signing).
+> To sign an AAB app for Google Play distribution, see [Sign your app](https://developer.android.com/studio/publish/app-signing).
-## Prepare your PC
+## Before you begin
-You need the following information to get started:
+### Required software
-- Set up [Android Studio](https://developer.android.com/studio)
-- Set up [OpenSSL](https://slproweb.com/products/Win32OpenSSL.html)
-- Set up [apksigner tool](https://developer.android.com/studio/command-line/apksigner)
+Before you begin, install and set up:
-## Prerequisites
+- [Android Studio](https://developer.android.com/studio)
+- [OpenSSL](https://slproweb.com/products/Win32OpenSSL.html)
+- [apksigner tool](https://developer.android.com/studio/command-line/apksigner) (included with Android Studio)
-- Application name for creating the hash key.
-- Latest APK file for signing in process.
+### Prerequisites
-## Generate keys
+You need:
+- The application name to create the hash key.
+- The latest APK file to sign in.
> [!NOTE]
-> Skip to [sign the APK package](#manual-sign-the-apk-package) if you've already generated keys and signature hash while creating the [app registration](wrap-how-to.md#step-3-register-app).
+> Use the `.jks` extension for manual signing and the `.pfx` extension for automatic signing.
-We'll use **keytool.exe** (available after installing Android Studio, from the folder location "Drive:\Program Files\Android\Android Studio\jre\bin\keytool.exe") to create a certificate to sign the application package. Keytool is used to manage a keystore (database) of cryptographic keys, X.509 certificate chains, and trusted certificates.
+## Generate key and signature hash
-If you don't have environment variables, open a command prompt and run the following command to generate a key:
+> [!NOTE]
+> Skip to [Manual signing](#manual-signing-of-apk-package-not-for-kv-signing) if you already generated keys and the signature hash when you created the [app registration](wrap-how-to.md#4-register-your-app).
-1. Download Android Studio, openssl
-2. Add keytool and openssl as environment variable. Add C:\Program Files\Android\Android Studio\jbr\bin as env variable. Add path of openssl.exe in environment variable (C:\Program Files\OpenSSL-Win64\bin)
-3. Run this command---keytool -genkey -alias powerappswrap -keyalg RSA -keystore powerappswrap.jks -keysize 2048 -validity 10000
-Generate Keys
-4. Run this command in cmd - keytool -exportcert -alias powerappswrap -keystore powerappswrap.jks | openssl sha1 -binary | openssl base64
-Generate Signature Hash
+### Set up environment variables
-:::image type="content" source="media/code-sign-android/codeSignIn3.png" alt-text="A screenshot with keytool command using the parameters in the example shown above." lightbox="media/code-sign-android/codeSignIn3.png":::
+If you don't set environment variables:
+1. Download and install Android Studio and OpenSSL.
+1. Add `keytool` and `openssl` to your PATH environment variable:
+ - Add `C:\Program Files\Android\Android Studio\jbr\bin` to your PATH.
+ - Add the path of `openssl.exe` (for example, `C:\Program Files\OpenSSL-Win64\bin`) to your PATH.
-If you have environment variables, open a command prompt and run the following command to generate a key:
-`keytool -genkey -alias SIGNATURE_ALIAS -keyalg RSA -keystore PATH_TO_KEYSTORE -keysize 2048 -validity 10000`
+## **For manual signing process**
+### Generate signature hash key and certificate
+Run this command in the command prompt:
-Parameters:
+```
+keytool -genkey -alias powerappswrap -keyalg RSA -keystore powerappswrap.jks -keysize 2048 -validity 10000
+```
-- **genkey** - command to generate a key.
-- **alias** - indicates the alias to be used in the future to refer to the keystore entry containing the keys that are generated.
-- **keyalg** - key algorithm name.
-- **keystore** - the name of the keystore you're using.
-- **keysize** - the size of each key to be generated.
-- **validity** - validity of the key in number of days.
+When prompted:
+1. Enter a password for your keystore.
+1. Enter your name, organization, location, and other required details.
+1. Confirm the information.
-Example:
-- If preparing Key Vault, PATH_TO_KEYSTORE should have .pfx extension.
+Run this command to generate key and certificate:
- `keytool -genkey -alias powerappswrap -keyalg RSA -keystore powerappswrap.pfx -keysize 2048 -validity 10000`
+```
+keytool -exportcert -alias powerappswrap -keystore powerappswrap.jks | openssl sha1 -binary | openssl base64
+```
-- If preparing for manual signing, PATH_TO_KEYSTORE should have .jks extension.
+When prompted, enter the keystore password you created earlier.
- `keytool -genkey -alias powerappswrap -keyalg RSA -keystore \Users\name\Desktop\powerappswrap.jks -keysize 2048 -validity 10000`
+:::image type="content" source="media/code-sign-android/codeSignIn3.png" alt-text="A screenshot with keytool command using the parameters in the example shown earlier." lightbox="media/code-sign-android/codeSignIn3.png":::
-:::image type="content" source="media/code-sign-android/codeSignIn1.png" alt-text="A screenshot with keytool command using the parameters in the above example." lightbox="media/code-sign-android/codeSignIn1.png":::
+**Parameters explained:**
-## Generate signature hash
+| Parameter | Description |
+|-----------|-------------|
+| **genkey** | Command to generate a key |
+| **alias** | Alias for the keystore entry |
+| **keyalg** | Key algorithm name |
+| **keystore** | Name of the keystore |
+| **keysize** | Size of each key |
+| **validity** | Validity of the key in days |
+| **exportcert** | Reads the certificate from the keystore |
+| **openssl** | Generates SHA1 key for Android |
-> [!NOTE]
-> Skip to [sign the APK package](#manual-sign-the-apk-package) if you've already generated keys and signature hash while creating the [app registration](wrap-how-to.md#step-3-register-app).
+## **For automatic key vault signing process**
+
+### Generate signature hash key and certificate
-After generating the key, the **exportcert** command is used in **keytool** to export the keystore certificate.
+Run this command in the command prompt:
-`keytool -exportcert -alias SIGNATURE_ALIAS -keystore PATH_TO_KEYSTORE | openssl sha1 -binary | openssl base64`
+```
+keytool -genkey -alias powerappswrap -keyalg RSA -keystore powerappswrap.pfx -keysize 2048 -validity 10000
+```
-Parameters:
+When prompted:
+1. Enter a password for your keystore.
+1. Enter your name, organization, location, and other required details.
+1. Confirm the information.
-- **exportcert** - reads from the keystore the certificate associated with alias and stores it in the cert_file file. When no file is specified, the certificate is output to stdout.
-- **alias** - the alias used while generating keys [earlier](#generate-keys).
-- **keystore** - the name of the keystore you're using.
-- **openssl** - generates SHA1 key for Android.
+Run this command to generate key and certificate:
-Add the generated signature hash in the **Redirect URI** while [registering the app](wrap-how-to.md#step-3-register-app).
+```
+keytool -exportcert -alias powerappswrap -keystore powerappswrap.pfx | openssl sha1 -binary | openssl base64
+```
-### Convert SHA1 hex to Base64-encoded signature hash manually
+When prompted, enter the keystore password you created earlier.
-You might see the following error if your signature hash isn't correctly encoded or unacceptable in the Azure portal:
+:::image type="content" source="media/code-sign-android/codeSignIn3.png" alt-text="Screenshot of keytool command using the parameters in the example shown earlier." lightbox="media/code-sign-android/codeSignIn3.png":::
-"The signature hash must be base64-encoded SHA1."
+**Parameters explained:**
-When this error appears, try to generate the signature hash using the following steps instead:
+| Parameter | Description |
+|-----------|-------------|
+| **genkey** | Generates a key. |
+| **alias** | Alias for the keystore entry. |
+| **keyalg** | Key algorithm name. |
+| **keystore** | Name of the keystore. |
+| **keysize** | Size of each key. |
+| **validity** | Validity of the key in days. |
+| **exportcert** | Reads the certificate from the keystore |
+| **openssl** | Generates SHA1 key for Android |
-1. Run `keytool -list -v -alias SIGNATURE_ALIAS -keystore PATH_TO_KEYSTORE` to list the certificate information in verbose mode.
-1. Copy the **SHA1** value under the **Certificate fingerprints** section from the output. Ensure that you only copy the hexadecimal value.
-
For example: `EF:11:45:3D:F1:72:D9:8C:43:32:CD:0A:49:C2:E4:75:2D:B3:2D:9F`
-1. Use any available "Hexadecimal to Base64" converter to convert the copied certificate fingerprint hexadecimal value into Base64 encoded value.
-
Example of the Base64 encoded value: `8CPPeLaz9etdqQyaQubcqsy2Tw=`
-1. Copy the generated Base64 encoded value as the **Signature hash** in the Azure portal while [registering the app](wrap-how-to.md#step-3-register-app).
-## Manual sign the APK package
+## Manual signing of APK package (Not for KV signing)
-> [!Note]
-> These steps are required if you haven't wrapped the app using automatic sign-in or are trying to upload an AAB file for Play Store. To avoid repeating this step, we recommend using automatic sign-in.
+Follow these steps if you don't use automatic sign-in during wrap or if you try to upload an AAB file for Play Store. To avoid repeating this process, use automatic sign-in when possible.
-To sign the APK package, we'll use the [apksigner tool](https://developer.android.com/studio/command-line/apksigner). This tool allows you to sign APKs and ensure that the APK package signature are verified successfully on all Android platforms supported by the APKs.
+### Locate the apksigner tool
-### Find your apksigner
+1. Open Android Studio.
+1. Go to **Tools** > **SDK Manager** > **Android SDK Location** to find your SDK path.
+1. In the SDK directory, navigate to:
+ - **build-tools** > **[version number]** > find **apksigner.bat** (Windows) or **apksigner** (Mac/Linux)
+ - Or: **build-tools** > **[version number]** > **lib** > find **apksigner.jar**
-1. Check the Android SDK path in the Android Studio.
-1. Select **Tool** > **SDK Manager** > **Android SDK Location**.
+:::image type="content" source="media/code-sign-android/codeSignIn2.png" alt-text="A screenshot with apksigner location information." lightbox="media/code-sign-android/codeSignIn2.png":::
- If using iOS, check the apksigner file from the **buildTools Version** directory:
+### Sign the APK file
- Go to **SDK** directory > **build-tools** > **buildToolsVersion** > **lib**, and check the **apksigner.jar** file
+Run this command to sign your APK:
-:::image type="content" source="media/code-sign-android/codeSignIn2.png" alt-text="A screenshot with apksigner location information." lightbox="media/code-sign-android/codeSignIn2.png":::
+```
+apksigner.bat sign --ks PATH_TO_KEYSTORE --ks-key-alias KEY_ALIAS PATH_TO_APK
+```
+
+**Parameters explained:**
-### Use the apksigner file
+| Parameter | Description |
+|-----------|-------------|
+| **ks** | Path to your keystore file (for example, `C:\Users\name\Desktop\powerappswrap.jks`) |
+| **ks-key-alias** | The alias you used when generating the key (for example, `powerappswrap`) |
+| **PATH_TO_APK** | Full path to your APK file (for example, `C:\Users\name\Downloads\MyApp.apk`) |
-Run the following command to use the **apksigner** and sign the package:
+When prompted, enter the keystore password.
-`apksigner.bat sign --ks PATH_TO_KEYSTORE --ks-key-alias KEY_ALIAS PATH_TO_APK`
+**Example:**
+```
+apksigner.bat sign --ks C:\Users\name\Desktop\powerappswrap.jks --ks-key-alias powerappswrap C:\Users\name\Desktop\MyApp.apk
+```
-Parameters:
+### Verify the signature
-- **ks** - path to the keystore.
-- **ks-key-alias** - key alias path to APK file.
+After signing, verify the APK signature with:
+```
+apksigner.bat verify --verbose PATH_TO_APK
+```
-When prompted, enter the password.
+A successful verification confirms your APK is properly signed and ready for distribution.
+
+For more information, see [Android Studio command line tools: apksigner](https://developer.android.com/studio/command-line/apksigner).
-More information: [Android Studio command line tools: **apksigner**](https://developer.android.com/studio/command-line/apksigner)
## Distribute the app
-To distribute using Microsoft Intune, see [Add an Android line-of-business app to Microsoft Intune](/mem/intune/apps/lob-apps-android). To learn about giving an app access to the Intune app protection service, see [Give your app access to the Intune app protection service](/mem/intune/developer/app-sdk-get-started#give-your-app-access-to-the-intune-app-protection-service-optional).
+After signing your app, you can distribute it using several methods:
+
+### Distribution options
+
+- **Microsoft Intune**: To distribute using Microsoft Intune, see [Add an Android line-of-business app to Microsoft Intune](/mem/intune/apps/lob-apps-android).
+- **Intune app protection**: To give your app access to the Intune app protection service, see [Give your app access to the Intune app protection service](/mem/intune/developer/app-sdk-get-started#give-your-app-access-to-the-intune-app-protection-service-optional).
-### See also
+- **Direct distribution**: You can also distribute the signed APK directly to users for manual installation.
+
+
+## See also
- [Wrap overview](overview.md)
- [Manually Signing the APK - Xamarin](/xamarin/android/deploy-test/signing/manually-signing-the-apk)
-- [Manual code sign on iOS](code-sign-ios.md)
-- [Frequently asked questions for wrap](faq.yml)
-- [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps/wrap-issues)
-
+- [Manual code sign on iOS](code-sign-ios.md)
+- [Frequently asked questions for wrap](faq.yml)
+- [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps/wrap-issues)
diff --git a/powerapps-docs/maker/common/wrap/code-sign-ios.md b/powerapps-docs/maker/common/wrap/code-sign-ios.md
index 15a9ced153..7b0b03f4bb 100644
--- a/powerapps-docs/maker/common/wrap/code-sign-ios.md
+++ b/powerapps-docs/maker/common/wrap/code-sign-ios.md
@@ -2,7 +2,7 @@
title: Manual code sign for iOS
description: Learn how to manually code sign for iOS for Power Apps wrap.
author: komala2019
-ms.topic: article
+ms.topic: how-to
ms.custom: canvas
ms.reviewer: smurkute
ms.date: 03/22/2024
@@ -16,192 +16,209 @@ contributors:
# Manual code sign for iOS
-In this article, you'll learn about how to code sign for iOS. You need to sign your app for iOS if you selected iOS as one of the [platforms](overview.md#app-platforms) while creating and building your [wrap project](wrap-how-to.md#create-custom-branded-native-power-apps-for-ios-and-android-using-the-wrap-wizard).
+This article explains how to code sign for iOS. You need to sign your app for iOS if you selected iOS as one of the [platforms](overview.md#app-platforms) while creating and building your [wrap project](wrap-how-to.md#steps-to-create-a-custom-branded-native-app-using-the-wrap-wizard).
- > [!Important]
- > Using Xcode to digitally sign your wrapped mobile apps for iOS is not supported. Follow the instructions below to sign your wrapped mobile app packages for iOS correctly.
+> [!IMPORTANT]
+> Using Xcode to digitally sign your wrapped mobile apps for iOS is not supported. Follow the instructions below to sign your wrapped mobile app packages for iOS correctly.
-## Prerequisites
-You need the following information to get started:
+## Before you begin
-- App ID
-- Device UDIDs (only for testing and development purpose)
+### Prerequisites
-You also need a macOS device to code sign for iOS.
+Before you start, make sure you have:
-## Prepare your Mac
+- App ID
+- Device UDIDs (only for testing and development purposes)
+- A macOS device to code sign for iOS
-Set up your Mac with the following configuration.
+### Set up your Mac
1. Install **Xcode**. More information: [Xcode](https://developer.apple.com/support/xcode/)
-1. Install PowerShell for macOS. More information: [Installing PowerShell on macOS](/powershell/scripting/install/installing-powershell-on-macos)
-1. Enroll in [Apple Developer Program](https://developer.apple.com/programs/)
-1. To distribute your apps within the organization, you need to sign up for [Apple Enterprise Developer Program](https://developer.apple.com/programs/enterprise/).
+2. Install PowerShell for macOS. More information: [Installing PowerShell on macOS](/powershell/scripting/install/installing-powershell-on-macos)
+3. Enroll in the [Apple Developer Program](https://developer.apple.com/programs/)
+4. For organization distribution, sign up for the [Apple Enterprise Developer Program](https://developer.apple.com/programs/enterprise/)
+
## Create App ID
-1. Sign in to your developer account by going to and selecting the **Account** tab.
+1. Sign in to your developer account at and select the **Account** tab.
:::image type="content" source="media/code-sign-ios/account-tab.png" alt-text="Account tab.":::
-1. Go to [**Certificates, IDs & Profiles > Identifiers**](https://developer.apple.com/account/resources/identifiers/list).
+2. Go to [**Certificates, IDs & Profiles > Identifiers**](https://developer.apple.com/account/resources/identifiers/list).
-1. Select **+** to create a new identifier.
+3. Select **+** to create a new identifier.
:::image type="content" source="media/code-sign-ios/identifier.png" alt-text="Create new identifier.":::
-1. Select **App IDs**, and then select **Continue**.
+4. Select **App IDs**, then select **Continue**.
:::image type="content" source="media/code-sign-ios/register-identifier.png" alt-text="Register a new identifier.":::
-1. Select the type as **App**, and then select **Continue**.
+5. Select the type as **App**, then select **Continue**.
-1. Register an **App ID**:
+6. Register an **App ID**:
:::image type="content" source="media/code-sign-ios/register-appid.png" alt-text="Register an App ID.":::
- 1. **Description** - Name of your app.
- 1. **Bundle ID** - select **Explicit Bundle ID**.
- 1. Enter the bundle ID that you used while [creating the wrap project](wrap-how-to.md#step-2-target-platform). More information: [Bundle ID](overview.md#bundle-id)
- 1. Enable the following capabilities:
+ - **Description** - Name of your app.
+ - **Bundle ID** - Select **Explicit Bundle ID**.
+ - Enter the bundle ID that you used while [creating the wrap project](wrap-how-to.md#3-choose-target-platform). More information: [Bundle ID](overview.md#bundle-id)
+ - Enable these capabilities:
- Associated Domains
- iCloud
- NFC Tag Reading
- Push Notifications
- 1. Select **Continue**.
+ - Select **Continue**.
-1. Review, and register the App ID.
+7. Review and register the App ID.
-## Create a distribution certificate
-
-To create a distribution certificate, create a new certificate signing request first.
+## Create distribution certificate
### Create Certificate Signing Request (CSR)
1. On your Mac, go to the **Applications** folder > **Utilities** > open **Keychain Access**.
-1. Select **Keychain Access** > **Certificate Assistant** > **Request a Certificate from a Certificate Authority**.
+2. Select **Keychain Access** > **Certificate Assistant** > **Request a Certificate from a Certificate Authority**.
:::image type="content" source="media/code-sign-ios/cert-req.png" alt-text="Request a certificate from a CA.":::
-1. Fill out the **Certificate Information** as explained below, and then select **Continue**.
- 1. In the **User Email Address** field, enter your Apple ID email address to identify with this certificate.
- 1. In the **Common Name** field, enter your name.
- 1. In the **Request** group, select **Saved to disk**.
- 1. Save the file to your Mac.
+3. Fill out the **Certificate Information**:
+ - In the **User Email Address** field, enter your Apple ID email address.
+ - In the **Common Name** field, enter your name.
+ - In the **Request** group, select **Saved to disk**.
+ - Save the file to your Mac.
+ - Select **Continue**.
-## Create the distribution certificate
+### Upload and install certificate
1. Sign in to your developer account at by selecting the **Account** tab.
-1. Go to [Certificates, IDs & Profiles > Certificates](https://developer.apple.com/account/resources/certificates/list).
+2. Go to [**Certificates, IDs & Profiles > Certificates**](https://developer.apple.com/account/resources/certificates/list).
+
+3. Select **+** to create a new certificate.
- 1. Select **+** to create a new certificate.
- 1. Select **App Store and Ad Hoc** > **Continue**.
+4. Select **App Store and Ad Hoc** > **Continue**.
- 
+ 
- > [!NOTE]
- > If you have an Enterprise Developer Account then you'll have the option to create an Enterprise Distribution certificate.
+ > [!NOTE]
+ > If you have an Enterprise Developer Account, you'll have the option to create an Enterprise Distribution certificate.
-1. Upload the Certificate Signing Request (CSR) file that was generated in the previous steps.
+5. Upload the Certificate Signing Request (CSR) file that you generated in the previous steps.
:::image type="content" source="media/code-sign-ios/upload-cert.png" alt-text="Upload the certificate.":::
-1. Select **Continue**, and download the certificate to your Mac.
+6. Select **Continue**, and download the certificate to your Mac.
+
+7. Double-click the downloaded .cer file to install it in Keychain Access.
-1. Double-click the downloaded .cer file to install to Keychain Access.
+8. Make note of the **Name** of the certificate (usually formatted as **iPhone Distribution: Name (Team ID)**). This value is the code signing identity needed for signing.
-1. Take a note of the **Name** of the certificate (usually like **iPhone Distribution: Name (Team ID)**). This value is the code signing identity that needs to be provided for signing.
-## Add all the devices where the IPA needs to be installed
+## Register devices for testing
- > [!NOTE]
- > This step is only necessary if you're distributing to app to external users. It's not required if the app is only for internal users.
+> [!NOTE]
+> This step is only necessary if you're distributing the app to external users. It's not required if the app is only for internal users.
1. Sign in to your developer account at by selecting the **Account** tab.
-1. Go to [Certificates, IDs & Profiles > Devices](https://developer.apple.com/account/resources/devices/list).
+2. Go to [**Certificates, IDs & Profiles > Devices**](https://developer.apple.com/account/resources/devices/list).
-1. Select **+** to register one or more devices.
+3. Select **+** to register one or more devices.
-1. Enter the **Device Name** and **Device ID (UDID)**.
+4. Enter the **Device Name** and **Device ID (UDID)**.
:::image type="content" source="media/code-sign-ios/register-device.png" alt-text="Register a device.":::
-1. Select **Save**.
+5. Select **Save**.
> [!TIP]
- > You can also register multiple devices together by uploading a list of UDID's.
+ > You can register multiple devices at once by uploading a list of UDIDs.
+
-## Create an iOS Provisioning Profile
+## Create iOS Provisioning Profile
-1. Sign in to your developer account by going to and selecting the **Account** tab.
+1. Sign in to your developer account at and select the **Account** tab.
-1. Go to [**Certificates, IDs & Profiles > Profiles**](https://developer.apple.com/account/resources/profiles/list).
+2. Go to [**Certificates, IDs & Profiles > Profiles**](https://developer.apple.com/account/resources/profiles/list).
-1. Select **+** to create a new profile.
+3. Select **+** to create a new profile.
-1. Select **Ad Hoc** > **Continue**.
+4. Select **Ad Hoc** > **Continue**.
:::image type="content" source="media/code-sign-ios/ad-hoc.png" alt-text="Ad Hoc.":::
> [!NOTE]
- > For production testing and development purpose, use **App Store** distribution method.
+ > For production use, select the **App Store** distribution method.
-1. Select App ID that you created earlier, and then select **Continue**.
+5. Select the App ID you created earlier, then select **Continue**.
:::image type="content" source="media/code-sign-ios/app-id.png" alt-text="App ID.":::
-1. Select the certificate that you created earlier, and then select **Continue**.
+6. Select the certificate you created earlier, then select **Continue**.
:::image type="content" source="media/code-sign-ios/select-cert.png" alt-text="Select certificate.":::
-1. Select all the test devices where you want to install your app, and then select **Continue**.
+7. Select all the test devices where you want to install your app, then select **Continue**.
:::image type="content" source="media/code-sign-ios/add-devices.png" alt-text="Add devices.":::
-1. Review and name the provisioning profile. Note down the name of the provisioning profile.
+8. Name your provisioning profile and note down the name.
-1. Generate and download the profile to your Mac.
+9. Select **Generate** and download the profile to your Mac.
-1. Double-click to open the downloaded file (\*.mobileprovision) to register it with Xcode.
+10. Double-click the downloaded file (*.mobileprovision) to register it with Xcode.
## Sign the iOS Archive
-1. Download and unzip the **iOS-Archive.zip** file from Azure blob storage. This creates a folder named after the [Bundle ID](wrap-how-to.md#step-2-target-platform). In the example below, the Bundle ID is **com.single.wrap**.
+1. Download and unzip the **iOS-Archive.zip** file from your Azure blob storage. This creates a folder named after the [Bundle ID](wrap-how-to.md#3-choose-target-platform). In the example below, the Bundle ID is **com.single.wrap**.
-1. If signing with enterprise certificate, open the file **Distribution-exportOptions.plist** with Xcode and change the value for the **method** field inside the file to **enterprise**.
+2. For enterprise signing only: Open the file **Distribution-exportOptions.plist** with Xcode and change the value for the **method** field to **enterprise**.
- > [!NOTE]
- > Enterprise signing is not supported with Key Vault signing.
+ > [!NOTE]
+ > Enterprise signing is not supported with Key Vault signing.
-1. Open terminal, and change directory to the unzipped folder.
+3. Open Terminal and change directory to the unzipped folder.
-1. Enter `pwsh` to start PowerShell in the terminal.
+4. Enter `pwsh` to start PowerShell in the terminal.
-1. Run `./SignAndGenerateIPA.ps1` with the values for the "CodeSigningIdentity" and "ProvisioningProfilePath" parameters.
+5. Run the PowerShell script with your certificate and provisioning profile information:
+ ```
+ ./SignAndGenerateIPA.ps1 -CodeSigningIdentity "YOUR_CODE_SIGNING_IDENTITY" -ProvisioningProfilePath "PATH_TO_PROVISIONING_PROFILE"
+ ```
- > [!NOTE]
- > 'CodeSigningIdentity' is the name of the certificate that was created at the Apple developer website. To look up the vaule for 'CodeSigningIdentity', right-click on the **.mobileprovision** file (this is the provisioning profile), then select **More Info**. Scroll down and select **Preview**. Your 'CodeSigningIdentity' value is stored in the **Name** field under **Certificates** in the **.mobileprovision** file.
+ > [!NOTE]
+ > To find your **CodeSigningIdentity** value, right-click on the **.mobileprovision** file, select **More Info** > **Preview**. Look for the **Name** field under **Certificates**.
- > [!TIP]
- > 'ProvisioningProfilePath' is the path to the provisioning profile file that you have downloaded from the Apple developer website in the previous step [**Create an iOS Provisioning Profile**](code-sign-ios.md#create-an-ios-provisioning-profile). For example, it could be located at /Users/username/Downloads/MyProvisioningProfile.mobileprovision on your computer.
+ > [!TIP]
+ > The **ProvisioningProfilePath** is the path to the .mobileprovision file you downloaded. For example: `/Users/username/Downloads/MyProvisioningProfile.mobileprovision`
+
+ :::image type="content" source="media/code-sign-ios/powershell.png" alt-text="Run PowerShell script.":::
- :::image type="content" source="media/code-sign-ios/powershell.png" alt-text="Run PowerShell script.":::
+6. When the script completes, a **.ipa** file is created (for example, **com.single.wrap.ipa**).
-1. When the script finishes, a **.ipa** file is created such as **com.single.wrap.ipa**.
- - If the command **./SignAndGenerateIPA.ps1** fails, then delete the unzipped folder and files because they might be corrupted. Unzip **iOS-Archive.zip** again before you try to sign again.
+ > [!IMPORTANT]
+ > If the script fails, delete the unzipped folder and files as they might be corrupted. Unzip **iOS-Archive.zip** again before retrying.
:::image type="content" source="media/code-sign-ios/folder-structure.png" alt-text="IPA package.":::
-1. Install the **.ipa** file in the registered devices using the **Finder** app. To distribute using Microsoft Intune, see [Add an iOS/iPadOS line-of-business app to Microsoft Intune](/mem/intune/apps/lob-apps-ios). To learn about giving an app access to the Intune app protection service, see [Give your app access to the Intune app protection service](/mem/intune/developer/app-sdk-get-started#give-your-app-access-to-the-intune-app-protection-service-optional).
-### See also
+
+## Distribute the app
+
+Install the **.ipa** file on registered devices using the **Finder** app.
+
+For enterprise distribution with Microsoft Intune:
+- [Add an iOS/iPadOS line-of-business app to Microsoft Intune](/mem/intune/apps/lob-apps-ios)
+- [Give your app access to the Intune app protection service](/mem/intune/developer/app-sdk-get-started#give-your-app-access-to-the-intune-app-protection-service-optional)
+
+
+
+## See also
- [Wrap overview](overview.md)
- [Manual code sign on Android](code-sign-android.md)
- [Frequently asked questions for wrap](faq.yml)
-- [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps/wrap-issues)
-
+- [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps/wrap-issues)
diff --git a/powerapps-docs/maker/common/wrap/create-key-vault-for-code-signing.md b/powerapps-docs/maker/common/wrap/create-key-vault-for-code-signing.md
index 7503302ac6..f59ee3f802 100644
--- a/powerapps-docs/maker/common/wrap/create-key-vault-for-code-signing.md
+++ b/powerapps-docs/maker/common/wrap/create-key-vault-for-code-signing.md
@@ -5,7 +5,7 @@ author: komala2019
ms.topic: how-to
ms.custom: canvas
ms.reviewer: smurkute
-ms.date: 5/9/2024
+ms.date: 07/09/2025
ms.subservice: canvas-maker
ms.author: koagarwa
search.audienceType:
@@ -13,101 +13,99 @@ search.audienceType:
contributors:
- mduelae
---
-# Azure key vault for wrap using default subscription
-Azure Key Vault is a cloud-based service designed to provide a secure storage solution for secrets, which can include certificates, passwords, keys, and other sensitive information. To learn more about Azure Key Vault, see [Introduction to Azure Key Vault](/azure/key-vault/general/overview). This step is neccesary to create azure blob storage as well as during automatic signing process.
+# Azure key vault for wrap
+Azure key vault is a cloud-based service that securely stores secrets like certificates, passwords, keys, and other sensitive information. To learn more, see [Introduction to Azure key vault](/azure/key-vault/general/overview). Set up Azure key vault to create Azure blob storage and use the automatic signing process in wrap.
-
-In this article, you'll learn how to use an existing Azure Key Vault or create a new [Azure portal](https://portal.azure.com).
+This article explains how to use an existing Azure Key Vault or create a new one in the [Azure portal](https://portal.azure.com).
## Prerequisites
-
-- Microsoft Entra subscription to [create key vault](/azure/key-vault/general/quick-create-portal).
-- Your subscription ID needs to be the default one. More information: [Get subscription information](/cli/azure/manage-azure-subscriptions-azure-cli?tabs=bash#get-subscription-information)
+
+- Microsoft Entra subscription to [create a key vault](/azure/key-vault/general/quick-create-portal).
- Admin access for your tenant.
-- You need to have a [Apple account](https://developer.apple.com) enrolled in Apple developer Program or Apple enterprise developer program.
-- Create a [distribution certificate](code-sign-ios.md#create-the-distribution-certificate) or [ad-hoc Provisioning Profile](code-sign-ios.md#create-an-ios-provisioning-profile) or enterprise provisioning profile.
+- An [Apple account](https://developer.apple.com) enrolled in the Apple Developer Program or Apple Enterprise Developer Program.
+- Create a [distribution certificate](code-sign-ios.md#create-distribution-certificate), [ad-hoc provisioning profile](code-sign-ios.md#create-ios-provisioning-profile), or enterprise provisioning profile.
-
-## Configure key vault URI
+## Configure key vault
> [!IMPORTANT]
-> Before configuring the Key Vault URI, you need to create an Azure Key Vault. Follow the steps listed in [Create a vault](/azure/key-vault/general/quick-create-portal#create-a-vault) to proceed further.
-
-1. To create a new Azure service principal for the 1P Microsoft Entra application **4e1f8dc5-5a42-45ce-a096-700fa485ba20 (WrapKeyVaultAccessApp)**, sign in to your tenant as an admin. Then, run the following script in PowerShell:
-
- `Connect-AzureAD -TenantId `
- `New-AzureADServicePrincipal -AppId 4e1f8dc5-5a42-45ce-a096-700fa485ba20 -DisplayName "Wrap KeyVault Access App"`
-
-> [!NOTE]
-> On this page, 'Wrap KeyVault Access App' is used as a proxy for the application display name, and for the client, it refers to their app display name.
-
-2. Follow these steps to ensure that the Service Principal representing your app, such as Wrap Key Vault Access App, has the necessary access permissions, add a **Reader** role assignment to it in the **Access Control (IAM)** of your default subscription. This should also be present in the IAM of both the subscription and the Key Vault.
-
- 1. On the left select **Access control (IAM)** tab and then select **Add** > **Add role assignment**.
-
- 2. Select the **Members** tab and then select **Job function roles**. Make sure the **Reader** role is selected.
-
- > [!div class="mx-imgBorder"]
- > 
-
- 4. On **Members** tab, select **Select member** and in the text box on the right enter **Wrap Key Vault Access App** and search for it.
-
- > [!div class="mx-imgBorder"]
- > 
-
- 5. Select **Wrap Key Vault Access App** and then select **Review + assign** to assign the **Reader** role.
-
- > [!div class="mx-imgBorder"]
- > 
-
-
-3. Create or access existing Key Vault. Make sure this Key Vault is located in the default subscription for your tenant. More information: [Create a key vault using the Azure portal](/azure/key-vault/general/quick-create-portal).
-
-4. Add access policies for the Key Vault. For **Secret permissions** and **Certificate permissions** make sure that **Get** and **List** permissions are selected.
-
- > [!div class="mx-imgBorder"]
- > 
-
-5. Choose one of the following options based on your device:
-
- - **Android**
-
- Generate the .pfx file and then proceed to upload it to the certificate section of the Key Vault. More information: [Generate keys](code-sign-android.md#generate-keys)
-
- :::image type="content" source="media/wrap-canvas-app/wrap-1.png" alt-text="Create a cert for Android.":::
-
- > [!NOTE]
- > Ensure that the certificate name is included in the tag step and that the password matches the one entered for the store pass parameter used in creating the .pfx file during step 2.
-
- - **iOS**
- 1. Select the .cer into Keychain Access app to install it. For more information, see [Create the distribution certificate](code-sign-ios.md#create-the-distribution-certificate).
- 2. Right-click your certificate file to export the file as a .p12 file, select **Export**, and then select the file format .p12.
- 3. The iOS Certificate extension (.p12) should be renamed to **.pfx** as it's the accepted format by Key Vault
-
- > [!NOTE]
- > When you upload to the Key Vault, you'll need to provide the password that you set in previous step for the .p12 file.
-
- 4. [Create the provisioning profile](code-sign-ios.md#create-an-ios-provisioning-profile) and run this command to encode it to base64:
- - Mac: `base64 -i example.mobileprovision`
- - Windows: `certutil -encode data.txt tmp.b64`
-
- 5. Upload the `base64` string obtained from the previous step to the Key Vault secret. Next, upload the .pfx file to Key Vault Certificate.
-
-
- :::image type="content" source="media/wrap-canvas-app/wrap-2.png" alt-text="Create a cert for iOS.":::
-
-6. Once iOS or Android certificates are created and uploaded, add three tags with the name as the bundle ID, and the value corresponding to the name of the uploaded certificate(s). If you have already created a [bundle ID in the wrap wizard](wrap-how-to.md#step-2-target-platform), use the same one here.
-
- :::image type="content" source="media/wrap-canvas-app/wrap-3.png" alt-text="Add tags.":::
+> Before configuring the Key Vault, you need to create an Azure Key Vault. Follow the steps in [Create a vault](/azure/key-vault/general/quick-create-portal#create-a-vault).
+
+1. **Create a service principal for Wrap KeyVault Access App**
+
+ Sign in to your tenant as an admin and run the following PowerShell commands:
+
+ ```
+ Connect-AzureAD -TenantId
+ New-AzureADServicePrincipal -AppId 4e1f8dc5-5a42-45ce-a096-700fa485ba20 -DisplayName "Wrap KeyVault Access App"
+ ```
+
+2. **Assign Reader role to the service principal**
+
+ Add a **Reader** role assignment to the Wrap Key Vault Access App in the **Access Control (IAM)** of your subscription and the Key Vault.
+
+ 1. In the Azure portal, select **Access control (IAM)** and then **Add** > **Add role assignment**.
+ 2. Go to the **Members** tab, select **Job function roles**, and ensure **Reader** is selected.
+
+ > [!div class="mx-imgBorder"]
+ > 
+
+ 3. On the **Members** tab, select **Select member** and search for **Wrap Key Vault Access App**.
+
+ > [!div class="mx-imgBorder"]
+ > 
+
+ 4. Select **Wrap Key Vault Access App** and then **Review + assign** to assign the Reader role.
+
+ > [!div class="mx-imgBorder"]
+ > 
+
+3. Create or access an existing Key Vault. More information: [Create a key vault using the Azure portal](/azure/key-vault/general/quick-create-portal).
+
+4. **Add access policies for the Key Vault**
+
+ For **Secret permissions** and **Certificate permissions**, select **Get** and **List**.
+
+ > [!div class="mx-imgBorder"]
+ > 
+
+5. **Upload certificates and secrets**
+
+ Choose your platform and follow the steps below:
+
+ - **Android**
+
+ Generate the .pfx file and upload it to the certificate section of the Key Vault. More information: [Generate keys](code-sign-android.md#generate-key-and-signature-hash)
+
+ :::image type="content" source="media/wrap-canvas-app/wrap-1.png" alt-text="Create a cert for Android.":::
+
+ > [!NOTE]
+ > Ensure the certificate name is included in the tag step and the password matches the store pass parameter used when creating the .pfx file.
+
+ - **iOS**
+
+ 1. Install the .cer file using Keychain Access. See [Create the distribution certificate](code-sign-ios.md#create-distribution-certificate).
+ 2. Export the certificate as a .p12 file, then rename the extension to **.pfx** (required by Key Vault).
+ 3. When uploading to Key Vault, provide the password set for the .p12 file.
+ 4. [Create the provisioning profile](code-sign-ios.md#create-ios-provisioning-profile) and encode it to base64:
+ - Mac: `base64 -i example.mobileprovision`
+ - Windows: `certutil -encode data.txt tmp.b64`
+ 5. Upload the base64 string as a Key Vault secret, then upload the .pfx file as a Key Vault certificate.
+
+ :::image type="content" source="media/wrap-canvas-app/wrap-2.png" alt-text="Create a cert for iOS.":::
+
+6. **Add tags for certificates**
+
+ After uploading iOS or Android certificates, add three tags with the name as the bundle ID and the value as the uploaded certificate name(s). Use the same bundle ID as in the [wrap wizard](wrap-how-to.md#3-choose-target-platform).
+
+ :::image type="content" source="media/wrap-canvas-app/wrap-3.png" alt-text="Add tags.":::
A video for configuring key vault is available at [How to configure access to key vault](https://www.youtube.com/watch?v=QV5xAUoJDcA&t=7s)
-
-## Troubleshoot
-For Troubleshooting issues, see [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps-and-solutions/wrap-issues).
+## Troubleshoot
+For troubleshooting, see [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps-and-solutions/wrap-issues).
### See also
@@ -116,5 +114,4 @@ For Troubleshooting issues, see [Troubleshoot issues with the wrap feature in Po
- [Code sign for Android](code-sign-android.md)
- [Code sign for Google Play Store](https://developer.android.com/studio/publish/app-signing)
- [Frequently asked questions for wrap](faq.yml)
-- [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps/wrap-issues)
-
+- [Troubleshoot issues with the wrap feature in Power Apps](/troubleshoot/power-platform/power-apps/manage-apps/wrap-issues)
diff --git a/powerapps-docs/maker/common/wrap/faq.yml b/powerapps-docs/maker/common/wrap/faq.yml
index 0792528808..bf0e18f8fa 100644
--- a/powerapps-docs/maker/common/wrap/faq.yml
+++ b/powerapps-docs/maker/common/wrap/faq.yml
@@ -16,21 +16,21 @@ summary: |
sections:
- name: General
- questions:
+ questions:
- question: |
- Can single tenant customers use wrap with Power Apps?
+ Can single tenant customers use wrap with Power Apps?
answer: |
- Yes. Both single tenant and multitenant customers can use wrap. However, it's important to assign a correct account type for your app on Azure portal if you're creating a new app registration manually. See [App registration](wrap-how-to.md#register-your-app-on-azure-portal-manually-optional) for directions on how to select a correct account type to prepare your app for wrap.
+ Yes. Both single tenant and multitenant customers can use wrap. When registering your app manually in Azure, ensure you select the correct account type. See [App registration](wrap-how-to.md#register-your-app-on-azure-portal-manually-optional) for directions.
- question: |
Does the wrap feature in Power Apps support Customer-Managed Keys (CMK) or Lockbox capabilities?
answer: |
- No. The wrap feature in Power Apps doesn't support Customer-Managed Keys (CMK) or Lockbox capabilities. Wrap for Power Apps uses Azure DevOps build pipelines to build mobile apps. Customer assets might be exposed in the build pipeline to Microsoft service operators.
+ No. The wrap feature in Power Apps doesn't support Customer-Managed Keys (CMK) or Lockbox. Wrap uses Azure DevOps build pipelines, and customer assets might be exposed to Microsoft service operators during the build process.
- question: |
Can I create mobile apps with Power Apps?
answer: |
- Yes. More information: [Creating mobile apps with Power Apps](overview.md)
+ Yes. See [Creating mobile apps with Power Apps](overview.md).
- question: |
If I create a mobile app with Power Apps, does Microsoft release it for me?
@@ -40,8 +40,8 @@ sections:
- question: |
How do I digitally sign my mobile app?
answer: |
- You can automatically sign your mobile app package in **Step 2: Target Platforms** step in wrap wizard. You'll need to [create and prepare your Azure Key Vault](create-key-vault-for-code-signing.md) to take advantage of automatic mobile app signing feature in wrap wizard. For information on how to code sign your app, see instructions here: [Android](code-sign-android.md), [iOS](code-sign-ios.md) and [Google Play Store](https://developer.android.com/studio/publish/app-signing).
-
+ You can automatically sign your mobile app package in Step 2 of the wrap wizard if you have set up [Azure Key Vault](create-key-vault-for-code-signing.md). For manual signing, see [Android](code-sign-android.md), [iOS](code-sign-ios.md), and [Google Play Store](https://developer.android.com/studio/publish/app-signing).
+
- question: |
Can I use Xcode to digitally sign my mobile apps for iOS?
answer: |
@@ -50,47 +50,47 @@ sections:
- question: |
How do I distribute my mobile app?
answer: |
- It depends on your business scenario. You can use [Microsoft Intune](/mem/intune/fundamentals/what-is-intune), [Google Play](https://support.google.com/googleplay/work/answer/6138458) or [Apple Business Manager](https://developer.apple.com/custom-apps/).
+ You can use [Microsoft Intune](/mem/intune/fundamentals/what-is-intune), [Google Play](https://support.google.com/googleplay/work/answer/6138458), or [Apple Business Manager](https://developer.apple.com/custom-apps/).
- question: |
How do I configure my mobile app for distribution through Microsoft Intune?
answer: |
- Wrap wizard automatically configures your app for distribution with [Microsoft Intune](/mem/intune/fundamentals/what-is-intune). To troubleshoot, you can manually grant all the canvas app(s) that you intend to wrap *Microsoft Mobile Application Management* API permission manually. More information: [Configure the API permissions for your app manually](wrap-how-to.md#configure-the-api-permissions-for-your-app-manually-optional).
+ Wrap wizard automatically configures your app for distribution with [Microsoft Intune](/mem/intune/fundamentals/what-is-intune). To troubleshoot, you can manually grant all the canvas app(s) that you intend to wrap *Microsoft Mobile Application Management* API permission manually. More information: [Configure the API permissions for your app manually](wrap-how-to.md#configure-api-permissions-manually-optional).
- question: |
Do I need to rewrap and redistribute my mobile app frequently?
answer: |
- Power Apps Mobile is [updated periodically](/power-platform/released-versions/powerapps#all-power-apps-studio-and-power-apps-mobile-versions). Hence, to ensure compatibility with the latest Power Apps release versions, benefit from bug-fixes and new platform features, we recommend that you rewrap and redistribute your mobile app to your end users at least on a monthly basis.
+ Power Apps Mobile is [updated periodically](/power-platform/released-versions/powerapps#all-power-apps-studio-and-power-apps-mobile-versions). To ensure compatibility and benefit from bug fixes and new features, we recommend that you rewrap and redistribute your mobile app at least monthly.
- question: |
Do I need to rewrap and redistribute my mobile app after making changes to the canvas app(s) included in the package?
answer: |
- No. Published changes to the included canvas app(s) are downloaded automatically by existing, released versions of your mobile app. However, we recommend that you rewrap and redistribute your mobile app on a [monthly basis](faq.yml#do-i-need-to-rewrap-and-redistribute-my-mobile-app-frequently-) to benefit from platform bug fixes, updates and new features.
-
+ No. Published changes to the included canvas app(s) are downloaded automatically by existing, released versions of your mobile app. However, we recommend that you rewrap and redistribute your mobile app on a [monthly basis](faq.yml#do-i-need-to-rewrap-and-redistribute-my-mobile-app-frequently-) to benefit from platform bug fixes, updates, and new features.
+
- question: |
- How do I update the icons and colors in my mobile app?
+ How do I update the icons and colors in my mobile app?
answer: |
- You can update icons and colors in your mobile app by rewraping your apps with new icons and colors and redistributing the updated mobile app package.
-
+ Update icons and colors by rewrapping your apps with new assets and redistributing the updated mobile app package.
+
- question: |
- How do I add or remove canvas apps in my wrapped mobile app?
+ How do I add or remove canvas apps in my wrapped mobile app?
answer: |
- You can add or remove canvas apps by rewraping your mobile app package with a new set of included apps and redistributing your mobile package.
-
+ Add or remove canvas apps by rewrapping your mobile app package with the desired set of apps and redistributing your mobile package.
+
- question: |
What are Primary and Secondary apps in the context of wrap?
answer: |
- Primary app provides the main experience of your mobile app. Secondary apps are bundled for performance reasons and must be linked from your primary app. See [wrap multiple canvas apps together](overview.md#wrap-multiple-canvas-apps-together).
+ The Primary app provides the main experience of your mobile app. Secondary apps are bundled for performance reasons and must be linked from your primary app. See [wrap multiple canvas apps together](overview.md#wrap-multiple-canvas-apps-together).
- question: |
What are the advantages of including Secondary apps in the bundle, if I can still Launch() them without doing so?
answer: |
- Including Secondary apps in the bundle provides a better Launch time performance when opening them for the first time. However, it's entirely optional to bundle Secondary apps with the Primary app. If you have many Secondary apps, you may choose to not bundle them to reduce the total size of the app bundle.
+ Including Secondary apps in the bundle provides better launch performance when opening them for the first time. However, it's optional. If you have many Secondary apps, you may choose not to bundle them to reduce the total app size.
- question: |
Can I add apps that use Power BI data to wrap?
answer: |
- Yes. Wrap wizard automatically configures your mobile app to be able to use Power BI. To troubleshoot, you can manually grant *Power BI* API permission to all your apps that use Power BI data. More information: [Configure the API permissions for your app manually](wrap-how-to.md#configure-the-api-permissions-for-your-app-manually-optional)
+ Yes. Wrap wizard automatically configures your mobile app to be able to use Power BI. To troubleshoot, you can manually grant *Power BI* API permission to all your apps that use Power BI data. More information: [Configure the API permissions for your app manually](wrap-how-to.md#configure-api-permissions-manually-optional).
- question: |
Can I deep link into a wrapped mobile app?
@@ -98,19 +98,20 @@ sections:
Yes. You can use ```ms-mobile-apps:///providers/Microsoft.PowerApps/apps/?tenantId=``` schema to deep link into your wrapped mobile apps. Refer to [Using deep links with wrapped mobile apps](wrap-deep-links.md) for more information.
- question: |
- Why do I see this error message when I try to open my wrapped native app on a mobile device: You can't get there from here error message
+ Why do I see this error message when I try to open my wrapped native app on a mobile device: You can't get there from here error message
answer: |
- Your organization might have **Require Approved Client App** conditional access policy that restricts access to mobile apps. To fix this issue, see, [Edit your conditional access policy](/azure/active-directory/conditional-access/migrate-approved-client-app#edit-an-existing-conditional-access-policy).
-
+ Your organization might have a **Require Approved Client App** conditional access policy that restricts access to mobile apps. To fix this issue, see [Edit your conditional access policy](/azure/active-directory/conditional-access/migrate-approved-client-app#edit-an-existing-conditional-access-policy).
+
- question: |
Can I create B2C mobile apps with Power Apps?
answer: |
- No. Power Apps is a platform for creating business applications and uses Microsoft Entra authentication. The wrap feature wraps existing canvas apps for the same set of end users.
+ No. Power Apps is a platform for business applications and uses Microsoft Entra authentication. The wrap feature wraps existing canvas apps for the same set of end users.
- question: |
Do I need a premium license to package the app?
answer: |
No, you don't need a premium license for wrap. However, if your APK uses certain connectors, you will need to pay according to the requirements of those connectors.
+
- question: |
Can I delete wrap projects?
answer: |
@@ -119,18 +120,17 @@ sections:
- question: |
How can I ensure that customers outside the home tenant can't access the app even if I enable multitenant access during registration?
answer: |
- Users outside the home tenant can't access Wrap projects unless both the Azure admin and the maker explicitly share the app with the user.
- The app ensures proper data separation across organizations by embedding the tenant identifier in the authentication token.
- This mechanism allows the app to verify the user's tenant and grant access only to data relevant to that tenant.
+ Users outside the home tenant can't access wrap projects unless both the Azure admin and the maker explicitly share the app with the user. The app ensures proper data separation across organizations by embedding the tenant identifier in the authentication token.
- question: |
Can we allow users from outside home tenant to access wrap projects?
answer: |
- The Wrap App supports multi-tenancy. To enable this feature, the Azure admin must take additional steps:
+ The Wrap App supports multi-tenancy. To enable this feature, the Azure admin must:
1. Add users from outside the home tenant as guests in Azure.
- 2. Include these guests in the Azure Conditional Access process. Additionally, the maker must share the app with these guest IDs within Power Apps.
+ 2. Include these guests in the Azure Conditional Access process.
+ 3. The maker must share the app with these guest IDs within Power Apps.
- - question: |
+ - question: |
Why am I not able to Sign into my wrapped Application?
answer: |
1. Verify if the user has access to the PowerApps application. More information: [Share a canvas app with your organization](../../canvas-apps/share-app.md)
@@ -142,11 +142,12 @@ sections:
- question: |
When do you need to re-wrap?
answer: |
+
- If you're an existing customer who has already created and successfully distributed a wrapped app, you don't need to go through the wrapping process again. To ensure users receive the latest published changes, follow the steps mentioned in [Power Apps for Makers: Get App Versions](/connectors/powerappsforappmakers/#get-app-versions).
- - For new customers, we recommend re-wrapping if you have completed all the registration steps mentioned in [Use the wrap wizard to build your mobile app: Register app](wrap-how-to.md#step-3-register-app) and have either manually or automatically completed the sign-in process mentioned in [Use the wrap wizard to build your mobile app: Sign your mobile app package manually](wrap-how-to.md#sign-your-mobile-app-package-manually-optional).
+ - For new customers, we recommend re-wrapping if you have completed all the registration steps mentioned in [Use the wrap wizard to build your mobile app: Register app](wrap-how-to.md#4-register-your-app) and have either manually or automatically completed the sign-in process mentioned in [Use the wrap wizard to build your mobile app: Sign your mobile app package manually](wrap-how-to.md#sign-your-mobile-app-package-manually-optional).
- To ensure platform changes benefit end users, we recommend re-wrapping monthly and distributing the updated app to users.
- - question: |
+ - question: |
How to find your Azure admin?
answer: |
- Go to the Microsoft Entra roles and administration portal. More information: [Microsoft Entra admin center](https://entra.microsoft.com/#home)
@@ -154,44 +155,32 @@ sections:
- Select the **Active assignments** tab.
- Review the list of owners for the active assignments.
- - question: |
+ - question: |
Why is Azure key vault a mandatory step?
answer: |
- - To access the Azure blob storage location, we need the access key, which is stored in the Azure key vault.
+ The Azure key vault securely stores the access key needed for Azure blob storage.
- - question: |
+ - question: |
Do you need to pay for Azure key vault & Azure blob storage?
answer: |
- - Yes, more information: [Key Vault pricing](https://azure.microsoft.com/en-us/pricing/details/key-vault/#pricing).
-
- - question: |
- Can you have cross tenant azure blob storage location?
- answer: |
- - No.
-
- - question: |
- Which subscription ID should I choose when creating a new one, given multiple options?
- answer: |
- - Select the default subscription.
+ Yes. See [Key Vault pricing](https://azure.microsoft.com/en-us/pricing/details/key-vault/#pricing).
- - question: |
+ - question: |
What should I do if I don't have access to the resource group while creating the key vault?
answer: |
- - Connect with your azure tenant admin to create a key vault for you or ask to share the permission with you.
+ Contact your Azure tenant admin to create a key vault for you or request permission.
- - question: |
- How can Entra B2B guest users access the wrapped apps?
+ - question: |
+ How can Entra B2B guest users access the wrapped apps?
answer: |
- - To let guest users to access the app, follow these steps:
- 1. Add users from outside the home tenant as guests in Azure. More information: [Quickstart: Add a guest user and send an invitation](/entra/external-id/b2b-quickstart-add-guest-users-portal#invite-an-external-guest-user).
- 2. Include these guests in the Azure Conditional Access process. Share the app with these guest IDs in Power Apps. More information: [Share a canvas app with your organization](../../canvas-apps/share-app.md).
- 3. Replace the app ID and the user account in the following link: `ms-mobile-apps:///providers/Microsoft.PowerApps/apps/?tenantId=`
- 4. Share the link with your client.
- 5. Install the APK on Android and the IPA on iOS.
- 6. Open the weblink and enter the external ids to sign in.
+ 1. Add users from outside the home tenant as guests in Azure. See [Quickstart: Add a guest user and send an invitation](/entra/external-id/b2b-quickstart-add-guest-users-portal#invite-an-external-guest-user).
+ 2. Include these guests in the Azure Conditional Access process. Share the app with these guest IDs in Power Apps. See [Share a canvas app with your organization](../../canvas-apps/share-app.md).
+ 3. Replace the app ID and the user account in the following link: `ms-mobile-apps:///providers/Microsoft.PowerApps/apps/