Nov 22, 2025
A way to process more than 5000 records in Cloud Flow execution
Nov 17, 2023
Write a Custom API call from Clout Flow
In a previous article, we check how we Write a Custom API and calling it from classic workflow. It worked well, yet we encountered some hiccups in deployment. Actually, recommended way is to call it from a Cloud Flow than a workflow.
Lets check that using a simple sample Cloud Flow. Implementation of the Custom API remains the same. Please refer that part from previous post.
Lets do the calling part from a Cloud Flow. I would select a flow that triggered on demand from the custom entity (in our case so_office).
First I am selecting a task to trigger when selecting a record from Office where I need to select the environment along with entity.
Here I demonstrated only simple on demand flow for ease of demonstration, but what we need to learn is, in any flow we can call out Custom API using Performa Bound Action of Microsoft Dataverse. Most importantly, this is the recommended way than calling from a workflow.
Oct 18, 2023
Write a Custom API and call from Workflow
A Custom API is comparatively a new mechanism to create your own API in Dataverse. This is like a Action where you can package few steps to accomplish something. Advantage is you can then call from anywhere, either client side or server side etc. Obviously it can be called via a workflow or Cloud Flow too. Custom API is more flexible since coding is possible.
In this scenario we will see how to create a simple Custom API and call it from a classic workflow.
Writing a Custom API
1) We need to write a code which is pretty similar to a Plug-in. This is where we define our logic. In my case I am accepting a parameter string (i.e. DetailStr). Logic is to update Description (i.e. so_description) field of the custom entity called Office (i.e. so_office) with parameter value.
namespace AccAdmin.Plugins.CustomApi { public class UpdateOffice : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context; IOrganizationServiceFactory factory; IOrganizationService service; try { context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); if (!context.InputParameters.Contains("DetailStr")) throw new InvalidPluginExecutionException($"DetailStr not designated or Invalid.."); if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is EntityReference target) { if (target.LogicalName != "so_office") return; factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); service = factory.CreateOrganizationService(context.UserId); Entity entity = new Entity(); entity.LogicalName = "so_office"; entity.Id = context.PrimaryEntityId; entity["so_description"] = (string)context.InputParameters["DetailStr"]; service.Update(entity); } } catch (FaultException<OrganizationServiceFault> e) { throw e; } finally { service = null; factory = null; context = null; } } } }
2) Once register the Plug-in, Custom API step will be visible as a step as below.












