Tables

core.table.* actions in a workflow definition.
Use tables when you want to:
- Keep durable records across workflow runs
- Look up known values such as users, hosts, or indicators
- Search and export structured data for investigation or reporting
- Reuse the same dataset across multiple workflows
Columns
Each table has a schema that defines its columns. Choose column types based on the data you want to store and query. You can create tables with the following column types:- TEXT
- INTEGER
- BOOLEAN
- NUMERIC
- JSONB
- TIMESTAMPTZ
- UUID
TEXT, INTEGER, BOOLEAN, and NUMERIC for simple fields.
Use JSONB when you need to store nested structured data, and use TIMESTAMPTZ or UUID for timestamps and identifiers.
Rows
Rows hold the actual records in a table. You can insert, update, delete, look up, and search rows as your workflows process new events. This works well for data such as:- Asset inventories
- User allowlists
- Enrichment results
- Investigation evidence
- External system references
core.table.lookup.
If you need broader filtering or text search, use core.table.search_rows.
For example, use core.table.lookup when you know the exact value:
core.table.search_rows when you want to search across rows:
Index and upsert
You’ll often need to deduplicate data or require all values in a column to be unique. You can do that by creating an index and then usingcore.table.insert_row with upsert: true.

- One row per hostname
- One row per email address
- One row per alert ID
- One row per hash value
core.table.insert_row with upsert: true updates the existing row instead of creating a duplicate.
Table actions
Usecore.table.* actions when you want your workflows to work with tables directly.
- Tables to create tables, inspect metadata, insert rows, search rows, and export data
- Use
core.table.insert_rowwithupsert: truewhen you want to update an existing row that matches a unique index