API reference · Data plane
Rows
Read and write the rows of a table on the data plane. Every call is filtered by the table's access preset and the identity of the caller.
Host: https://proj-<id>.manybases.com · Key: pk_ (with X-Session for a signed-in user) or sk_. The same routes exist for an account key under /v1/projects/:pid/… — see Mirrors.
/v1/tables/:table/rows200 { data: [...], cursor }/v1/tables/:table/rows/:id200 { data: {...} }. A row that does not exist and a row you may not read answer the same 404/v1/tables/:table/rows201 with the complete rows, platform columns filled in/v1/tables/:table/rows/:id200 with the complete row/v1/tables/:table/rows/:id200 { data: { id, deleted: true } }Creating a row#
POST /v1/tables/habits/rows
Authorization: Bearer pk_…
X-Session: <token>
Content-Type: application/json
{ "name": "Sport", "target_per_week": 3 }
→ 201
{ "data": { "id": "01J3ZK…", "name": "Sport", "target_per_week": 3,
"owner_id": "usr_a", "created_at": "2026-07-27T09:12:00Z", "updated_at": "2026-07-27T09:12:00Z" } }- The API sets
id,owner_id,created_atandupdated_at. A body that carriesidorowner_idis refused with400 validation_error. owner_idis the end user of the session. A row created with ansk_orak_key hasowner_id: null: it belongs to nobody, so on apriveorjournaltable no end user will ever see it.- On a spaces preset the body carries
space_id, chosen among the caller's own spaces; the API checks membership before writing.space_idis immutable afterwards — to move a row, delete and recreate it. - On a form table an anonymous caller may create; the rate limit is 10 creations per minute per IP (
429), and the table holds at most 10 000 rows (402 quota_exceeded). Both apply to anonymous and signed-in callers alike;sk_andak_are exempt. - Send
Idempotency-Keyto make a retry safe. For an anonymous caller the key only de-duplicates: a replay answers409, never the first response.
Sizes#
A row is at most 64 KB (32 KB on a form table), platform columns included, on creation as on update. The request payload is at most 256 KB. Beyond, 413 payload_too_large names the figure.
Who sees what#
The preset decides per operation. Examples: on prive a user lists only rows where owner_id is theirs; on partage everyone signed in lists everything but edits only their own rows; on journal nobody edits or deletes, ever; on formulaire anyone creates and nobody reads from the app. The full matrix is in Access presets.
A refusal never reveals what it hides: an operation on a row the caller may not see answers the neutral 404; an operation the caller may see but not perform (editing a journal row) answers 403 forbidden. An anonymous caller on a non-public preset answers 401 with the hint "session required".
What is not there#
No OR between filters, no joins, no aggregation (sum, average, group by), no conditional visibility per row or per column. See Limitations for the workarounds. Schema changes go through SQL or the create_table and apply_migration tools.
