Search all guides

Reference · Tools

Supabase integration

Add, get, delete, and update rows in Supabase database tables via the PostgREST API.

Action Data & Storage v1

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.

Works as
Action
Tool name
supabase
Operations
5 — Create , Delete , Get , Get Many , Update
Parameters
20
Outputs
Output, Error
Credentials
Supabase API
Official docs
Supabase docs supabase.com

What you can build with Supabase

  • 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.

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).

Node Type

Action — processes input items and produces output

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

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

Resources

ResourceValue
Rowrow

Operations

OperationValueDescription
CreatecreateCreate a new row
DeletedeleteDelete a row
GetgetGet a row
Get ManygetAllGet many rows
UpdateupdateUpdate a row

Parameters

Row: Create

ParameterTypeRequiredDefaultDescription
Table NamestringYes—Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor.
Data to SendoptionsNodefineBelowHow 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 IgnorestringNo—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 SendfixedCollectionNo{}Field-value pairs to send to the table. (shown when Data to Send is defineBelow)
— Field NamestringNo—Column name in the table. Find column names in your Supabase Table Editor.
— Field ValuestringNo—Value to set for this column.

Row: Delete

ParameterTypeRequiredDefaultDescription
Table NamestringYes—Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor.
Select TypeoptionsNomanualHow to specify which rows to select.
Options: manual, string
Must Match (matchType)optionsNoanyFilterWhether rows must match any or all of the filter conditions. (shown when Select Type is manual)
Options: anyFilter, allFilters
Select Conditions (filters)fixedCollectionNo{}Filter conditions to select which rows get affected. (shown when Select Type is manual)
Options: eq
— Field NamestringNo—Column name to filter on. Find column names in your Supabase Table Editor.
— ConditionoptionsNoeqThe comparison operator to use.
Options: eq, fullText, gt, gte, ilike (use * in place of %), is (checking for exact equality (null, true, false, unknown)), lt, lte, like (use * in place of %), neq
— Search FunctionoptionsNoftsFull-text search function to use. (shown when Condition is fullText)
Options: fts, plfts, phfts, wfts
— Field ValuestringNo—The value to compare against.
Filters (String) (filterString)stringNo—Raw PostgREST filter string. 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

ParameterTypeRequiredDefaultDescription
Table NamestringYes—Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor.
Select Conditions (getFilters)fixedCollectionNo{}Equality conditions to select which row to get. At least one condition is required.
— Field NamestringNo—Column name to match on (equality only). Find column names in your Supabase Table Editor.
— ValuestringNo—The value the field must equal.

Row: Get Many

ParameterTypeRequiredDefaultDescription
Table NamestringYes—Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor.
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. (shown when Return All is false)
FilteroptionsNononeHow to filter which rows to retrieve.
Options: none, manual, string
Must Match (getAllMatchType)optionsNoanyFilterWhether rows must match any or all of the filter conditions. (shown when Filter is manual)
Options: anyFilter, allFilters
FiltersfixedCollectionNo{}Filter conditions for retrieving rows. (shown when Filter is manual)
Options: eq
— Field NamestringNo—Column name to filter on.
— ConditionoptionsNoeqThe comparison operator to use.
Options: eq, fullText, gt, gte, ilike (use * in place of %), is (checking for exact equality (null, true, false, unknown)), lt, lte, like (use * in place of %), neq
— Search FunctionoptionsNoftsFull-text search function to use. (shown when Condition is fullText)
Options: fts, plfts, phfts, wfts
— Field ValuestringNo—The value to compare against.
Filters (String) (getAllFilterString)stringNo—Raw PostgREST filter string. See PostgREST docs for syntax. (shown when Filter is string)

Row: Update

ParameterTypeRequiredDefaultDescription
Table NamestringYes—Name of the Supabase table. Find available tables in your Supabase project dashboard under Table Editor.
Data to SendoptionsNodefineBelowHow 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 IgnorestringNo—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 SendfixedCollectionNo{}Field-value pairs to send to the table. (shown when Data to Send is defineBelow)
— Field NamestringNo—Column name in the table. Find column names in your Supabase Table Editor.
— Field ValuestringNo—Value to set for this column.
Select TypeoptionsNomanualHow to specify which rows to select.
Options: manual, string
Must Match (matchType)optionsNoanyFilterWhether rows must match any or all of the filter conditions. (shown when Select Type is manual)
Options: anyFilter, allFilters
Select Conditions (filters)fixedCollectionNo{}Filter conditions to select which rows get affected. (shown when Select Type is manual)
Options: eq
— Field NamestringNo—Column name to filter on. Find column names in your Supabase Table Editor.
— ConditionoptionsNoeqThe comparison operator to use.
Options: eq, fullText, gt, gte, ilike (use * in place of %), is (checking for exact equality (null, true, false, unknown)), lt, lte, like (use * in place of %), neq
— Search FunctionoptionsNoftsFull-text search function to use. (shown when Condition is fullText)
Options: fts, plfts, phfts, wfts
— Field ValuestringNo—The value to compare against.
Filters (String) (filterString)stringNo—Raw PostgREST filter string. 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

ParameterTypeRequiredDefaultDescription
Use Custom SchemabooleanNofalseWhether to use a database schema different from the default “public” schema. Requires schema exposure in the Supabase API settings.
SchemastringNopublicName of the database schema to use for the table. (shown when Use Custom Schema is true)
Max ConcurrencynumberNo10Maximum number of items to process concurrently.

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.

OperationOutput items per input itemItem JSON
createOneThe created row exactly as the table stores it, including database defaults and generated keys
deleteOne per deleted rowEach row as it looked before deletion
getOne per matching rowThe matched row. Despite the name, the equality conditions can match more than one row — add enough conditions to identify a single row
getAllOne per rowThe row. With Return All on, the node pages through the table and emits every row it finds
updateOne per updated rowEach 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 }}.

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

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes failed items to Error output port

Tips

This tool manages rows within Supabase database tables. It is ideal for precise row-level operations like creating, retrieving, updating, or deleting specific entries, especially when filtering or pagination is needed. It produces the results of these row manipulations, such as the newly created row’s data or the retrieved rows matching the criteria.

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 Supabase

Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Supabase API credentials first.

Open BusyBot

Last reviewed . Spotted something wrong? Tell us.