<!-- BusyBot node reference — https://busybot.net/tools/seatable/ -->

> Node: SeaTable (`seatable`) · Action (binary) · v1
> Category: Data & Storage · Credentials: SeaTable API (`seaTableApi`)
> Updated: 2026-08-16

# 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](https://busybot.net/credentials/sea-table-api/) 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 `_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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "row",
    "operation": "getMany",
    "tableName": "Customers",
    "viewName": "Active Customers",
    "options": {
      "simple": false,
      "convert": true
    }
  }
}
```

Search a column for a keyword:

```json
{
  "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:

```json
{
  "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):

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "row",
    "operation": "lock",
    "tableName": "Customers",
    "rowId": "{{ $json._id }}"
  }
}
```

Read the complete base metadata — every table, view and column:

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "base",
    "operation": "metadata"
  }
}
```

Take a snapshot of the base:

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "base",
    "operation": "snapshot"
  }
}
```

Find a collaborator by email or name:

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "base",
    "operation": "collaborator",
    "searchString": "john@example.com"
  }
}
```

Link two rows across tables:

```json
{
  "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:

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "link",
    "operation": "list",
    "linkTableName": "Orders:::tbl001",
    "linkColumn": "Customer:::link001:::tbl002:::col001",
    "linkRowId": "row123"
  }
}
```

Remove a link between two rows:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "asset",
    "operation": "getPublicURL",
    "assetPath": "/workspace/base/images/photo123.jpg"
  }
}
```

**Pattern — create a record, then link it.** Create the row first:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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.

```json
{
  "type": "seatable",
  "parameters": {
    "resource": "row",
    "operation": "create",
    "tableName": "Documents",
    "fieldsToSend": "autoMapInputData",
    "bigdata": false
  }
}
```

Then upload the binary file onto it:

```json
{
  "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 `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
</content>
</invoke>