# Changelog

Incremental cursor for caches that want to follow the release stream.

MCP: `get_changes` `{ "since": "<cursor>" }`

## When to use

You already ingested a release and want creates / updates / deletes / merges since a cursor.

**Release `2026-09.2` is the first load.** This list is **empty** until the next release. Do not poll it expecting Hail Mary to appear.

## Request

```bash
curl -sS -H "Authorization: Bearer $FDS_API_KEY" \
  "https://api.fulldatasets.com/v1/changes?since=0&limit=100"
```

| Query | Required | Notes |
|---|---|---|
| `since` | yes | Opaque cursor from the previous `next_cursor`, or a starting token you persist |
| `limit` | no | Default `100`, max `1000` |

## Response `200`

```json
{
  "changes": [
    {
      "entity_id": "fds_ed_…",
      "entity_type": "edition",
      "op": "update",
      "content_hash_before": "…",
      "content_hash_after": "…",
      "merged_into": null,
      "release": "2026-09.3",
      "observed_at": "2026-09-01T00:00:00.000Z",
      "cursor": "…"
    }
  ],
  "next_cursor": null
}
```

| `entity_type` | `work` · `edition` · `contributor` |
| `op` | `create` · `update` · `delete` · `merge` |

On `merge`, `merged_into` is the surviving id. Follow [redirects](/docs/data-model).

Short-TTL cache (30s / 60s CDN).

## Errors

| Status | `code` | When |
|---|---|---|
| `400` | `bad_request` | Missing `since` |

## See also

- [Bulk download](/docs/bulk) — full snapshot instead of a cursor
