Reference · Tools
SeaTable
Read, update, write, and delete data from SeaTable bases. Manage rows, base metadata, links, and file/image assets.
The SeaTable node manages rows, base metadata, links between tables and file or image assets, with binary upload support. A typical build is syncing records into a SeaTable base and attaching the associated images as assets.
- Node type
- Action (binary)
- Parameters
- 30
- Outputs
- Output, Error
- Credentials
- SeaTable API
SeaTable
Read, update, write, and delete data from SeaTable bases
Overview
Performs full CRUD operations against a SeaTable base across four resources: Row — create, get, get many, search, update, delete, lock and unlock rows; Base — create a snapshot, read the complete base metadata, or find a collaborator; Link — add, list and remove cross-table row links; Asset — upload a file or image from an item’s binary data onto a row, and get the public download URL of an asset.
Category: Data & Storage
Tool Name: seatable
Version: 1
Appearance: Icon: lucide-Table | Color: #FF8000
Node Type
Action (Binary) — handles file/binary data operations
Input / Output
| Direction | Port(s) |
|---|---|
| Input | Input |
| Output | Output, Error |
Credentials
This tool requires SeaTable API credentials. See the Credentials Guide for setup instructions.
Resources
| Resource | Value |
|---|---|
| Row | row |
| Base | base |
| Link | link |
| Asset | asset |
Operations
Each resource has its own set of operations. Pick the resource first — the Operation list changes with it.
| Resource | Operation | Value | Description |
|---|---|---|---|
| Row | Create | create | Create a new row |
| Row | Delete | delete | Delete a row |
| Row | Get | get | Get the content of a row |
| Row | Get Many | getMany | Get many rows from a table or view |
| Row | Lock | lock | Lock a row to prevent changes |
| Row | Search | search | Search rows by keyword |
| Row | Unlock | unlock | Remove the lock from a row |
| Row | Update | update | Update the content of a row |
| Base | Snapshot | snapshot | Create a snapshot of the base |
| Base | Metadata | metadata | Get the complete metadata of the base |
| Base | Collaborator | collaborator | Find a collaborator by email or name |
| Link | Add | add | Create a link between two rows |
| Link | List | list | List all links of a row |
| Link | Remove | remove | Remove a link between two rows |
| Asset | Upload | upload | Upload a file/image to a row |
| Asset | Get Public URL | getPublicURL | Get the public download URL of an asset |
Parameters
Base: Snapshot and Base: Metadata take no parameters of their own — see All Operations.
Row: Create
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
| Data to Send | options | No | defineBelow | Whether to insert the input data this node receives in the new row. |
Options: autoMapInputData (input properties are matched to columns of the same name), defineBelow (set the value for each destination column yourself) | ||||
| Inputs to Ignore | string | No | — | Comma-separated list of input properties to avoid sending. Leave empty to send all. (shown when Data to Send is autoMapInputData) |
| Columns to Send | fixedCollection | No | {} | Add destination column with its value. (shown when Data to Send is defineBelow) |
| — Column Name | string | No | — | The column name to set. |
| — Column Value | string | No | — | The value to set. Date: YYYY-MM-DD. Duration: seconds. Checkbox: true/on/1. Multi-Select: comma-separated. |
| Save to Big Data Backend | boolean | No | false | Whether to write to the Big Data backend. Requires Big Data activation in the base. |
| Apply Column Default Values | boolean | No | false | Whether to use column default values for new rows. Only available when not using Big Data backend. (shown when Save to Big Data Backend is false) |
Row: Delete
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
Row ID (rowId) | string | Yes | — | The _id of the row to operate on. |
Row: Get
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
Row ID (rowId) | string | Yes | — | The _id of the row to operate on. |
| Options | collection | No | {} | Optional settings for how the row is returned. |
| — Simplify | boolean | No | true | Whether to return a simplified version (remove underscore fields). |
| — Return Column Names | boolean | No | true | Whether to return column names (true) or column keys (false). |
Row: Get Many
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
| View Name | string | No | — | Optional view name to limit rows. Leave empty for all rows. |
| Options | collection | No | {} | Optional settings for how the rows are returned. |
| — Simplify | boolean | No | true | Whether to return a simplified version (remove underscore fields). |
| — Return Column Names | boolean | No | true | Whether to return column names (true) or column keys (false). |
Row: Lock
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
Row ID (rowId) | string | Yes | — | The _id of the row to operate on. |
Row: Search
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
| Search Column | string | Yes | — | The column name to search in. Supported types: text, long-text, number, single-select, email, url, rate, formula. |
| Search Term | string | Yes | — | The value to search for. Supports expressions like {{ $json.query }}. |
| Search Options | collection | No | {} | Optional settings for how the search runs and what it returns. |
| — Case Insensitive | boolean | No | false | Whether the search ignores case sensitivity. |
| — Wildcard Search | boolean | No | true | Whether to use LIKE wildcard search (true) or exact match (false). |
| — Simplify | boolean | No | true | Whether to return a simplified version (remove underscore fields). |
| — Return Column Names | boolean | No | true | Whether to return column names (true) or column keys (false). |
Row: Unlock
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
Row ID (rowId) | string | Yes | — | The _id of the row to operate on. |
Row: Update
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (tableName) | string | Yes | — | The name of the SeaTable table. For link operations, provide as “table_name:::table_id”. |
Row ID (rowId) | string | Yes | — | The _id of the row to operate on. |
| Data to Send | options | No | defineBelow | Whether to insert the input data this node receives in the new row. |
Options: autoMapInputData (input properties are matched to columns of the same name), defineBelow (set the value for each destination column yourself) | ||||
| Inputs to Ignore | string | No | — | Comma-separated list of input properties to avoid sending. Leave empty to send all. (shown when Data to Send is autoMapInputData) |
| Columns to Send | fixedCollection | No | {} | Add destination column with its value. (shown when Data to Send is defineBelow) |
| — Column Name | string | No | — | The column name to set. |
| — Column Value | string | No | — | The value to set. Date: YYYY-MM-DD. Duration: seconds. Checkbox: true/on/1. Multi-Select: comma-separated. |
Base: Collaborator
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Search String | string | Yes | — | Name or email of the collaborator to find. Supports expressions like {{ $json.email }}. |
Link: Add
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name (Source) | string | Yes | — | The source table in the format “table_name:::table_id”. Get the table_id from base metadata. |
| Link Column | string | Yes | — | The link column in the format “column_name:::link_id:::other_table_id”. For list operation, append “:::column_key”. |
| Row ID (Source) | string | Yes | — | The row ID from the source table. |
| Row ID (Target) | string | Yes | — | The row ID from the target table to link to. |
Link: List
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name (Source) | string | Yes | — | The source table in the format “table_name:::table_id”. Get the table_id from base metadata. |
| Link Column | string | Yes | — | The link column in the format “column_name:::link_id:::other_table_id”. For list operation, append “:::column_key”. |
Row ID (linkRowId) | string | Yes | — | The row ID to list links for. |
Link: Remove
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name (Source) | string | Yes | — | The source table in the format “table_name:::table_id”. Get the table_id from base metadata. |
| Link Column | string | Yes | — | The link column in the format “column_name:::link_id:::other_table_id”. For list operation, append “:::column_key”. |
| Row ID (Source) | string | Yes | — | The row ID from the source table. |
| Row ID (Target) | string | Yes | — | The row ID from the target table to link to. |
Asset: Upload
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
Table Name (assetTableName) | string | Yes | — | The name of the table containing the row. |
| Column Name | string | Yes | — | The image or file column in the format “column_name:::column_type” (e.g., “Photo:::image” or “Docs:::file”). |
Row ID (assetRowId) | string | Yes | — | The _id of the row to attach the asset to. |
| Binary Property | string | Yes | data | Name of the binary property which contains the data for the file to be uploaded. Names are case-sensitive — see the upstream node’s Binary Data panel for the exact names to use. |
| Upload Options | collection | No | {} | Optional settings for how the asset is stored on the row. |
| — Replace Existing File | boolean | No | true | Whether to replace an existing asset with the same name. |
| — Append to Column | boolean | No | true | Whether to keep existing files/images in the column and append the new asset. |
Asset: Get Public URL
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Asset Path | string | Yes | — | The path of the asset to get a public download URL for. |
All Operations
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Max Concurrency | number | No | 10 | Maximum number of items to process concurrently. |
Output Data
Most operations produce one output item per input item: the service’s response is merged onto the item JSON, so the rest of the incoming fields pass through and any binary data on the input item is forwarded. When the response is a list rather than an object it lands on results instead of being merged.
Row: Get Many and Row: Search are the exceptions — they emit one output item per returned row, each carrying the row’s columns merged onto the incoming item JSON. A query that matches 200 rows produces 200 output items from a single input item. When nothing matches, one item is emitted carrying _noResults: true.
| Operation | What lands on the output item |
|---|---|
create | The new row’s fields merged onto the item JSON, including its _id. A row written to the Big Data backend returns the service’s insert acknowledgement instead, with no row ID |
get | The row’s columns merged onto the item JSON |
getMany | One item per row, columns merged onto the item JSON — or a single item with _noResults: true |
search | One item per matching row, columns merged onto the item JSON — or a single item with _noResults: true |
update, delete, lock, unlock | The service’s acknowledgement merged onto the item JSON |
snapshot | The snapshot response merged onto the item JSON |
metadata | The base metadata (its tables and their columns) merged onto the item JSON |
collaborator | results — the collaborators whose name or contact email contains the search string |
add, remove | The service’s acknowledgement merged onto the item JSON |
list | The linked rows for the requested row, merged onto the item JSON |
upload | results — one entry per uploaded asset, each with name, type, url and upload_successful |
getPublicURL | The download-link response merged onto the item JSON, or error when no asset path was given |
Two things are worth knowing before you write downstream expressions:
- Simplify removes underscore fields, and
_idis one of them.Get,Get ManyandSearchleave Simplify on by default, so the row ID is stripped from the output. Turn Simplify off whenever a later node needs to address the row — an update, delete, lock or link step always does. - Return Column Names decides whether the output is keyed by human column names (
Name,Email) or by internal column keys. It is on by default; turn it off if your downstream expressions use column keys.
Reference the result downstream by expression, for example {{ $json._id }} after a create, or {{ $json.results[0].url }} after an asset upload.
Usage Examples
- Create a new row in a SeaTable table
- Search for rows matching a keyword
- Upload an image to a SeaTable row
- Get a public download link for a SeaTable asset
- Lock a row to prevent edits
- Get base metadata including all tables and columns
Example Configuration
Create a row by mapping incoming item properties straight onto columns of the same name:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "create",
"tableName": "Customers",
"fieldsToSend": "autoMapInputData",
"inputsToIgnore": "id,createdAt",
"bigdata": false,
"applyDefault": true
}
}
Create a row by setting each column value explicitly:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "create",
"tableName": "Customers",
"fieldsToSend": "defineBelow",
"columnsUi": {
"columnValues": [
{ "columnName": "Name", "columnValue": "John Doe" },
{ "columnName": "Email", "columnValue": "john@example.com" }
]
},
"bigdata": false,
"applyDefault": true
}
}
Read a single row by ID:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "get",
"tableName": "Customers",
"rowId": "{{ $json.rowId }}",
"options": {
"simple": true,
"convert": true
}
}
}
Read every row of a view, one output item per row:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "getMany",
"tableName": "Customers",
"viewName": "Active Customers",
"options": {
"simple": false,
"convert": true
}
}
}
Search a column for a keyword:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "search",
"tableName": "Customers",
"searchColumn": "Name",
"searchTerm": "John",
"searchOptions": {
"insensitive": true,
"wildcard": true,
"simple": true,
"convert": false
}
}
}
Update a row from the incoming item:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "update",
"tableName": "Customers",
"rowId": "{{ $json._id }}",
"fieldsToSend": "autoMapInputData",
"inputsToIgnore": "id"
}
}
Lock a row so it can no longer be edited (use unlock to release it):
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "lock",
"tableName": "Customers",
"rowId": "{{ $json._id }}"
}
}
Read the complete base metadata — every table, view and column:
{
"type": "seatable",
"parameters": {
"resource": "base",
"operation": "metadata"
}
}
Take a snapshot of the base:
{
"type": "seatable",
"parameters": {
"resource": "base",
"operation": "snapshot"
}
}
Find a collaborator by email or name:
{
"type": "seatable",
"parameters": {
"resource": "base",
"operation": "collaborator",
"searchString": "john@example.com"
}
}
Link two rows across tables:
{
"type": "seatable",
"parameters": {
"resource": "link",
"operation": "add",
"linkTableName": "Orders:::tbl001",
"linkColumn": "Customer:::link001:::tbl002",
"linkColumnSourceId": "row123",
"linkColumnTargetId": "row456"
}
}
List the links of a row — note the extra :::column_key segment the list operation needs:
{
"type": "seatable",
"parameters": {
"resource": "link",
"operation": "list",
"linkTableName": "Orders:::tbl001",
"linkColumn": "Customer:::link001:::tbl002:::col001",
"linkRowId": "row123"
}
}
Remove a link between two rows:
{
"type": "seatable",
"parameters": {
"resource": "link",
"operation": "remove",
"linkTableName": "Orders:::tbl001",
"linkColumn": "Customer:::link001:::tbl002",
"linkColumnSourceId": "row123",
"linkColumnTargetId": "row456"
}
}
Attach a file from an upstream node to a file column, keeping whatever is already there:
{
"type": "seatable",
"parameters": {
"resource": "asset",
"operation": "upload",
"assetTableName": "Documents",
"uploadColumn": "Attachment:::file",
"assetRowId": "row789",
"binaryPropertyName": "data",
"uploadOptions": {
"replace": false,
"append": true
}
}
}
Replace the contents of an image column instead:
{
"type": "seatable",
"parameters": {
"resource": "asset",
"operation": "upload",
"assetTableName": "Products",
"uploadColumn": "Photo:::image",
"assetRowId": "row456",
"binaryPropertyName": "imageData",
"uploadOptions": {
"replace": true,
"append": false
}
}
}
Get a public download URL for a stored asset:
{
"type": "seatable",
"parameters": {
"resource": "asset",
"operation": "getPublicURL",
"assetPath": "/workspace/base/images/photo123.jpg"
}
}
Pattern — create a record, then link it. Create the row first:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "create",
"tableName": "Customers",
"fieldsToSend": "defineBelow",
"columnsUi": {
"columnValues": [
{ "columnName": "Name", "columnValue": "Jane Smith" }
]
}
}
}
Then link it from a second node — the new row’s _id is on the item the create node emitted:
{
"type": "seatable",
"parameters": {
"resource": "link",
"operation": "add",
"linkTableName": "Orders:::tbl001",
"linkColumn": "Customer:::link001:::tbl002",
"linkColumnSourceId": "{{ $json._id }}",
"linkColumnTargetId": "existing_customer_id"
}
}
Pattern — search, then update what you found. Search with Simplify off so _id survives:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "search",
"tableName": "Customers",
"searchColumn": "Status",
"searchTerm": "Pending",
"searchOptions": {
"insensitive": false,
"wildcard": false,
"simple": false
}
}
}
Each matching row arrives as its own item, so the update node runs once per row:
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "update",
"tableName": "Customers",
"rowId": "{{ $json._id }}",
"fieldsToSend": "defineBelow",
"columnsUi": {
"columnValues": [
{ "columnName": "Status", "columnValue": "Active" }
]
}
}
}
Pattern — import records and attach their files. Create the row first. Leave Save to Big Data Backend off here: the next node needs the new row’s _id, and a Big Data write does not return one.
{
"type": "seatable",
"parameters": {
"resource": "row",
"operation": "create",
"tableName": "Documents",
"fieldsToSend": "autoMapInputData",
"bigdata": false
}
}
Then upload the binary file onto it:
{
"type": "seatable",
"parameters": {
"resource": "asset",
"operation": "upload",
"assetTableName": "Documents",
"uploadColumn": "File:::file",
"assetRowId": "{{ $json._id }}",
"binaryPropertyName": "fileData",
"uploadOptions": {
"replace": false,
"append": true
}
}
}
Error Handling
| Mode | Behavior |
|---|---|
| stop | Halts workflow on first error |
| continue | Skips failed items, passes successful ones through |
| errorPort | Routes failed items to Error output port |
Tips
Manage SeaTable rows, links, metadata, and file/image assets with full CRUD and binary upload support.
Key Structure Reminders
- fixedCollection parameters like
columnsUiMUST use the documented groupKey structure - collection parameters like
options,searchOptions, anduploadOptionsare flat objects - Link operations require properly formatted table and column identifiers with ”:::” separators
- Asset operations need matching column types (file/image) in the uploadColumn format
Frequently asked questions
How are collection parameters structured?
fixedCollection parameters such as `columnsUi` must use the documented groupKey structure, while collection parameters like `options`, `searchOptions` and `uploadOptions` are flat objects. Mixing the two shapes is the usual configuration error.
What do link operations need?
Properly formatted table and column identifiers using the `:::` separator — links are addressed by that composite form rather than by plain names.
Can it upload images?
Yes — asset operations handle file and image uploads as binary, with matching identifiers required to place them correctly.
How do I react to changes in a base?
Use the SeaTable Trigger, which polls for new rows, updated rows or new signatures.
Build with the SeaTable node
Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need SeaTable API credentials first.
Open BusyBotLast updated . Spotted something wrong? Tell us.