---
title: "Read D1 project changes with cursor pagination and deletion tombstones."
method: GET
path: "/api/changes"
---

# Read D1 project changes with cursor pagination and deletion tombstones.

`GET /api/changes`

## Request

- Base URL: `https://git.top`
- URL: `https://git.top/api/changes`
- Auth: none declared

## Query parameters

- `cursor` string
- `since` string
- `limit` string

## Response `200`

Project change feed

- ProjectChangesResponse
  - `changes` object[], required
    - `cursor` string, required: Opaque cursor for this event.
    - `project_id` string, required
    - `change_type` 'added' | 'updated' | 'classification_changed' | 'score_changed' | 'deleted', required
    - `changed_fields` string[], required
    - `before` object, nullable
    - `after` object, nullable
    - `occurred_at` string, date-time, required
    - `tombstone` boolean, required
  - `page` object, required
    - `limit` integer
    - `has_more` boolean
    - `next_cursor` string: Opaque polling cursor returned even when has_more is false.
  - `retention` object, required
    - `days` 30
    - `earliest_guaranteed_at` string, date-time
  - `metadata` Metadata, required: Common provenance envelope for agent-facing responses. Agents should require source=d1 for high-confidence production claims and disclose seed fallback.
    - `source` 'd1' | 'seed'
    - `reason` string
    - `project_count` integer
    - `generated_at` string, date-time
    - `snapshot_id` string: Stable identity for the corpus snapshot used by this response.
    - `latest_synced_at` string, date-time, nullable
    - `schema_version` 'git-top.knowledge.v1'
    - `loaded_project_limit` integer: Maximum D1 knowledge or search-candidate rows loaded into the bounded ranking set when present.
    - `truncated` boolean: Whether the D1-backed ranking or candidate set reached its limit and may omit additional matching rows.
    - `candidate_retrieval` 'd1_first': Search-only marker indicating that deterministic filters and broad query matching ran in D1 before TypeScript ranking.
    - `candidate_count` integer: Number of D1 search candidates passed to the authoritative TypeScript filter and ranking stage.
    - `candidate_limit` integer: Maximum number of D1 search candidates passed to the ranking stage.
    - `warnings` string[]: Fallback, count, freshness, or trust caveats that agents should account for before citing results.

## Other responses

- `400`: Invalid cursor, timestamp, or limit

---

[API](https://skmtc.dev/git/apis/git-top-agent-api.md) · [All operations](https://skmtc.dev/git/apis/git-top-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/git/apis/git-top-agent-api/revisions/c9ebf661ef6d?raw)
