---
title: "Incremental change feed for a local store (exact cursor, grants envelope)"
method: GET
path: "/api/preview/sync/changes"
tags: ["sync"]
---

# Incremental change feed for a local store (exact cursor, grants envelope)

`GET /api/preview/sync/changes`

## Request

- Base URL: `https://symbol.chat` (the document declares no server; this is the origin it was published from)
- URL: `https://symbol.chat/api/preview/sync/changes`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__Secure-next-auth.session-token`
  - OAuth 2
    - Authorization code: `https://mcp.symbol.chat/authorize`
    - Token URL: `https://mcp.symbol.chat/token`
- TypeScript: <https://skmtc.dev/symbol-chat/apis/symbol-api/docs/api/preview/sync/changes/get.ts> (a function with typed inputs; its response is checked against the schema)

## Query parameters

- `cursor` string: Opaque cursor from a previous changes response. Omit on first sync: the response then carries `resync: true` and the watermark to start from after a snapshot.
- `limit` integer: Page size (1..200, default 100). For the change feed this bounds the log rows examined; the page may hold fewer entries after filtering.
- `completeness` '1': Set to `1` to receive the data a local copy needs to answer every offline read: each capsule item gains `data.query`, a page reports `coverage`, the feed follows a capsule's `remove` with an `archived_capsule` entry when it was archived, and a page is cut short at a byte budget.

## Response `200`

Successful response

- object
  - `changes` object[], required
  - `coverage` object
    - `complete` boolean
    - `entity` string
    - `protocol` 1, required
  - `cursor` string, required
  - `dependency_review` object: Your dependency review switch now. Capsule documents carry dependency reasons only when it is on; when it differs from the value your copy was built under, re-snapshot the capsules.
    - `enabled` boolean, required
  - `grants` object, required
    - `workspaces` object[], required
  - `hasMore` boolean, required
  - `reach` object: Your suspensions. `epoch` moves when one is created or restored; `generations` says in which workspace. Discard a page whose epoch differs from the one you are working under, wipe each workspace whose generation changed, and take a fresh snapshot of it if it is in your grants again.
    - `epoch` string, required
    - `generations` object, required
    - `suspended_workspace_ids` string[], required
  - `resync` boolean, required
  - `retention_days` integer, required
  - `server_time` string, required

## Changes

- **2026-11-13** `24536ef7ac40`: 3 info
  - added the new optional `query` request parameter `completeness`
  - added the optional property `coverage` to the response with the `200` status
  - added the optional property `reach` to the response with the `200` status
- **2026-11-08** `fd7b0a7085e4`: 1 info
  - added the optional property `dependency_review` to the response with the `200` status
- **2026-09-12** `74a5f960149b`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/symbol-chat/apis/symbol-api/changes/api/preview/sync/changes/get.md)

---

[API](https://skmtc.dev/symbol-chat/apis/symbol-api.md) - [All operations](https://skmtc.dev/symbol-chat/apis/symbol-api/llms.txt) - [OpenAPI document](https://skmtc.dev/symbol-chat/apis/symbol-api/revisions/3ae8310b31e1?raw)
