200The schema.
tableobjectrequired
The table.
Show child properties
idstringrequired
The table id.
- format
uuid
namestringrequired
Display name.
slugstringrequired
URL-safe name, unique within the tenant.
descriptionstring | nulloptional
What the table holds, or null.
iconstring | nulloptional
Icon name chosen in the dashboard, or null.
records_countintegerrequired
Live (not deleted) records in the table.
storage_bytesintegerrequired
Bytes the records occupy, counted against the storage quota.
title_columnstring | nulloptional
Key of the column that names a record (the `title` on every record row), or null when the first text column is used.
created_atstring | nulloptional
When the table was created (ISO-8601).
- format
date-time
updated_atstring | nulloptional
When the table or its columns last changed (ISO-8601).
- format
date-time
retentionobjectoptional
Retention policy description.
- additionalProperties
true
legal_holdbooleanoptional
Whether retention deletion is held for this table.
columnsarray<object>required
The columns, in position order.
Show child properties
idstringrequired
The column id.
- format
uuid
keystringrequired
The key this column has inside a record's `data`, and the `column` to name in a filter or a `sort`.
labelstringrequired
Display label.
typestringrequired
The field type. Its rules, operators and display hints are in `types` on the schema payload. `auto_number` is written by the platform: its `ui.readonly` is true and a value sent for it is refused.
- enum
["text","long_text","number","currency","boolean","date","datetime","phone","email","select","multi_select","relation","file","auto_number","unknown"]
stored_typestringoptional
Only when `type` is `unknown`: the type name actually stored, which this version cannot render.
positionintegerrequired
Zero-based column order; record `data` keys come back in this order.
requiredbooleanrequired
A create must supply a value; an update may not clear it.
uniquebooleanrequired
No two live records may share a value. A duplicate answers 422 with `errors`.
indexedbooleanrequired
Whether the column has an index. Sorting a large table on a column needs one — see `sort_index_threshold`.
index_statusstring | nulloptional
State of the latest index job on this column, or null when none was ever requested. Only `ready` makes the column sortable at scale.
- enum
["pending","building","ready","failed","dropping",null]
index_errorstring | nulloptional
Why the index build failed, when `index_status` is `failed`.
configobjectoptional
Type-specific settings: `options` for select/multi_select, `table_id` for relation, `default`, `ui` hints, and so on.
- additionalProperties
true
rulesarray<string>required
The validation rules a write runs, Laravel-style (`required`, `phone:TZ`, `max:255`, …).
operatorsarray<string>required
The filter operators this column accepts. Any other operator answers 422.
- items.enum
["equals","not_equals","contains","starts_with","greater_than","less_than","between","is_empty","is_not_empty","in"]
uiobjectrequired
Display hints for a grid or form: `cell` and `input` renderer names, `filter` widget, `width` in pixels, plus any of `hidden_in_grid`, `hidden_in_form`, `help_text`, `placeholder`, `is_title_field` set in the dashboard.
- additionalProperties
true
Show child properties
cellstringoptional
Renderer for the value in a grid cell.
inputstringoptional
Renderer for the value in a form.
filterstring | nulloptional
Filter widget, or null when the column cannot be filtered.
widthintegeroptional
Suggested column width in pixels.
warningstringoptional
Only when `type` is `unknown`: why the column is read-only.
typesobjectrequired
Every field type this version knows, keyed by name (`text`, `number`, `phone`, …).
- additionalProperties
{"$ref":"#/components/schemas/DataFieldType"}
system_columnsarray<object>required
The `$id`, `$created_at`, `$updated_at` and `$source` columns.
Show child properties
keystringrequired
The key to use in a filter `column` or in `sort`.
- enum
["$id","$created_at","$updated_at","$source"]
labelstringrequired
Display label.
typestringrequired
The field type its values behave as.
operatorsarray<string>required
The operators this system column accepts.
- items.enum
["equals","not_equals","contains","starts_with","greater_than","less_than","between","is_empty","is_not_empty","in"]
limitsobjectrequired
Current table allowances and usage. Record/storage quota refusals use HTTP 402 with error.code quota_exceeded and quota/limit/used in error.details.
Show child properties
columnsobjectoptional
How many columns the table uses against its allowance.
Show child properties
usedintegeroptional
columns in use.
maxintegeroptional
The most columns this table may have.
indexesobjectoptional
How many indexes the table uses against its allowance.
Show child properties
usedintegeroptional
indexes in use.
maxintegeroptional
The most indexes this table may have.
recordsobjectoptional
How many records the table uses against its allowance.
Show child properties
usedintegeroptional
records in use.
maxintegeroptional
The most records this table may have.
storageobjectoptional
Bytes the records occupy against the table's storage allowance.
Show child properties
used_bytesintegeroptional
Bytes in use.
max_bytesintegeroptional
The storage allowance in bytes.
sort_index_thresholdintegerrequired
At or above this record count, sorting on an unindexed user column returns 501 not_supported with reason sort_needs_index. System timestamp sorts remain supported.
canobjectrequired
What the user who issued this key may do.
Show child properties
managebooleanoptional
May change tables and columns (in the dashboard; not over this API).
edit_recordsbooleanoptional
May create, change and delete records — the gate on the write endpoints here.
manage_reportsbooleanoptional
May save reports on this table.
accessobjectrequired
Per-table access for this caller, including governed state and granted capabilities.
- additionalProperties
true
actionsarray<object>required
Available record-action summaries, without private action secrets.
- items.additionalProperties
true
unique_setsarray<object>required
Unique field combinations and their index state.
- items.additionalProperties
true
{
"table": {
"id": "9d2f4c1e-7b8a-4e0f-9a3b-5c6d7e8f9a0b",
"name": "Customers",
"slug": "customers",
"description": "Everyone who has bought from us.",
"icon": "users",
"records_count": 1286,
"storage_bytes": 418304,
"title_column": "name",
"created_at": "2026-08-30T09:00:00+00:00",
"updated_at": "2026-09-07T14:02:31+00:00"
},
"columns": [
{
"id": "6a1b2c3d-0000-4000-8000-000000000001",
"key": "name",
"label": "Name",
"type": "text",
"position": 0,
"required": true,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": {
"ui": {
"is_title_field": true
}
},
"rules": [
"required",
"string",
"max:255"
],
"operators": [
"equals",
"not_equals",
"contains",
"starts_with",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"is_title_field": true,
"cell": "text",
"input": "text",
"filter": "text",
"width": 200
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000002",
"key": "phone",
"label": "Simu",
"type": "phone",
"position": 1,
"required": true,
"unique": true,
"indexed": true,
"index_status": "ready",
"index_error": null,
"config": {
"region": "TZ"
},
"rules": [
"required",
"phone:TZ"
],
"operators": [
"equals",
"not_equals",
"starts_with",
"contains",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "phone",
"input": "phone",
"filter": "text",
"width": 160
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000003",
"key": "region",
"label": "Region",
"type": "select",
"position": 2,
"required": false,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": {
"options": [
{
"key": "dar",
"label": "Dar es Salaam"
},
{
"key": "arusha",
"label": "Arusha"
}
]
},
"rules": [
"in:dar,arusha"
],
"operators": [
"equals",
"not_equals",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "select",
"input": "select",
"filter": "select",
"width": 140
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000004",
"key": "opt_in",
"label": "Opted in",
"type": "boolean",
"position": 3,
"required": false,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": [],
"rules": [
"boolean"
],
"operators": [
"equals",
"is_empty",
"is_not_empty"
],
"ui": {
"cell": "boolean",
"input": "checkbox",
"filter": "boolean",
"width": 100
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000005",
"key": "balance",
"label": "Balance",
"type": "currency",
"position": 4,
"required": false,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": {
"currency": "TZS"
},
"rules": [
"numeric"
],
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between",
"is_empty",
"is_not_empty"
],
"ui": {
"cell": "currency",
"input": "number",
"filter": "number",
"width": 140
}
}
],
"types": {
"text": {
"label": "Text",
"operators": [
"equals",
"not_equals",
"contains",
"starts_with",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "text",
"input": "text",
"filter": "text",
"width": 200
},
"numeric": false,
"temporal": false
},
"phone": {
"label": "Phone",
"operators": [
"equals",
"not_equals",
"starts_with",
"contains",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "phone",
"input": "phone",
"filter": "text",
"width": 160
},
"numeric": false,
"temporal": false
},
"datetime": {
"label": "Date & time",
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between",
"is_empty",
"is_not_empty"
],
"ui": {
"cell": "datetime",
"input": "datetime",
"filter": "date",
"width": 180
},
"numeric": false,
"temporal": true
}
},
"system_columns": [
{
"key": "$id",
"label": "ID",
"type": "relation",
"operators": [
"equals",
"in"
]
},
{
"key": "$created_at",
"label": "Created",
"type": "datetime",
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between"
]
},
{
"key": "$updated_at",
"label": "Updated",
"type": "datetime",
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between"
]
},
{
"key": "$source",
"label": "Source",
"type": "text",
"operators": [
"equals",
"in",
"starts_with"
]
}
],
"limits": {
"columns": {
"used": 5,
"max": 40
},
"indexes": {
"used": 1,
"max": 5
},
"records": {
"used": 1286,
"max": 500000
},
"storage": {
"used_bytes": 418304,
"max_bytes": 2147483648
}
},
"sort_index_threshold": 20000,
"can": {
"manage": true,
"edit_records": true,
"manage_reports": true
}
}
default
{
"table": {
"id": "9d2f4c1e-7b8a-4e0f-9a3b-5c6d7e8f9a0b",
"name": "Customers",
"slug": "customers",
"description": "Everyone who has bought from us.",
"icon": "users",
"records_count": 1286,
"storage_bytes": 418304,
"title_column": "name",
"created_at": "2026-08-30T09:00:00+00:00",
"updated_at": "2026-09-07T14:02:31+00:00"
},
"columns": [
{
"id": "6a1b2c3d-0000-4000-8000-000000000001",
"key": "name",
"label": "Name",
"type": "text",
"position": 0,
"required": true,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": {
"ui": {
"is_title_field": true
}
},
"rules": [
"required",
"string",
"max:255"
],
"operators": [
"equals",
"not_equals",
"contains",
"starts_with",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"is_title_field": true,
"cell": "text",
"input": "text",
"filter": "text",
"width": 200
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000002",
"key": "phone",
"label": "Simu",
"type": "phone",
"position": 1,
"required": true,
"unique": true,
"indexed": true,
"index_status": "ready",
"index_error": null,
"config": {
"region": "TZ"
},
"rules": [
"required",
"phone:TZ"
],
"operators": [
"equals",
"not_equals",
"starts_with",
"contains",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "phone",
"input": "phone",
"filter": "text",
"width": 160
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000003",
"key": "region",
"label": "Region",
"type": "select",
"position": 2,
"required": false,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": {
"options": [
{
"key": "dar",
"label": "Dar es Salaam"
},
{
"key": "arusha",
"label": "Arusha"
}
]
},
"rules": [
"in:dar,arusha"
],
"operators": [
"equals",
"not_equals",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "select",
"input": "select",
"filter": "select",
"width": 140
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000004",
"key": "opt_in",
"label": "Opted in",
"type": "boolean",
"position": 3,
"required": false,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": [],
"rules": [
"boolean"
],
"operators": [
"equals",
"is_empty",
"is_not_empty"
],
"ui": {
"cell": "boolean",
"input": "checkbox",
"filter": "boolean",
"width": 100
}
},
{
"id": "6a1b2c3d-0000-4000-8000-000000000005",
"key": "balance",
"label": "Balance",
"type": "currency",
"position": 4,
"required": false,
"unique": false,
"indexed": false,
"index_status": null,
"index_error": null,
"config": {
"currency": "TZS"
},
"rules": [
"numeric"
],
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between",
"is_empty",
"is_not_empty"
],
"ui": {
"cell": "currency",
"input": "number",
"filter": "number",
"width": 140
}
}
],
"types": {
"text": {
"label": "Text",
"operators": [
"equals",
"not_equals",
"contains",
"starts_with",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "text",
"input": "text",
"filter": "text",
"width": 200
},
"numeric": false,
"temporal": false
},
"phone": {
"label": "Phone",
"operators": [
"equals",
"not_equals",
"starts_with",
"contains",
"is_empty",
"is_not_empty",
"in"
],
"ui": {
"cell": "phone",
"input": "phone",
"filter": "text",
"width": 160
},
"numeric": false,
"temporal": false
},
"datetime": {
"label": "Date & time",
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between",
"is_empty",
"is_not_empty"
],
"ui": {
"cell": "datetime",
"input": "datetime",
"filter": "date",
"width": 180
},
"numeric": false,
"temporal": true
}
},
"system_columns": [
{
"key": "$id",
"label": "ID",
"type": "relation",
"operators": [
"equals",
"in"
]
},
{
"key": "$created_at",
"label": "Created",
"type": "datetime",
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between"
]
},
{
"key": "$updated_at",
"label": "Updated",
"type": "datetime",
"operators": [
"equals",
"not_equals",
"greater_than",
"less_than",
"between"
]
},
{
"key": "$source",
"label": "Source",
"type": "text",
"operators": [
"equals",
"in",
"starts_with"
]
}
],
"limits": {
"columns": {
"used": 5,
"max": 40
},
"indexes": {
"used": 1,
"max": 5
},
"records": {
"used": 1286,
"max": 500000
},
"storage": {
"used_bytes": 418304,
"max_bytes": 2147483648
}
},
"sort_index_threshold": 20000,
"can": {
"manage": true,
"edit_records": true,
"manage_reports": true
}
}