Search all guides

Reference · Tools

Baserow integration

Create, retrieve, update and delete rows in Baserow database tables, with filtering, sorting, searching and pagination when listing rows.

Action Data & Storage v1

The Baserow node lets you create, read, update, and delete rows in any Baserow database table directly from a BusyBot workflow. Use it to sync form submissions into a Baserow table, pull filtered and sorted records for downstream processing, or keep a self-hosted database in step with other tools. Authentication is handled via Baserow's JWT flow using your username and password.

Works as
Action
Tool name
baserow
Operations
5 — Create , Delete , Get , Get Many , Update
Parameters
14
Outputs
Output, Error
Credentials
Baserow API
Official docs
Baserow docs baserow.io

What you can build with Baserow

  • Create a new row in a Baserow table.
  • Retrieve all rows from a Baserow table with filters.
  • Update a row by ID in Baserow.
  • Delete a row from a Baserow table.
  • Search rows across all columns in a Baserow table.

Overview

Baserow is an open-source online database tool and Airtable alternative. This tool interacts with the Baserow REST API to create, read, update, and delete rows in database tables. It supports filtering, sorting, searching, and pagination when listing rows. Baserow uses JWT authentication obtained via username/password exchange. Field names in API responses are mapped between internal field IDs (field_N) and human-readable names automatically.

Node Type

Action — processes input items and produces output

Input / Output

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

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

Resources

ResourceValue
Rowrow

Operations

OperationValueDescription
CreatecreateCreate a row
DeletedeleteDelete a row
GetgetRetrieve a row
Get ManygetAllRetrieve many rows
UpdateupdateUpdate a row

Parameters

Row: Create

ParameterTypeRequiredDefaultDescription
Data to SendoptionsNodefineBelowWhether to insert the input data this node receives in the new row.
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{}Explicit field ID and value pairs to send. (shown when Data to Send is defineBelow)
— Field IDstringNo—The numeric field ID. Find via GET /api/database/fields/table/{tableId}/. Example: for field_123, enter “123”.
— Field ValuestringNo—The value to set for this field.

Row: Delete

ParameterTypeRequiredDefaultDescription
Row IDstringYes—ID of the row to delete.

Row: Get

ParameterTypeRequiredDefaultDescription
Row IDstringYes—ID of the row to return.

Row: Get Many

ParameterTypeRequiredDefaultDescription
Return AllbooleanNofalseWhether to return all results or only up to a given limit.
LimitnumberNo50Max number of results to return. Accepts 1–100. (shown when Return All is false)
OptionscollectionNo{}Additional options for filtering, sorting, and searching.
— FiltersfixedCollectionNo{}Filter rows based on comparison operators.
— — FieldstringNo—Field ID (numeric) to filter on. Find via GET /api/database/fields/table/{tableId}/.
— — Filter OperatoroptionsNoequalOperator to compare field and value with.
Options: contains, contains_not, date_after (field after this date, YYYY-MM-DD), date_before, date_equal, date_equals_month, date_equals_today, date_equals_year, date_not_equal, equal, filename_contains, higher_than, empty (field is empty), not_empty, boolean (boolean field is true), link_row_has_not, link_row_has, lower_than, not_equal, single_select_equal, single_select_not_equal
— — ValuestringNo—Value to compare to.
— Filter TypeoptionsNoANDHow to combine multiple filters. Only applies when two or more filters are provided. Defaults to AND.
Options: AND (rows must match all provided filters), OR (rows only have to match one of the filters)
— Search TermstringNo—Text to match (can be in any column).
— SortingfixedCollectionNo{}Set the sort order of the result rows.
— — FieldstringNo—Field ID (numeric) to sort by. Find via GET /api/database/fields/table/{tableId}/.
— — DirectionoptionsNo—Sort direction, either ascending or descending.
Options: empty string (ASC — ascending), - (DESC — descending)

Row: Update

ParameterTypeRequiredDefaultDescription
Row IDstringYes—ID of the row to update.
Data to SendoptionsNodefineBelowWhether to insert the input data this node receives in the new row.
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{}Explicit field ID and value pairs to send. (shown when Data to Send is defineBelow)
— Field IDstringNo—The numeric field ID. Find via GET /api/database/fields/table/{tableId}/. Example: for field_123, enter “123”.
— Field ValuestringNo—The value to set for this field.

All Operations

ParameterTypeRequiredDefaultDescription
Database IDstringYes—ID of the Baserow database. Find by calling GET /api/applications/ and filtering by type “database”.
Table IDstringYes—ID of the table within the database. Find by calling GET /api/database/tables/database/{databaseId}/.
Max ConcurrencynumberNo10Maximum number of items to process concurrently. Accepts 1–100.

Output Data

Unlike most connectors, this node replaces the item JSON rather than merging into it — the output item carries the Baserow row (or the delete confirmation) and nothing else. Binary data on the input item is forwarded.

Baserow stores columns internally as field_123. On the way out, those keys are translated back to your human-readable column names, so a row arrives as { "id": 1, "order": "1.00", "Name": "…", "Notes": "…" }. The same translation runs in reverse for Data to Send = autoMapInputData, which is why auto-mapping works with plain column names; Fields to Send takes the numeric field ID instead.

OperationOutput
createOne item per input item, carrying the created row including its new id.
getOne item per input item, carrying the requested row.
updateOne item per input item, carrying the row as it stands after the patch.
deleteOne item per input item, carrying success: true.
getAllFans out — one output item per row returned. A query that matches nothing emits one item, which is the input item passed through unchanged.

Reference columns downstream by their Baserow name, e.g. {{ $json.Name }} or {{ $json.id }}.

Example Configuration

Create a row from the incoming item’s own properties:

{
  "type": "baserow",
  "parameters": {
    "resource": "row",
    "operation": "create",
    "databaseId": "12345",
    "tableId": "67890",
    "dataToSend": "autoMapInputData",
    "inputsToIgnore": "id,_error"
  }
}

Create a row with explicit field IDs:

{
  "type": "baserow",
  "parameters": {
    "resource": "row",
    "operation": "create",
    "databaseId": "12345",
    "tableId": "67890",
    "dataToSend": "defineBelow",
    "fieldsUi": {
      "fieldValues": [
        { "fieldId": "123", "fieldValue": "{{ $json.name }}" },
        { "fieldId": "124", "fieldValue": "{{ $json.email }}" },
        { "fieldId": "125", "fieldValue": "active" }
      ]
    }
  }
}

Fetch one row by ID:

{
  "type": "baserow",
  "parameters": {
    "resource": "row",
    "operation": "get",
    "databaseId": "12345",
    "tableId": "67890",
    "rowId": "{{ $json.rowId }}"
  }
}

List rows matching two filters, newest first:

{
  "type": "baserow",
  "parameters": {
    "resource": "row",
    "operation": "getAll",
    "databaseId": "12345",
    "tableId": "67890",
    "returnAll": false,
    "limit": 50,
    "additionalOptions": {
      "filterType": "AND",
      "filters": {
        "fields": [
          { "field": "125", "operator": "equal", "value": "active" },
          { "field": "126", "operator": "date_after", "value": "2026-01-01" }
        ]
      },
      "order": {
        "fields": [
          { "field": "126", "direction": "-" }
        ]
      }
    }
  }
}

Search every column for a term and return the whole table:

{
  "type": "baserow",
  "parameters": {
    "resource": "row",
    "operation": "getAll",
    "databaseId": "12345",
    "tableId": "67890",
    "returnAll": true,
    "additionalOptions": {
      "search": "{{ $json.query }}"
    }
  }
}

Update selected columns on a row:

{
  "type": "baserow",
  "parameters": {
    "resource": "row",
    "operation": "update",
    "databaseId": "12345",
    "tableId": "67890",
    "rowId": "{{ $json.id }}",
    "dataToSend": "defineBelow",
    "fieldsUi": {
      "fieldValues": [
        { "fieldId": "125", "fieldValue": "archived" }
      ]
    }
  }
}

Delete a row:

{
  "type": "baserow",
  "parameters": {
    "resource": "row",
    "operation": "delete",
    "databaseId": "12345",
    "tableId": "67890",
    "rowId": "{{ $json.id }}"
  }
}

Error Handling

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

Tips

Baserow creates, reads, updates and deletes rows in a Baserow database table. It is the right tool when a workflow must work with records in a hosted or self-hosted Baserow database, with filtering, sorting, searching and pagination on reads, rather than a spreadsheet file or Airtable. It returns the affected rows as JSON items with field names mapped from Baserow’s internal field IDs, and getAll paging through a table.

Frequently asked questions

How does this node authenticate with Baserow?

It uses the Baserow API credential type (baserowApi), which exchanges your Baserow username and password for a JWT token automatically. You don't supply a static API key — instead, configure a baserowApi credential with your account details and the node handles the token exchange before each request.

Field names in my Baserow table look like 'field_123' in the response — why?

Baserow's REST API internally identifies columns by numeric IDs (field_N). The Baserow node maps these back to their human-readable names automatically, so by the time data reaches the next step in your workflow you should see your actual column names rather than the raw IDs.

Can I filter, sort, or paginate when listing rows?

Yes. The List Rows operation supports filtering, sorting, searching, and pagination. This means you can fetch only the records matching specific criteria rather than pulling an entire table, which is important for large datasets or when you only need a targeted subset of rows.

What happens if the API call fails — does the workflow stop?

The node has two separate outputs: Output and Error. A failed API call routes to the Error output rather than stopping the workflow outright, so you can attach a branch that handles errors — logging them, sending an alert, or retrying — without the whole automation breaking.

Is this node suitable for a self-hosted Baserow instance, or only Baserow Cloud?

Because authentication goes through the Baserow REST API and credentials include your own endpoint configuration, the node works with both self-hosted and cloud-hosted Baserow instances. You point the baserowApi credential at whichever URL your Baserow is running on.

Build with Baserow

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

Open BusyBot

Last reviewed . Spotted something wrong? Tell us.