GET Site Runs & Pages
Monitor a whole site — crawl on a schedule and track pages added, removed, and changed
Last updated Jul 23, 2026
A site monitor (scope: "site") crawls the whole site on each interval, compares the set of pages against the previous run, and reports pages added, removed, and changed (with a per‑page content diff). It reuses the same schedule, alerting (webhook + email), and AI meaningful‑change filtering as page monitors — the unit of work is a crawl instead of a single fetch.
Create one by setting scope: "site" and the crawl config on POST /v1/monitors:
{
"url": "https://example.com",
"scope": "site",
"maxPages": 25,
"maxDepth": 2,
"excludePatterns": ["/cart", "/checkout"],
"intervalMinutes": 720,
"alertWebhookUrl": "https://your-app.com/hooks/anakin"
}Pinned pages + organic crawl. By default the monitor crawls the site organically — discovered URLs are sorted before the maxPages cap, so a stable site yields the same pages each run. To guarantee specific pages are always watched, pin them: put their full URLs in includePatterns (the dashboard's "Inspect" and "Import" flows do this). Pinned URLs are crawled directly every run (fetched even if discovery misses them) in addition to the organic crawl of up to maxPages more pages — total capped at 50/run. Pinned URLs must be on the monitor's own site. You can also remove pages you don't care about (below) so their crawl budget goes to others.
Credits & limits
- 1 credit per page crawled per run (a browser‑rendered crawl costs more, same as the URL scraper).
maxPagesis capped at 50 per run.- Site monitors have their own active‑monitor caps per plan, lower than page monitors since each run crawls many pages: Free 1 · Pro 5 · Scale 20.
The change payload
For a site monitor, each entry from GET /v1/monitors/{id}/changes has a diffJson of type "site":
{
"type": "site",
"runId": "…",
"counts": { "added": 2, "removed": 1, "changed": 4, "pages": 25 },
"added": [{ "url": "https://example.com/new", "afterHash": "9f3a…" }],
"removed": [{ "url": "https://example.com/gone", "beforeHash": "1b7c…" }],
"changed": [{ "url": "https://example.com/pricing", "beforeHash": "1b7c…", "afterHash": "9f3a…", "summary": "Price rose from $19 to $24." }]
}Each entry carries the page's content hashes: afterHash (added & changed) and beforeHash (removed & changed). Fetch either side's page body with the content endpoint below to render a before/after diff. summary on a changed entry is present only when AI mode is on. The same digest is delivered to your webhook/email as one alert per run.
Page content (for diffs)
https://api.anakin.io/v1/monitors/{id}/content?hash=…Fetch a tracked page's stored body by its content hash — the beforeHash / afterHash from a change entry above. Use it to render before/after text diffs; you pass a hash, never a storage path.
Response
200 OK{ "available": true, "content": "# Pricing\n\n…" }| Field | Type | Description |
|---|---|---|
available | boolean | false when no body is stored for that hash (e.g. storage not configured). |
content | string | The page body in the monitor's watchFormat. Empty when available is false. |
hash must be a 64‑character content hash; a missing or malformed hash returns 400.
List runs
https://api.anakin.io/v1/monitors/{id}/runsEach site‑monitor check is a run. Returns the runs newest‑first with their set‑diff counts.
{
"runs": [
{
"id": "…",
"jobId": "…",
"status": "completed",
"startedAt": "2026-07-06T12:00:00Z",
"finishedAt": "2026-07-06T12:01:30Z",
"pageCount": 25,
"addedCount": 2,
"removedCount": 1,
"changedCount": 4
}
]
}Tracked pages
https://api.anakin.io/v1/monitors/{id}/pagesThe pages currently tracked (from the latest run) and the URLs you've removed from tracking.
{ "tracked": ["https://example.com", "https://example.com/pricing"], "excluded": ["https://example.com/blog"] }https://api.anakin.io/v1/monitors/{id}/pages?url=…Stop tracking a page. It's excluded from every future crawl (freeing budget for other pages) and never reported as removed. Returns { "success": true, "excludedUrls": [...] }.
https://api.anakin.io/v1/monitors/{id}/pages/restore?url=…Resume tracking a previously‑removed page. Returns { "success": true, "excludedUrls": [...] }.