{"id":110737,"date":"2016-07-26T10:53:08","date_gmt":"2016-07-26T17:53:08","guid":{"rendered":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-automate\/integrating-custom-api\/"},"modified":"2025-06-11T08:17:56","modified_gmt":"2025-06-11T15:17:56","slug":"integrating-custom-api","status":"publish","type":"post","link":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-automate\/integrating-custom-api\/","title":{"rendered":"Integrating a Custom API with Flow"},"content":{"rendered":"<p>Today, I wanted to share the experience I went through while integrating the Web API for Microsoft\u2019s Application analytics platform as a CustomAPI into PowerApps and Flow, and briefly walk through how to upload a Custom API to PowerApps.<\/p>\n<h2>Custom API\u2019s<\/h2>\n<p>Custom API\u2019s are simply any RESTful API that you can integrate with our service.<\/p>\n<p>The two things required for a Custom API are:<\/p>\n<ol>\n<li>A Well-Documented Swagger\/Specification that conforms to the OpenAPI standard.<\/li>\n<li>An Icon that represents the service<\/li>\n<\/ol>\n<p>The most important of the two being\u2026<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.png\"\/><\/p>\n<p>For those who are not familiar with what a Swagger is, it\u2019s a very well documented Specification that defines the structure for how a service can be discovered and its capabilities understood. More information, a Web Editor, and examples of Swaggers from companies like Spotify, Uber, Slack, and Rackspace can be found at Swagger.io.<\/p>\n<p>The main things to note regarding integration with Microsoft Flow: The Swagger can be written in JSON or YAML, but Microsoft Flow and PowerApps requires a JSON file. Conveniently, the Swagger Web Editor allows you to download a Swagger as YAML or JSON. Personally, it was much easier for me to use YAML and download it as JSON.<\/p>\n<p>A section labeled securityDefinitions needs to be included in the Swagger.<\/p>\n<p>Some modifications using Microsoft specific Swagger extensions may be necessary to fully integrate a Custom API with Flow.<\/p>\n<p>A more in-depth guide to creating and registering a custom API with PowerApps can be found in <a href=\"https:\/\/powerapps.microsoft.com\/en-us\/tutorials\/register-custom-api\/\">this Custom API Tutorial<\/a>, as well as more specifics about how to Customize your Swagger definition for PowerApps and Flow<\/p>\n<h2>Creating a Custom API for Application analytics <img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-KustoIcon.png\"\/><\/h2>\n<p>Application analytics is a relatively new service that Microsoft publicized, although it\u2019s been used for a while internally at Microsoft. It is a \u201cDisruptive Technology for Log Search and Analytics\u201d.<\/p>\n<p>I was tasked with creating a \u201cconnector\u201d for it (Adding a Custom API, and Integrating it with PowerApps and Flow). This originally detailed writing a Swagger for it and grabbing an icon off of a Power Point. The objective of adding this API is deceivingly simple: we just wanted to allow users to be able to include a Query to the backend in one of their flows. That is, a flow should just be able to query given a cluster name, database name, and query string and receive tabular results.<\/p>\n<p>The first iteration was trivial to produce:<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-KustoCard.png \"\/><\/p>\n<p>The Swagger contained all the necessary information including the security definitions (AAD in this case), a single well-defined \u201cPOST\u201d call, and explicit definitions for the request object to the backend  as well as the response object (JSON Objects in this case).<\/p>\n<p>This looked great and returned the correct results\u2026<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SuccessfulKustoFlow.png\"\/><\/p>\n<p>but unfortunately the Flow designer could not inherently create the reference boxes that make it extremely simple for an end user to reference data from a previous card like so:<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-ReferenceBoxes.png\"\/><\/p>\n<p>The main problem is the response from the query. The response object is a \u201ctable\u201d derived from a specific query; It\u2019s impossible to know the number and names of the columns that will be in the table, or the type of information each column is represented by until the query is actually executed. This means the Table is dynamic in nature. My first implementation although functional was completely useless to an end-user unless they have clairvoyance and l33t webdev skills.<\/p>\n<p>It was to inconvenient to use, which defeats the objective of Flow when we want people to \u201cWork less, do more\u201d.<\/p>\n<p>Luckily, the team had encountered this issue while integrating services like SQL Server, Excel, Sharepoint. The team developed a Swagger Extension: \u201cx-ms-dynamic-schema\u201d. This extension allows a definition in the Swagger to have the property \u201cx-ms-dynamic-schema\u201d which also entails referencing a function that will dynamically populate the schema. Now while editing a Flow if this custom API is used, the Flow Designer should recognize that there is dynamic schema definition and call the function attached to the definition. This allows Flow to get the schema during editing a flow instead of running a flow and allows the reference boxes to be populated in later condition or action cards.<\/p>\n<p>This is a nice solution to the problem of dynamic schema, but I encountered interesting obstacles on this endeavor of implementing x-ms-dynamic-schema into the Swagger\u2026 The first problem was the fact that there is currently a small bug where the Flow Designer will only recognize a dynamic schema call if the referenced function is a GET method (this actively being fixed). Too bad the HttpRequest needs to have a JSON body that includes the database name and query string, because the internet gets angry you if a GET request has a body.<\/p>\n<p>To compound the problem, the response object from the backend is a \u201cnon-standard, efficient, and compact JSON representation\u201d<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-rest-json-representation.png\"\/><\/p>\n<p>It\u2019s pretty much impossible for the Flow Designer to navigate and understand the schema of this object by itself, and I can\u2019t internally extend or modify the Web API. I now have a request problem and a response problem.<\/p>\n<p>I explained this depressing realization to a teammate.<\/p>\n<p>His response: \u201cIt\u2019s too far gone\u2026 it\u2019s not worth it\u2026 you are too deep down the rabbit hole. No one has ever done this before.\u201d<\/p>\n<p>My response:<\/p>\n<p>(\u2022_\u2022)<\/p>\n<p>( \u2022_\u2022)&gt;\u2310\u25a0-\u25a0<\/p>\n<p>(\u2310\u25a0_\u25a0)<\/p>\n<p>\u201cThat\u2019s why it\u2019s going to work.\u201d<\/p>\n<p>(or at least that\u2019s how it played out in my head\u2026)<\/p>\n<h2>The Solution: Azure Functions<\/h2>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-azure-functions-screenshot.png\"\/><\/p>\n<p>Azure Functions are this cool new app service on Azure that basically allows you to easily setup serverless code that can get triggered by different things. It\u2019s quite magical.<\/p>\n<p>In this case, I was going to leverage an Azure function to act as a mediator between Flow and the backend. With this I am able to modularly address each problem.<\/p>\n<h3>Request<\/h3>\n<p>For simplicity, I made sure to name the function to match the relative paths I defined in the Swagger. The host\/base path in the Swagger was also modified to point to my new Azure function and I added code in the Azure Function to essentially \u201cforward\u201d the request to the backend. Below is some templated code I made for creating a mediator Azure Function:<\/p>\n<pre>\npublic static async Task&lt;HttpResponseMessage&gt; Run(HttpRequestMessage req, TraceWriter log)\n{\n    log.Info($\"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}\");\n    \/\/ extract necessary info from request\n    AuthenticationHeaderValue auth = req.Headers.Authorization;\n    \/\/ forward new response to custom API and maniuplate API response before sending back to Flow\n    HttpResponseMessage apiResponse = await ForwardRequest(auth, hostUri, log).ConfigureAwait(false);\n    String result = await Response.Content.ReadAsStringAsync();\n    \/\/send Response back to original request (Flow)\n    return req.CreateResponse(HttpStatusCode.OK, result);\n}\n\n\/\/ constructs a httprequestmessage to send to Application analytics with the Query\n\/\/ change parameters to fit what you need to add\/forward request to new hostUri\n\nprivate static async Task&lt;HttpResponseMessage&gt; ForwardRequest (AuthenticationHeaderValue auth, string hostUri, TraceWriter log){\n    \/\/ A new httprequest is used to get a response from the API\n    using(var request = new HttpRequestMessage(HttpMethod.Post, hostUri)){\n        \/\/ populating headers of the new httprequestmessage from function parameters\n        request.Headers.Authorization = auth;\n        \/\/ You can use other Content Classes to add things beside a string\n        request.Content = new StringContent(\"REQUEST BODY HERE\" , Encoding.UTF8, \"application\/json\");\n        \n        \/\/ Send off request to new hostUri and await response\n        using (var handler = new WebRequestHandler())\n        {\n            using (var client = new HttpClient(handler))\n            {\n                return await client.SendAsync(query).ConfigureAwait(false);\n            }\n        }\n    }\n}\n<\/pre>\n<p>This means I can send whatever I want from Flow to the Azure function and then in the Azure function modify whatever I need to and build a new request to Application analytics with the correct parameters. This circumvents the GET problem as I ended up breaking up the JSON object properties in to strings and stashing them in the Http Request Query then, in the Azure Function, rebuilding the JSON object in the body of a new Request to the backend.<\/p>\n<p>Now, Flow is able to talk to the Azure Function and the function talks to the backend.<\/p>\n<h3>Response<\/h3>\n<p>There is still the response object problem from before. The response object the backend sends back to the Azure Function then to Flow is still exactly the same and as useless as ever.<\/p>\n<p>To solve this, the JSON.net C# framework was particularly helpful. When the Azure function receives the response from Application analytics, I parse the content of the response as a string into a JObject and then manipulate JTokens to simplify the original JSON into something more digestible by Flow. The complexity with this logic came from the fact that Flow needs to be able to get the Schema during editing and the actual Data during run time. With this, two Azure functions were necessary. One to derive a schema of a consolidated, simplified JSON object representing the Table, and one to actually create that consolidated, simplified JSON object. Creating a JSON object that represented the schema of another JSON object using JSON.net was very reminiscent of inception (It didn\u2019t help that there exists a \u201cJSON Schema.net\u201d I could not use as it requires a license the team doesn\u2019t have).<\/p>\n<p>Finally, after I finished modifications to the JSON schema and object, Flow was able to understand the JSON and populate those glorious reference boxes!<\/p>\n<p><img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-KustoReferences.png\"\/><\/p>\n<h2>Conclusion<\/h2>\n<p>With completion of the JSON modifications, the Application Analytics Custom API now worked perfectly with Microsoft Flow. Having the reference boxes is a world of difference and was worth it for the result of making using Application analytics queries in a Flow extremely easy and powerful! Creating the implementation for the Application analytics Web API helped form a great foundation using Azure Functions for extending and controlling a service without directly modifying it. The experience provided a great discovery and learning opportunity and resulted in a well-received addition to Flow.<\/p>\n<h3>Uploading a Custom API<\/h3>\n<p>Once you have a complete Swagger (and have an Icon to accompany it) you can then upload it to PowerApps by doing the following:<\/p>\n<ol>\n<li>Navigate to the Connections page in the PowerApps web portal and then click on New Connection in the top right:<br \/>\n<img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-ConnectionsPage.png\"\/><\/li>\n<li>Then from the New Connections page click Custom on the upper left side and the page should change to look like the one below:<br \/>\n<img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-CustomAPIPage.png\"\/><\/li>\n<li>Finally, click the + New Custom API button in the top right.<\/li>\n<li>Now upload and fill out the required information that resembles below:<br \/>\n<img decoding=\"async\" alt=\"\" src=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-CreateCustomAPI.png\"\/><\/li>\n<li>Hit Next, then another box will pop up if you specified Authentication in your Swagger. Fill out the required information and then hit save.<\/li>\n<\/ol>\n<p>Note: If you need to change the Swagger of your Custom API or Icon, a new Custom API will need to be created in PowerApps. We are actively working on allowing users to edit their existing Custom APIs<\/p>\n<p>Now your Custom API has been uploaded and you\u2019ll be able to search for it when creating or editing a Flow and use it!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Custom APIs are a great way to use services that we haven&#8217;t yet added to Microsoft Flow by default. See how I integrated the Web API for Microsoft&rsquo;s Azure Application Insights platform (dubbed <em>Kusto<\/em>) as a CustomAPI into PowerApps and Flow. I will also briefly walk through how to upload a Custom API.<\/p>\n","protected":false},"author":369,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ms_queue_id":[],"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","_alt_title":"","ms-ems-related-posts":[],"footnotes":""},"audience":[3378],"content-type":[27,3423],"job-role":[],"product":[3474],"property":[],"topic":[],"coauthors":[2924],"class_list":["post-110737","post","type-post","status-publish","format-standard","hentry","audience-it-professional","content-type-customer-stories","content-type-tips-and-guides","product-power-automate"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Integrating a Custom API with Flow - Microsoft Power Platform Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integrating a Custom API with Flow - Microsoft Power Platform Blog\" \/>\n<meta property=\"og:description\" content=\"Custom APIs are a great way to use services that we haven&#039;t yet added to Microsoft Flow by default. See how I integrated the Web API for Microsoft&rsquo;s Azure Application Insights platform (dubbed Kusto) as a CustomAPI into PowerApps and Flow. I will also briefly walk through how to upload a Custom API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-automate\/integrating-custom-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Power Platform Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-26T17:53:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-11T15:17:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.png\" \/>\n<meta name=\"author\" content=\"Taylor Cambre\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Taylor Cambre\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/\"},\"author\":[{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/t-tcambr\/\",\"@type\":\"Person\",\"@name\":\"Taylor Cambre\"}],\"headline\":\"Integrating a Custom API with Flow\",\"datePublished\":\"2016-07-26T17:53:08+00:00\",\"dateModified\":\"2025-06-11T15:17:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/\"},\"wordCount\":1623,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.png\",\"keywords\":[\"Developers\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/\",\"name\":\"Integrating a Custom API with Flow - Microsoft Power Platform Blog\",\"isPartOf\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.png\",\"datePublished\":\"2016-07-26T17:53:08+00:00\",\"dateModified\":\"2025-06-11T15:17:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.webp\",\"contentUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.webp\",\"width\":1097,\"height\":73},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrating a Custom API with Flow\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/\",\"name\":\"Microsoft Power Platform Blog\",\"description\":\"Innovate with Business Apps\",\"publisher\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization\",\"name\":\"Microsoft Power Platform Blog\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"contentUrl\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"width\":194,\"height\":145,\"caption\":\"Microsoft Power Platform Blog\"},\"image\":{\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/person\/4876996dd9a3d5ed64cf6a68b6711970\",\"name\":\"Taylor Cambre\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/c7d746484c80a9f6fa11f1043ee0e8e7b8fe60e736ffaff4c20bce3b250021dd?s=96&d=mm&r=gcccd1815ab31b92e1c7b58be3e3233d7\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c7d746484c80a9f6fa11f1043ee0e8e7b8fe60e736ffaff4c20bce3b250021dd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c7d746484c80a9f6fa11f1043ee0e8e7b8fe60e736ffaff4c20bce3b250021dd?s=96&d=mm&r=g\",\"caption\":\"Taylor Cambre\"},\"url\":\"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/t-tcambr\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Integrating a Custom API with Flow - Microsoft Power Platform Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/","og_locale":"en_US","og_type":"article","og_title":"Integrating a Custom API with Flow - Microsoft Power Platform Blog","og_description":"Custom APIs are a great way to use services that we haven't yet added to Microsoft Flow by default. See how I integrated the Web API for Microsoft&rsquo;s Azure Application Insights platform (dubbed Kusto) as a CustomAPI into PowerApps and Flow. I will also briefly walk through how to upload a Custom API.","og_url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/power-automate\/integrating-custom-api\/","og_site_name":"Microsoft Power Platform Blog","article_published_time":"2016-07-26T17:53:08+00:00","article_modified_time":"2025-06-11T15:17:56+00:00","og_image":[{"url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.png","type":"","width":"","height":""}],"author":"Taylor Cambre","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Taylor Cambre","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#article","isPartOf":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/"},"author":[{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/t-tcambr\/","@type":"Person","@name":"Taylor Cambre"}],"headline":"Integrating a Custom API with Flow","datePublished":"2016-07-26T17:53:08+00:00","dateModified":"2025-06-11T15:17:56+00:00","mainEntityOfPage":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/"},"wordCount":1623,"commentCount":0,"publisher":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization"},"image":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage"},"thumbnailUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.png","keywords":["Developers"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/","name":"Integrating a Custom API with Flow - Microsoft Power Platform Blog","isPartOf":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage"},"image":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage"},"thumbnailUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.png","datePublished":"2016-07-26T17:53:08+00:00","dateModified":"2025-06-11T15:17:56+00:00","breadcrumb":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#primaryimage","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.webp","contentUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/kusto-SwaggerBanner.webp","width":1097,"height":73},{"@type":"BreadcrumbList","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/2016\/07\/26\/integrating-custom-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/"},{"@type":"ListItem","position":2,"name":"Integrating a Custom API with Flow"}]},{"@type":"WebSite","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#website","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/","name":"Microsoft Power Platform Blog","description":"Innovate with Business Apps","publisher":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#organization","name":"Microsoft Power Platform Blog","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","contentUrl":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","width":194,"height":145,"caption":"Microsoft Power Platform Blog"},"image":{"@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/#\/schema\/person\/4876996dd9a3d5ed64cf6a68b6711970","name":"Taylor Cambre","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c7d746484c80a9f6fa11f1043ee0e8e7b8fe60e736ffaff4c20bce3b250021dd?s=96&d=mm&r=gcccd1815ab31b92e1c7b58be3e3233d7","url":"https:\/\/secure.gravatar.com\/avatar\/c7d746484c80a9f6fa11f1043ee0e8e7b8fe60e736ffaff4c20bce3b250021dd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c7d746484c80a9f6fa11f1043ee0e8e7b8fe60e736ffaff4c20bce3b250021dd?s=96&d=mm&r=g","caption":"Taylor Cambre"},"url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/author\/t-tcambr\/"}]}},"bloginabox_animated_featured_image":null,"bloginabox_display_generated_audio":false,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Power Platform Blog","distributor_original_site_url":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/110737","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/users\/369"}],"replies":[{"embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/comments?post=110737"}],"version-history":[{"count":1,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/110737\/revisions"}],"predecessor-version":[{"id":128852,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/110737\/revisions\/128852"}],"wp:attachment":[{"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/media?parent=110737"}],"wp:term":[{"taxonomy":"audience","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/audience?post=110737"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/content-type?post=110737"},{"taxonomy":"job-role","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/job-role?post=110737"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/product?post=110737"},{"taxonomy":"property","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/property?post=110737"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/topic?post=110737"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/cm-edgetun.pages.dev\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/coauthors?post=110737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}