Skip to content
Last updated

Tables

A Table is a spreadsheet-like resource: rows, columns, views, and aggregations. It is flatter than an Object — it does not have record types, and it does not carry CRM-style activities like notes or tasks. It can still link to other resources (Objects or Tables) through a relation column, and it can hold files via a file column.

If you need a dataset that flows interact with (lookups, writes, conditionals) without the CRM-style overhead, use a Table. If you need a typed entity with multiple record types and full activity tracking, use an Object.

All tables endpoints require a USER API key. See Authentication.

Identity

FieldTypeNotes
idnumber
namestringInternal identifier. Use as :name in route params.
display_namestringUser-facing name.
typeenumAlways "table" (vs "object" for Objects).
custombooleantrue for tables you created.
descriptionstring?
emojistring?A single Unicode emoji (e.g. 📊). Not an icon key like "chart" — those are for Objects only.
icon_colorstring?Color name or hex.
field_countnumber?Number of columns.
created_atstringISO timestamp.
updated_atstringISO timestamp.

Detail responses include fields and views. They also include a record_types array for shape compatibility, but Tables always carry a single implicit record type — categorization is not exposed. The /objects/{name}/record-types endpoints reject Table names with a 404.

Who can change a Table's schema

Changing a Table (its name, columns, or select options) requires edit access to that Table. Reading it only requires view access.

Edit access is granted to account admins and owners, to the user who created the Table, and to anyone given FULL_ACCESS through sharing. A user with VIEW access can read the Table and its rows but gets a 403 on any schema change. Deleting a Table follows the same rule.

This is deliberately more permissive than Objects, whose schema is admin/owner-only: a Table is owned by whoever made it, so they can reshape it without needing an admin.

Columns

Tables use the same column types as Objects (see Objects → Fields). Allowed types in the Public API: string, number, boolean, date, dateOnly, select, relation (limited), file, avatar. Internal types are rejected.

Tables vs Objects

FeatureTablesObjects
Multiple record types❌✅
Relations to Objects / other Tables✅✅
Relations to Users❌✅
Notes attached to rows❌✅
Tasks attached to rows❌✅
file column type✅✅
Views✅✅
Aggregations✅✅
Exports (CSV / XLSX)✅✅

When in doubt: pick Object if records need record types, notes/tasks, or links to Users; pick Table for flatter datasets used by flows and workflows.

Sub-resources

Mounted under /public/v1/tables/{name}/...:

Sub-resourcePurpose
fieldManage columns.
optionManage select field options.
record / rowList, get, create, update, delete rows.
viewSaved view configurations.
aggregationPer-view aggregations.
exportExport rows as XLSX or CSV.

To attach files to a row, use a column of type file rather than a row-level activity.

Operations (top-level)

VerbPathPurpose
GET/public/v1/tablesList
POST/public/v1/tablesCreate
GET/public/v1/tables/{name}Detail
GET/public/v1/tables/{name}/schemaSchema-only
PATCH/public/v1/tables/{name}Update display name, emoji, color, description
DELETE/public/v1/tables/{name}Delete

CLI

frontline table list
frontline table get my_table
frontline table create my_table --data '{"displayName":"My Table","columns":[{"name":"Name","type":"string","metadata":{"format":"text"}}]}'
frontline table row create my_table --data '{"Name":"Acme"}'
frontline table export my_table --format csv