DataTable

The DataTable node reads, writes, and manages data in Heym DataTables.

The DataTable node reads, writes, and manages data in Heym DataTables. Use it for CRUD operations on first-party structured storage without external credentials.

Overview

PropertyValue
Inputs1
Outputs1
Output$nodeLabel.rows, $nodeLabel.row, $nodeLabel.success, $nodeLabel.id

Parameters

ParameterTypeDescription
dataTableIdUUIDDataTable from DataTable tab
dataTableOperationstringOperation: find, getAll, count, getById, insert, update, remove, upsert
dataTableRowIdexpressionRow UUID (for getById, update, remove)
dataTableDataJSON stringColumn values: {"column_name": "value"}
dataTableFilterJSON stringFilter (find/upsert/count). find and count support operators {"age": {"$gt": 18}}; upsert uses exact-match {"column_name": "value"}
dataTableSortstringSort column, prefix - for descending
dataTableLimitnumberMax rows returned (default: 100)

Operations

OperationRequired FieldsDescription
finddataTableIdFind rows matching an optional operator filter with optional sort/limit
getAlldataTableIdGet all rows with optional sort/limit
countdataTableIdCount rows matching an optional operator filter (counted in the database; returns just a number)
getByIddataTableId, dataTableRowIdGet a single row by UUID
insertdataTableId, dataTableDataInsert a new row
updatedataTableId, dataTableRowId, dataTableDataUpdate row (merges data)
removedataTableId, dataTableRowIdDelete a row
upsertdataTableId, dataTableFilter, dataTableDataUpdate if match found, insert otherwise

Example - Find Rows

{
  "type": "dataTable",
  "data": {
    "label": "findActive",
    "dataTableId": "table-uuid",
    "dataTableOperation": "find",
    "dataTableFilter": "{\"status\": \"active\", \"age\": {\"$gte\": 18}, \"created_at\": {\"$contains\": \"2026-06\"}}",
    "dataTableSort": "-created_at",
    "dataTableLimit": 50
  }
}

Example - Insert Row

{
  "type": "dataTable",
  "data": {
    "label": "addUser",
    "dataTableId": "table-uuid",
    "dataTableOperation": "insert",
    "dataTableData": "{\"name\": \"$start.text\", \"status\": \"pending\"}"
  }
}

Example - Count Rows

Count rows matching a condition in a single node, instead of getAll → If/Else → Map.

{
  "type": "dataTable",
  "data": {
    "label": "activeAdults",
    "dataTableId": "table-uuid",
    "dataTableOperation": "count",
    "dataTableFilter": "{\"status\": \"active\", \"age\": {\"$gt\": 18}}"
  }
}

The result is available as $activeAdults.count. An empty or omitted filter counts every row.

Find and count filter operators

In a find or count filter, a plain value means equals; an object value applies an operator:

OperatorMeaning
$eq (or a plain value)Equals
$neNot equals
$gt, $gte, $lt, $lteGreater/less than comparisons (numeric for columns typed as number, otherwise text)
$containsCase-insensitive substring match
$inValue is in the given array

Example combining several: {"status": "active", "age": {"$gte": 18}, "plan": {"$in": ["pro", "team"]}, "name": {"$contains": "jo"}}. Unknown operators are ignored. upsert filters still use exact-match values to find the row to update.

You can also filter on row metadata — id, table_id, created_at, updated_at, created_by, updated_by — which are stored as real columns rather than inside your data. For dates, pass a full value for range comparisons (e.g. {"created_at": {"$gt": "2026-06-04"}}) or use $contains for a partial text match (e.g. {"created_at": {"$contains": "2026-06-04"}}). If one of your own columns is named the same as a metadata field, the data column takes precedence.

Output Access

  • $nodeLabel.success - Boolean success status
  • $nodeLabel.rows - Array of rows (find, getAll)
  • $nodeLabel.row - Single row object (getById, insert, update, upsert)
  • $nodeLabel.row.data.column_name - Access specific column value
  • $nodeLabel.count - Number of rows (rows returned for find/getAll; matching-row total for count)
  • $nodeLabel.id - Row UUID (insert, update, remove)
  • $nodeLabel.found - Boolean (getById)
  • $nodeLabel.operation - Operation name (e.g. count; insert/update for upsert)

No Credential Required

Unlike external integrations, DataTable operates on Heym's internal database. The workflow owner's access permissions are checked automatically.

Built by the AI Assistant

When the AI Assistant or Chat builds this node, it picks or creates the table with you and writes the table's exact column names into dataTableData and dataTableFilter.