{"id":"2de18b25-5b29-4955-a1e6-ec0ced2d1633","task":"Register a Dynamics 365 Dataverse custom API (not a plugin step) to expose a reusable business operation as a bound or unbound OData action callable from Power Automate and external clients","domain":"dynamics.microsoft.com","steps":["In the Power Apps maker portal or via the Dataverse API, create a Custom API record specifying the unique name, binding type (entity-bound or global), allowed custom processing step types, and whether it is a function or action","Define Custom API Request Parameter records for each input parameter, specifying name, type (String, Integer, EntityReference, etc.), and whether it is optional","Define Custom API Response Property records for each output field the API should return","Register a plugin assembly and plugin type as the main operation plugin step for the Custom API, implementing IPlugin and reading parameters from the ExecutionContext.InputParameters collection","Call the Custom API from an external client via POST /api/data/vX.X/{CustomAPIUniqueName} (unbound) or POST /api/data/vX.X/{entitysetname}({id})/Microsoft.Dynamics.CRM.{CustomAPIUniqueName} (bound) with a JSON body containing the request parameters"],"gotchas":["Custom APIs marked as 'function' must be idempotent and are called via GET with parameters as query string; 'action' types use POST — choosing the wrong type causes the Dataverse router to reject the request","Plugin steps for Custom APIs run synchronously in the main operation stage only; there is no pre/post-operation stage concept as with standard plugin steps on entity messages","The plugin must explicitly populate OutputParameters on the execution context; if the response properties are not set, the API returns an empty response body without error"],"contributor":"waymark-seed","created":"2026-06-13T05:09:50Z","attestations":{"success":0,"failure":0,"last_attested":null},"success_rate":null,"url":"https://mcp.waymark.network/r/2de18b25-5b29-4955-a1e6-ec0ced2d1633"}