REST API
Updated 27 July 2026 · 9 min read
On this page
The API exposes your sheets for reading and writing. Payloads follow the shape of the Airtable API: an integration written for Airtable transposes without relearning anything.
Base URL: https://rowbase.co/api/v1
Authenticate
Create a token from API tokens, in the sidebar — administrators only. You tick the tables it can reach; it sees nothing else. The secret is shown once.
Authorization: Bearer rowb_…
With no header, the response is 401 AUTHENTICATION_REQUIRED. With a revoked or unknown token, 401 INVALID_API_KEY. With a table outside the token's scope, 403 NOT_AUTHORIZED.
Throughput is capped at five calls per second per token.
List the tables
GET /api/v1/tables
Returns the token's tables, their sheets, and each sheet's columns. This is where you read the identifiers used by the other calls.
{
"tables": [
{
"id": "1",
"slug": "lar",
"name": "LAR",
"sheets": [
{
"id": "5",
"slug": "sheet-1",
"name": "Sheet 1",
"fields": [
{ "id": "fld20", "name": "ID", "type": "text" },
{ "id": "fld23", "name": "Email", "type": "email" }
]
}
]
}
]
}
A table and a sheet can be addressed either by slug or by numeric identifier.
List records
GET /api/v1/tables/{table}/{sheet}/records
{
"records": [
{
"id": "0c8f2b16-1f3e-4a91-9a0c-2b7d0f5c8ab1",
"createdTime": "2026-07-27T00:06:46.000Z",
"fields": { "ID": "…", "Website": "lettre-ar.com" }
}
],
"offset": "100"
}
A record's identifier is a UUID, unrelated to its position or to the internal key. Cells are keyed by column name; an empty cell is absent from the payload.
| Parameter | Effect |
|---|---|
pageSize |
Records per page, 100 at most and by default |
offset |
Resumes at the next page, returned while more remain |
maxRecords |
Caps the total returned |
fields[] |
Returns only these columns, by name or by fld… |
sort[0][field], sort[0][direction] |
Sorts on a column, asc or desc |
returnFieldsByFieldId |
Keys cells by fld… rather than by name |
filterByFormula and view do not exist: Rowbase has neither formulas nor views.
Read one record
GET /api/v1/tables/{table}/{sheet}/records/{recordId}
Create records
POST /api/v1/tables/{table}/{sheet}/records
A single row:
{ "fields": { "ID": "abc", "Website": "lettre-ar.com" } }
Or up to ten at once:
{ "records": [ { "fields": { "ID": "abc" } }, { "fields": { "ID": "def" } } ] }
The response mirrors the request: an object for the single form, a records array for the batch form.
Values are converted according to the column's type, just like typing in the grid. An unknown column name returns 422 UNKNOWN_FIELD_NAME — nothing is written.
A row created through the API triggers the sheet's Google Sheets syncs, exactly like data entered by hand.
Update records
PATCH /api/v1/tables/{table}/{sheet}/records
{ "records": [ { "id": "0c8f2b16-…", "fields": { "Website": "example.com" } } ] }
PATCH only touches the cells you send. PUT replaces the row: cells you leave out are cleared.
An update through the API rewrites the row in Google Sheets, just like an edit made in the grid.
Delete records
DELETE /api/v1/tables/{table}/{sheet}/records?records[]=0c8f2b16-…
{ "records": [ { "id": "0c8f2b16-…", "deleted": true } ] }
Ten records at most per call.
Errors
Every error has the same shape:
{ "error": { "type": "UNKNOWN_FIELD_NAME", "message": "Unknown field “Nope”." } }
| Type | Code | When |
|---|---|---|
AUTHENTICATION_REQUIRED |
401 | No Authorization header |
INVALID_API_KEY |
401 | Unknown or revoked token |
NOT_AUTHORIZED |
403 | Table outside the token's scope |
TABLE_NOT_FOUND, SHEET_NOT_FOUND, ROW_NOT_FOUND |
404 | Unknown identifier |
UNKNOWN_FIELD_NAME |
422 | Column name not on the sheet |
TOO_MANY_RECORDS |
422 | More than ten records in one call |
INVALID_REQUEST_BODY |
422 | Malformed body |
RATE_LIMIT_REACHED |
429 | More than five calls per second |
Full example
curl -X POST https://rowbase.co/api/v1/tables/lar/sheet-1/records \
-H "Authorization: Bearer rowb_…" \
-H "Content-Type: application/json" \
-d '{
"fields": {
"ID": "Cj0KCQjw4a3OBhCHARIsAChaq",
"Date": "2026-04-01 02:35:53",
"Website": "lettre-ar.com",
"Email": "[email protected]"
}
}'