English
SharePoint
Files, tags and shares documents in a SharePoint site, and keeps its lists up to date.
The SharePoint node works on the team sites of a Microsoft 365 organization: it files, finds, moves, shares and tags documents in a document library, creates folders (including whole trees copied from a template folder), and keeps SharePoint lists up to date. It is one node with a resource (resource) and, for each resource, an action; the fields shown depend on that choice.
It needs the SharePoint access of a Microsoft account, shown as the SharePoint capability in Connections. See Microsoft. This access usually requires a Microsoft 365 administrator to grant consent once for the whole organization; until then, members see a "Need admin approval" screen when connecting. The node acts with the rights of the member running the workflow, on the sites that member can already reach.
For the member's own OneDrive, use Upload to OneDrive and its sibling nodes. For an Excel workbook stored in a library, use the Excel node.
At a glance
- Type:
sharepoint.api· version 1 - Category: Actions
- Kind: Step — one stage of a run
- Effect: Writes outside (
external_write) — writes outside Mankomail; described instead of performed during a test run - Needs a carrier email: No
- Connection: Microsoft (capability
sharepoint) - Inputs:
main - Outputs:
main
Connection
This node needs a Microsoft connection with the sharepoint capability granted.
Parameters
credential
Microsoft account — The account whose SharePoint rights are borrowed. Connect it from Connections — this authorization usually needs a Microsoft 365 administrator to approve it once for the whole organization.
- Type: Connection (
credential) - Required: No
- Default:
""(empty)
resource
What to act on
- Type: One choice (
options) - Required: Yes
- Default:
file - Options:
site— Site: Find a team site, or list its subsites.library— Library: The document libraries of a site.file— File: Upload, search, file, share, tag a document.folder— Folder: Create a folder — or a whole tree, by copying a template.list— List: The lists of a site and their columns.listItem— List item: The rows of a list: a register of deadlines, matters, parties.
siteOperation
Action
- Type: One choice (
options) - Required: Yes
- Default:
site.search - Options:
site.search— Search sites: Searches by name. It is the only discovery available: Microsoft does not let an account list every site.site.get— Get a site: By its identifier, or from a URL pasted from the browser.site.subsites— List subsites: The child sites of a site.
- Shown when:
resourceissite
libraryOperation
Action
- Type: One choice (
options) - Required: Yes
- Default:
library.list - Options:
library.list— List libraries: The document libraries of the site. System libraries stay hidden.
- Shown when:
resourceislibrary
fileOperation
Action
- Type: One choice (
options) - Required: Yes
- Default:
file.upload - Options:
file.list— List a folder: The contents of a folder — the completeness check of a client folder.file.search— Search: Searches names, metadata and document contents.file.get— Get a document: The details of a document identified by its id.file.download— Fetch the contents: The file is dropped into the run’s attachments (a “Compose an email” can attach it by its position), plus a link valid for one hour and the text when it is readable.file.upload— Upload an attachment: The attachments (from the email or added by a step) — or some text — into a library folder, under the name you choose.file.move— Move or rename: Within the same library: Microsoft does not move across libraries.file.copy— Copy: Copies a document. Beware: a copy keeps neither columns nor permissions.file.delete— Move to the recycle bin: Nothing is destroyed: the document goes to the site recycle bin.file.share— Create a sharing link: A revocable link to paste into an email — rather than sending 200 MB of attachments.file.metadata_get— Read the columns: The SharePoint columns of the document: "Client", "Matter", "Document type".file.metadata_set— Write the columns: Fills in the document columns. Columns you do not name are left alone.
- Shown when:
resourceisfile
folderOperation
Action
- Type: One choice (
options) - Required: Yes
- Default:
folder.create - Options:
folder.create— Create a folder: Creates the folder unless it exists — a retry creates no duplicate.folder.from_template— Create from a template: Copies a template folder, subfolders included, and waits for the copy to finish before continuing.
- Shown when:
resourceisfolder
listOperation
Action
- Type: One choice (
options) - Required: Yes
- Default:
list.list - Options:
list.list— List the lists: The site lists, without the SharePoint plumbing.list.columns— List the columns: The columns of a list, with their internal name — the one you must write.
- Shown when:
resourceislist
rowOperation
Action
- Type: One choice (
options) - Required: Yes
- Default:
row.upsert - Options:
row.list— List rows: The rows of a list, filtered if needed.row.get— Get a row: One row by its id.row.create— Create a row: Adds a row. Without a key column, a retry of the step would add a second one: prefer “Create or update”.row.update— Update a row: Changes the named columns of a row known by its id.row.upsert— Create or update: Matches on a key column value: a reminder updates the row instead of adding a second one.row.delete— Delete a row: Removes a row from the list.
- Shown when:
resourceislistItem
site
Site — Pick from the list (the sites you follow), paste a site URL, or its identifier. Left empty: the organization root site.
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":""} - Ways to choose: pick from a list, type an ID, paste a URL (
sharepoint.site) - Listed with the connection in:
credential - Shown when:
resourceis notsiteorsiteOperationis notsite.search
library
Document library — The site library where the documents live. "Documents" is the one every new site has.
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":""} - Ways to choose: pick from a list, type an ID (
sharepoint.library) - Listed inside:
site - Listed with the connection in:
credential - Shown when:
resourceisfileorresourceisfolder
folder
Folder — Left empty: the library root. For a deep subfolder, paste its id — for instance the one returned by a "Create a folder" step.
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":""} - Ways to choose: pick from a list, type an ID (
sharepoint.folder) - Listed inside:
library - Listed with the connection in:
credential - Shown when: (
resourceisfileandfileOperationis one offile.list,file.search,file.upload) orresourceisfolder
item
Document id — The id returned by an earlier step: {{ data.api_1.items.0.id }}.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 512 characters at most
- Example:
{{ data.api_1.items.0.id }} - Shown when:
resourceisfileandfileOperationis one offile.get,file.download,file.move,file.copy,file.delete,file.share,file.metadata_get,file.metadata_set - Expressions:
{{ }}accepted
targetFolder
Destination folder — Where to put the document. Left empty when renaming: the document stays where it is.
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":""} - Ways to choose: pick from a list, type an ID (
sharepoint.folder) - Listed inside:
library - Listed with the connection in:
credential - Shown when:
resourceisfileandfileOperationis one offile.move,file.copy
template
Template folder — The template folder to copy, subfolders included. ⚠️ A copy keeps neither columns nor permissions: the new folder inherits those of its destination.
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":""} - Ways to choose: pick from a list, type an ID (
sharepoint.folder) - Listed inside:
library - Listed with the connection in:
credential - Shown when:
resourceisfolderandfolderOperationis one offolder.from_template
name
Name — Accepts {{ }} expressions. Characters SharePoint rejects (: / \ * ? " < > |) are replaced with a dash, and the step says so.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 255 characters at most
- Example:
{{ data.extract_1.seller }} – {{ data.extract_1.property }} - Shown when: (
resourceisfolderandfolderOperationis one offolder.create,folder.from_template) or (resourceisfileandfileOperationis one offile.move,file.copy) - Expressions:
{{ }}accepted
source
What to upload
- Type: One choice (
options) - Required: Yes
- Default:
attachment - Options:
attachment— The attachments: Those of the email and the files added by an earlier step, uploaded as-is — the "file the deed" case.text— Some text: Content you write: a report, a summary, a CSV.
- Shown when:
resourceisfileandfileOperationis one offile.upload
selection
Attachments to use
- Type: One choice (
options) - Required: Yes
- Default:
all - Options:
all— All attachments: Those of the triggering email, then the files added by earlier steps (a fetched deed, a signed PDF), in that order.first— The first one only: The first attachment, when only one matters.byMime— By file type: By MIME type:application/pdf, or a whole family withimage/*.byName— By file name: By name pattern:*.pdf,invoice-*.
- Shown when: (
resourceisfileandfileOperationis one offile.upload) andsourceisattachment
mime
File type — Exact MIME type (application/pdf) or a whole family (image/*). Left empty, no attachment is kept.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 200 characters at most
- Example:
application/pdf - Shown when: (
resourceisfileandfileOperationis one offile.upload) andsourceisattachmentandselectionisbyMime - Expressions:
{{ }}accepted
namePattern
File name — Simple pattern: * matches anything, ? one character (*.pdf, invoice-*). Case is ignored.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 200 characters at most
- Example:
*.pdf - Shown when: (
resourceisfileandfileOperationis one offile.upload) andsourceisattachmentandselectionisbyName - Expressions:
{{ }}accepted
text
Content — The file content. Accepts {{ }} expressions: {{ data.summarize_1.summary }}, {{ email.subject }}.
- Type: Long text (
text) - Required: No
- Default:
""(empty) - 200000 characters at most
- Shown when: (
resourceisfileandfileOperationis one offile.upload) andsourceistext - Expressions:
{{ }}accepted
fileName
Uploaded file name — Extension included. Left empty with attachments, each keeps its own name; filled in, it only applies when a single attachment matches. This is where the "NAME – PROPERTY – PARTNER.pdf" pattern lives.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 255 characters at most
- Example:
{{ data.extract_1.name }} – {{ data.extract_1.property }} – {{ data.extract_1.partner }}.pdf - Shown when:
resourceisfileandfileOperationis one offile.upload - Expressions:
{{ }}accepted
onConflict
If the name already exists
- Type: One choice (
options) - Required: Yes
- Default:
rename - Options:
rename— Keep both: SharePoint numbers the new one (deed 1.pdf). Nothing is lost.skip— Do nothing: The file already there is returned as-is, never overwritten.replace— Replace: The content overwrites the existing file — its version history keeps it.
- Shown when:
resourceisfileandfileOperationis one offile.upload
linkType
What the link allows
- Type: One choice (
options) - Required: Yes
- Default:
view - Options:
view— View: Read only.edit— Edit: Read and write. Keep it for internal recipients.
- Shown when:
resourceisfileandfileOperationis one offile.share
linkScope
Who can open it
- Type: One choice (
options) - Required: Yes
- Default:
organization - Options:
organization— People in the organization: The default, and the only one most organizations allow.users— People who already have access: Widens nothing: the link only works for those who already had access.anonymous— Anyone with the link: ⚠️ Almost always forbidden by an organization sharing policy.
- Shown when:
resourceisfileandfileOperationis one offile.share
linkExpiresAt
Expires on — ISO 8601 date (2026-12-31T23:59:59Z). Left empty: the link does not expire, unless the organization enforces one.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 64 characters at most
- Example:
2026-12-31T23:59:59Z - Shown when:
resourceisfileandfileOperationis one offile.share - Expressions:
{{ }}accepted
list
List — The register to work with: "Deadlines", "Parties", "Matters".
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":""} - Ways to choose: pick from a list, type an ID (
sharepoint.list) - Listed inside:
site - Listed with the connection in:
credential - Shown when: (
resourceislistandlistOperationis one oflist.columns) orresourceislistItem
columns
Columns to write — 🔴 The key is the column internal name, not its label: "Follow-up date" is called Follow_x002d_up_x0020_date. The "List the columns" action gives it to you. Only simple types are guaranteed: text, number, yes/no, date, choice, currency.
- Type: Key / value pairs (
keyValue) - Required: No
- Default:
[] - Shown when: (
resourceisfileandfileOperationis one offile.metadata_set) or (resourceislistItemandrowOperationis one ofrow.create,row.update,row.upsert) - Expressions:
{{ }}accepted
columnNames
Columns to read — Internal names separated by commas. Left empty: every column SharePoint returns.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 1000 characters at most
- Example:
Client,MatterNumber - Shown when:
resourceisfileandfileOperationis one offile.metadata_get - Expressions:
{{ }}accepted
rowId
Row id — The one returned by an earlier step: {{ data.item.id }}.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 128 characters at most
- Example:
{{ data.item.id }} - Shown when:
resourceislistItemandrowOperationis one ofrow.get,row.update,row.delete - Expressions:
{{ }}accepted
keyColumn
Matching column — The column that identifies the row — "Matter number". ⚠️ SharePoint can only filter on one column at a time, and it must be indexed in the list settings.
- Type: Remote resource (
resourceLocator) - Required: No
- Default:
{"mode":"id","value":""} - Ways to choose: pick from a list, type an ID (
sharepoint.column) - Listed inside:
list - Listed with the connection in:
credential - Shown when:
resourceislistItemandrowOperationis one ofrow.upsert
keyValue
Value to match — Accepts {{ }} expressions: {{ data.extract_1.matter }}. It decides between creating and updating.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 500 characters at most
- Example:
{{ data.extract_1.matter }} - Shown when:
resourceislistItemandrowOperationis one ofrow.upsert - Expressions:
{{ }}accepted
filter
Filter — An OData filter on one column: fields/MatterNumber eq '2026-0412'. Allowed operators: eq ne lt gt le ge startswith. ⚠️ One column at a time, and it must be indexed.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 500 characters at most
- Example:
fields/MatterNumber eq '{{ data.extract_1.matter }}' - Shown when:
resourceislistItemandrowOperationis one ofrow.list - Expressions:
{{ }}accepted
allowUnindexed
Allow unindexed columns — Unticked by default, on purpose: Microsoft itself names this option "may fail randomly". A step that fails one time in five is worse than one that always fails. The right answer is to index the column in SharePoint.
- Type: Yes / no (
boolean) - Required: No
- Default:
false - Shown when:
resourceislistItemandrowOperationis one ofrow.list,row.upsert
query
Search — The text to search. On documents it also covers the contents, not just the name.
- Type: Text (
string) - Required: No
- Default:
""(empty) - 500 characters at most
- Example:
agreement 2026 - Shown when: (
resourceissiteandsiteOperationis one ofsite.search) or (resourceisfileandfileOperationis one offile.search) - Expressions:
{{ }}accepted
foldersOnly
Folders only — Useful to walk a tree rather than list documents.
- Type: Yes / no (
boolean) - Required: No
- Default:
false - Shown when:
resourceisfileandfileOperationis one offile.list
limit
Maximum results — A step should not load a whole register: past this, filter upstream.
- Type: Number (
number) - Required: No
- Default:
50 - Whole number, from 1 to 500
- Shown when: (
resourceissiteandsiteOperationis one ofsite.search,site.subsites) or (resourceisfileandfileOperationis one offile.list,file.search) or (resourceislistItemandrowOperationis one ofrow.list)
maxDownloadMb
Maximum size (MB) — Past this, the file is not dropped into the attachments — the link is still returned.
- Type: Number (
number) - Required: No
- Default:
10 - Whole number, from 1 to 25
- Shown when:
resourceisfileandfileOperationis one offile.download
Outputs
main
Data produced
What this node adds to the run data, and how to read it in an expression. <step> stands for the step key: the node name turned into an identifier (see Data and expressions).
{{ data.<step>.sites }}—array of { id, name, displayName, webUrl, description? }. site.search, site.subsites: the sites found.idis the three-part site id ({hostname},{guid},{guid}), usable in the Site field (id mode).{{ data.<step>.site }}—object { id, name, displayName, webUrl, description? }. site.get: the site.{{ data.<step>.libraries }}—array of { id, name, webUrl, driveType }. library.list: the document libraries of the site.idis the library id (usable in the Document library field, id mode);driveTypeisdocumentLibraryfor a SharePoint library.{{ data.<step>.items }}—array of { id, name, mime, size, webUrl, isFolder, parentId, driveId, lastModifiedAt? }. file.list, file.search, file.upload: the documents and folders.idis the item id to pass to Document id in a later step,parentIdthe parent folder id (empty for the library root),driveIdthe library id,mimeisinode/directoryfor a folder.{{ data.<step>.items.0.id }}—string. The id of the first item, the usual value for Document id in the next SharePoint step.{{ data.<step>.names }}—array of string. file.list: the names of the items listed, handy for a completeness check.{{ data.<step>.item }}—object { id, name, mime, size, webUrl, isFolder, parentId, driveId, lastModifiedAt? }. file.get, file.download, file.move, file.copy: the document (after the move, or the new copy).{{ data.<step>.downloadUrl }}—string. file.download: a pre-authorized download URL, valid for about one hour, that needs no sign-in. Not a sharing link.{{ data.<step>.text }}—string. file.download: the file text, for text-like files (text, JSON, XML, CSV) of 4 MB or less, cut at 20,000 characters. Absent otherwise.{{ data.<step>.truncated }}—boolean. file.download:truewhentextwas cut. row.list:truewhen the limit was reached and more rows remained.{{ data.<step>.attachmentPosition }}—number. file.download: the position of the file added to the run's attachments, to attach it in a Compose step. Absent when the file was not added (seeskippedReason).{{ data.<step>.deduplicated }}—boolean. file.download: present withattachmentPosition;truewhen the same file was already among the run's attachments and was not added twice.{{ data.<step>.skippedReason }}—string. file.download: why the file was not added to the attachments:too_large(over Maximum size) ornot_writable(the run cannot receive files).{{ data.<step>.reused }}—array of string. file.upload: the names of the files a replay found already uploaded by an earlier attempt — the same shape as OneDrive.{{ data.<step>.skipped }}—array of string. file.upload: the names of the files left in place because the name was taken and If the name already exists is Do nothing.{{ data.<step>.sanitized }}—array of string. file.upload: the final names of the files whose requested name contained characters SharePoint rejects and was corrected.{{ data.<step>.attachments }}—array of { position, filename, mime, size, origin, addedByNodeId?, integration? }. file.upload with the attachments as source: where each uploaded attachment comes from (origin:emailoradded).{{ data.<step>.deleted }}—boolean. file.delete, row.delete:truewhen the item was removed by this step,falsewhen it was already gone (a replay, not an error).{{ data.<step>.url }}—string. file.share: the sharing link, to paste into an email. Empty in a test run.{{ data.<step>.created }}—boolean. file.share:falsewhen SharePoint returned an existing link. folder.create, folder.from_template:falsewhen a folder with that name already existed. row.create: alwaystrue; row.update: alwaysfalse; row.upsert:truewhen the row was created,falsewhen it was updated.{{ data.<step>.fields }}—object. file.metadata_get, file.metadata_set: the document's column values, keyed by internal column name (for metadata_set, as SharePoint returns them after the write).{{ data.<step>.folder }}—object { id, name, mime, size, webUrl, isFolder, parentId, driveId, lastModifiedAt? }. folder.create, folder.from_template: the folder created or found. Itsidgoes into the Folder field of the next step (id mode).{{ data.<step>.lists }}—array of { id, listId, name, displayName, template, webUrl }. list.list: the lists of the site.idis the composite id{siteId}|{listId}that the List field expects;templateisgenericList,documentLibrary,events…{{ data.<step>.columns }}—array of { name, displayName, type, readOnly, required }. list.columns: the columns of the list.nameis the internal name to use in Columns to write, Matching column and Filter;displayNameis the label users see.{{ data.<step>.rows }}—array of { id, webUrl, fields, createdAt?, updatedAt? }. row.list: the rows.fieldsholds the values keyed by internal column name.{{ data.<step>.row }}—object { id, webUrl, fields, createdAt?, updatedAt? }. row.get, row.create, row.update, row.upsert: the row. After an update,fieldsholds the values SharePoint returns andwebUrlmay be empty.{{ data.<step>.count }}—number. Operations that return a list: the number of entries.{{ data.<step>.summary }}—string. A readable sentence describing what the step did.{{ data.<step>.simulated }}—boolean.truewhen the step ran in a test run and the write was only described — the same field as on the Google and Outlook nodes. Alwaysfalsefor a read.
Sites and libraries
Choose resource: site and set siteOperation, or resource: library and set libraryOperation.
| Value | Fields used | Data produced |
|---|---|---|
site.search | query, limit | sites, count |
site.get | site | site |
site.subsites | site, limit | sites, count |
library.list | site | libraries, count |
site.searchsearches sites by name. With an empty query it returns the sites the member follows plus the organization root site: Microsoft does not let an account list every site.- The Site field accepts a site picked from the list, a site id, or a pasted URL such as
https://contoso.sharepoint.com/sites/Litigation(or/teams/<name>). Left empty, it means the organization root site. A OneDrive URL (/personal/<account>) designates that OneDrive. Another URL on a valid host (a library of the root site, a sharing link) is read as the root site of its host; a URL whose host cannot be read fails withmicrosoft.rejectedrather than silently targeting the root site. library.listhides system libraries. Every new site has a library namedDocuments.
Files
Choose resource: file and set fileOperation. Every file action needs the Document library (library), picked after the site.
| Value | Fields used | Data produced |
|---|---|---|
file.list | folder, foldersOnly, limit | items, count, names |
file.search | folder, query, limit | items, count |
file.get | item | item |
file.download | item, maxDownloadMb | item, downloadUrl, text, truncated, attachmentPosition, deduplicated, skippedReason |
file.upload | folder, source, selection / mime / namePattern or text, fileName, onConflict | items, count, reused, skipped, sanitized, attachments |
file.move | item, targetFolder, name | item |
file.copy | item, targetFolder, name | item |
file.delete | item | deleted |
file.share | item, linkType, linkScope, linkExpiresAt | url, created |
file.metadata_get | item, columnNames | fields |
file.metadata_set | item, columns | fields |
- Document id (
item) is the id returned by an earlier step, typically{{ data.<step>.items.0.id }}. It is required for every action that targets an existing document (node_invalid_paramotherwise). - Folder (
folder) is the folder to list, search or upload into; left empty, the library root. Pick it from the list or paste a folder id, for instance the one returned by a Folder action. file.listreturns the direct contents of the folder; Folders only keeps subfolders.file.searchlooks in names, metadata and contents; with an empty query it lists the folder.file.downloadadds the file to the run's attachments, so that a later Compose step can attach it byattachmentPosition. Files larger than Maximum size (1 to 25 MB, 10 by default) are not added (skippedReason: too_large), butdownloadUrlis still returned. Text-like files of 4 MB or less also come back astext.file.uploadtakes the attachments of the run (those of the email and those added by earlier steps, at most 20) or a text you write. File name applies only when a single attachment matches; with Some text it is required, and the file type follows its extension. If the name already exists: Keep both (rename, SharePoint numbers the new file), Do nothing (skip, the existing file is returned untouched) or Replace (replace, the version history keeps the old content). 100 MB per file at most.file.movemoves and/or renames within the same library: leave Destination folder empty to only rename, or Name empty to only move. With both empty the step fails withmicrosoft.rejected.file.copycopies a document and waits for the copy to finish. A copy keeps neither the columns nor the permissions of the original.file.deletemoves the document to the site recycle bin; nothing is destroyed for good.file.sharecreates a revocable link. What the link allows: View (view, default) or Edit (edit). Who can open it: People in the organization (organization, default), People who already have access (users) or Anyone with the link (anonymous, usually forbidden by the organization's sharing policy). Expires on takes an ISO 8601 date; left empty, the link does not expire unless the organization enforces it.file.metadata_getreads the document's SharePoint columns; Columns to read takes internal names separated by commas (empty: all).file.metadata_setwrites the columns listed in Columns to write and leaves the others untouched.
Folders
Choose resource: folder and set folderOperation. Both actions need the Document library; Folder is the parent (empty: the library root).
| Value | Fields used | Data produced |
|---|---|---|
folder.create | folder, name | folder, created |
folder.from_template | template, folder, name | folder, created |
folder.createcreates the folder unless a folder with that name already exists in the parent, in which case it returns it withcreated: false.folder.from_templatecopies a template folder, subfolders included, under the given name, and waits for the copy to finish (up to one minute) before the workflow continues, so the next step can upload into it. If a folder with that name already exists in the parent, nothing is copied and it is returned withcreated: false. The copy keeps neither columns nor permissions: the new folder inherits those of its destination. Template folder is required (node_invalid_paramotherwise).
Lists and rows
Choose resource: list and set listOperation, or resource: listItem and set rowOperation. The List field (list) is picked after the site; its id is the composite {siteId}|{listId} (the id returned by list.list). A bare list id is refused with microsoft.rejected.
| Value | Fields used | Data produced |
|---|---|---|
list.list | site | lists, count |
list.columns | list | columns, count |
row.list | list, filter, allowUnindexed, limit | rows, count, truncated |
row.get | list, rowId | row |
row.create | list, columns | row, created |
row.update | list, rowId, columns | row, created |
row.upsert | list, keyColumn, keyValue, columns, allowUnindexed | row, created |
row.delete | list, rowId | deleted |
- Internal column names. In Columns to write, the key is the column's internal name, not its label: a column created as "Next step date" is called
Next_x0020_step_x0020_date, and keeps that name even if it is renamed later. Runlist.columnsonce to read them (columns[].name). Only simple types are guaranteed: text, number, yes/no, date, choice, currency. list.listhides SharePoint's hidden lists, andlist.columnsits hidden columns.row.listaccepts an OData Filter on one column:fields/MatterNumber eq '2026-0412', with the operatorseq ne lt gt le ge startswith. SharePoint filters on one indexed column at a time.row.upsertlooks for a row whose Matching column equals Value to match: found, it updates the columns given; not found, it creates the row with those columns plus the matching column set to the value. The matching column must be indexed in the list settings.row.updateandfile.metadata_setmerge: columns you do not name keep their value.row.deleteremoves a row;deletedisfalseif it was already gone.
Example
A new property sale arrives by email. The workflow creates the client folder from the firm's template, files the deed, shares it, and records the matter in the Matters list. An Extract step named Extract reads seller, property and matter.
Step Matter folder:
resource: folder
folderOperation: folder.from_template
site: (url mode) https://contoso.sharepoint.com/sites/Conveyancing
library: (list mode) Documents
template: (list mode) _Template matter
folder: (list mode) Matters 2026
name: {{ data.extract.seller }} – {{ data.extract.property }}Step File deed:
resource: file
fileOperation: file.upload
library: (list mode) Documents
folder: (id mode) {{ data.matter_folder.folder.id }}
source: attachment
selection: byMime
mime: application/pdf
fileName: Deed – {{ data.extract.seller }}.pdf
onConflict: replaceIts data:
json
{
"items": [
{
"id": "01ABCD…",
"name": "Deed – Smith.pdf",
"mime": "application/pdf",
"size": 391022,
"webUrl": "https://contoso.sharepoint.com/sites/Conveyancing/Documents/Matters%202026/…",
"isFolder": false,
"parentId": "01FOLD…",
"driveId": "b!Xy…"
}
],
"count": 1,
"reused": [],
"skipped": [],
"sanitized": [],
"attachments": [
{ "position": 1, "filename": "scan_0412.pdf", "mime": "application/pdf", "size": 391022, "origin": "email" }
]
}Step Share deed: resource: file, fileOperation: file.share, item: {{ data.file_deed.items.0.id }}, linkType: view, linkScope: organization. A Compose step then quotes {{ data.share_deed.url }}.
Step Record matter:
resource: listItem
rowOperation: row.upsert
list: (list mode) Matters
keyColumn: (list mode) MatterNumber
keyValue: {{ data.extract.matter }}
columns:
Title: {{ data.extract.seller }} – {{ data.extract.property }}
Status: OpenThe first time, created is true; a later email about the same matter updates the same row with created: false.
Tips
- Replays. Reads and these writes can be replayed safely:
folder.createandfolder.from_template(match on the name),file.uploadwith Replace or Do nothing (match on the name) and with Keep both (a hidden mark finds the file again, listed inreused; some tenants refuse the mark, and there a replay in Keep both mode can add a numbered copy),file.move,file.metadata_set,file.share(SharePoint returns the existing link),file.deleteandrow.delete(deleted: falsewhen already gone),row.update, androw.upsert.row.createandfile.copyare not: a replay creates a second row or a second copy. Preferrow.upsertfor registers. - Names. In Name and Uploaded file name, the characters SharePoint rejects (
: / \ * ? " < > |) are replaced with a dash, and leading or trailing spaces and trailing dots are removed. For uploads, the corrected names are listed insanitized. A name that is empty once corrected fails withmicrosoft.rejected. - Unindexed columns. SharePoint refuses a filter on a column that is not indexed. The step then fails with
microsoft.rejectedand a message telling you to index the column in the list settings. Allow unindexed columns sends Microsoft's "may fail randomly" header instead; it is off by default because a step that fails one time in five is worse than one that always fails. - Locked files. A document open for editing by someone else gives
microsoft.locked, which is retried automatically until it is released. - Template copy timeout. If a template copy does not finish within one minute, the step fails with
microsoft.rejected. Replay it once the copy is done on SharePoint's side: the name check finds the folder. - Missing fields. No Document library gives
microsoft.rejected("a SharePoint document library is required"). An action missing its Document id, List, Row id or Columns to write fails withnode_invalid_param, naming the field. - Test runs. In test runs every read runs for real (sites, libraries, lists, rows, file listing, search, metadata and
file.download). Writes are only described: items and folders come back with an id starting withsimulated:and an emptywebUrl,file.sharereturns an emptyurl, rows come back with the idsimulated:row, androw.upsertalways reportscreated: true. - Errors.
credential.capability_missing: SharePoint is not connected for the member running the workflow.microsoft.access_denied: the member lacks rights on the site, or the consent was withdrawn.microsoft.not_found: the site, library, folder, document or list does not exist.microsoft.storage_full: the site is full (permanent).microsoft.conflict: the item changed since it was read.microsoft.lockedandmicrosoft.unavailableare retried automatically. See Error handling.