Create SharePoint list Item using Rest API via Power Automate

In this post: Overview · Create SharePoint List Item · Setting up the action · A multi-select Choice column needs its own shape too · Catching a failed call instead of assuming success · Related reading


Overview

REST API is one of the best options for modifying SharePoint from Power Automate. SharePoint includes its own REST APIs that can be used to create sites, items, files, and folders, as well as update existing content — essentially any SharePoint operation that has a REST endpoint available. Sending REST API requests to carry out any of these actions in SharePoint is possible using the “Send an HTTP Request to SharePoint” action.


Create SharePoint List Item

To add a new list item to a SharePoint list, Power Automate already has a built-in action named “Create Item,” but using a REST API call instead gives more freedom and control. For instance, the built-in Create Item action won’t let you set a Hyperlink column’s value directly — say, a column named “Website” that needs both a display name (“Google”) and a URL (www.google.com). The REST API can.


Setting up the action

Add the “Send an HTTP Request to SharePoint” action to your flow, then configure it as below.

Send an HTTP Request to SharePoint action configured to create a list item
FieldValue
Site Addresshttps://yourtenant.sharepoint.com/sites/YourSite
MethodPOST
Uri/_api/web/lists/GetByTitle('YourList')/items

Headers — one key needed to create an item:

Content-Type: application/json;odata=verbose

Body — this is where the Hyperlink column’s real value shape shows up. A plain text field takes a plain string, but a Hyperlink or Picture column needs its own nested object with Url and Description properties, keyed under the column’s internal name:

{
    "__metadata": { "type": "SP.Data.YourListItem" },
    "Title": "Search Engine",
    "Website": {
        "__metadata": { "type": "SP.FieldUrlValue" },
        "Url": "https://www.google.com",
        "Description": "Google"
    }
}

Description is what displays as the clickable link text in the list view; Url is where it actually points. This is exactly the shape the built-in Create Item action can’t produce — its dynamic content picker for a Hyperlink column only exposes a single combined text box, not the separate display-text/URL pair the column actually stores underneath. Worth double-checking the column’s actual internal name (which may differ from its display name, especially if it was renamed after creation) rather than assuming it matches what’s shown in the list view.


A multi-select Choice column needs its own shape too

Hyperlink isn’t the only column type the built-in Create Item action handles awkwardly. A Choice column set to allow multiple selections needs the same kind of nested shape as a multi-value Lookup or Person field — a results array, not a plain string, even though a single-select Choice column takes a plain string just fine:

{
    "__metadata": { "type": "SP.Data.YourListItem" },
    "Title": "Search Engine",

    "SingleChoiceField": "Option A",

    "MultiChoiceField": {
        "__metadata": { "type": "Collection(Edm.String)" },
        "results": ["Option A", "Option B"]
    }
}

Sending a plain string to a multi-select Choice column, the same way the single-select example above works, either fails outright or silently only captures one value depending on the exact list configuration — worth testing against a real multi-select column before assuming the simpler shape is safe just because it worked for a different column on the same list.

One more thing worth verifying before any of the examples above run against a real list: "SP.Data.YourListItem" in the __metadata block is a guess based on the list’s title, and that guess doesn’t always match. The actual, reliable value is the list’s ListItemEntityTypeFullName property, which can differ from the naive “list name + ListItem” pattern — lists with spaces, special characters, or names that were changed after creation are the usual culprits. Query it directly rather than assuming:

/_api/web/lists/getbytitle('YourList')?$select=ListItemEntityTypeFullName

Add this as a preceding Send an HTTP Request to SharePoint action (a simple GET, no body needed), then feed its result into the type value of every create/update call that follows — more reliable than hardcoding a guessed string into every flow that touches this list.


Catching a failed call instead of assuming success

Send an HTTP Request to SharePoint doesn’t automatically fail the flow just because SharePoint rejected the request — a wrong internal name, a malformed Hyperlink or Choice value, or a stale entity type from the section above all come back as an HTTP error status in the action’s own output, not as a red X the flow stops on by default. Left unchecked, the flow carries on to whatever comes next as if the item was created.

Add a Condition right after the action, checking the response status code:

outputs('Send_an_HTTP_request_to_SharePoint')['statusCode']

is equal to 201 (Created) — and branch accordingly, logging or alerting on anything else rather than letting a silent failure flow through to the next step. Checking specifically for 201, not just “not an error,” matters here: a 200 from this action can show up in scenarios that didn’t actually create anything, so treating any 2xx as success is looser than the flow usually wants.

When it does fail, the action’s response body is worth logging alongside the status code, not just the code alone — SharePoint’s error responses include a structured error.message.value with the actual reason (an invalid field name, a malformed value, a permissions issue), which is far more useful for diagnosing what went wrong than the status code by itself. A failure branch that captures both gives whoever’s troubleshooting the flow later something concrete to act on, instead of just “it failed.”


The built-in Create Item action’s Hyperlink field only exposes a single combined text box — the REST API’s separate Url and Description properties are what the column actually stores underneath.


Now that’s another tip! Hope it helps somehow. Let me know if you have questions or just leave a comment if we missed something.

Happy SharePointing! #SharingIsCaring

App Catalog Authentication Automation Backup Compliance Content Type CSS Flows Google Javascript Limitations List Metadata MFA Microsoft Node NodeJs O365 OneDrive Permissions PnP PnPJS Policy PowerApps Power Automate PowerAutomate PowerPlatform PowerShell React ReactJs Rest API Rest Endpoint Security Send an HTTP Request to SharePoint SharePoint SharePoint List SharePoint Modern SharePoint Online SPFX SPO Sync Tags Teams Termstore Versioning

Leave a Comment

Your email address will not be published. Required fields are marked *