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

> Node: Supabase (`supabase`) · Action · v1
> Category: Data & Storage · Credentials: Supabase API (`supabaseApi`)
> Updated: 2026-08-16

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

```json
{
  "type": "supabase",
  "parameters": {
    "resource": "row",
    "operation": "create",
    "tableId": "users",
    "dataToSend": "autoMapInputData",
    "inputsToIgnore": "internal_id,created_at"
  }
}
```

Create a row from explicitly defined column values:

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

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

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

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

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

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

```json
{
  "type": "supabase",
  "parameters": {
    "resource": "row",
    "operation": "create",
    "tableId": "customers",
    "dataToSend": "autoMapInputData"
  }
}
```

Read an entire table with no filtering:

```json
{
  "type": "supabase",
  "parameters": {
    "resource": "row",
    "operation": "getAll",
    "tableId": "customers",
    "returnAll": true,
    "getAllFilterType": "none"
  }
}
```

Update exactly one customer by primary key:

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

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

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

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

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