Pull the unified note + attachment change feed
GET
/sync/changes
const url = 'https://api.engram.page/sync/changes';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://api.engram.page/sync/changes \ --header 'Authorization: Bearer <token>'Pulls one ordered page of the merged note and attachment change feed, each entry tagged with its type, using keyset pagination via an opaque cursor (has_more + next_cursor). fields=meta strips note content; limit is capped at 500. The cursor the client sends is recorded as its durably-applied device watermark, and a cursor older than the retention window returns 410.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”limit
integer
Max rows (≤500)
fields
string
“meta” or “all”
cursor
string
Opaque keyset cursor
Responses
Section titled “Responses”Changes page
Media typeapplication/json
SyncChangesResponse
object
changes
required
Array<object>
SyncChangeobject
content
Note body — present only when fields=all.
string
content_hash
string
deleted
boolean
id
string format: uuid
path
string
seq
required
Per-vault ordering key.
integer
type
required
string
has_more
required
boolean
next_cursor
Opaque keyset cursor; null on the last page.
string
Example
{ "changes": [ { "type": "note" } ]}Invalid cursor
Media typeapplication/json
MessageError
object
error
required
string
Example
{ "error": "not found"}Cursor older than retention window
Media typeapplication/json
MessageError
object
error
required
string
Example
{ "error": "not found"}