Guides

Monitors

Detect visual changes on any URL and receive webhook notifications.

Monitors periodically capture a URL and notify you when the page content changes. Use them for price tracking, content alerts, uptime monitoring, or competitor surveillance.

Create a monitor

curl -X POST https://api.bytekit.com/v1/monitors \
  -H "Authorization: Bearer sk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/pricing",
    "interval": 3600,
    "notify_url": "https://your-server.example.com/webhooks/bytekit"
  }'
FieldDescription
urlThe page to monitor
intervalCheck frequency in seconds (e.g. 3600 = every hour)
notify_urlWebhook endpoint to receive change notifications

A successful response returns the monitor object with an id prefixed mon_:

{
  "id": "mon_...",
  "url": "https://example.com/pricing",
  "interval": 3600,
  "notify_url": "https://your-server.example.com/webhooks/bytekit",
  "created_at": "2026-01-01T00:00:00Z"
}

List monitors

curl https://api.bytekit.com/v1/monitors \
  -H "Authorization: Bearer sk_live_YOUR_KEY_HERE"

Get a monitor

curl https://api.bytekit.com/v1/monitors/mon_... \
  -H "Authorization: Bearer sk_live_YOUR_KEY_HERE"

Update a monitor

curl -X PATCH https://api.bytekit.com/v1/monitors/mon_... \
  -H "Authorization: Bearer sk_live_YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{"interval": 1800}'

Delete a monitor

curl -X DELETE https://api.bytekit.com/v1/monitors/mon_... \
  -H "Authorization: Bearer sk_live_YOUR_KEY_HERE"

Monitor captures

Each time a monitor fires and detects a change, it records a capture event. Retrieve the history with:

curl https://api.bytekit.com/v1/monitors/mon_.../captures \
  -H "Authorization: Bearer sk_live_YOUR_KEY_HERE"

Each capture in the list represents one detected change event, including the timestamp and a diff of what changed.

Webhook payload

When a change is detected, Bytekit sends a POST to your notify_url with a JSON body:

{
  "success": true,
  "type": "scrape.completed",
  "id": "mon_...",
  "scrape_id": "sc_...",
  "has_change": true,
  "change_pct": 100.0,
  "metadata": {},
  "scrape": {
    "status": "success",
    "data": {
      "id": "sc_...",
      "url": "https://example.com/pricing",
      "content": "..."
    }
  }
}
FieldDescription
has_changetrue when the captured content differs from the previous capture
change_pctPercentage of content that changed (0–100)
scrapeFull scrape result envelope (same shape as POST /v1/scrape response)

Your endpoint must respond with 2xx within 10 seconds. Failed deliveries are retried with exponential backoff.

Next steps