Core concepts

Pagination

Offset paging over every collection, with the total alongside.

Collections are paged with limit and offset, and every page carries the total so you know how far there is to go.

Parameters

ParameterTypeDefaultMeans
limitinteger25Rows per page, 1–100
offsetinteger0How many to skip

Anything outside those bounds is refused with 422 rather than quietly clamped — a request for 5,000 rows is a mistake worth hearing about.

The shape

Every collection answers with the same object inside data, so one reader works against all of them.

GET/recordings

total is the whole collection, not the page.

cURL
curl "https://api-notetaker.nabrah.ai/ext/v1/recordings?limit=2" \
  -H "Authorization: Bearer $NABRAH_API_KEY"
Response 200
{
  "data": {
    "rows": [
      { "runId": "9f8c2e10-...", "reference": "NB-3F2A-9C1D-7E5B", "title": "Weekly product sync" },
      { "runId": "7a1b4d92-...", "reference": "NB-8E4C-1B77-2D90", "title": "Design review" }
    ],
    "total": 128,
    "limit": 2,
    "offset": 0
  }
}

Walking the whole collection

async function* allRecordings() {
  let offset = 0;
  const limit = 100;

  for (;;) {
    const response = await fetch(
      `https://api-notetaker.nabrah.ai/ext/v1/recordings?limit=${limit}&offset=${offset}`,
      { headers: { Authorization: `Bearer ${process.env.NABRAH_API_KEY}` } },
    );

    const { data } = await response.json();
    yield* data.rows;

    offset += data.rows.length;
    if (offset >= data.total || data.rows.length === 0) return;
  }
}

Offsets shift as rows are written

Recordings arrive while you are reading. A new one at the top pushes everything down by one, so a row can repeat between pages, and a deletion can make one slip past you.

For a full sweep this rarely matters. When it does, walk oldest first where the endpoint allows an order, or reconcile on runId rather than trusting position.

The exceptions

A few endpoints return everything they have rather than a page, because the collection is bounded by something other than your patience: /calendar/connections, /organization/invites, and /webhooks. They use the same envelope, with total equal to the number of rows, so the same reader still works.