Reference · Tools

SeaTable

Read, update, write, and delete data from SeaTable bases. Manage rows, base metadata, links, and file/image assets.

Action (binary) Data & Storage v1 Binary data

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

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires SeaTable API credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Rowrow
Basebase
Linklink
Assetasset

Operations

Each resource has its own set of operations. Pick the resource first — the Operation list changes with it.

ResourceOperationValueDescription
RowCreatecreateCreate a new row
RowDeletedeleteDelete a row
RowGetgetGet the content of a row
RowGet ManygetManyGet many rows from a table or view
RowLocklockLock a row to prevent changes
RowSearchsearchSearch rows by keyword
RowUnlockunlockRemove the lock from a row
RowUpdateupdateUpdate the content of a row
BaseSnapshotsnapshotCreate a snapshot of the base
BaseMetadatametadataGet the complete metadata of the base
BaseCollaboratorcollaboratorFind a collaborator by email or name
LinkAddaddCreate a link between two rows
LinkListlistList all links of a row
LinkRemoveremoveRemove a link between two rows
AssetUploaduploadUpload a file/image to a row
AssetGet Public URLgetPublicURLGet the public download URL of an asset

Parameters

Base: Snapshot and Base: Metadata take no parameters of their own — see All Operations.

Row: Create

ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
Data to SendoptionsNodefineBelowWhether 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 IgnorestringNoComma-separated list of input properties to avoid sending. Leave empty to send all. (shown when Data to Send is autoMapInputData)
Columns to SendfixedCollectionNo{}Add destination column with its value. (shown when Data to Send is defineBelow)
— Column NamestringNoThe column name to set.
— Column ValuestringNoThe value to set. Date: YYYY-MM-DD. Duration: seconds. Checkbox: true/on/1. Multi-Select: comma-separated.
Save to Big Data BackendbooleanNofalseWhether to write to the Big Data backend. Requires Big Data activation in the base.
Apply Column Default ValuesbooleanNofalseWhether 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

ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
Row ID (rowId)stringYesThe _id of the row to operate on.

Row: Get

ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
Row ID (rowId)stringYesThe _id of the row to operate on.
OptionscollectionNo{}Optional settings for how the row is returned.
— SimplifybooleanNotrueWhether to return a simplified version (remove underscore fields).
— Return Column NamesbooleanNotrueWhether to return column names (true) or column keys (false).

Row: Get Many

ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
View NamestringNoOptional view name to limit rows. Leave empty for all rows.
OptionscollectionNo{}Optional settings for how the rows are returned.
— SimplifybooleanNotrueWhether to return a simplified version (remove underscore fields).
— Return Column NamesbooleanNotrueWhether to return column names (true) or column keys (false).

Row: Lock

ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
Row ID (rowId)stringYesThe _id of the row to operate on.
ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
Search ColumnstringYesThe column name to search in. Supported types: text, long-text, number, single-select, email, url, rate, formula.
Search TermstringYesThe value to search for. Supports expressions like {{ $json.query }}.
Search OptionscollectionNo{}Optional settings for how the search runs and what it returns.
— Case InsensitivebooleanNofalseWhether the search ignores case sensitivity.
— Wildcard SearchbooleanNotrueWhether to use LIKE wildcard search (true) or exact match (false).
— SimplifybooleanNotrueWhether to return a simplified version (remove underscore fields).
— Return Column NamesbooleanNotrueWhether to return column names (true) or column keys (false).

Row: Unlock

ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
Row ID (rowId)stringYesThe _id of the row to operate on.

Row: Update

ParameterTypeRequiredDefaultDescription
Table Name (tableName)stringYesThe name of the SeaTable table. For link operations, provide as “table_name:::table_id”.
Row ID (rowId)stringYesThe _id of the row to operate on.
Data to SendoptionsNodefineBelowWhether 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 IgnorestringNoComma-separated list of input properties to avoid sending. Leave empty to send all. (shown when Data to Send is autoMapInputData)
Columns to SendfixedCollectionNo{}Add destination column with its value. (shown when Data to Send is defineBelow)
— Column NamestringNoThe column name to set.
— Column ValuestringNoThe value to set. Date: YYYY-MM-DD. Duration: seconds. Checkbox: true/on/1. Multi-Select: comma-separated.

Base: Collaborator

ParameterTypeRequiredDefaultDescription
Search StringstringYesName or email of the collaborator to find. Supports expressions like {{ $json.email }}.
ParameterTypeRequiredDefaultDescription
Table Name (Source)stringYesThe source table in the format “table_name:::table_id”. Get the table_id from base metadata.
Link ColumnstringYesThe link column in the format “column_name:::link_id:::other_table_id”. For list operation, append “:::column_key”.
Row ID (Source)stringYesThe row ID from the source table.
Row ID (Target)stringYesThe row ID from the target table to link to.
ParameterTypeRequiredDefaultDescription
Table Name (Source)stringYesThe source table in the format “table_name:::table_id”. Get the table_id from base metadata.
Link ColumnstringYesThe link column in the format “column_name:::link_id:::other_table_id”. For list operation, append “:::column_key”.
Row ID (linkRowId)stringYesThe row ID to list links for.
ParameterTypeRequiredDefaultDescription
Table Name (Source)stringYesThe source table in the format “table_name:::table_id”. Get the table_id from base metadata.
Link ColumnstringYesThe link column in the format “column_name:::link_id:::other_table_id”. For list operation, append “:::column_key”.
Row ID (Source)stringYesThe row ID from the source table.
Row ID (Target)stringYesThe row ID from the target table to link to.

Asset: Upload

ParameterTypeRequiredDefaultDescription
Table Name (assetTableName)stringYesThe name of the table containing the row.
Column NamestringYesThe image or file column in the format “column_name:::column_type” (e.g., “Photo:::image” or “Docs:::file”).
Row ID (assetRowId)stringYesThe _id of the row to attach the asset to.
Binary PropertystringYesdataName 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 OptionscollectionNo{}Optional settings for how the asset is stored on the row.
— Replace Existing FilebooleanNotrueWhether to replace an existing asset with the same name.
— Append to ColumnbooleanNotrueWhether to keep existing files/images in the column and append the new asset.

Asset: Get Public URL

ParameterTypeRequiredDefaultDescription
Asset PathstringYesThe path of the asset to get a public download URL for.

All Operations

ParameterTypeRequiredDefaultDescription
Max ConcurrencynumberNo10Maximum 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.

OperationWhat lands on the output item
createThe 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
getThe row’s columns merged onto the item JSON
getManyOne item per row, columns merged onto the item JSON — or a single item with _noResults: true
searchOne item per matching row, columns merged onto the item JSON — or a single item with _noResults: true
update, delete, lock, unlockThe service’s acknowledgement merged onto the item JSON
snapshotThe snapshot response merged onto the item JSON
metadataThe base metadata (its tables and their columns) merged onto the item JSON
collaboratorresults — the collaborators whose name or contact email contains the search string
add, removeThe service’s acknowledgement merged onto the item JSON
listThe linked rows for the requested row, merged onto the item JSON
uploadresults — one entry per uploaded asset, each with name, type, url and upload_successful
getPublicURLThe 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 _id is one of them. Get, Get Many and Search leave 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

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes 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 columnsUi MUST use the documented groupKey structure
  • collection parameters like options, searchOptions, and uploadOptions are 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 BusyBot

Last updated . Spotted something wrong? Tell us.