GET Snapshots & Changes
Read a monitor's captured snapshots, detected changes, and page bodies
Every check stores a snapshot. When a snapshot differs from the previous one, a change is recorded. These endpoints let you read that history.
GET
https://api.anakin.io/v1/monitors/{id}/changesList detected changes for a monitor, newest first (up to 200).
Response
200 OK{
"changes": [
{
"id": "c_9a1…",
"monitorId": "b1e7c2a4-…",
"snapshotId": "s_77b…",
"changedAt": "2026-01-01T12:00:00Z",
"summary": "The price dropped from $19.99 to $14.99.",
"diffJson": {
"type": "specific_data",
"changedFields": ["price"],
"before": { "price": 19.99 },
"after": { "price": 14.99 },
"stats": { "adds": 1, "dels": 1 },
"aiMeaningful": [
{ "description": "Price dropped", "before": "$19.99", "after": "$14.99" }
]
},
"createdAt": "2026-01-01T12:00:00Z"
}
]
}| Field | Type | Description |
|---|---|---|
changedAt | string | When the change was detected. |
summary | string | null | Human-readable summary (AI-generated when aiMode is on). |
diffJson | object | Structured diff (see below). |
diffJson fields
| Field | Type | Description |
|---|---|---|
type | string | specific_data or full_page. |
changedFields | string[] | Field keys that changed (specific_data). |
before / after | object | Extracted values before/after (specific_data). |
beforeSnapshotId / afterSnapshotId | string | Snapshot IDs for a full_page text diff — fetch each side's body via the content endpoint below. |
stats | object | { "adds": number, "dels": number } — line counts for full_page diffs. |
aiMeaningful | array | AI-curated substantive changes, each { description, before, after } (present in aiMode). |
GET
https://api.anakin.io/v1/monitors/{id}/snapshotsList captured snapshots, newest first (up to 200).
Response
200 OK{
"snapshots": [
{
"id": "s_77b…",
"monitorId": "b1e7c2a4-…",
"capturedAt": "2026-01-01T12:00:00Z",
"contentHash": "a1b2c3…",
"extractedData": { "price": 14.99 },
"createdAt": "2026-01-01T12:00:00Z"
}
]
}| Field | Type | Description |
|---|---|---|
contentHash | string | Hash of the compared content — identical hashes mean no change. |
extractedData | object | null | Extracted fields (specific_data mode). |
To read a full_page snapshot's stored body (for rendering a text diff), call the snapshot content endpoint below with the snapshot's id — you never handle a storage path.
GET
https://api.anakin.io/v1/monitors/{id}/snapshots/{snapshotId}/contentFetch the stored page body for a full_page snapshot — use it to render before/after text diffs. Returns an empty body for specific_data snapshots (their data is in extractedData).
Response
200 OK{
"available": true,
"content": "# Home page content…",
"capturedAt": "2026-01-01T12:00:00Z",
"contentHash": "a1b2c3…"
}| Field | Type | Description |
|---|---|---|
available | boolean | false when no body is stored (e.g. specific_data, or storage not configured). |
content | string | The captured body in the monitor's watchFormat. Empty when available is false. |
Code Examples
curl https://api.anakin.io/v1/monitors/b1e7c2a4-.../changes -H "X-API-Key: your_api_key"
curl https://api.anakin.io/v1/monitors/b1e7c2a4-.../snapshots -H "X-API-Key: your_api_key"
curl https://api.anakin.io/v1/monitors/b1e7c2a4-.../snapshots/s_77b.../content -H "X-API-Key: your_api_key"import requests
headers = {"X-API-Key": "your_api_key"}
mid = "b1e7c2a4-..."
changes = requests.get(f"https://api.anakin.io/v1/monitors/{mid}/changes", headers=headers).json()["changes"]
for ch in changes:
print(ch["changedAt"], ch.get("summary"))