Skip to content

List sealed store changes

The sync read, as a delta feed.

  • Full read. Without since, the feed returns every record in the store, live and tombstoned, in change order.
  • Delta read. With since, it returns every record created, updated, deleted or undeleted after that cursor. Each record appears once, in its current state; a deleted record arrives as its envelope-only tombstone.

Follow next_cursor while has_more is true, then keep the last next_cursor for the next sync. Cursors are opaque.

410 SEALED_CURSOR_EXPIRED means "do a full read and reconcile". A cursor issued more than 30 days ago is refused, and so is one from before a tombstone that has since been removed (after its 30 days, or early because the store keeps only its newest 500): the delta could no longer tell the device about that delete. Read the store again without since and reconcile the device's records against the full read. A synced record the device holds that the full read does not return is no longer in the store.

A page stops early once it carries 8 MiB of decoded payload, never below one record, so has_more can be true with fewer than limit records.

GEThttps://api.aitronos.com/v1/sealed-stores/{store}/changes

Path Parameters

store string required

The store: aitronos-browser. Up to 64 characters; an unknown store is 404 SEALED_STORE_NOT_FOUND.

Query Parameters

since string optional

The next_cursor of an earlier page, up to 512 characters. Leave it out for a full read.

limit integer optional

The most records in this page, 1 to 500. Defaults to 100.

Headers

Authorization string required

Bearer <access token> from the person's own sign-in. API keys and service accounts are refused with 403 SEALED_STORE_PERSONAL_SESSION_REQUIRED.


Returns

200 OK:

  • object string — sealed_change_page.
  • full_read boolean — true when the request carried no since.
  • changes array — the changed records in change order, each in its current state (see below). A deleted record is its tombstone.
  • next_cursor string — always present. Opaque: store it and send it back, never parse it. Send it as since for the next page while has_more is true, and keep the last one for the next sync.
  • has_more boolean — whether more changes follow this page.

Each entry of changes:

  • object string — sealed_record.
  • id string — the client's record id.
  • kind string — session or favourites.
  • schema_version integer — as the last accepted write sent it.
  • revision integer — server-assigned; rises by 1 on every accepted write.
  • created_at string — when the record was created (ISO 8601 UTC).
  • last_touched_at string — set by the server on every accepted write. Sort by it, ties by id.
  • deleted boolean — whether the record is a tombstone.
  • deleted_at string or null — when it was deleted.
  • device_id string — the device of the last accepted write.
  • wrapped_dek object or null — the data key that opens payload: v, aead, nonce, ct, epk. v is always the integer 1. null for a tombstone.
  • payload string or null — the sealed bytes, standard padded base64. null for a tombstone.
  • payload_bytes integer or null — the decoded payload size. null for a tombstone.

Errors

StatusCodeWhen
401AUTHENTICATION_REQUIREDNo access token, or one that is not valid.
403SEALED_STORE_PERSONAL_SESSION_REQUIREDThe call used an API key or a service account. Only a person's own sign-in session reaches a sealed store.
404SEALED_STORE_NOT_FOUNDNo store with that name (details.store).
410SEALED_CURSOR_EXPIREDThe cursor was issued more than 30 days ago, or a tombstone after it has since been removed (details.retention_days). Do a full read and reconcile.
422SEALED_CURSOR_INVALIDThe cursor was not issued by this store. Do a full read.
422VALIDATION_ERRORlimit is outside 1 to 500, or since is longer than 512 characters.
cURL
# Full read: no cursor.
curl "https://api.aitronos.com/v1/sealed-stores/aitronos-browser/changes?limit=100" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

# Next sync: everything after the cursor kept from the last one.
curl "https://api.aitronos.com/v1/sealed-stores/aitronos-browser/changes?since=ZjE6NTc6MTc5MTYyNDAwMA&limit=100" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Response:

{
  "object": "sealed_change_page",
  "full_read": true,
  "changes": [
    {
      "object": "sealed_record",
      "id": "z4rSQRGzUlRnQMJmA0W1Uw",
      "kind": "session",
      "schema_version": 1,
      "revision": 2,
      "created_at": "2026-10-06T14:22:31.845570Z",
      "last_touched_at": "2026-10-09T21:14:50.093318Z",
      "deleted": true,
      "deleted_at": "2026-10-09T21:14:50.093318Z",
      "device_id": "1f783def-2aa1-4b44-9c73-3c6b9102c06b",
      "wrapped_dek": null,
      "payload": null,
      "payload_bytes": null
    },
    {
      "object": "sealed_record",
      "id": "F1PMCmFG6rsW4-HU4afL_g",
      "kind": "favourites",
      "schema_version": 1,
      "revision": 7,
      "created_at": "2026-10-08T17:20:09.381146Z",
      "last_touched_at": "2026-10-10T08:55:12.774031Z",
      "deleted": false,
      "deleted_at": null,
      "device_id": "1aee2c02-ccac-4ede-b017-1334be895e2e",
      "wrapped_dek": {
        "v": 1,
        "aead": "aes-256-gcm",
        "nonce": "K4oMLrGJ4dOy3SSa",
        "ct": "KF2aNtgNDsrl44sR1t60za/U14/38uhVtZR5x1IwVuE1ZA9O40F7m+B3Z5c4F5ff",
        "epk": "YTA186lzj639ytab4sP9at47MIW6rLw1mPH+rLf5zYk="
      },
      "payload": "KwbjgOqLohvGjo8CWi61+eqKsSS+Hr8joqdGVDKWywAlQ10opPF9w3HUCpIUC+fHif6s4NscN7iuK7ewtpt27Hams2lMd2TDStW8nnG53gk=",
      "payload_bytes": 80
    },
    {
      "object": "sealed_record",
      "id": "vSWmWbg9sDur336pnYgYzQ",
      "kind": "session",
      "schema_version": 1,
      "revision": 2,
      "created_at": "2026-10-10T08:41:17.204913Z",
      "last_touched_at": "2026-10-10T09:02:44.918207Z",
      "deleted": false,
      "deleted_at": null,
      "device_id": "1aee2c02-ccac-4ede-b017-1334be895e2e",
      "wrapped_dek": {
        "v": 1,
        "aead": "aes-256-gcm",
        "nonce": "oxwDDz+SyxUEkitE",
        "ct": "UvORUdzuxuE3FMncUQgc4qOEz2QT8a5LarNYrATM0A4Zi1J0aJj9Yu+5ySIKPQHY",
        "epk": "fRXpvCBVDmU9kJ+PSkoqi7NU2Po3FQMK9SbJiz1gOGs="
      },
      "payload": "hWbThAu7J8u8jIcvARYROTja+vbbV4hlntXsIctvvcVdqWGMyTjVt2LgISSfrFORn+gjkJcDsT9l8dsHXoFFCaDLzP06FHLuixGaBMY3WOfWFex4l7SU0G5IKY7DABr74o0l20asWcd9gADrlQl4Zg==",
      "payload_bytes": 112
    }
  ],
  "next_cursor": "ZjE6NTc6MTc5MTYyNDAwMA",
  "has_more": false
}