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
tablesendpoints require a USER API key. See Authentication.
| Field | Type | Notes |
|---|---|---|
id | number | |
name | string | Internal identifier. Use as :name in route params. |
display_name | string | User-facing name. |
type | enum | Always "table" (vs "object" for Objects). |
custom | boolean | true for tables you created. |
description | string? | |
emoji | string? | A single Unicode emoji (e.g. 📊). Not an icon key like "chart" — those are for Objects only. |
icon_color | string? | Color name or hex. |
field_count | number? | Number of columns. |
created_at | string | ISO timestamp. |
updated_at | string | ISO 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.
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.
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.
| Feature | Tables | Objects |
|---|---|---|
| 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.
Mounted under /public/v1/tables/{name}/...:
| Sub-resource | Purpose |
|---|---|
field | Manage columns. |
option | Manage select field options. |
record / row | List, get, create, update, delete rows. |
view | Saved view configurations. |
aggregation | Per-view aggregations. |
export | Export rows as XLSX or CSV. |
To attach files to a row, use a column of type file rather than a row-level activity.
| Verb | Path | Purpose |
|---|---|---|
GET | /public/v1/tables | List |
POST | /public/v1/tables | Create |
GET | /public/v1/tables/{name} | Detail |
GET | /public/v1/tables/{name}/schema | Schema-only |
PATCH | /public/v1/tables/{name} | Update display name, emoji, color, description |
DELETE | /public/v1/tables/{name} | Delete |
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