The API in five minutes: a key, three curls
Mint an API key, list records, create one, change it — with real requests and real responses. Every table you make is already an endpoint; this is the shortest path to proving that.
Updated August 2026
Everything the Tabla screen does runs through one API — the grid is a client of it, not a favored sibling. So there is no "enable API access" switch and no separate sync step: every table you make is already an endpoint, serving the same data the screen shows. Five minutes below: a key, then list, create, update against a real table.
The examples run against a demo database — a Cairo plant shop with a
Plants table (tbl_jukzu86nxtcj).
Mint a key
- Open the account menu — your avatar, top right — and choose API keys…
- Name the key for the thing that will hold it ("Invoice script", "Make") and press Create.
- Copy the value. It is shown once, at creation — after this dialog it can't be shown again, only replaced.
The key rides in a header on every request:
Authorization: Bearer key_xxxx.your-secret
More on the two halves of that value, and where a key must never go, in API keys.
List records
curl "https://tabladb.com/api/tables/tbl_jukzu86nxtcj/records?fields=Name,Price&page_size=3" \
-H "Authorization: Bearer key_xxxx.your-secret"
{
"records": [
{ "id": "rec_y4crk8w9hc3e",
"created_at": "2026-08-09T22:18:11.426Z",
"updated_at": "2026-08-09T23:00:54.516Z",
"fields": { "Name": "Monstera deliciosa", "Price": 45 } },
{ "id": "rec_y45z2yssdq4i",
"created_at": "2026-08-09T22:18:11.426Z",
"updated_at": "2026-08-09T22:18:13.308Z",
"fields": { "Name": "Snake plant", "Price": 28 } },
{ "id": "rec_rkuhigwbfbq9",
"created_at": "2026-08-09T22:18:11.426Z",
"updated_at": "2026-08-09T22:18:13.308Z",
"fields": { "Name": "Golden barrel cactus", "Price": 22 } }
],
"bookmark": "eyJ2IjpbXSwicyI6M30",
"field_ids": { "Name": "fld_rume7j84a473", "Price": "fld_t8y7aqpv8ykt" }
}
Three things worth noticing. fields= narrowed the response to two columns.
bookmark means there are more records — pass it back to get the next page
(pagination). And field_ids maps every field name
to its stable id, which matters the day someone renames a column
(names and ids). Filtering, sorting and search ride
on the same endpoint (filtering).
Create a record
Cells are keyed by field name; select values are written by choice name.
curl -X POST "https://tabladb.com/api/tables/tbl_jukzu86nxtcj/records" \
-H "Authorization: Bearer key_xxxx.your-secret" \
-H "Content-Type: application/json" \
-d '{"records":[{"fields":{"Name":"Fiddle-leaf fig","Price":55,"Light":"Bright indirect","In stock":7}}]}'
{
"records": [
{ "id": "rec_utf767j36rpj",
"created_at": "2026-08-09T23:03:51.631Z",
"updated_at": "2026-08-09T23:03:51.631Z",
"fields": { "Name": "Fiddle-leaf fig", "Price": 55,
"Light": "Bright indirect", "In stock": 7,
"Photo": [], "Tags": null, "Care notes": null } }
]
}
(Response trimmed — a created record comes back with every field, the empty
ones as null or [].) One call can carry up to 100 records, and a batch is
all-or-nothing: one bad row and nothing is written
(writing records).
Update it
Same endpoint, PATCH, and the record's id:
curl -X PATCH "https://tabladb.com/api/tables/tbl_jukzu86nxtcj/records" \
-H "Authorization: Bearer key_xxxx.your-secret" \
-H "Content-Type: application/json" \
-d '{"records":[{"id":"rec_utf767j36rpj","fields":{"In stock":6}}]}'
The response is the full record again, now with "In stock": 6 and a moved
updated_at. Only the fields you send change; the rest stay put. The edit is
live everywhere the moment it lands — the grid, every view, any webhook
watching the table.
What else is behind this door
The same API covers fields and views, linked records, attachments, the trash, webhooks, members, import and whole-database export — read and write, same envelope, same key. The full reference lives at /docs/api, and there is a machine-readable /openapi.json if you'd rather point a generator at it. Rate limit: 600 requests a minute per key — the rest of the numbers are in errors and limits.