{"id":44748,"date":"2026-05-28T16:23:01","date_gmt":"2026-05-28T10:53:01","guid":{"rendered":"https:\/\/www.inogic.com\/blog\/?p=44748"},"modified":"2026-05-28T16:23:35","modified_gmt":"2026-05-28T10:53:35","slug":"calling-dataverse-actions-functions-from-power-apps-code-apps","status":"publish","type":"post","link":"https:\/\/www.inogic.com\/blog\/2026\/05\/calling-dataverse-actions-functions-from-power-apps-code-apps\/","title":{"rendered":"Calling Dataverse Actions and Functions from Power Apps Code Apps"},"content":{"rendered":"<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44757\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps.png\" alt=\"Dataverse\" width=\"2100\" height=\"1200\" srcset=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps.png 2100w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps-300x171.png 300w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps-1024x585.png 1024w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps-768x439.png 768w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps-1536x878.png 1536w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps-2048x1170.png 2048w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Calling-Dataverse-Actions-and-Functions-from-Power-Apps-Code-Apps-660x377.png 660w\" sizes=\"(max-width: 2100px) 100vw, 2100px\" \/>When building Power Apps code apps, one of the most powerful things you can do is reach directly into Dataverse to trigger business logic. Whether it is routing a support ticket to the right queue, checking who the current user is, or running a custom API operation, Dataverse actions and functions are the engine behind most enterprise workflows.<\/p>\n<p>In the past, calling these operations required manually writing Web API fetch calls, constructing the right URLs, and handling typed responses by hand. It worked, but it was slow, error-prone, and hard to maintain as schemas evolved.<\/p>\n<p>Microsoft has now introduced a much cleaner developer experience through the Power Apps npm CLI. With just two commands \u2014 find-dataverse-api and add-dataverse-api \u2014 you can discover operations in your Dataverse environment, generate fully typed TypeScript service classes, and call them directly from your code app with confidence.<\/p>\n<p>This blog walks through exactly how to do that, using a real-world scenario: a support team that needs to automatically route incoming cases to the correct queue based on priority.<\/p>\n<h3>Client Scenario: Automated Case Routing<\/h3>\n<p>A client running a customer support operation on Dynamics 365 came to us with a specific pain point. Their agents were starting every shift by manually scanning a shared queue, finding cases relevant to them, and self-assigning each one individually through the Dynamics 365 UI. With dozens of queued cases at any given time, agents were spending the first 15\u201320 minutes of every shift just on assignment, before they had even looked at a single customer issue.<\/p>\n<p>They needed a code app that displayed all cases currently sitting in the queue and allowed an agent to pick and assign any case to themselves with a single click. The assignment logic already existed as a Dataverse bound action called PickFromQueue. The challenge was invoking it cleanly from a modern Power Apps code app.<\/p>\n<p>The requirements the client laid out were straightforward:<\/p>\n<ul>\n<li>View all active cases in a clean, filterable list<\/li>\n<li>Select a case from the queue and assign it to yourself with one click<\/li>\n<li>Show who is currently logged in so agents can confirm their session<\/li>\n<li>Ensure all operations are type-safe and maintainable<\/li>\n<\/ul>\n<p>This is exactly the kind of scenario the add-dataverse-api command was built for.<\/p>\n<h3>Prerequisites<\/h3>\n<p>Before following this guide, make sure the following are in place:<\/p>\n<ul>\n<li>A Power Apps code app initialised using npx power-apps init<\/li>\n<li>The @microsoft\/power-apps package at version 1.1.1 or later in your package.json<\/li>\n<li>An active CLI session (the CLI will prompt you to authenticate if not already logged in)<\/li>\n<li>Access to the Dataverse environment that contains the operations you want to call<\/li>\n<li>js installed on your machine (version 18 or later recommended)<\/li>\n<\/ul>\n<blockquote><p><strong><em>Note: Run npm list @microsoft\/power-apps to confirm the package version (1.1.1 or later). The CLI version (shown by npx power-apps &#8211;version) may differ from the package version.<\/em><\/strong><em>.<\/em><\/p><\/blockquote>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44755\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1.png\" alt=\"Dataverse 1\" width=\"2170\" height=\"725\" srcset=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1.png 2170w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1-300x100.png 300w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1-1024x342.png 1024w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1-768x257.png 768w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1-1536x513.png 1536w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1-2048x684.png 2048w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-1-660x221.png 660w\" sizes=\"(max-width: 2170px) 100vw, 2170px\" \/><\/p>\n<h3>Step 1: Discover Available Dataverse Operations<\/h3>\n<p>The first step is to find out which Dataverse operations are available in your environment. The find-dataverse-api command performs a case-insensitive substring search against the operation names in your connected environment.<\/p>\n<p>For this scenario, we need two operations. The first is WhoAmI, which identifies the current logged-in user. The second is PickFromQueue, which picks a case from a queue and assigns it to a specified user.<\/p>\n<h3>Finding WhoAmI<\/h3>\n<p>Run the following command in your terminal from inside the code app project folder:<\/p>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps find-dataverse-api --search \"WhoAmI\"<\/pre>\n<p>The output will show the operation name, its kind (Function or Action), and its return type:<\/p>\n<h3><img decoding=\"async\" class=\"alignnone size-full wp-image-44754\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-2.png\" alt=\"Dataverse\" width=\"1428\" height=\"476\" srcset=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-2.png 1428w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-2-300x100.png 300w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-2-1024x341.png 1024w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-2-768x256.png 768w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-2-660x220.png 660w\" sizes=\"(max-width: 1428px) 100vw, 1428px\" \/><\/h3>\n<h3>Finding PickFromQueue<\/h3>\n<p>Next, search for the PickFromQueue action:<\/p>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps find-dataverse-api --search \"PickFromQueue\"<\/pre>\n<p>You will see something like this:<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44753\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-3.png\" alt=\"Dataverse\" width=\"1712\" height=\"919\" srcset=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-3.png 1712w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-3-300x161.png 300w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-3-1024x550.png 1024w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-3-768x412.png 768w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-3-1536x825.png 1536w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-3-660x354.png 660w\" sizes=\"(max-width: 1712px) 100vw, 1712px\" \/><\/p>\n<p>Notice that PickFromQueue is a bound action \u2014 it is bound to mscrm.queueitem, meaning it must be called with the GUID of the queue item record as its first argument. This is an important distinction that affects how the generated service method works, which we will cover shortly.<\/p>\n<p>If you want to inspect the raw JSON output for scripting purposes, add the &#8211;json flag:<\/p>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps find-dataverse-api --search \"PickFromQueue\" --json<\/pre>\n<h3>Step 2: Add the Operations to Your Code App<\/h3>\n<p>Once you have confirmed the operation names, use the add-dataverse-api command to wire them into your project. This command does several things automatically:<\/p>\n<ul>\n<li>Fetches the full operation definition from your environment&#8217;s Dataverse metadata endpoint<\/li>\n<li>Creates a schema file at the configured schema path<\/li>\n<li>Generates TypeScript model files for any entities referenced in the operation<\/li>\n<li>Generates a typed service class for the operation<\/li>\n<li>Updates power.config.json with the necessary database reference<\/li>\n<li>Regenerates dataSourcesInfo.ts to include the new operation<\/li>\n<\/ul>\n<h3>Adding WhoAmI<\/h3>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps add-dataverse-api --api-name WhoAmI<\/pre>\n<p>On success, you will see:<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44752\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-4.png\" alt=\"Dataverse 1\" width=\"1426\" height=\"477\" srcset=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-4.png 1426w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-4-300x100.png 300w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-4-1024x343.png 1024w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-4-768x257.png 768w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-4-660x221.png 660w\" sizes=\"(max-width: 1426px) 100vw, 1426px\" \/><\/p>\n<h3>Adding PickFromQueue<\/h3>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps add-dataverse-api --api-name PickFromQueue<\/pre>\n<p>Or using the short alias:<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44751\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-5.png\" alt=\"Dataverse \" width=\"1427\" height=\"477\" srcset=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-5.png 1427w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-5-300x100.png 300w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-5-1024x342.png 1024w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-5-768x257.png 768w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-5-660x221.png 660w\" sizes=\"(max-width: 1427px) 100vw, 1427px\" \/><\/p>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps add-dataverse-api -n PickFromQueue<\/pre>\n<p>Once both commands complete, your project structure will include new generated files. Here is a summary of what was created or updated:<\/p>\n<table width=\"624\">\n<tbody>\n<tr>\n<td width=\"312\"><strong>File<\/strong><\/td>\n<td width=\"312\"><strong>What Changed<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"312\">schemas\/dataverse\/WhoAmI.Schema.json<\/td>\n<td width=\"312\">Created \u2014 operation schema<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">schemas\/dataverse\/PickFromQueue.Schema.json<\/td>\n<td width=\"312\">Created \u2014 operation schema<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">schemas\/appschemas\/dataSourcesInfo.ts<\/td>\n<td width=\"312\">Regenerated to include both operations<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">power.config.json<\/td>\n<td width=\"312\">Updated with default.cds database reference<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">generated\/services\/WhoAmIService.ts<\/td>\n<td width=\"312\">Generated typed service class<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">generated\/services\/PickFromQueueService.ts<\/td>\n<td width=\"312\">Generated typed service class<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><img decoding=\"async\" class=\"alignnone size-full wp-image-44750\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-6.png\" alt=\"Dataverse\" width=\"266\" height=\"296\" \/><\/h3>\n<h3>Step 3: Use the Generated Services in Your App<\/h3>\n<p>With the service classes generated, you can now import and call them directly in your application code. The CLI handles all the Web API URL construction, authentication headers, and response parsing behind the scenes.<\/p>\n<h3>Calling WhoAmI<\/h3>\n<p>Import the WhoAmIService from the generated services directory and call it to retrieve the current user&#8217;s identity:<\/p>\n<pre class=\"lang:css gutter:true start:1\">import { WhoAmIService } from '.\/generated\/services\/WhoAmIService';\r\n\r\nconst userInfo = await WhoAmIService.WhoAmI() as any;\r\n\r\nconst currentUserId = userInfo.UserId;\r\n\r\nconst businessUnitId = userInfo.BusinessUnitId;\r\n\r\nconst orgId = userInfo.OrganizationId;<\/pre>\n<p>The result object contains three GUIDs \u2014 UserId, BusinessUnitId, and OrganizationId \u2014 all fully typed. In the case routing app, we use the UserId to display which agent is currently logged in, giving the team lead confidence before performing any routing action.<\/p>\n<h3>Calling PickFromQueue<\/h3>\n<p>The PickFromQueue action is a bound operation, which means the generated service method takes the queue item GUID as its first argument, followed by the operation parameters:<\/p>\n<pre class=\"lang:css gutter:true start:1\">import { PickFromQueueService } from '.\/generated\/services\/PickFromQueueService';\r\nconst handlePickCase = async (queueItemId: string, currentUserId: string) =&gt; {\r\n\r\nconst systemUser = {\r\n\r\n'@odata.type': 'Microsoft.Dynamics.CRM.systemuser',\r\n\r\nsystemuserid: currentUserId\r\n\r\n};\r\n\r\nawait PickFromQueueService.PickFromQueue(\r\n\r\nqueueItemId,\u00a0\u00a0\u00a0 \/\/ GUID of the queue item (first arg for bound actions)\r\n\r\nsystemUser,\u00a0\u00a0\u00a0\u00a0 \/\/ The system user to assign the case to\r\n\r\ntrue\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ RemoveQueueItem \u2014 remove from queue after picking\r\n\r\n);\r\n\r\nconsole.log('Case picked from queue successfully');\r\n\r\n};<\/pre>\n<p>The function picks the case from the queue and assigns it to the specified user. When RemoveQueueItem is true, the item is automatically removed from the queue to prevent duplicate assignments.<\/p>\n<blockquote><p><strong>Note: <\/strong><em>For bound operations, the first argument is always the GUID of the record the action is bound to. In this case, PickFromQueue is bound to mscrm.queueitem, so the first argument is the queue item ID.<\/em><\/p><\/blockquote>\n<h3>Step 4: Build the Case Routing UI<\/h3>\n<p>With both services wired up, the final step is to build the actual interface the team leads will use. The component needs to show a list of open cases, allow selection, and trigger the routing action.<\/p>\n<p>Below is a simplified version of how the component comes together:<\/p>\n<pre class=\"lang:css gutter:true start:1\">import { useEffect, useState } from 'react';\r\n\r\nimport { WhoAmIService } from '.\/generated\/services\/WhoAmIService';\r\n\r\nimport { PickFromQueueService } from '.\/generated\/services\/PickFromQueueService';\r\n\r\n\/\/ Sample cases in queue (in production, fetch from Dataverse)\r\n\r\nconst queuedCases = [\r\n\r\n{ id: 'CAS-1001', title: 'Printer not working',\u00a0\u00a0\u00a0 queueItemId: '&lt; queue-item-guid-1 &gt;' },\r\n\r\n{ id: 'CAS-1002', title: 'Password reset request', queueItemId: '&lt; queue-item-guid-2 &gt;' },\r\n\r\n{ id: 'CAS-1003', title: 'Software installation',\u00a0 queueItemId: '&lt; queue-item-guid-3 &gt;' },\r\n\r\n];\r\n\r\nexport const CaseRoutingApp = () =&gt; {\r\n\r\nconst [currentUserId, setCurrentUserId] = useState('');\r\n\r\nconst [routedCases, setRoutedCases] = useState&lt;Record&lt;string, boolean&gt;&gt;({});\r\n\r\nuseEffect(() =&gt; {\r\n\r\nWhoAmIService.WhoAmI().then((r: any) =&gt; setCurrentUserId(r.UserId));\r\n\r\n}, []);\r\n\r\nconst handlePickCase = async (queueItemId: string, caseId: string) =&gt; {\r\n\r\nconst systemUser = {\r\n\r\n'@odata.type': 'Microsoft.Dynamics.CRM.systemuser',\r\n\r\nsystemuserid: currentUserId\r\n\r\n};\r\n\r\nawait PickFromQueueService.PickFromQueue(queueItemId, systemUser, true);\r\n\r\nsetRoutedCases(prev =&gt; ({ ...prev, [caseId]: true }));\r\n\r\n};\r\n\r\nreturn ( \/* your JSX here *\/ );\r\n\r\n};\r\n\r\n<img decoding=\"async\" class=\"alignnone size-full wp-image-44749\" style=\"border: 1px solid #000000; padding: 1px; margin: 1px;\" src=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-7.png\" alt=\"Dataverse \" width=\"1366\" height=\"562\" srcset=\"https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-7.png 1366w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-7-300x123.png 300w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-7-1024x421.png 1024w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-7-768x316.png 768w, https:\/\/www.inogic.com\/blog\/wp-content\/uploads\/2026\/05\/Dataverse-7-660x272.png 660w\" sizes=\"(max-width: 1366px) 100vw, 1366px\" \/><\/pre>\n<p>Once you are happy with the result in local preview, run:<\/p>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps push<\/pre>\n<p>This deploys the app to your Dataverse environment and makes it available inside the model-driven app.<\/p>\n<h3>Important Notes and Common Pitfalls<\/h3>\n<p>A few things to keep in mind as you work with this feature:<\/p>\n<h3>Bound vs. Unbound Operations<\/h3>\n<p>The distinction between bound and unbound operations matters for how you call the generated service method. Bound operations always take an id: string as the first argument (the GUID of the record the operation is bound to). Unbound operations, like WhoAmI, take only the declared parameters.<\/p>\n<p>The CLI detects the operation type automatically and generates the method signature accordingly. You do not need to configure anything manually.<\/p>\n<h3>Re-running add-dataverse-api is Safe<\/h3>\n<p>If the operation&#8217;s signature changes in your environment \u2014 for example, a developer added a new optional parameter \u2014 simply re-run the same command:<\/p>\n<pre class=\"lang:css gutter:true start:1\">npx power-apps add-dataverse-api --api-name PickFromQueue<\/pre>\n<p>The command is idempotent. It overwrites the schema and regenerates the service class with the latest definition. It will not create duplicate entries in power.config.json, and it will not overwrite entity schema files that already exist.<\/p>\n<h3><strong>Conclusion<\/strong><\/h3>\n<p>The add-dataverse-api command is a significant quality-of-life improvement for developers building Power Apps code apps. Instead of handwriting Web API calls, managing URL patterns for bound vs. unbound operations, and manually typing response objects, you get fully generated, type-safe service classes in seconds.<\/p>\n<p>For the support team in our scenario, the result was exactly what the client needed. Cases are now routed with a single click, the correct agent identity is confirmed before any action is taken, and the development time was a fraction of what it would have taken with raw Web API calls.<\/p>\n<p>Whether you are calling WhoAmI to verify the current session, triggering a bound action like PickFromQueue to execute business logic, or invoking a custom operation your team has built, the CLI handles the scaffolding so you can focus on building the experience.<\/p>\n<h3>FAQs<\/h3>\n<p><strong>What is add-dataverse-api in Power Apps code apps?<\/strong><\/p>\n<p>The add-dataverse-api command is a Power Apps CLI feature that generates fully typed TypeScript service classes for Dataverse actions and functions. It eliminates the need to manually write Web API fetch calls when building Power Apps code apps.<\/p>\n<p><strong>How do you call Dataverse actions from a Power Apps code app?<\/strong><\/p>\n<p>You can call Dataverse actions in a Power Apps code app by using the Power Apps npm CLI commands find-dataverse-api and add-dataverse-api. These commands generate typed service classes that let developers invoke Dataverse actions directly in TypeScript.<\/p>\n<p><strong>What is the difference between bound and unbound Dataverse actions?<\/strong><\/p>\n<p>Bound Dataverse actions are linked to a specific Dataverse table or record and require a record GUID as the first parameter. Unbound actions are standalone operations that do not require a record reference. For example, PickFromQueue is bound, while WhoAmI is unbound.<\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [{\n    \"@type\": \"Question\",\n    \"name\": \"What is add-dataverse-api in Power Apps code apps?\",\n    \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"The add-dataverse-api command is a Power Apps CLI feature that generates fully typed TypeScript service classes for Dataverse actions and functions. It eliminates the need to manually write Web API fetch calls when building Power Apps code apps.\"\n    }\n  },{\n    \"@type\": \"Question\",\n    \"name\": \"How do you call Dataverse actions from a Power Apps code app?\",\n    \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"You can call Dataverse actions in a Power Apps code app by using the Power Apps npm CLI commands find-dataverse-api and add-dataverse-api. These commands generate typed service classes that let developers invoke Dataverse actions directly in TypeScript.\"\n    }\n  },{\n    \"@type\": \"Question\",\n    \"name\": \"What is the difference between bound and unbound Dataverse actions?\",\n    \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Bound Dataverse actions are linked to a specific Dataverse table or record and require a record GUID as the first parameter. Unbound actions are standalone operations that do not require a record reference. For example, PickFromQueue is bound, while WhoAmI is unbound.\"\n    }\n  }]\n}\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>When building Power Apps code apps, one of the most powerful things you can do is reach directly into Dataverse to trigger business logic. Whether it is routing a support ticket to the right queue, checking who the current user is, or running a custom API operation, Dataverse actions and functions are the engine behind\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.inogic.com\/blog\/2026\/05\/calling-dataverse-actions-functions-from-power-apps-code-apps\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":15,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2354,44,2361],"tags":[],"class_list":["post-44748","post","type-post","status-publish","format-standard","hentry","category-dataverse","category-power-apps","category-technical"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/posts\/44748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/comments?post=44748"}],"version-history":[{"count":2,"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/posts\/44748\/revisions"}],"predecessor-version":[{"id":44758,"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/posts\/44748\/revisions\/44758"}],"wp:attachment":[{"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/media?parent=44748"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/categories?post=44748"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inogic.com\/blog\/wp-json\/wp\/v2\/tags?post=44748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}