Row Event
trigger.seatable_event
TriggerDatabases & warehousesconnection requiredruns in-engine
Registers a webhook in the tenant's SeaTable base on publish and starts one run per row change, verified against SeaTable's X-SeaTable-Signature.
Start a run when a row is added, changed or deleted in a SeaTable base.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- SeaTable
- Secret shape
- {"api_token", "account_token"}
- Config it needs
- server_url
- Resolved by
- config.connection_id, else node.connection_id
- Note
- Two credentials, and they are not interchangeable: the base 'api_token' names the workspace and base, and the 40-character 'account_token' (POST /api2/auth-token/ with a username and password) is the only one SeaTable's webhook endpoints accept. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to a URL SeaTable can reach.
Configuration
This node takes no configuration beyond its connection.
Output
One shape.
seatable row event
The flattened SeaTable delivery. row_data's own entries depend on the table's columns, so the shape is open below the declared fields.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
event SeaTable's event name. It is 'update' for every row change today — SeaTable ships one event type — so branch on op_type, not on this. | string | update |
op_type What happened to the row: insert_row, modify_row or delete_row. This is the field to branch on, because SeaTable's webhook has no server-side filter and delivers all three. | string | insert_row |
dtable_uuid Uuid of the base the change happened in. One webhook covers one base, so this is constant for a given trigger. | string | — |
table_id Four-character internal id of the table. Stable across a rename, unlike table_name. | string | 9g8f |
table_name The table's name as it reads in the SeaTable UI. Check it before acting: the webhook fires for every table in the base. | string | Opportunities |
row_id Id of the row that changed — what seatable.get_row takes. | string | QoNno3QiTF26sxmG1sl3_g |
row_name The row's primary-column value, when it has one. | string | — |
row_count How many rows this one delivery covers. A paste across several rows produces ONE webhook with a count above 1, not one per row, and only the first row is described — re-read the table if it is not 1. | number | 1 |
op_user Who made the change, as a SeaTable account id (…@auth.local). | string | — |
op_time When SeaTable applied the change, Unix seconds with millisecond precision. | number | 1649922777.279 |
op_time_at The same instant as an ISO-8601 UTC string. | string | — |
op_app The API token name the change was made through, or empty when a person made it in the SeaTable UI. | string | — |
row_data The changed columns, as SeaTable reports them on a modify_row. Empty on an insert or a delete. | array | — |
payload SeaTable's delivery exactly as it arrived, for anything the fields above do not lift out. | object | — |
{
"dtable_uuid": "fae0a3a42ba94df88e8303fd385e37de",
"event": "update",
"op_app": "Mantle",
"op_time": 1649922777.279,
"op_time_at": "2022-04-14T07:52:57.279000Z",
"op_type": "insert_row",
"op_user": "4bc9a7c79c5942c5b6238413f2132bea@auth.local",
"payload": {
"data": {
"op_type": "insert_row"
},
"event": "update"
},
"row_count": 1,
"row_data": [],
"row_id": "QoNno3QiTF26sxmG1sl3_g",
"row_name": "Acme renewal",
"table_id": "9g8f",
"table_name": "Opportunities"
}Notes
- Publishing creates the webhook in SeaTable; unpublishing, disabling or archiving deletes it. A workflow that is off is off at SeaTable too.
- SeaTable's webhook has no event filter: it fires for every row inserted, modified or deleted anywhere in the base. Branch on table_name and op_type.
- A change that touches several rows at once (a paste, a bulk edit) arrives as ONE delivery with row_count above 1 — not one per row.
- Structural changes — adding a column, creating a view, renaming a table — do not fire a webhook. Only row content does.
- SeaTable disables a webhook after five consecutive deliveries that do not answer HTTP 200; re-publishing the workflow registers it again.
See Row Event run in a workflow.
In a technical demo we add the SeaTable connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.