This is the free Microsoft PL-400 practice question bank —
210 of 409 total questions, each with a full explanation, free to
read with no signup required. Updated 2026-08-05.
Every answer is verified against official Microsoft documentation —
see our methodology.
Question 1
You create a custom API as part of a solution that will be made available on Microsoft AppSource.
You need to prevent others from using Dataverse code generation tools that create classes and use the messages for your custom API.
What should you do?
A. Set Is Private to Yes.
B. Set Is Function to Yes.
C. Set Allowed Custom Processing Step Type to None.
D. Set Allow Customizations to No.
Show Answer
Correct Answer: A
Explanation: Setting Is Private to Yes makes the custom API private so it is not exposed in the service metadata used by Dataverse code generation tools to generate message classes. Other options control function semantics, plug-in extensibility, or solution customization rather than code generation exposure.
Sources:
https://learn.microsoft.com/en-us/power-apps/developer/data-platform/create-custom-api-with-code
Question 2
A company is testing a solution that you built by using access team templates.
Users report that they are unable to access rows.
You need to ensure that the solution works as expected.
What should you do?
A. Assign the rows to the team.
B. Add the users to the Access Team Members subgrid.
C. Share the affected rows.
D. Assign a security role to the users.
Show Answer
Correct Answer: B
Explanation: Access team templates grant record-level access by adding users to an access team associated with a specific record. To give users access, they must be added through the Access Team Members subgrid on the record. Assigning the record, sharing it manually, or assigning security roles does not implement the access team template mechanism. Security roles are still required for baseline entity access, but the issue described with access team templates is resolved by adding users to the access team.
Question 3
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear on the review screen.
You have two tables, account and contact, with a parent-child relationship. Records in the account table can be created in the UI or from an external system integrated with Dataverse by using an Azure Function.
When a user creates a record in the account table, a default record in the contact table must be created automatically.
You need to implement a process to create the contact records.
Solution: Create a JavaScript function that runs when the account record form is saved. Use the Web API in the JavaScript function to create the contact record.
Does the solution meet the goal?
A. Yes
B. No
Show Answer
Correct Answer: B
Explanation: The requirement applies to account records created either through the UI or by an external system via Dataverse. A JavaScript function on the form save event only runs for interactive users in the model-driven app and will not execute when records are created through the external integration. Therefore it does not guarantee creation of the related contact for all account records. A server-side approach such as a Dataverse plug-in or Power Automate cloud flow would meet the requirement.
Question 4
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear on the review screen.
You have two tables, account and contact, with a parent-child relationship. Records in the account table can be created in the UI or from an external system integrated with Dataverse by using an Azure Function.
When a user creates a record in the account table, a default record in the contact table must be created automatically.
You need to implement a process to create the contact records.
Solution: Create a custom API bound to the account table that uses a plug-in. Use the Organization service to create the contact record.
Does the solution meet the goal?
A. Yes
B. No
Show Answer
Correct Answer: B
Explanation: The requirement is to automatically create a child contact when an account is created from either the model-driven app UI or an external integration. A custom API only runs when it is explicitly invoked; creating an account through the standard Create message does not automatically call a custom API. A plug-in registered on the Account Create message (or another automatic process such as a flow) would meet the requirement, but the proposed custom API solution does not.
Question 5
DRAG DROP
-
You are writing code to integrate a system with Dataverse by using the Web API.
The code must perform the following operations:
• Upsert to create and update records
• Upsert only to create new records
You need to complete the requests to perform the operations.
Which headers should you use? To answer, move the appropriate headers to the correct operations. You may use each header once, more than once, or not at all. You may need to move the split bar between panes or scroll to view content.
Show Answer
Correct Answer: Upsert to create and update records — If-None-Match: null
Upsert only to create new records — If-None-Match: *
Explanation: In Dataverse Web API, a normal upsert uses If-None-Match: null to allow create or update. To prevent updates and only create when the record does not exist, use If-None-Match: *.
Question 6
Note: This question is part of a series of questions that present the same scenario. Each question in the series contains a unique solution that might meet the stated goals. Some question sets might have more than one correct solution, while others might not have a correct solution.
After you answer a question in this section, you will NOT be able to return to it. As a result, these questions will not appear on the review screen.
You have two tables, account and contact, with a parent-child relationship. Records in the account table can be created in the UI or from an external system integrated with Dataverse by using an Azure Function.
When a user creates a record in the account table, a default record in the contact table must be created automatically.
You need to implement a process to create the contact records.
Solution: Create a plug-in that runs when the account record is created. Use the Organization service to create the contact record.
Does the solution meet the goal?
A. Yes
B. No
Show Answer
Correct Answer: A
Explanation: A synchronous plug-in registered on the Create message for the account table can automatically create the related contact by using the Dataverse Organization Service. This works regardless of whether the account is created through the model-driven app UI or via an external integration that uses Dataverse, satisfying the requirement.
Question 7
A model-driven app form has JavaScript that runs during the OnLoad event. The event retrieves an account record and changes visibility to a form column based on one of the record columns. The following portion of code retrieves the account record:
Xrm.WebApi.retrieveRecord('account', accountId)_
Users report that the form loads slowly.
You need to improve the performance of the code that retrieves the account and changes visibility.
What should you do?
A. Use a synchronous XMLHttpRequest instead.
B. Add the code to change visibility to the success callback.
C. Enable the Async OnLoad app setting.
D. Set the options parameter to return only the column required.
E. Store the returned data in a global variable.
Show Answer
Correct Answer: D
Explanation: Use the options parameter (for example, $select) to retrieve only the specific column needed to determine visibility. Reducing the payload improves the performance of the Web API call. The other options either do not reduce retrieval cost, are incorrect (synchronous requests would hurt responsiveness), or are unrelated to the immediate performance issue.
Question 8
HOTSPOT
-
Users are directed to a form in a model-driven app through a special URL that passes values for three lookup columns.
The form consists of three tabs: A, which is the default tab, B, and C. The form has JavaScript code registered on the OnLoad and OnSave events as follows:
• OnLoad: A lookup column on each tab is used to retrieve data. The data is used to populate columns on that same tab.
• OnSave: Data validation involves calculations of columns on the form. If a value is outside the acceptable range, the record must not be saved.
Users report that loading and saving the form takes too long when they create a new record.
You need to shorten the time it takes to load and save the form without losing functionality.
Which new event registrations should you create? To answer, select the appropriate options in the answer area.
NOTE: Each correct selection is worth one point.
Show Answer
Correct Answer: OnLoad: TabStateChange events on tabs B and C
OnSave: OnChange events for the columns involved in the calculations
Explanation: Keep initialization only for the default visible tab and defer work for hidden tabs until opened. Move save-time validation calculations to field OnChange so validation state is maintained during editing, reducing OnSave processing while still preventing invalid saves.
Question 9
HOTSPOT
-
You are implementing a Power Automate flow in a model-driven app. The flow will facilitate an approval process to increase customer credit limits.
A user must be able to initiate the process from a customer record. The user must be prompted for the amount of the increase.
Once the increase is approved, the customer record must update to reflect the new amount.
You need to add a trigger to the flow and locate the ID of the record to update. The flow should be written to use the least number of steps.
How should you create the flow? To answer, select the appropriate options in the answer area.
NOTE: Each correct selection is worth one point.
Show Answer
Correct Answer: Trigger type: When a Dataverse record is selected
Record ID to update: From the trigger
Explanation: A flow started from a model-driven app on a selected Dataverse record can prompt for inputs (such as the credit increase amount) and already has the selected record's ID in the trigger outputs, avoiding an extra lookup step.
Question 10
HOTSPOT
-
You are extending a model-driven app by using modern commanding in Power Fx.
When a user selects a button on the Opportunity form, the button must trigger an automation to generate a document by updating a single column in Dataverse. Users must affirm the action before it takes place and receive a message after it completes successfully.
You need to write the formula.
How should you complete the code segment? To answer, select the appropriate options in the answer area.
NOTE: Each correct selection is worth one point.
Show Answer
Correct Answer: Confirm
Patch
ThisItem
Notify
Explanation: Use Confirm to require user affirmation, Patch to update a single Dataverse column, ThisItem to reference the current form record, and Notify to display a success message.
$19
Get all 409 questions with detailed answers and explanations
Instant download HTML + PDF delivered the moment payment clears.
Secure Stripe checkout we never see or store your card details.
7-day refund if files are defective see our refund policy.