Microsoft Dataverse
Use the Microsoft Dataverse node to automate work in Microsoft Dataverse and integrate it with other applications. You can create, read, update, and delete rows in standard and custom tables using the Dataverse Web API.
Operations
Row
Create: Add a new row.
Create or Update: Create a row or update an existing row using a row ID or alternate key.
Delete: Delete a row.
Get: Get a row by its ID.
Get Many: Get multiple rows, with optional filtering and sorting.
Update: Update an existing row. This operation doesn't create a missing row.
Select a table and row
Set Resource to Row, then select an Operation.
In Table Name or ID, choose From List to search your environment's tables. To enter a table manually, choose By ID and enter its Web API entity set name, such as accounts or contacts. This isn't the table's display name, singular logical name, or GUID.
For Get, Update, and Delete, use Row ID to select a row From List or enter its GUID By ID. For example, 00000000-0000-0000-0000-000000000001 has the required format. Replace it with the ID of a row in your environment.
Only Create or Update supports alternate-key addressing.
Create and update rows
For Create, Update, and Create or Update, choose an Input Mode:
JSON (default)
Enter an object in Row Item (JSON). Use column logical names as keys and the data types the columns expect.
Fields (Key / Value Pairs)
Under Fields, select Add Field, choose a Field Name or ID, and enter a Field Value. Repeat for each column.
Provide at least one field. The node rejects an empty row item. The field picker shows writable columns for the selected operation. For Create or Update, it shows columns that support both creating and updating rows.
The Field Value input is a string field. The node doesn't automatically convert literal text to numbers or booleans. Use JSON when you need to preserve these types or send null.
Create an account
To create an account, select Create, set Table Name or ID to accounts, and use JSON input. Enter this object in Row Item (JSON):
For Update, select the existing account's Row ID and send only the fields you want to change. For example, {"telephone1": "555-0100"} updates the phone number without replacing the other fields.
Set lookup columns
A lookup column refers to a row in another table. When relationship metadata is accessible, the node converts lookup values to the navigation-property bindings Dataverse requires.
One target table, such as primarycontactid on an account
A row GUID or a reference such as /contacts(<contact-id>).
Multiple target tables, such as a Customer column
An explicit reference such as /accounts(<account-id>) or /contacts(<contact-id>). A bare GUID is ambiguous.
Owner column
/systemusers(<user-id>) or /teams(<team-id>). A bare GUID is ambiguous.
Replace the angle-bracket placeholders with row GUIDs from your environment. You can omit the leading slash in these references.
For example, to set an account's primary contact and owner, include the following fields in Row Item (JSON):
You can also supply an explicit binding, such as {"primarycontactid@odata.bind": "/contacts(<contact-id>)"}. The node passes explicit bindings through unchanged. Use the exact, case-sensitive navigation property name from your table's metadata, which can differ from the column logical name.
To clear a single-target lookup, send null, for example {"primarycontactid": null}. For a multi-table lookup, clear the specific navigation property instead, if Dataverse permits clearing that relationship.
Create or update a row
Select Create or Update to address a row using either of these Identifier Type values:
Row ID (GUID): Select or enter a Row ID. If the row doesn't exist, Dataverse creates it with that GUID.
Alternate Key: Enter an Alternate Key Predicate, such as
accountnumber='ACC-001'. Configure the alternate key on the table in Dataverse before using it.
Enter only the predicate, without the table name or surrounding parentheses. For a string key, keep the single quotes around the value. The node rejects URL delimiters, path separators, and control characters in the predicate.
Under Options, use Behavior to control the write:
Create or Update (default)
Create the row if it doesn't exist, or update it if it does.
Update Only
Update an existing row. Fail if the row doesn't exist.
Create Only
Create a new row. Fail if the row already exists.
For example, select the accounts table, choose Alternate Key, and enter accountnumber='ACC-001'. Send {"name": "Contoso"} in Row Item (JSON) to create or update the account with that account number.
Query rows
The Get operation supports Select Column Names or IDs and Expand Query under Options. Get Many supports those options and additional filters, sorting, and result limits.
Get many rows with OData
Select Get Many and configure the following parameters:
Return All
Off
Follow OData pagination links until no more results remain.
Limit
50
Maximum number of rows to return when Return All is off. Minimum: 1.
Select Column Names or IDs
None selected
Choose the columns to retrieve. Leave empty to use Dataverse's default projection.
Filter Rows
Empty
OData filter expression, such as statecode eq 0. Don't include the $filter= prefix.
Expand Query
Empty
OData expression to retrieve related rows, such as primarycontactid($select=fullname).
Sort Column Name or ID
None selected
Column to sort by.
Sort Direction
Ascending
Sort direction for the selected column.
Sort By Override
Empty
Raw OData sort expression, such as createdon desc, name asc. Used only when Sort Column Name or ID is empty.
Row Count ($Top)
Unset
Server-side cap on results. Overrides the $top value derived from Limit and disables server-driven paging.
For example, to retrieve up to 100 active accounts whose names start with Contoso:
Set Table Name or ID to
accounts.Leave Return All off and set Limit to
100.Under Options, select
nameandaccountnumberin Select Column Names or IDs.Set Filter Rows to
statecode eq 0 and startswith(name,'Contoso').Set Sort Column Name or ID to
nameand Sort Direction to Ascending.
The read-column pickers use lookup property names such as _primarycontactid_value automatically. When writing raw filters or sort expressions, use that property form for lookup GUIDs. For example, filter by _primarycontactid_value eq <contact-id>, replacing <contact-id> with the GUID without quotes. Use navigation property names for Expand Query.
Pagination and result limits
For OData queries, the node follows @odata.nextLink until it reaches Limit or retrieves all available results.
When Limit is 5,000 or less, the node also sends it as $top. For larger limits, the node leaves $top unset so Dataverse can return multiple pages. An explicit Row Count ($Top) takes precedence and can restrict results even when Return All is on.
To retrieve more than 5,000 rows, leave Row Count ($Top) unset and either enable Return All or set Limit above 5,000. These paging rules apply to OData queries, not FetchXML.
Use FetchXML
Set Options > FetchXML Query to run a FetchXML query. It replaces the OData select, filter, sort, expand, and top options. Keep Return All off and set Limit to cap the returned rows.
For example, select the accounts table and enter this query to retrieve up to 50 active accounts:
FetchXML uses the table's logical name, account, even though Table Name or ID uses the entity set name, accounts.
FetchXML pagination
The Microsoft Dataverse node doesn't support FetchXML pagination. FetchXML Query with Return All produces an error. Turning off Return All avoids the error, but increasing Limit doesn't retrieve additional FetchXML pages. Use an OData query for automatic pagination.
Work with elastic tables
For Get, Get Many, and Delete, set Options > Partition ID when you need to target an elastic-table partition.
Create, Update, and Create or Update don't expose a Partition ID option. For Create, include partitionid in the row JSON when creating a partitioned row.
To update or upsert a partitioned row, use Create or Update with Identifier Type set to Alternate Key. Include the table's primary key and partitionid in Alternate Key Predicate:
Replace the placeholders with your table's primary key column logical name, row GUID, and partition ID. Set Behavior to Update Only if the row must already exist. Refer to Microsoft's elastic table documentation for table-specific behavior and restrictions.
Output and metadata
Create, Update, and Create or Update request the row after the write and return Dataverse's response.
Get returns a single row.
Get Many returns each row as a separate n8n item, rather than a collection inside a
valuefield.Delete returns
{"success": true, "id": "<row-id>"}after a successful deletion.
All operations except Delete offer Options > Return Full Metadata, which is off by default. Turn it on to request OData annotations, including formatted values where Dataverse provides them. The node doesn't rename columns or simplify annotations.
Common issues
Table or column options don't load
Check the HTTP status and Dataverse error shown in the picker. Verify the environment URL and credential access, including access to table metadata. Refer to Microsoft Dataverse credential troubleshooting.
If you know the table's entity set name, you can enter it using Table Name or ID > By ID. This doesn't bypass Dataverse permissions.
A lookup value is rejected
Don't use a display name as a lookup value. Use a GUID for a single-target lookup, or a reference containing the entity set name and row ID. Customer and Owner columns need an explicit target table. Refer to Set lookup columns for examples.
A query returns fewer rows than expected
Check Limit, remove Row Count ($Top) if you need paging, and confirm whether the query uses FetchXML. Refer to Pagination and result limits and Use FetchXML.
Related resources
Last updated
Was this helpful?