API
Read records
List records page by page, or get one record by ID.
The examples use a deals collection with title, stage and amount fields. Replace the IDs with yours from Workspaces and collections.
List records
GET /api/v1/workspaces/:workspace/collections/:collection/records
limit sets the page size (default 50) and offset skips rows. Add a query to sort, filter or search.
curl --get 'http://127.0.0.1:8080/api/v1/workspaces/YOUR_WORKSPACE_ID/collections/YOUR_COLLECTION_ID/records' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--data-urlencode 'limit=20' \
--data-urlencode 'offset=0' const base = `http://127.0.0.1:8080/api/v1/workspaces/${workspaceId}/collections/${collectionId}`;
const res = await fetch(`${base}/records?limit=20&offset=0`, {
headers: { Authorization: `Bearer ${token}` }
});
const { data: records, meta } = await res.json(); base := "http://127.0.0.1:8080/api/v1/workspaces/" + workspaceID + "/collections/" + collectionID
req, _ := http.NewRequest("GET", base+"/records?limit=20&offset=0", nil)
req.Header.Set("Authorization", "Bearer "+token)
res, err := http.DefaultClient.Do(req) base = f"http://127.0.0.1:8080/api/v1/workspaces/{workspace_id}/collections/{collection_id}"
res = requests.get(
f"{base}/records",
headers={"Authorization": f"Bearer {token}"},
params={"limit": 20, "offset": 0},
)
records = res.json()["data"] Response:
{
"data": [
{
"id": "adb696e5c90257c2c313d635f892a776",
"title": "Warehouse analytics",
"stage": "Lead",
"amount": 7300000,
"created_at": "2026-10-23T07:04:27.858424Z",
"updated_at": "2026-10-23T07:04:27.858424Z"
}
],
"meta": {
"request_id": "...",
"response_time": 1.8,
"pagination": { "limit": 20, "offset": 0, "count": 1, "has_more": false }
}
} has_more tells you whether to fetch the next page with a higher offset. Every record has id, created_at and updated_at.
Get one record
GET /api/v1/workspaces/:workspace/collections/:collection/records/:record
curl 'http://127.0.0.1:8080/api/v1/workspaces/YOUR_WORKSPACE_ID/collections/YOUR_COLLECTION_ID/records/YOUR_RECORD_ID' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' const res = await fetch(`${base}/records/${recordId}`, {
headers: { Authorization: `Bearer ${token}` }
});
const { data: record } = await res.json();
const etag = res.headers.get('ETag'); req, _ := http.NewRequest("GET", base+"/records/"+recordID, nil)
req.Header.Set("Authorization", "Bearer "+token)
res, err := http.DefaultClient.Do(req)
etag := res.Header.Get("ETag") res = requests.get(f"{base}/records/{record_id}", headers={"Authorization": f"Bearer {token}"})
record = res.json()["data"]
etag = res.headers["ETag"] The response has the record in data and an ETag header. Send that value as If-Match when you update, so you never overwrite someone else’s change.
A record that does not exist, or that you may not read, returns 404 not_found.