Reference · Tools
Supabase
Add, get, delete, and update rows in Supabase database tables via the PostgREST API.
The Supabase node creates, reads, updates and deletes rows in Supabase tables via the PostgREST API, with filtering, pagination and support for custom schemas. A typical build is syncing records into a Supabase table that powers an application front end.
- Node type
- Action
- Parameters
- 20
- Outputs
- Output, Error
- Credentials
- Supabase API
Supabase
Add, get, delete, and update rows in Supabase tables.
Overview
Supabase is an open-source Backend-as-a-Service (BaaS) built on top of PostgreSQL. This tool interacts with Supabase tables through the PostgREST REST API to create, read, update, and delete rows. It supports PostgREST filtering operators (eq, neq, gt, lt, gte, lte, like, ilike, is, fullText), custom database schemas, auto-mapping of input data to table columns, and pagination for large result sets. The Service Role key is used for authentication, which bypasses Row Level Security (RLS).
Category: Data & Storage
Tool Name: supabase
Version: 1
Appearance: Icon: si-supabase | Color: #3ECF8E
Node Type
Action — processes input items and produces output
Input / Output
| Direction | Port(s) |
|---|---|
| Input | Input |
| Output | Output, Error |
Credentials
This tool requires Supabase API credentials. See the Credentials Guide for setup instructions.
Resources
| Resource | Value |
|---|---|
| Row | row |
Operations
| Operation | Value | Description |
|---|---|---|
| Create | create | Create a new row |
| Delete | delete | Delete a row |
| Get | get | Get a row |
| Get Many | getAll | Get many rows |
| Update | update | Update a row |
Parameters
Row: Create
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name | string | Yes | — | Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor. Supports expressions like {{ $json.table }}. |
| Data to Send | options | No | defineBelow | How to map data to table columns. |
Options: autoMapInputData (use when node input properties match destination column names), defineBelow (set the value for each destination column) | ||||
| Inputs to Ignore | string | No | — | List of input properties to avoid sending, separated by commas. Leave empty to send all properties. (shown when Data to Send is autoMapInputData) |
| Fields to Send | fixedCollection | No | {} | Field-value pairs to send to the table. (shown when Data to Send is defineBelow) |
— Field Name (fieldId) | string | No | — | Column name in the table. Find column names in your Supabase Table Editor. |
— Field Value (fieldValue) | string | No | — | Value to set for this column. |
Row: Delete
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name | string | Yes | — | Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor. Supports expressions like {{ $json.table }}. |
| Select Type | options | No | manual | How to specify which rows to select. |
Options: manual (build the conditions field by field), string (paste a raw PostgREST filter) | ||||
Must Match (matchType) | options | No | anyFilter | Whether rows must match any or all of the filter conditions. (shown when Select Type is manual) |
Options: anyFilter (any select condition), allFilters (all select conditions) | ||||
Select Conditions (filters) | fixedCollection | No | {} | Filter conditions to select which rows get affected. At least one condition is required. (shown when Select Type is manual) |
— Field Name (keyName) | string | No | — | Column name to filter on. Find column names in your Supabase Table Editor. |
| — Condition | options | No | eq | The comparison operator to use. |
Options: eq (equals), fullText, gt (greater than), gte (greater than or equal), ilike (use * in place of %), is (checking for exact equality — null, true, false, unknown), lt (less than), lte (less than or equal), like (use * in place of %), neq (not equals) | ||||
| — Search Function | options | No | fts | Full-text search function to use. (shown when Condition is fullText) |
Options: fts (to_tsquery), plfts (plainto_tsquery), phfts (phraseto_tsquery), wfts (websearch_to_tsquery) | ||||
— Field Value (keyValue) | string | No | — | The value to compare against. |
Filters (String) (filterString) | string | No | — | Raw PostgREST filter string, e.g. name=eq.john. See PostgREST docs for syntax: https://postgrest.org/en/stable/references/api/tables_views.html#horizontal-filtering (shown when Select Type is string) |
Row: Get
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name | string | Yes | — | Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor. Supports expressions like {{ $json.table }}. |
Select Conditions (getFilters) | fixedCollection | No | {} | Equality conditions to select which row to get. At least one condition is required. |
— Field Name (keyName) | string | No | — | Column name to match on (equality only). Find column names in your Supabase Table Editor. |
| — Value | string | No | — | The value the field must equal. |
Row: Get Many
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name | string | Yes | — | Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor. Supports expressions like {{ $json.table }}. |
| Return All | boolean | No | false | Whether to return all results or only up to a given limit. |
| Limit | number | No | 50 | Max number of results to return. Minimum 1. (shown when Return All is false) |
Filter (getAllFilterType) | options | No | none | How to filter which rows to retrieve. |
Options: none, manual, string | ||||
Must Match (getAllMatchType) | options | No | anyFilter | Whether rows must match any or all of the filter conditions. (shown when Filter is manual) |
Options: anyFilter (any filter), allFilters (all filters) | ||||
Filters (getAllFilters) | fixedCollection | No | {} | Filter conditions for retrieving rows. (shown when Filter is manual) |
— Field Name (keyName) | string | No | — | Column name to filter on. |
| — Condition | options | No | eq | The comparison operator to use. |
Options: eq (equals), fullText, gt (greater than), gte (greater than or equal), ilike (use * in place of %), is (checking for exact equality — null, true, false, unknown), lt (less than), lte (less than or equal), like (use * in place of %), neq (not equals) | ||||
| — Search Function | options | No | fts | Full-text search function to use. (shown when Condition is fullText) |
Options: fts (to_tsquery), plfts (plainto_tsquery), phfts (phraseto_tsquery), wfts (websearch_to_tsquery) | ||||
— Field Value (keyValue) | string | No | — | The value to compare against. |
Filters (String) (getAllFilterString) | string | No | — | Raw PostgREST filter string, e.g. name=eq.john. See PostgREST docs for syntax. (shown when Filter is string) |
Row: Update
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Table Name | string | Yes | — | Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor. Supports expressions like {{ $json.table }}. |
| Data to Send | options | No | defineBelow | How to map data to table columns. |
Options: autoMapInputData (use when node input properties match destination column names), defineBelow (set the value for each destination column) | ||||
| Inputs to Ignore | string | No | — | List of input properties to avoid sending, separated by commas. Leave empty to send all properties. (shown when Data to Send is autoMapInputData) |
| Fields to Send | fixedCollection | No | {} | Field-value pairs to send to the table. (shown when Data to Send is defineBelow) |
— Field Name (fieldId) | string | No | — | Column name in the table. Find column names in your Supabase Table Editor. |
— Field Value (fieldValue) | string | No | — | Value to set for this column. |
| Select Type | options | No | manual | How to specify which rows to select. |
Options: manual (build the conditions field by field), string (paste a raw PostgREST filter) | ||||
Must Match (matchType) | options | No | anyFilter | Whether rows must match any or all of the filter conditions. (shown when Select Type is manual) |
Options: anyFilter (any select condition), allFilters (all select conditions) | ||||
Select Conditions (filters) | fixedCollection | No | {} | Filter conditions to select which rows get affected. At least one condition is required. (shown when Select Type is manual) |
— Field Name (keyName) | string | No | — | Column name to filter on. Find column names in your Supabase Table Editor. |
| — Condition | options | No | eq | The comparison operator to use. |
Options: eq (equals), fullText, gt (greater than), gte (greater than or equal), ilike (use * in place of %), is (checking for exact equality — null, true, false, unknown), lt (less than), lte (less than or equal), like (use * in place of %), neq (not equals) | ||||
| — Search Function | options | No | fts | Full-text search function to use. (shown when Condition is fullText) |
Options: fts (to_tsquery), plfts (plainto_tsquery), phfts (phraseto_tsquery), wfts (websearch_to_tsquery) | ||||
— Field Value (keyValue) | string | No | — | The value to compare against. |
Filters (String) (filterString) | string | No | — | Raw PostgREST filter string, e.g. name=eq.john. See PostgREST docs for syntax: https://postgrest.org/en/stable/references/api/tables_views.html#horizontal-filtering (shown when Select Type is string) |
All Operations
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Use Custom Schema | boolean | No | false | Whether to use a database schema different from the default “public” schema. Requires schema exposure in the Supabase API settings. |
| Schema | string | No | public | Name of the database schema to use for the table. (shown when Use Custom Schema is true) |
| Max Concurrency | number | No | 10 | Maximum number of items to process concurrently. Accepts 1–100. |
Output Data
Every operation returns the affected rows, and each returned row becomes its own output item — the row IS the item JSON, with no wrapper property. That means one input item can produce many output items: a Get Many that matches 200 rows produces 200 items, and a Delete whose conditions match 40 rows produces 40 items. The input item’s JSON does not pass through; binary data on the input item is forwarded to every item it produces.
| Operation | Output items per input item | Item JSON |
|---|---|---|
create | One | The created row exactly as the table stores it, including database defaults and generated keys |
delete | One per deleted row | Each row as it looked before deletion |
get | One per matching row | The matched row. Despite the name, the equality conditions can match more than one row — add enough conditions to identify a single row |
getAll | One per row | The row. With Return All on, the node pages through the table and emits every row it finds |
update | One per updated row | Each row after the update was applied |
When the request succeeds but matches nothing, a single item with an empty JSON object is emitted so the branch still carries an item. If the service replies with something that is not an object, the value is wrapped as { "data": … }.
Reference the result downstream by expression, e.g. {{ $json.id }} or {{ $json.email }}.
Usage Examples
- Insert a new user row into a Supabase users table
- Fetch all orders from Supabase with status=active filter
- Update a customer record in Supabase by email
- Delete rows from Supabase where age is greater than 100
- Get all products from a custom schema in Supabase
Example Configuration
Create a row by auto-mapping the incoming item, skipping two internal properties:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "create",
"tableId": "users",
"dataToSend": "autoMapInputData",
"inputsToIgnore": "internal_id,created_at"
}
}
Create a row from explicitly defined column values:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "create",
"tableId": "products",
"dataToSend": "defineBelow",
"fieldsUi": {
"fieldValues": [
{ "fieldId": "name", "fieldValue": "New Product" },
{ "fieldId": "price", "fieldValue": "29.99" },
{ "fieldId": "category", "fieldValue": "electronics" }
]
}
}
}
Update the rows that match two conditions at once:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "update",
"tableId": "users",
"dataToSend": "autoMapInputData",
"filterType": "manual",
"matchType": "allFilters",
"filters": {
"conditions": [
{ "keyName": "id", "condition": "eq", "keyValue": "123" },
{ "keyName": "status", "condition": "eq", "keyValue": "active" }
]
}
}
}
Delete old debug logs with a raw PostgREST filter string:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "delete",
"tableId": "logs",
"filterType": "string",
"filterString": "created_at=lt.2024-01-01&level=eq.debug"
}
}
Get a single row by an exact column match:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "get",
"tableId": "users",
"getFilters": {
"conditions": [
{ "keyName": "email", "keyValue": "user@example.com" }
]
}
}
}
Read up to 50 orders that are either pending or high priority:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "getAll",
"tableId": "orders",
"returnAll": false,
"limit": 50,
"getAllFilterType": "manual",
"getAllMatchType": "anyFilter",
"getAllFilters": {
"conditions": [
{ "keyName": "status", "condition": "eq", "keyValue": "pending" },
{ "keyName": "priority", "condition": "eq", "keyValue": "high" }
]
}
}
}
Read every row from a table in a non-public schema:
{
"type": "supabase",
"parameters": {
"useCustomSchema": true,
"schema": "analytics",
"resource": "row",
"operation": "getAll",
"tableId": "events",
"returnAll": true,
"getAllFilterType": "none"
}
}
Create a row from every property on the incoming item:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "create",
"tableId": "customers",
"dataToSend": "autoMapInputData"
}
}
Read an entire table with no filtering:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "getAll",
"tableId": "customers",
"returnAll": true,
"getAllFilterType": "none"
}
}
Update exactly one customer by primary key:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "update",
"tableId": "customers",
"dataToSend": "autoMapInputData",
"filterType": "manual",
"matchType": "allFilters",
"filters": {
"conditions": [
{ "keyName": "id", "condition": "eq", "keyValue": "customer-123" }
]
}
}
}
Read products matching either of two conditions (OR logic):
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "getAll",
"tableId": "products",
"returnAll": false,
"limit": 100,
"getAllFilterType": "manual",
"getAllMatchType": "anyFilter",
"getAllFilters": {
"conditions": [
{ "keyName": "category", "condition": "eq", "keyValue": "electronics" },
{ "keyName": "featured", "condition": "eq", "keyValue": "true" }
]
}
}
}
Use a raw PostgREST string for a range query the manual builder cannot express:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "getAll",
"tableId": "sales",
"returnAll": true,
"getAllFilterType": "string",
"getAllFilterString": "amount=gte.1000&date=gte.2024-01-01&date=lt.2024-12-31"
}
}
Create a row with a fixed set of columns, ignoring whatever else the item carries:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "create",
"tableId": "users",
"dataToSend": "defineBelow",
"fieldsUi": {
"fieldValues": [
{ "fieldId": "email", "fieldValue": "new@example.com" },
{ "fieldId": "role", "fieldValue": "user" },
{ "fieldId": "active", "fieldValue": "true" }
]
}
}
}
Update a profile while keeping timestamp and key columns out of the payload:
{
"type": "supabase",
"parameters": {
"resource": "row",
"operation": "update",
"tableId": "profiles",
"dataToSend": "autoMapInputData",
"inputsToIgnore": "created_at,updated_at,id",
"filterType": "manual",
"matchType": "allFilters",
"filters": {
"conditions": [
{ "keyName": "user_id", "condition": "eq", "keyValue": "user-456" }
]
}
}
}
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
Use Supabase to create, read, update, or delete rows in Supabase (PostgreSQL) tables via the PostgREST API with filtering, pagination, and custom schema support.
Frequently asked questions
Does it talk to Postgres directly?
No — it goes through PostgREST, Supabase's REST layer. For direct SQL against the same database, the PostgreSQL node is the alternative.
Can it work with a non-public schema?
Yes, custom schema support is available, which matters when your tables are not in the default public schema.
How do I narrow a read?
Through the filtering and pagination options, which map onto PostgREST's query capabilities rather than requiring raw SQL.
Which credential does it need?
A Supabase API credential with the project URL and key.
Build with the Supabase node
Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Supabase API credentials first.
Open BusyBotLast updated . Spotted something wrong? Tell us.