Catalogian compares records row by row. Every row is identified by its key field. When a row's content changes between two snapshots, Catalogian records the full before and after state of the entire row: every field. This is what makes Catalogian especially useful for AI agents: when an agent asks "what changed?", it gets the complete row context automatically, without needing to make a follow-up request for more detail.
Catalogian hashes each row using its key field as identifier. When the hash changes between snapshots, the full row is re-stored. The delta rows endpoint returns:
row_data — the current (new) values of every field in the rowprevious_data — the prior snapshot's values of every fieldfield_diff — a convenience map of only the fields that changed, with before/after pairsThe comparison unit is the row, not the field — you always get the full picture.
When a row changes, the response includes the complete row state before and after the change. The primary data is row_data (current) and previous_data (prior snapshot):
{
"key": "nc75443737",
"changeType": "changed",
"row_data": {
"id": "nc75443737",
"time": "2026-09-28T10:11:39.970Z",
"place": "7 km WNW of Cobb, CA",
"mag": "1.4",
"status": "reviewed"
},
"previous_data": {
"id": "nc75443737",
"time": "2026-09-28T10:11:39.970Z",
"place": "7 km WNW of Cobb, CA",
"mag": "1.2",
"status": "automatic"
},
"field_diff": {
"mag": {
"before": "1.2",
"after": "1.4"
},
"status": {
"before": "automatic",
"after": "reviewed"
}
}
}Since the full row is always available, field_diff is provided as a convenience — a pre-computed map of which fields changed, so you don't have to diff row_data and previous_data yourself. In this example, only mag and status changed. The other fields (id, time, place) are identical in both snapshots, so they don't appear in field_diff.
When an AI agent processes a change event, having the full row context — not just the changed fields — means the agent can reason about the change without additional API calls.
Consider a magnitude revision on nc75443737. With full-row diffs, the agent knows the new magnitude AND the place, time, and review status, all in one response. It can immediately decide whether to update a dashboard, send an alert, or refresh a model input: no follow-up request needed.
With field-level-only diffs, the agent would see that mag changed from "1.2" to "1.4", but it wouldn't know where the event was, when it happened, or whether it was reviewed; it would need to re-fetch the current row for context. Catalogian eliminates that round trip.
For rows with changeType: "new", the response includes row_data but no previous_data or field_diff (since there was no prior version):
{
"key": "nc75443740",
"changeType": "new",
"row_data": {
"id": "nc75443740",
"time": "2026-09-28T18:22:41.180Z",
"place": "12 km NE of Ridgecrest, CA",
"mag": "2.6",
"status": "automatic"
},
"previous_data": null,
"field_diff": null
}For deleted rows, previous_data contains the last known values.row_data is null:
{
"key": "nc75443001",
"changeType": "deleted",
"row_data": null,
"previous_data": {
"id": "nc75443001",
"time": "2026-09-27T21:03:12.900Z",
"place": "9 km SW of Livermore, CA",
"mag": "1.4",
"status": "automatic"
},
"field_diff": null
}Fetch changed rows with the delta rows endpoint:
GET https://api.catalogian.com/v1/sources/:id/delta/:deltaEventId/rows?changeType=changed Authorization: Bearer cat_live_...
You can filter by change type (new, changed, or deleted) and paginate with cursor and limit.
field_diff.mag exists to detect value changesstatus flipping from "automatic" to "reviewed"Compare entire snapshots side by side. Snapshot Comparison →