Website change monitoring
Create, list, update, and delete monitors that watch a URL (exact content
diff) or a sitemap (added/removed URL tracking) on a schedule, with signed
webhook delivery on change — all as normalized JSON from the Crawlora API,
with no polling loop or diffing logic of your own to write.
When to use this skill
- "Watch this page and tell me when it changes." / "Track this competitor's
pricing page."
- "Alert me when new pages get added to this site" (sitemap mode).
- "List my active monitors." / "Pause/update/delete this monitor."
- "Show me this monitor's recent check history" — did it run, did it find a
change, did the webhook deliver.
- Anything that would otherwise mean writing your own cron job + diffing +
notification pipeline for "let me know when X changes."
Setup (one-time)
- Get a free Crawlora API key (2,000 credits/mo, no card) at https://crawlora.net.
- Set
CRAWLORA_API_KEY in the environment before running the helper.
- The helper reads
CRAWLORA_API_KEY from the environment and sends requests to https://api.crawlora.net/api/v1. Missing/invalid key → 401.
How it works
- Create —
POST /monitors with url, cadence_minutes (5 to
10080, i.e. 5 minutes to 7 days), and optionally target_type
(page, the default — exact SHA-256 content-fingerprint diff — or
sitemap, which tracks a sitemap's <loc> entries for additions and
removals, with optional sitemap.include_patterns/exclude_patterns
glob filters and sitemap.max_urls). Add notification.webhook_url
(must be https and resolve to a public address) and an optional
notification.webhook_secret to get a signed delivery on change.
notification.events opts into change.detected (default — fires only
when a check finds a difference) and/or run.completed (fires on every
completed run, a heartbeat for a "last checked" UI).
- List / get —
GET /monitors lists the caller's own monitors (newest
first, capped at 100, free to call); GET /monitors/{id} fetches one.
- Update —
PATCH /monitors/{id} partially updates a monitor (free to
call). Changing target_type or sitemap resets the stored diff
baseline (fingerprint, snapshot, or URL set), so the next check starts
fresh rather than comparing against the old target's state.
- Delete —
DELETE /monitors/{id} removes a monitor.
- Check history —
GET /monitors/{id}/checks lists the monitor's most
recent check runs (newest first, capped at 50), including per-run
webhook delivery status — use this to debug "why didn't I get notified."
- Verify webhook deliveries — every delivery carries an
X-Crawlora-Signature: t=<unix>,v1=<hmac-hex> header, an HMAC-SHA256
digest of "{t}.{rawBody}" keyed by your webhook_secret. Recompute it
and reject stale timestamps to guard against replay.
Full endpoint list, methods, and params: reference/endpoints.md.
Calling the API
# Create a page monitor with a webhook:
scripts/crawlora.sh -X POST /monitors '{
"url": "https://example.com/pricing",
"cadence_minutes": 60,
"name": "Pricing page",
"notification": {"webhook_url": "https://example.com/webhooks/crawlora"}
}' | jq '.'
# Create a sitemap monitor (new/removed pages):
scripts/crawlora.sh -X POST /monitors '{
"url": "https://example.com/sitemap.xml",
"target_type": "sitemap",
"cadence_minutes": 1440
}' | jq '.'
# List monitors:
scripts/crawlora.sh /monitors | jq '.'
# Check one monitor's recent runs:
scripts/crawlora.sh /monitors/mon_abc123/checks | jq '.'
# Pause a monitor:
scripts/crawlora.sh -X PATCH /monitors/mon_abc123 '{"enabled": false}' | jq '.'
Use scripts/crawlora.sh for all requests; it keeps the API key out of command-line arguments.
Endpoint reference
See reference/endpoints.md for every Monitors
endpoint this skill uses (method, path, params, description).
Examples
- Competitor pricing watch:
POST /monitors on a competitor's pricing
page with notification.events: ["change.detected"], then poll
/monitors/{id}/checks (or just wait for the webhook) to see when it
actually changes.
- New-page discovery:
target_type: "sitemap" on a site's sitemap URL
to get notified when a new product/blog page goes live, without crawling
the whole site yourself.
- "Is my monitor actually working?" —
GET /monitors/{id}/checks shows
whether recent runs completed, found a change, and whether the webhook
delivered — the fastest way to debug a monitor that "should have fired."
Notes & limits
- Credits / pay-on-success: management calls (create, list, get, update,
delete) are free; only checks are billed. Free tier 2,000 credits/mo.
Key at https://crawlora.net.
- Security: key lives in
CRAWLORA_API_KEY only — never hardcode,
query-param, or commit it. Always verify the webhook signature before
trusting a delivery's payload.
- Public data only — a monitor watches a publicly-reachable URL; it
can't authenticate into a page behind a login.
cadence_minutes range is 5 to 10080 (5 minutes to 7 days) — pick the
cadence that matches how often the target actually changes; a tighter
cadence than needed just burns checks faster.
- Every request scopes to the caller's own API key — there's no
cross-account listing or lookup.
1---2name: website-monitoring3description: Creates and manages website-change monitors via the Crawlora API — watch a page for a content change or a sitemap for added/removed URLs, and get a signed webhook the moment something changes. No polling loop or diffing pipeline to run yourself. Use when the user wants to track a competitor's pricing page, watch for new pages on a site, get notified when content changes, or otherwise avoid re-checking a URL by hand.4---56# Website change monitoring78Create, list, update, and delete monitors that watch a URL (exact content9diff) or a sitemap (added/removed URL tracking) on a schedule, with signed10webhook delivery on change — all as normalized JSON from the Crawlora API,11with no polling loop or diffing logic of your own to write.1213## When to use this skill1415- "Watch this page and tell me when it changes." / "Track this competitor's16 pricing page."17- "Alert me when new pages get added to this site" (sitemap mode).18- "List my active monitors." / "Pause/update/delete this monitor."19- "Show me this monitor's recent check history" — did it run, did it find a20 change, did the webhook deliver.21- Anything that would otherwise mean writing your own cron job + diffing +22 notification pipeline for "let me know when X changes."2324## Setup (one-time)2526- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).27- Set `CRAWLORA_API_KEY` in the environment before running the helper.28- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.2930## How it works31321. **Create** — `POST /monitors` with `url`, `cadence_minutes` (5 to33 10080, i.e. 5 minutes to 7 days), and optionally `target_type`34 (`page`, the default — exact SHA-256 content-fingerprint diff — or35 `sitemap`, which tracks a sitemap's `<loc>` entries for additions and36 removals, with optional `sitemap.include_patterns`/`exclude_patterns`37 glob filters and `sitemap.max_urls`). Add `notification.webhook_url`38 (must be `https` and resolve to a public address) and an optional39 `notification.webhook_secret` to get a signed delivery on change.40 `notification.events` opts into `change.detected` (default — fires only41 when a check finds a difference) and/or `run.completed` (fires on every42 completed run, a heartbeat for a "last checked" UI).432. **List / get** — `GET /monitors` lists the caller's own monitors (newest44 first, capped at 100, free to call); `GET /monitors/{id}` fetches one.453. **Update** — `PATCH /monitors/{id}` partially updates a monitor (free to46 call). Changing `target_type` or `sitemap` resets the stored diff47 baseline (fingerprint, snapshot, or URL set), so the next check starts48 fresh rather than comparing against the old target's state.494. **Delete** — `DELETE /monitors/{id}` removes a monitor.505. **Check history** — `GET /monitors/{id}/checks` lists the monitor's most51 recent check runs (newest first, capped at 50), including per-run52 webhook delivery status — use this to debug "why didn't I get notified."536. **Verify webhook deliveries** — every delivery carries an54 `X-Crawlora-Signature: t=<unix>,v1=<hmac-hex>` header, an HMAC-SHA25655 digest of `"{t}.{rawBody}"` keyed by your `webhook_secret`. Recompute it56 and reject stale timestamps to guard against replay.5758Full endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).5960## Calling the API6162```sh63# Create a page monitor with a webhook:64scripts/crawlora.sh -X POST /monitors '{65 "url": "https://example.com/pricing",66 "cadence_minutes": 60,67 "name": "Pricing page",68 "notification": {"webhook_url": "https://example.com/webhooks/crawlora"}69}' | jq '.'7071# Create a sitemap monitor (new/removed pages):72scripts/crawlora.sh -X POST /monitors '{73 "url": "https://example.com/sitemap.xml",74 "target_type": "sitemap",75 "cadence_minutes": 144076}' | jq '.'7778# List monitors:79scripts/crawlora.sh /monitors | jq '.'8081# Check one monitor's recent runs:82scripts/crawlora.sh /monitors/mon_abc123/checks | jq '.'8384# Pause a monitor:85scripts/crawlora.sh -X PATCH /monitors/mon_abc123 '{"enabled": false}' | jq '.'86```8788Use `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.899091## Endpoint reference9293See [`reference/endpoints.md`](reference/endpoints.md) for every Monitors94endpoint this skill uses (method, path, params, description).9596## Examples9798- **Competitor pricing watch:** `POST /monitors` on a competitor's pricing99 page with `notification.events: ["change.detected"]`, then poll100 `/monitors/{id}/checks` (or just wait for the webhook) to see when it101 actually changes.102- **New-page discovery:** `target_type: "sitemap"` on a site's sitemap URL103 to get notified when a new product/blog page goes live, without crawling104 the whole site yourself.105- **"Is my monitor actually working?"** — `GET /monitors/{id}/checks` shows106 whether recent runs completed, found a change, and whether the webhook107 delivered — the fastest way to debug a monitor that "should have fired."108109## Notes & limits110111- **Credits / pay-on-success:** management calls (create, list, get, update,112 delete) are **free**; only checks are billed. Free tier 2,000 credits/mo.113 Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).114- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode,115 query-param, or commit it. Always verify the webhook signature before116 trusting a delivery's payload.117- **Public data only** — a monitor watches a publicly-reachable URL; it118 can't authenticate into a page behind a login.119- **`cadence_minutes` range is 5 to 10080** (5 minutes to 7 days) — pick the120 cadence that matches how often the target actually changes; a tighter121 cadence than needed just burns checks faster.122- Every request scopes to the caller's own API key — there's no123 cross-account listing or lookup.