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.

Next steps

Buy me a coffee