One API. One syntax. No second dialect.
Everything the screen does travels through the same documented API — the screen is just another client. The filter you build in the grid is the filter you send over HTTP is the condition a webhook evaluates.
What the API covers
The whole product — because the product itself uses it.
Records
List with filter, sort, search, page_size, and bookmark paging; create, update, and delete in all-or-nothing batches of up to 100. Cells are keyed by field name; links read as {id, display} pairs.
The filter syntax
One JSON grammar — join plus conditions of field / op / value — with operators per field type: is, contains, before, has_any, empty, and friends. The same grammar filters the grid, saved views, and webhook triggers.
Structure
Databases, tables, fields, and views are resources too — make a table, add a currency field, or save a filtered view over HTTP, exactly like the screen does.
Attachments
Two plain calls: POST the file as ordinary multipart, then set the record’s field to the returned id. What Make and n8n already send, no choreography.
Webhooks
Create and manage webhooks over the API, verify deliveries with the X-Tabla-Signature HMAC header, and replay from the delivery log. Payloads carry before and after for every change.
In and out
POST /import takes CSV and Excel; GET /export returns the whole database as one zip — every table as CSV, every attachment’s bytes, and a machine-readable manifest.
Fast, and honest about why
The query does almost nothing, because we made it do almost nothing.