CertSafari

    Free Extending Microsoft Power Platform Solutions with Code and AI (AB-400) Sample Questions

    35 free sample questions from our bank of 351+, covering every exam domain, with answers and detailed explanations. Updated September 2026.

    Domain 1: Build Microsoft Power Platform solutions

    Subdomain 1.1: Design the technical architecture

    1.A finance team needs employee bonus amounts calculated using a fixed formula defined in company policy, with a guarantee that identical inputs always produce identical output for audit purposes. Solution: implement the calculation using a Power Fx-based business rule on the Employee table rather than an AI Builder prompt. Does this solution meet the goal?

    1. A.True
    2. B.False
    Show answer & explanation

    Correct answer: ATrue

    • A. True is correct: a business rule applies a fixed, deterministic formula to the input columns, so identical inputs always produce the identical output the audit requirement demands.
    • B. False is incorrect: the proposed rule-based approach is deterministic by design, which is exactly what is required here, so the solution does meet the stated goal.

    Subdomain 1.3: Implement application lifecycle management (ALM)

    2.Contoso Manufacturing runs a Dataverse solution that calls a third-party inventory API from a Power Automate flow. The API key must never appear in plain text inside the solution, and the value needs to differ between the dev, test, and production environments. The ALM lead wants the key stored as a solution component so it moves with the solution during deployment, but resolved from a vault at runtime rather than stored as clear text in Dataverse. Which environment variable configuration meets this requirement?

    1. A.Create an environment variable with data type Text, and instruct each environment's administrator to manually update the current value immediately after every solution import.
    2. B.Create an environment variable with data type Secret, and configure it to retrieve the value from Azure Key Vault rather than storing it directly in the environment variable value table.
    3. C.Create an environment variable with data type JSON, and embed the API key inside a JSON object so that Dataverse encrypts the entire value automatically before storage.
    4. D.Create a connection reference instead of an environment variable, because connection references always encrypt any string value entered for the connected API endpoint.
    Show answer & explanation

    Correct answer: BCreate an environment variable with data type Secret, and configure it to retrieve the value from Azure Key Vault rather than storing it directly in the environment variable value table.

    • A. Text values are stored in Dataverse in the environment variable value table, and a manual per-environment update process doesn't provide vault-backed protection, so the key would sit as plain text between imports.
    • B. The Secret data type integrates with Azure Key Vault so the value is stored in a vault rather than in Dataverse directly, satisfying both the portability and the no-plain-text requirement.
    • C. JSON environment variables are structured text stored the same way as Text variables; wrapping a secret inside a JSON object does not trigger any additional encryption or vault integration.
    • D. A connection reference stores a link to an existing connection's authentication, not an arbitrary application secret like a third-party API key, so it cannot hold this kind of value.

    Subdomain 1.3: Implement application lifecycle management (ALM)

    3.A new ALM lead is reviewing how managed and unmanaged solutions behave in this Power Platform environment before writing the team's deployment runbook. Select the three correct statements.(Select 3)

    1. A.Components inside a managed solution can't be edited directly; they must first be added to an unmanaged solution to be customized.
    2. B.A managed solution can be imported into the very same environment that contains the unmanaged solution it originated from, replacing the unmanaged layer.
    3. C.An unmanaged solution can be exported as either unmanaged, for source control, or managed, to produce a deployable build artifact.
    4. D.Deleting an unmanaged solution removes the underlying customizations from the environment entirely, the same way deleting a managed solution does.
    5. E.Uninstalling a managed solution removes all the customizations and extensions it added, including any custom tables and their data.
    6. F.Managed solutions can be freely exported back out of an environment so they can be re-imported elsewhere with a different publisher prefix.
    Show answer & explanation

    Correct answers: A, C, EComponents inside a managed solution can't be edited directly; they must first be added to an unmanaged solution to be customized.; An unmanaged solution can be exported as either unmanaged, for source control, or managed, to produce a deployable build artifact.; Uninstalling a managed solution removes all the customizations and extensions it added, including any custom tables and their data.

    • A. A managed component can't be customized in place; making a change requires adding it to an unmanaged solution first, which creates a dependency that blocks uninstalling the managed solution until it's removed.
    • B. A managed solution can't be imported into the same environment that contains the unmanaged solution it originated from; a separate environment is needed to test the managed version.
    • C. Exporting an unmanaged solution as either unmanaged, for source control, or managed, as a build artifact, is exactly how the two solution types support ALM.
    • D. Deleting an unmanaged solution only removes the solution container; the customizations remain in effect and are attributed to the default solution, unlike deleting a managed solution.
    • E. Uninstalling a managed solution removes everything it added, including custom tables and the data stored in their columns, which is why this is a destructive operation.
    • F. Managed solutions can't be exported at all; only an unmanaged solution can be exported, and it can be exported as either unmanaged or managed.

    Subdomain 1.2: Design solution components

    4.A university's admissions solution needs a reusable operation that checks program capacity and returns a boolean before an application record is created. The operation must be callable directly from the Dataverse Web API, from a Power Automate flow, and from model-driven form JavaScript, and it must run synchronously as part of the same transaction as the create request. Which implementation should the solution architect choose?

    1. A.Define a custom API on the table's Create message, implemented by a plug-in running synchronously in the pre-operation stage.
    2. B.Create a Power Automate child flow triggered on record creation that queries capacity and cancels the operation if capacity is exceeded.
    3. C.Write a client-side JavaScript web resource on the form's OnSave event that blocks the save when capacity is exceeded.
    4. D.Register an asynchronous post-operation plug-in that deletes the application record if capacity was already exceeded.
    Show answer & explanation

    Correct answer: ADefine a custom API on the table's Create message, implemented by a plug-in running synchronously in the pre-operation stage.

    • A. A custom API gives a single, reusable message that the Web API, flows, and client scripts can all invoke the same way, and implementing it as a synchronous pre-operation plug-in lets the logic run inside the same transaction as the create request.
    • B. A flow that reacts after the record is created runs outside the original transaction, so it can only clean up afterward rather than block the creation itself, which does not meet the synchronous requirement.
    • C. Client-side script only runs in the model-driven form client, so it cannot be invoked from the Web API or from a flow, failing the cross-surface reuse requirement.
    • D. An asynchronous post-operation plug-in runs after the record has already been committed and outside the original transaction, so deleting the record afterward is not equivalent to preventing its creation.

    Subdomain 1.2: Design solution components

    5.A logistics company has an internal, non-internet-facing API that a Power Automate flow must call, and no code changes to the API are permitted. Which capability should the solution use to expose this private API to a custom connector?

    1. A.Configure an on-premises data gateway so the custom connector can route requests to the private API without exposing it publicly.
    2. B.Publish the custom connector for Microsoft certification so it appears alongside prebuilt connectors for all tenants.
    3. C.Rebuild the API as an Azure Function App with a public endpoint secured only by a shared, unrotated API key value.
    4. D.Import the API's OpenAPI definition directly into Copilot Studio without creating a custom connector or a connection.
    Show answer & explanation

    Correct answer: AConfigure an on-premises data gateway so the custom connector can route requests to the private API without exposing it publicly.

    • A. An on-premises data gateway provides the network path for custom connectors to reach a private, non-internet-facing API without requiring the API itself to be exposed publicly or modified.
    • B. Certification controls whether a connector is shared broadly across tenants and has nothing to do with letting the connector reach a private, on-premises API.
    • C. Rebuilding the API with a public endpoint contradicts the requirement that the API remain non-internet-facing and that no code changes to it be made.
    • D. Copilot Studio still needs an underlying connection mechanism such as a custom connector to reach an API, and importing an OpenAPI definition alone does not provide network access to a private API.

    Subdomain 1.2: Design solution components

    6.You need to let a Claude Desktop client search Dataverse records and create new rows using natural-language tool calls, without writing a bespoke REST API. Solution: Enable and configure the Dataverse MCP server for the environment, then connect the client using the environment's MCP server URL (`https://{org}.crm.dynamics.com/api/mcp`). Does this solution meet the goal?

    1. A.True
    2. B.False
    Show answer & explanation

    Correct answer: ATrue

    • A. Enabling the Dataverse MCP server exposes tools such as searching and creating records over the model context protocol at that server URL, so a non-Microsoft MCP client can connect and issue natural-language tool calls without a custom API.
    • B. This option would apply if the MCP server did not expose search and create tools to non-Microsoft clients, but the Dataverse MCP server is explicitly documented to support clients such as Claude desktop.

    Subdomain 1.1: Design the technical architecture

    7.A logistics company needs business logic triggered on quote creation that calls a third-party freight-pricing REST API, which can take up to eight seconds to respond, and then writes the returned rate back onto the quote. Which implementation approach should the architect choose?

    1. A.Register a synchronous pre-operation plug-in that calls the freight-pricing REST API directly and writes the returned rate onto the quote before the create request commits.
    2. B.Register an asynchronous post-operation plug-in that calls an Azure Function, which performs the REST API call and updates the quote once the response arrives.
    3. C.Add a business rule on the quote table that invokes the freight-pricing REST API through a calculated column formula and stores the returned rate directly on the quote record.
    4. D.Implement a client-side JavaScript OnLoad handler that calls the freight-pricing REST API directly from the user's browser and populates the rate field on the quote form.
    Show answer & explanation

    Correct answer: BRegister an asynchronous post-operation plug-in that calls an Azure Function, which performs the REST API call and updates the quote once the response arrives.

    • A. Dataverse enforces a strict synchronous plug-in execution time limit, and blocking the create transaction on an eight-second external call risks timeouts and unnecessarily locks the record for the duration of the wait.
    • B. Offloading the long-running external call to an Azure Function from an asynchronous step keeps the plug-in pipeline fast and updates the quote once the freight API responds, matching the architecture guidance to push long-running work to a cloud service.
    • C. Business rules and calculated columns can only operate on data already present in the record and related tables; neither can call an external REST API.
    • D. Calling the API from the user's browser exposes credentials to the client and only runs when a user happens to have the form open, so it cannot guarantee every quote gets a rate.

    Domain 2: Extend the user experience

    Subdomain 2.1: Apply business logic in model-driven apps by using client scripting

    8.Fabrikam's Opportunity form needs a script that creates a related Task record the moment a user marks the opportunity as Won, without a full page postback or navigating away from the current record. Which Client API call accomplishes this from inside the OnSave handler?

    1. A.Call `Xrm.WebApi.online.createRecord("task", taskData)`, passing the regarding lookup and subject inside the `taskData` object.
    2. B.Call `Xrm.WebApi.online.updateRecord("opportunity", opportunityId, taskData)` and let the platform infer that a Task should be generated.
    3. C.Call `Xrm.Navigation.openForm({entityName: "task"})` and require the user to manually fill in and save the new Task form themselves.
    4. D.Call `formContext.data.entity.save({useSaveMode: 2})` twice in sequence, once for the opportunity and once for an implicit related task.
    Show answer & explanation

    Correct answer: ACall `Xrm.WebApi.online.createRecord("task", taskData)`, passing the regarding lookup and subject inside the `taskData` object.

    • A. createRecord is the Web API method for creating a new table row from client script, so passing task field values here creates the related Task without any postback.
    • B. updateRecord only modifies the opportunity itself; it has no mechanism for generating an unrelated Task row as a side effect of the update call.
    • C. openForm opens a form for manual entry, which fails the requirement of creating the Task automatically without extra user interaction.
    • D. save() persists the current record's own changes; calling it twice does not create a second, different entity type like Task.

    Subdomain 2.1: Apply business logic in model-driven apps by using client scripting

    9.A maker is writing Power Fx commands for a grid of quotes and needs to reason precisely about the Selected property and AutoSave behavior the command component library exposes. Which of the following statements are correct? (Select 3.)(Select 3)

    1. A.`Self.Selected.Item` returns Blank when zero records are selected in the grid, and `IsBlank` on it correctly detects that empty state.
    2. B.`Self.Selected.AllItems` returns an empty table when nothing is selected, so `IsEmpty` on it reports true rather than throwing an error.
    3. C.`Self.Selected.Item` is always populated with a valid record whenever `SelectionMax` is greater than 1, no matter how many rows are checked.
    4. D.With AutoSave left at its default enabled setting, the form buffer is saved on the user's behalf before the command's formula begins executing.
    5. E.`Self.Selected.State` is a free-text field containing the display name of whichever form is currently active for the selected record.
    6. F.Because Dataverse is the only supported data source for commanding, `Self.Selected.Item` can also return rows sourced from a SharePoint list.
    Show answer & explanation

    Correct answers: A, B, D`Self.Selected.Item` returns Blank when zero records are selected in the grid, and `IsBlank` on it correctly detects that empty state.; `Self.Selected.AllItems` returns an empty table when nothing is selected, so `IsEmpty` on it reports true rather than throwing an error.; With AutoSave left at its default enabled setting, the form buffer is saved on the user's behalf before the command's formula begins executing.

    • A. This is correct: when no row is selected, Item resolves to Blank, and IsBlank correctly detects that there is currently no selected record to act on.
    • B. This is correct: with nothing selected, AllItems resolves to an empty table rather than an error, and IsEmpty on it reports true.
    • C. This is incorrect: Item is documented as always blank whenever SelectionMax is not exactly 1, specifically to stop formulas from silently acting on only one of several selected rows.
    • D. This is correct: with the default AutoSave setting, the form buffer is saved on the maker's behalf before the command formula runs, and any save problems are surfaced through the form's own UI.
    • E. This is incorrect: State is documented as an enum representing Edit, New, or View mode for the selected control, not a text field holding a form's display name.
    • F. This is incorrect: Dataverse is currently the only supported data source for model-driven app commanding, so a SharePoint-sourced row cannot appear as a Selected item here.

    Subdomain 2.3: Build Power Apps code apps

    10.True or False: According to Microsoft's documentation, a Power Apps code app can call Dataverse alternate keys and FetchXML queries directly through the generated Dataverse table service, in addition to the supported create, retrieve, retrieve-multiple, update, and delete operations.

    1. A.True
    2. B.False
    Show answer & explanation

    Correct answer: BFalse

    • A. This would only be true if alternate keys and FetchXML were listed among the supported Dataverse scenarios, but the documentation explicitly places both of them in the unsupported scenarios list alongside polymorphic lookups and entity metadata CRUD.
    • B. The documentation's unsupported scenarios list explicitly names alternate key support and FetchXML support as not yet available for Dataverse table data sources in code apps, so this statement about direct support is false.

    Subdomain 2.4: Deploy and manage Power Apps code apps

    11.Which npm package does the Power Apps code apps documentation direct a developer to install in order to send custom telemetry to Azure Application Insights from within a code app?

    1. A.@microsoft/applicationinsights-web
    2. B.@microsoft/power-apps-telemetry
    3. C.@azure/monitor-opentelemetry
    4. D.@microsoft/power-apps-insights
    Show answer & explanation

    Correct answer: A@microsoft/applicationinsights-web

    • A. This is the package the documented setup steps install with `npm install` to initialize an Application Insights client inside a code app.
    • B. This package name does not exist in the documented setup; the telemetry SDK used for code apps is the general-purpose Application Insights web package.
    • C. This is a different Azure Monitor OpenTelemetry package; it is not the package referenced in the code apps Application Insights setup guidance.
    • D. This package name does not exist in the documented setup; the Power Apps client library exposes a logger interface, but the telemetry SDK itself is a separate Microsoft package.

    Subdomain 2.4: Deploy and manage Power Apps code apps

    12.The operational health metrics for a code app in the Power Platform admin center show a high time to interactive (TTI), with the secondary metric indicating App.OnStart latency is elevated and a dependent screen count above two when users navigate to a particular screen. Which actions are appropriate responses to the flagged recommendations? (Select 3.)(Select 3)

    1. A.Simplify the Power Fx logic in App.OnStart and move formulas that do not depend on runtime state into App.Formulas instead.
    2. B.Reduce the number of other screens that the affected screen depends on loading before it can become interactive for users.
    3. C.Reduce the number of controls placed directly on the screen that is showing the elevated time to interactive measurement.
    4. D.Increase the code app's published solution version number so the platform recalculates its cached performance baselines.
    5. E.Disable Application Insights telemetry collection entirely, since collecting telemetry is what is slowing App.OnStart execution down.
    Show answer & explanation

    Correct answers: A, B, CSimplify the Power Fx logic in App.OnStart and move formulas that do not depend on runtime state into App.Formulas instead.; Reduce the number of other screens that the affected screen depends on loading before it can become interactive for users.; Reduce the number of controls placed directly on the screen that is showing the elevated time to interactive measurement.

    • A. The recommendation for high App.OnStart latency is to simplify its Power Fx and move formulas that do not need to run at startup into App.Formulas, reducing what has to complete before the app becomes interactive.
    • B. The recommendation for elevated dependent screen counts is to reduce cross-screen dependencies, since loading additional screens before navigation completes adds to the wait time for interactivity.
    • C. A high control count on a screen is called out as a factor in longer time to interactive, so reducing the number of controls on that screen directly addresses the flagged condition.
    • D. Solution version numbers are metadata for ALM tracking and have no effect on runtime performance metrics or how the platform measures time to interactive.
    • E. Application Insights telemetry collection happens after the app has already loaded and is not part of App.OnStart execution, so disabling it would not address elevated startup latency.

    Subdomain 2.2: Create PCF code components

    13.A developer is choosing `control-type` for a new PCF component that renders a Kanban-style board bound to a dataset of opportunity records, requiring drag-and-drop card reordering and dynamic column virtualization for large record counts. Which statement about the standard versus virtual control-type choice is accurate for this scenario?

    1. A.A virtual control renders through the platform's React-based pipeline and is the appropriate choice because it provides platform-managed rendering infrastructure supporting complex, high-volume interactive dataset visualizations overall.
    2. B.A standard control is the appropriate choice here because it grants the component full unmanaged access to the DOM and direct control over pointer events required to implement custom drag-and-drop card reordering across the Kanban board's columns.
    3. C.Both control types render identically for dataset-bound components bound to opportunity records, so the manifest declaration only determines the data-set and property nodes permitted for the board, not the rendering pipeline used for card virtualization or reordering at runtime.
    4. D.A virtual control is disallowed for dataset-type components in this scenario and can only be used with field-type components bound to a single column, such as a custom rating control or a currency formatter attached to one opportunity field.
    Show answer & explanation

    Correct answer: AA virtual control renders through the platform's React-based pipeline and is the appropriate choice because it provides platform-managed rendering infrastructure supporting complex, high-volume interactive dataset visualizations overall.

    • A. Virtual controls are built on the platform's own React rendering pipeline, which is designed to efficiently support dataset-heavy, interactive visualizations like a virtualized Kanban board, making it the fitting choice for this scenario's scale and interactivity requirements.
    • B. Standard controls do render directly to a provided DOM container, but drag-and-drop interactions can be implemented in either control type through standard browser event handling, so DOM access alone is not the deciding factor for this scenario.
    • C. The two control types differ meaningfully in their rendering approach, with virtual controls using the platform's managed React pipeline and standard controls managing their own DOM directly, so the choice is not purely a manifest-permission distinction.
    • D. Virtual controls are commonly used for dataset-type grid and Kanban-style components specifically because of the virtualization and rendering efficiency they provide at scale, so they are not restricted to single-column field-type components.

    Subdomain 2.3: Build Power Apps code apps

    14.A code app needs to render a form with the correct label text and input control type for every column on the Accounts table, adapting automatically if an admin later renames a column's display label or changes its localization. Which approach best satisfies this requirement without hardcoding label strings in the app?

    1. A.Call `AccountsService.getMetadata({ schema: { columns: 'all' } })` at startup, cache the result, and read each attribute's `DisplayName.UserLocalizedLabel.Label` and `AttributeTypeName.Value` to drive labels and control types.
    2. B.Maintain a local JSON file in the app repository that maps each column's `logicalName` to its display label and control type, and commit an update to that file whenever an admin renames a column's label or changes its localization in Dataverse.
    3. C.Parse the column's logical name string at runtime, capitalizing the first letter of each word and inserting spaces at camel-case boundaries, then cache that derived label alongside a control type guessed from the field's data type suffix for every form.
    4. D.Call `AccountsService.getAll({ select: ['name'] })` once at startup, cache the response, and infer each column's display label and input control type from the key names and JavaScript value types found in the first record returned.
    Show answer & explanation

    Correct answer: ACall `AccountsService.getMetadata({ schema: { columns: 'all' } })` at startup, cache the result, and read each attribute's `DisplayName.UserLocalizedLabel.Label` and `AttributeTypeName.Value` to drive labels and control types.

    • A. The getMetadata method requesting all columns returns attribute metadata whose DisplayName carries the user-localized label and whose AttributeTypeName identifies the column's type, letting the form adapt automatically to customization or localization changes as documented.
    • B. A manually maintained local file requires someone to remember to update it every time Dataverse customization changes, which is exactly the hardcoding problem the metadata-driven approach is designed to avoid.
    • C. Deriving a label by capitalizing the logical name produces a made-up string that does not reflect the actual configured display name or its localized translation, so it would not adapt to real label changes.
    • D. Retrieving a record only reveals which fields have values and their runtime shape, not the table's configured display names, attribute types, or localization, so it cannot reliably drive form labels.

    Subdomain 2.2: Create PCF code components

    15.A code component needs to call `context.webAPI.retrieveMultipleRecords` to look up related account records while running inside a model-driven app form. During testing in the browser, the call throws a permissions-style error even though the signed-in user has read privileges on the account table. What is the most likely manifest-related cause?

    1. A.The `feature-usage` node in `ControlManifest.Input.xml` omits a `uses` element with `name="WebAPI"`, so the platform blocks the component from accessing the Web API surface entirely.
    2. B.The `property` element bound to the field is marked `usage="bound"` instead of `usage="input"`, so the platform enforces the binding as read-only and rejects any outbound `retrieveMultipleRecords` call.
    3. C.The `external-service-usage` node lists the wrong domain for the Dataverse organization URL, so the browser treats every Web API request as cross-origin and blocks it before any account records return.
    4. D.The `type-group` element referenced by the bound property omits `Lookup.Simple` from its list of supported types, so the runtime rejects the binding at load time and prevents the component from issuing Web API calls.
    Show answer & explanation

    Correct answer: AThe `feature-usage` node in `ControlManifest.Input.xml` omits a `uses` element with `name="WebAPI"`, so the platform blocks the component from accessing the Web API surface entirely.

    • A. Component logic that calls Device, Utility, or Web API features must declare that usage in the manifest's feature-usage node, and a missing WebAPI declaration is exactly the kind of manifest omission that surfaces as a permissions-style failure when the code tries to invoke context.webAPI at runtime.
    • B. The bound versus input usage attribute determines whether a property is tied to a column value or can also accept a static value from the maker, and it has no bearing on whether the component may call the Web API.
    • C. External-service-usage domains matter for components calling out to services beyond the user's own Dataverse organization, but calling the built-in context.webAPI against the same organization does not depend on that node, so a mismatch there would not cause this symptom.
    • D. Type-group definitions constrain which column data types a bound or input property can accept, which is unrelated to whether the runtime authorizes calls through the context.webAPI object.

    Domain 3: Extend Microsoft Power Platform

    Subdomain 3.1: Create a Dataverse plug-in

    16.Inside the Execute method of an IPlugin implementation, which of the following are valid uses of IServiceProvider.GetService to obtain services the plug-in needs? (Select all that apply.)(Select 3)

    1. A.Call GetService(typeof(IPluginExecutionContext)) to obtain the execution context describing the message, entity, and images for the current operation.
    2. B.Call GetService(typeof(IOrganizationServiceFactory)) and then call CreateOrganizationService with the context's UserId to obtain an Organization service instance.
    3. C.Call GetService(typeof(ITracingService)) to obtain a service that writes diagnostic messages to the PluginTraceLog table for later review.
    4. D.Call GetService(typeof(IOrganizationService)) directly, since IServiceProvider always exposes an already-authenticated Organization service under that type.
    5. E.Call GetService(typeof(IWebProxy)) to obtain a preconfigured HTTP client the plug-in can use to call the Dataverse Web API from inside the pipeline.
    6. F.Call GetService(typeof(IServiceEndpointNotificationService)) to directly modify entity images before the main operation stage runs.
    Show answer & explanation

    Correct answers: A, B, CCall GetService(typeof(IPluginExecutionContext)) to obtain the execution context describing the message, entity, and images for the current operation.; Call GetService(typeof(IOrganizationServiceFactory)) and then call CreateOrganizationService with the context's UserId to obtain an Organization service instance.; Call GetService(typeof(ITracingService)) to obtain a service that writes diagnostic messages to the PluginTraceLog table for later review.

    • A. IPluginExecutionContext is the documented service to retrieve from IServiceProvider to access contextual data such as InputParameters, OutputParameters, and entity images for the current operation.
    • B. The correct pattern for obtaining an Organization service instance is to get IOrganizationServiceFactory from the provider and call CreateOrganizationService with the desired user ID, typically the context's UserId.
    • C. ITracingService is the documented service used to write trace messages that are stored in the PluginTraceLog table so a developer can review plug-in execution details.
    • D. IServiceProvider does not expose a directly castable IOrganizationService type; attempting this cast throws an exception, which is why the factory pattern exists instead.
    • E. IServiceProvider does not expose an IWebProxy service, and plug-ins are not supposed to call the Dataverse Web API from within plug-in code in the first place.
    • F. IServiceEndpointNotificationService is used to post event data to registered service endpoints such as Azure Service Bus, not to read or modify entity images on the execution context.

    Subdomain 3.1: Create a Dataverse plug-in

    17.Which of the following statements about Dataverse custom API configuration properties are correct? (Select all that apply.)(Select 3)

    1. A.Setting Is Private to true blocks the custom API from appearing in the $metadata service document, but a caller who already knows the message name can still invoke it.
    2. B.Setting Is Function to true means the operation is invoked with a GET request and must include at least one response property to be valid.
    3. C.The Enabled for Workflow property allows a custom API to be called from the classic workflow designer, but the custom API cannot be a function while this is enabled.
    4. D.The Execute Privilege Name property lets a publisher create a brand-new custom privilege specifically scoped to that one custom API.
    5. E.Setting Is Private to true immediately prevents any caller, including ones who already know the message name, from successfully invoking the custom API.
    6. F.The Status and Status Reason columns on a custom API record control whether the custom API is currently active and available for callers to invoke.
    Show answer & explanation

    Correct answers: A, B, CSetting Is Private to true blocks the custom API from appearing in the $metadata service document, but a caller who already knows the message name can still invoke it.; Setting Is Function to true means the operation is invoked with a GET request and must include at least one response property to be valid.; The Enabled for Workflow property allows a custom API to be called from the classic workflow designer, but the custom API cannot be a function while this is enabled.

    • A. Is Private hides the custom API from the metadata document and code generation tools, signaling that the publisher does not support outside use, but it does not technically block a caller who already knows the message name and composes a request manually.
    • B. A Function is invoked with a GET request and must return data, so Dataverse requires at least one response property for the function definition to be considered valid.
    • C. Enabled for Workflow lets the custom API be called as a workflow action from the classic designer, but this option cannot be combined with Is Function, since functions are not supported in that designer.
    • D. There is currently no supported way to create a new privilege scoped only to a single custom API; publishers must reuse an existing privilege or one generated for a custom entity instead.
    • E. Is Private only removes the API from discovery surfaces like the metadata document; it does not enforce a runtime block, so a caller who already knows the message name can still successfully invoke it.
    • F. The Status and Status Reason columns exist on the custom API record but have no effect on whether the custom API is available; a custom API record cannot be activated or deactivated to change its availability.

    Subdomain 3.2: Perform operations by using platform APIs

    18.A .NET console application calls Dataverse through IOrganizationService and must honor service protection API limits. A developer writes this retry logic: ```csharp try { service.Execute(request); } catch (FaultException<OrganizationServiceFault> ex) { if (ex.Detail.ErrorCode == -2147015902) { Thread.Sleep(TimeSpan.FromSeconds(5)); service.Execute(request); } } ``` Which change is needed so the application waits the correct amount of time before retrying?

    1. A.Read the wait duration from the Retry-After value in ErrorDetails instead of sleeping a fixed five seconds, because the server calculates that duration from recent load.
    2. B.Replace Thread.Sleep with Task.Delay while keeping the same five-second value, because only the asynchronous wait mechanism determines whether the retry succeeds against the server.
    3. C.Delete the error code comparison and retry on every FaultException that is caught, because service protection errors do not use a distinct error code range at all.
    4. D.Change the fixed sleep to sixty seconds, because every service protection limit error requires exactly one minute of waiting before a retry can succeed.
    Show answer & explanation

    Correct answer: ARead the wait duration from the Retry-After value in ErrorDetails instead of sleeping a fixed five seconds, because the server calculates that duration from recent load.

    • A. The Retry-After duration in the fault's error details reflects the server's own assessment of how long to wait based on recent request volume, so reading it produces the correct delay instead of a guess.
    • B. Swapping the synchronous wait for an asynchronous one changes how the thread blocks but does not fix the underlying problem of using a fixed guessed duration instead of the server-provided value.
    • C. The error code -2147015902 specifically identifies the number-of-requests service protection fault, so removing that check would retry on unrelated errors instead of targeting the throttling condition.
    • D. The Retry-After duration varies with how demanding recent requests were, so hardcoding sixty seconds either wastes time when a shorter wait would do or still fails when a longer wait is required.

    Subdomain 3.2: Perform operations by using platform APIs

    19.An integration that sends large batch requests with many operations per call begins failing with this Dataverse error: "Combined execution time of incoming requests exceeded limit of 1,200,000 milliseconds over time window of 300 seconds." Which change addresses the specific limit that was exceeded?

    1. A.Replace InteractiveBrowserCredential() with ClientSecretCredential(tenant_id, client_id, client_secret), since it authenticates as the application itself.
    2. B.Replace DataverseClient(base_url=..., credential=...) with a direct HTTP call, because the SDK only supports credentials tied to an interactive browser session.
    3. C.Replace the InteractiveBrowserCredential import with a plain username and password string, because the SDK does not use Azure Identity credentials at all.
    4. D.Replace base_url=dataverse_url with base_url=client_secret, because the client secret itself functions as the connection endpoint for unattended authentication.
    Show answer & explanation

    Correct answer: AReplace InteractiveBrowserCredential() with ClientSecretCredential(tenant_id, client_id, client_secret), since it authenticates as the application itself.

    • A. The message names the combined execution-time limit specifically, so the fix is to shrink how demanding each batch is — smaller or simpler batches — since this limit tracks total processing time, not just request count.
    • B. The number-of-requests limit has its own distinct error message about exceeding 6,000 requests; this message instead names execution time, so throttling request count alone doesn't target the limit that was actually hit.
    • C. The concurrent-requests limit has its own separate error citing the number of simultaneous calls; this message is about cumulative execution time over the window, not how many requests were open at once.
    • D. Larger, more complex batches increase the total execution time counted against the window rather than reducing it, so growing the batch size further would make this specific error more likely, not less.

    Subdomain 3.2: Perform operations by using platform APIs

    20.Which statements correctly describe $batch change sets in the Dataverse Web API? (Select 3.)(Select 3)

    1. A.Every operation inside a single change set is treated as atomic, so a failure in one rolls back the others in that same change set.
    2. B.GET requests are not permitted inside a change set, because a change set only groups operations that modify data.
    3. C.A change set can include a Content-ID header so a later operation in it can reference an entity created earlier in the same set.
    4. D.A single $batch request can contain an unlimited number of change sets with no cap on the total number of operations.
    5. E.Change sets automatically defer their contained operations to run as background jobs so the client doesn't wait for a response.
    6. F.A change set must reuse the outer batch's own boundary value for every item inside it, rather than defining its own boundary.
    Show answer & explanation

    Correct answers: A, B, CEvery operation inside a single change set is treated as atomic, so a failure in one rolls back the others in that same change set.; GET requests are not permitted inside a change set, because a change set only groups operations that modify data.; A change set can include a Content-ID header so a later operation in it can reference an entity created earlier in the same set.

    • A. Operations grouped in a change set are atomic: if any one fails, Dataverse rolls back the completed operations in that same change set rather than leaving a partial result.
    • B. GET requests don't change data, so the OData specification and Dataverse both exclude them from change sets, which exist specifically to group write operations into one transaction.
    • C. A Content-ID header lets a later request in the same change set reference the URI of an entity created earlier in it, using a $1-style reference in the request body or URL.
    • D. A $batch request can contain up to 1,000 individual requests in total, so change sets inside it are bounded by that overall limit rather than being unlimited.
    • E. Change sets are about transactional grouping, not deferred execution; the client still waits for the batch response, and asynchronous background processing is a separate mechanism using the respond-async preference.
    • F. A change set defines its own multipart boundary distinct from the outer batch's boundary, and items inside it are delimited using that change set's own boundary value, not the batch's.

    Subdomain 3.4: Configure Power Automate cloud flows and Copilot Studio workflows

    21.A child flow at Northwind Traders is designed to accept an employee ID from a parent flow, look up the employee's department, and return the department name back to the caller. The child flow currently ends with a `Compose` action that stores the department name, but the parent flow's `Run a Child Flow` step always shows an empty output. What is the most likely cause?

    1. A.The child flow is missing a `Respond to a PowerApp or flow` action at the end, which is required to send output values back to whatever called the flow.
    2. B.The child flow's trigger is `Manually trigger a flow` instead of `Power Apps V2`, and only the Power Apps V2 trigger supports returning values to a calling flow.
    3. C.The parent flow calls the child flow using an HTTP action instead of the dedicated `Run a Child Flow` action, which discards any values the child flow attempts to return.
    4. D.The child flow and the parent flow are stored in different solutions, and Dataverse blocks output values from crossing between separate managed solutions at run time.
    Show answer & explanation

    Correct answer: AThe child flow is missing a `Respond to a PowerApp or flow` action at the end, which is required to send output values back to whatever called the flow.

    • A. This is correct: a child flow must end with a Respond to a PowerApp or flow action to send data back to its caller, and without it the child flow returns nothing regardless of what a Compose action stored internally.
    • B. The Manually trigger a flow trigger is precisely the trigger type that supports being called as a child flow with input parameters and a paired response action, so this is not the underlying problem.
    • C. The scenario states the parent already uses the Run a Child Flow step, so an HTTP-based call is not what is being described, and the missing response action is the actual cause of the empty output.
    • D. Parent and child flows are documented to work best when created directly in the same solution for maintainability, but Dataverse does not have a rule that specifically blocks output values from crossing separate solutions at run time.

    Subdomain 3.4: Configure Power Automate cloud flows and Copilot Studio workflows

    22.Which statement about the Dataverse connector's service principal connection support in Power Automate is accurate?

    1. A.Microsoft Dataverse is the standard connector documented to natively support service principal sign-in for its triggers and actions.
    2. B.Every standard Power Automate connector, including Office 365 Outlook and SharePoint, supports service principal sign-in identically to Dataverse.
    3. C.Service principal connections to Dataverse require a premium per-user Power Automate license assigned specifically to the service principal's application user.
    4. D.Service principal connections can only be used with Dataverse actions and are not supported for Dataverse triggers such as row creation or modification.
    Show answer & explanation

    Correct answer: AMicrosoft Dataverse is the standard connector documented to natively support service principal sign-in for its triggers and actions.

    • A. This is correct: documentation specifically calls out that the Dataverse connector supports service principal connections for both its triggers and actions, distinguishing it from many other standard connectors.
    • B. Native service principal sign-in is specifically highlighted as a Dataverse connector capability rather than something available identically across all standard connectors.
    • C. The requirement for a service principal connection is an application user with sufficient Dataverse security privileges, not a specific per-user premium license assignment tied to that application user.
    • D. The Dataverse connector documentation states service principal connections work for both triggers and actions, so triggers such as row creation or modification are supported, not excluded.

    Subdomain 3.3: Process workloads by using Microsoft Azure Functions

    23.A developer enables a system-assigned managed identity on a Function App and deploys code that acquires a token for the organization's Dataverse Web API using `DefaultAzureCredential`. Every call to the Web API returns a 403 Forbidden response, even though the token is issued successfully. What is the most likely cause of the 403 response?

    1. A.No application user exists in Dataverse for the managed identity, or the application user has not been assigned a security role granting the needed privileges.
    2. B.The Function App is deployed to the Consumption hosting plan, which Microsoft Entra ID blocks from acquiring tokens for any Dataverse Web API resource.
    3. C.`DefaultAzureCredential` only supports interactive sign-in flows, so it cannot issue a usable token when running inside an Azure Function at all.
    4. D.The Dataverse Web API rejects every request that carries a managed identity token and requires a delegated user token issued through interactive login instead.
    Show answer & explanation

    Correct answer: ANo application user exists in Dataverse for the managed identity, or the application user has not been assigned a security role granting the needed privileges.

    • A. A valid token proves authentication succeeded, but Dataverse still authorizes the caller separately through an application user record and its assigned security roles; without that mapping, the identity is authenticated but has no privileges.
    • B. The Consumption plan supports managed identities and token acquisition the same as other hosting plans, so the plan choice does not block Entra ID token issuance.
    • C. `DefaultAzureCredential` is designed to work non-interactively inside Azure resources by falling back to the managed identity credential automatically, which is exactly the scenario described.
    • D. Dataverse's Web API accepts Entra ID tokens regardless of whether they came from a managed identity or a delegated sign-in, as long as the caller has a matching application user and security role.

    Subdomain 3.3: Process workloads by using Microsoft Azure Functions

    24.A Service Bus-triggered Azure Function performs Dataverse writes that can take several minutes per message. Select all practices that correctly address long-running message processing in this pattern (choose 3).(Select 3)

    1. A.Renew the Service Bus message lock periodically while processing continues, so it is not redelivered before the function finishes.
    2. B.Use a `CancellationToken` so the function can stop gracefully if the host signals a shutdown mid-processing.
    3. C.Route messages that repeatedly fail processing to a dead-letter queue for investigation instead of retrying indefinitely.
    4. D.Increase the async plug-in execution ceiling in the Dataverse sandbox so the Service Bus message can wait for it.
    5. E.Disable message locking entirely on the queue so the function always has unlimited time to finish any message.
    Show answer & explanation

    Correct answers: A, B, CRenew the Service Bus message lock periodically while processing continues, so it is not redelivered before the function finishes.; Use a `CancellationToken` so the function can stop gracefully if the host signals a shutdown mid-processing.; Route messages that repeatedly fail processing to a dead-letter queue for investigation instead of retrying indefinitely.

    • A. Lock renewal keeps the message invisible to other consumers for as long as processing legitimately continues, preventing the duplicate delivery caused by an expired lock.
    • B. A cancellation token lets the function respond to a host shutdown or timeout signal cleanly, avoiding partial or corrupted writes when processing is interrupted.
    • C. Dead-lettering a message after repeated failures prevents it from looping indefinitely and gives engineers a queue to inspect for the underlying cause.
    • D. There is no configurable execution ceiling for the Dataverse sandbox to raise, and the Service Bus message lock is unrelated to any plug-in's execution allowance.
    • E. Disabling message locking removes the mechanism that prevents duplicate processing altogether, making the reliability problem worse rather than solving it.

    Subdomain 3.3: Process workloads by using Microsoft Azure Functions

    25.A development team wants to use Durable Functions to coordinate a multi-step Dataverse-integrated workload that includes several long-running stages. Select all Durable Functions patterns that correctly apply to this kind of workload (choose 3).(Select 3)

    1. A.Function chaining, to run a sequence of long-running steps where each step's output feeds the next step's input.
    2. B.Fan-out/fan-in, to run multiple long-running sub-tasks in parallel and then aggregate their results once all complete.
    3. C.The human interaction pattern, to pause an orchestration until an external event, such as an approval, is raised back to it.
    4. D.Synchronous plug-in blocking, to hold the Dataverse transaction open until the orchestration reports that every stage has completed.
    5. E.Secure configuration storage, to persist the orchestration's intermediate state inside a plug-in's encrypted configuration field.
    Show answer & explanation

    Correct answers: A, B, CFunction chaining, to run a sequence of long-running steps where each step's output feeds the next step's input.; Fan-out/fan-in, to run multiple long-running sub-tasks in parallel and then aggregate their results once all complete.; The human interaction pattern, to pause an orchestration until an external event, such as an approval, is raised back to it.

    • A. Function chaining is a documented Durable Functions pattern for running ordered steps where each step's result becomes the input to the next, well suited to a multi-stage workload.
    • B. Fan-out/fan-in is a documented Durable Functions pattern for dispatching parallel sub-tasks and waiting for all of them to finish before continuing, which fits parallel long-running stages.
    • C. The human interaction pattern lets an orchestration suspend itself until an external event such as an approval is raised, without consuming compute while it waits.
    • D. Holding a Dataverse transaction open for an orchestration to finish reintroduces the exact synchronous timeout problem that moving work to Durable Functions is meant to avoid.
    • E. Durable Functions persists orchestration state in its own configured storage account, not inside a plug-in's encrypted configuration field, which is not a mechanism Durable Functions uses.

    Subdomain 3.5: Build Microsoft Foundry agents by using code that integrates with the Microsoft Power Platform

    26.Contoso is enabling Claude Code as a Model Context Protocol (MCP) client so a developer can query Dataverse tables directly from the IDE. The Dataverse environment's organization name is `contoso`. Which remote MCP server URL should the developer register in the client configuration?

    1. A.https://contoso.crm.dynamics.com/api/mcp
    2. B.https://contoso.api.powerplatform.com/mcp
    3. C.https://mcp.contoso.dynamics.com/api
    4. D.https://contoso.crm.dynamics.com/mcp/api
    Show answer & explanation

    Correct answer: Ahttps://contoso.crm.dynamics.com/api/mcp

    • A. The Dataverse MCP remote server URL follows the pattern `https://{orgName}.crm.dynamics.com/api/mcp`, so substituting `contoso` for the organization name produces exactly this address. This is the endpoint any conforming MCP client, including Claude Code, points at to reach the tool surface.
    • B. This host name mixes the Dataverse organization prefix with the generic `powerplatform.com` domain, which is not how the MCP endpoint is published. Dataverse MCP traffic is served from the org's own `crm.dynamics.com` host, not a shared platform domain.
    • C. Placing `mcp` as a subdomain in front of the organization name reverses the actual URL structure, where the organization name is the subdomain and `/api/mcp` is the path. A client configured with this host would fail to resolve to the tenant's Dataverse instance.
    • D. Swapping the order of the `mcp` and `api` path segments does not match the documented path `/api/mcp`. Even though the host portion is correct, the path mismatch means requests would not reach the MCP handler.

    Subdomain 3.5: Build Microsoft Foundry agents by using code that integrates with the Microsoft Power Platform

    27.A team wants Copilot Studio to connect to an agent they built and deployed using the current Microsoft Foundry portal, so it appears as a connected agent inside their main Copilot Studio agent. Which prerequisites must be satisfied before this specific connection type will work? (Select 3.)(Select 3)

    1. A.The Foundry agent must have the Activity protocol endpoint enabled, since it is not exposed by default.
    2. B.The Foundry agent must have been created in the current (new) Microsoft Foundry portal, not a legacy one.
    3. C.The maker must supply the Foundry agent's Agent Id when configuring the connection in Copilot Studio.
    4. D.The Foundry agent must be re-published as a Copilot Studio agent template before any connection is possible.
    5. E.The Foundry agent must disable its Responses protocol endpoint so only the Activity protocol remains active.
    6. F.The Copilot Studio environment must be recreated in the same Azure subscription that hosts the Foundry project.
    Show answer & explanation

    Correct answers: A, B, CThe Foundry agent must have the Activity protocol endpoint enabled, since it is not exposed by default.; The Foundry agent must have been created in the current (new) Microsoft Foundry portal, not a legacy one.; The maker must supply the Foundry agent's Agent Id when configuring the connection in Copilot Studio.

    • A. Correct: a newly created Foundry agent exposes only the Responses and A2A protocol endpoints by default, so the Activity protocol endpoint must be enabled before Copilot Studio can connect to it.
    • B. Correct: connecting to Microsoft Foundry agents from Copilot Studio is documented as only working for agents created in the new Microsoft Foundry portal.
    • C. Correct: configuring the connection in Copilot Studio requires entering the Agent Id of the Microsoft Foundry agent being connected to.
    • D. Incorrect: there is no documented requirement to re-publish the Foundry agent as a Copilot Studio template; the agent remains a Foundry agent that Copilot Studio connects to directly.
    • E. Incorrect: there is no requirement to disable the Responses endpoint; the requirement is that the Activity protocol endpoint specifically be enabled, not that other endpoints be turned off.
    • F. Incorrect: there is no documented requirement tying the Copilot Studio environment to the same Azure subscription hosting the Foundry project.

    Subdomain 3.5: Build Microsoft Foundry agents by using code that integrates with the Microsoft Power Platform

    28.Goal: A partner's agent, built entirely on its own external reasoning framework and hosted outside Copilot Studio, must receive delegated multi-turn tasks from your Copilot Studio agent along with rich structured metadata about each request. Solution: connect the partner's agent to your Copilot Studio agent using an A2A protocol connection with the appropriate authentication method for the partner's endpoint. Does this solution meet the goal?

    1. A.True
    2. B.False
    Show answer & explanation

    Correct answer: ATrue

    • A. This is correct. The A2A protocol is designed for exactly this case: delegating tasks with multi-turn support and rich structured metadata to an externally hosted agent built on its own framework, using an authentication method matched to how the target endpoint is secured.
    • B. This is incorrect as an assessment. An A2A connection configured with an authentication method appropriate to the partner endpoint is the documented approach for delegating multi-turn, metadata-rich tasks to an externally hosted, framework-independent agent.

    Domain 4: Develop integrations

    Subdomain 4.1: Publish and consume Dataverse events

    29.Northwind Traders runs a multi-region ERP integration platform outside Dataverse, and their environment already uses solution layers with a CI/CD pipeline built on Power Platform Build Tools. They need every case creation in Dataverse to reach the ERP integration layer even if that layer's listener service is temporarily down for maintenance, and messages must wait in a durable location until the listener resumes, without any custom retry logic inside Dataverse. Which service endpoint configuration meets this requirement?

    1. A.Register an Azure Service Bus service endpoint using the queue contract, so messages persist in the queue until the listener is ready to read them.
    2. B.Register a webhook service endpoint using HttpQueryString authentication, so the ERP layer can retrieve execution context whenever its listener restarts.
    3. C.Register an Azure Service Bus service endpoint using the one-way contract, so Dataverse retries the post at increasing intervals until a listener responds.
    4. D.Register an Azure Event Hub service endpoint with default settings, so any listener that later subscribes receives the buffered event stream.
    Show answer & explanation

    Correct answer: ARegister an Azure Service Bus service endpoint using the queue contract, so messages persist in the queue until the listener is ready to read them.

    • A. A queue contract does not require an actively listening application at the moment Dataverse posts the message; the message is held in the queue, including in a persistent variant with a long but finite availability duration, until a listener performs a read.
    • B. A webhook sends a synchronous HTTP POST with a 60-second timeout and has no built-in durable queue, so the listener must already be reachable at the moment the event fires or the request simply fails.
    • C. A one-way contract requires an active listener at post time; without one, Dataverse retries with exponential backoff for a period and then aborts the related system job as failed rather than holding the message indefinitely.
    • D. Event Hub is built for high-throughput streaming with a bounded retention window rather than guaranteed per-message delivery to a specific listener that may not yet exist when the event is published.

    Subdomain 4.1: Publish and consume Dataverse events

    30.An architecture team is evaluating Azure Event Hub as the mechanism for publishing high-volume Dataverse events to a telemetry pipeline. Which two statements correctly describe how the Azure Event Hub integration behaves? (Select two.)(Select 2)

    1. A.Event Hub is registered as a service endpoint contract distinct from the Service Bus queue, one-way, two-way, and REST contracts, and targets streaming scenarios rather than request/response messaging.
    2. B.Event data posted to an Event Hub can be consumed by multiple independent downstream readers without Dataverse needing to know how many consumers exist.
    3. C.Event Hub delivery guarantees that a response value is returned to the originating plug-in, the same way a two-way Service Bus contract does.
    4. D.Event Hub is configured through the Register New WebHook command, reusing the WebhookKey authentication option for the connection string.
    5. E.Event Hub requires every intended listener to already be actively subscribed before the plug-in step executes, or the transaction is rolled back.
    6. F.Event Hub replaces the need to register a message processing step, because Dataverse automatically forwards every table's events to any Event Hub in the environment.
    Show answer & explanation

    Correct answers: A, BEvent Hub is registered as a service endpoint contract distinct from the Service Bus queue, one-way, two-way, and REST contracts, and targets streaming scenarios rather than request/response messaging.; Event data posted to an Event Hub can be consumed by multiple independent downstream readers without Dataverse needing to know how many consumers exist.

    • A. Event Hub is its own contract type alongside queue, one-way, two-way, and REST, and it is intended for streaming event data to be processed downstream rather than for synchronous request/response calls.
    • B. Event Hub is designed so multiple independent consumers can read the stream, and Dataverse simply posts to the hub without tracking or limiting how many downstream readers exist.
    • C. Returning a value to the calling plug-in is a feature of the two-way contract, not of Event Hub, which is a one-way streaming destination with no response channel back to Dataverse.
    • D. Event Hub is registered as its own Azure integration endpoint type, not through the Register New WebHook command, and WebhookKey is a webhook authentication option rather than an Event Hub connection setting.
    • E. Event Hub retains published events for a configured window so consumers can read them later; a message processing step still executes and posts the event regardless of whether a consumer happens to be actively reading at that moment.
    • F. A message processing step still must be registered on the relevant message and table combination; Dataverse does not automatically forward every table's events to an Event Hub without that registration.

    Subdomain 4.1: Publish and consume Dataverse events

    31.You need an external system to receive Dataverse contact update events without polling, and delivery must succeed even if the listener application is temporarily offline for a few minutes at the moment an event occurs. Solution: register a webhook service endpoint using HttpHeader authentication. Does this solution meet the goal?

    1. A.True
    2. B.False
    Show answer & explanation

    Correct answer: BFalse

    • A. A webhook sends a synchronous HTTP POST with a 60-second timeout and no built-in message queue, so this claim that it tolerates a temporarily offline listener is incorrect regardless of which authentication option is chosen.
    • B. Because a webhook requires the listener to be reachable at the moment the event fires and provides no durable queuing, an offline listener causes the delivery to fail; a queue contract on Azure Service Bus would be needed to tolerate that downtime instead.

    Subdomain 4.3: Create custom connectors

    32.Contoso Invoicing's Get Invoice operation returns each invoice as a JSON object whose tags field is a single semicolon-separated string of tag names. The Power Automate team consuming the custom connector wants an easy-to-use array of tags in the flow designer instead of parsing the string themselves, and the connector maker wants to avoid changing any backend code. Which approach should the connector maker take?

    1. A.Apply the "Convert delimited string into array of objects" policy to the response of the Get Invoice action, targeting the tags property.
    2. B.Ask the Contoso Invoicing API team to change the backend so the tags field is returned as a native JSON array instead of text.
    3. C.Write a custom code Script class that parses the semicolon-separated string in ExecuteAsync and rebuilds the response body manually.
    4. D.Add an x-ms-dynamic-values extension to the tags property so the semicolon-separated list renders as a selectable dropdown in flows.
    Show answer & explanation

    Correct answer: AApply the "Convert delimited string into array of objects" policy to the response of the Get Invoice action, targeting the tags property.

    • A. This policy template runs on the response, splits a delimited string field into a new array, and requires no backend or code changes, which matches both stated constraints.
    • B. Changing the backend API's response shape is a real fix but requires the Contoso Invoicing team to modify their service, which the maker explicitly wants to avoid.
    • C. Custom code can perform this transformation, but it requires writing and maintaining a script, which is more effort than configuring an existing policy template for the same result.
    • D. This extension is meant to populate an input parameter's list of selectable values from another operation, not to reshape an existing response field into an array.

    Subdomain 4.3: Create custom connectors

    33.A maker needs a request sent to a custom connector operation to convert an array of invoice line items into a single comma-delimited string before it reaches the backend API. Solution: apply the "Convert delimited string into array of objects" policy template to the request. Does this solution meet the goal?

    1. A.True
    2. B.False
    Show answer & explanation

    Correct answer: BFalse

    • A. This statement would be incorrect: the chosen policy does not turn an array into a delimited string, so it cannot produce the outcome the goal describes.
    • B. The chosen policy template converts a delimited string into an array, which is the opposite direction from what the goal requires, so it does not turn the invoice line item array into a comma-delimited string.

    Subdomain 4.2: Implement synchronization for Dataverse data

    34.Adatum's integration developer wants the following Web API request to update an existing product identified by its alternate key, and to fail with a `404 Not Found` response instead of silently creating a new record if no matching product exists: ``` PATCH [Organization Uri]/api/data/v9.2/products(productcode='SKU-4471') HTTP/1.1 OData-MaxVersion: 4.0 OData-Version: 4.0 Content-Type: application/json { "name": "Widget Mount Bracket" } ``` Which change makes the request behave as an update-only operation?

    1. A.Add an `If-Match: *` request header, because including it turns the `PATCH` request into an update-only operation that returns `404 Not Found` when no record matches the alternate key in the URL.
    2. B.Add an `If-None-Match: *` request header, because that header instructs Dataverse to reject the request whenever a record already exists for the given alternate key value.
    3. C.Change the request body to include the alternate key value again as `"productcode": "SKU-4471"`, because Dataverse only treats a `PATCH` request as an update when the key value is duplicated in the body.
    4. D.Replace `PATCH` with `PUT` in the request line, because `PUT` requests are always treated as update-only operations while `PATCH` requests always allow record creation.
    Show answer & explanation

    Correct answer: AAdd an `If-Match: *` request header, because including it turns the `PATCH` request into an update-only operation that returns `404 Not Found` when no record matches the alternate key in the URL.

    • A. The `If-Match: *` header makes the `PATCH` request update-only, so Dataverse returns `404 Not Found` instead of creating a record when no row matches the alternate key in the URL.
    • B. `If-None-Match: *` is used to block an update and only allow record creation, which is the opposite of the update-only behavior this scenario requires.
    • C. Duplicating the alternate key value in the request body has no effect on whether the operation is treated as create-only or update-only, and the documented guidance is to omit key values from the body entirely.
    • D. The Web API's `Upsert`/`Update` distinction is controlled by the `If-Match` header on a `PATCH` request, not by switching the HTTP method to `PUT`.

    Subdomain 4.2: Implement synchronization for Dataverse data

    35.A developer at Contoso defines an alternate key on the Customer table using the `externalref` column so records can be upserted using the ID supplied by an external CRM. After the key is created, several `PATCH` requests referencing existing external IDs unexpectedly fail, and the team traces the failures to a small subset of IDs such as `CUST/4471` and `A&B-2209`. What is the cause of these failures?

    1. A.The values contain characters such as `/` and `&`; retrieve, update, and upsert requests fail when a key column holds `/`, `<`, `>`, `*`, `%`, `&`, `:`, `\`, `?`, or `+`.
    2. B.The `externalref` column was defined as a whole number type, and Dataverse alternate keys silently truncate any non-numeric characters supplied in a key value used in a `PATCH` request URL.
    3. C.The alternate key index is still building in the background, and Dataverse rejects any `PATCH` request that references a key whose `EntityKeyIndexStatus` has not yet reached `Active`.
    4. D.The external CRM IDs exceed the 900-byte total key size limit once URL-encoded, and Dataverse rejects any key value whose encoded length surpasses that SQL-based index constraint.
    Show answer & explanation

    Correct answer: AThe values contain characters such as `/` and `&`; retrieve, update, and upsert requests fail when a key column holds `/`, `<`, `>`, `*`, `%`, `&`, `:`, `\`, `?`, or `+`.

    • A. Dataverse documents that retrieve, update, and upsert operations don't work correctly when an alternate key column's value contains characters such as `/`, `<`, `>`, `*`, `%`, `&`, `:`, `\`, `?`, or `+`, which matches the IDs causing failures here.
    • B. A whole number column would reject non-numeric input outright rather than silently truncating characters, and the described symptom matches the documented character restriction instead.
    • C. A key whose index build is still in progress would cause uniqueness enforcement issues rather than failures isolated to values containing specific punctuation characters.
    • D. The 900-byte total key size limit is a constraint on the overall key definition, not something that fails only for a subset of values containing particular characters like these.

    Want the full experience?

    These are just samples. Practice the full Extending Microsoft Power Platform Solutions with Code and AI (AB-400) question bank in quiz mode — free, no signup, with domain practice and exam simulation.