Watch, the website change monitoring API

Register a URL once and get a signed webhook when it changes.

Private beta on paid plans. Watchers cost no ops.

POST /v2/watch
curl -X POST https://api.enconvert.com/v2/watch \
  -H "X-API-Key: sk_your_private_key" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.enconvert.com/changelog",
    "frequency_minutes": 60,
    "notify_email": false
  }'

201 CreatedTrimmed

{
  "watcher_id": "wat_791ed7976871477990157a13cfd27feb",
  "url": "https://www.enconvert.com/changelog",
  "status": "active",
  "frequency_minutes": 60,
  "diff_mode": "auto",
  "next_check_at": "2026-11-11T14:29:57.166558Z"
}

GET /v2/watch/{watcher_id}/snapshots

{"checked_at": "2026-11-11T14:31:03.539021Z", "has_changes": false, "similarity": 1.0, "render_quality": 1.0, "change_count": 0, "changes": []}

A watcher and its first check

The first check sets the baseline. Every later one is diffed against it.

The watcher, active on creation
{
  "watcher_id": "wat_791ed7976871477990157a13cfd27feb",
  "url": "https://www.enconvert.com/changelog",
  "status": "active",
  "frequency_minutes": 60,
  "diff_mode": "auto",
  "track_fields": null,
  "webhook_url": null,
  "notify_email": false,
  "consecutive_errors": 0,
  "checks_count": 0,
  "last_check_at": null,
  "next_check_at": "2026-11-11T14:29:57.166558Z",
  "created_at": "2026-11-11T14:29:57.166558Z"
}
Its first check, the baseline
{
  "checked_at": "2026-11-11T14:31:03.539021Z",
  "has_changes": false,
  "similarity": 1.0,
  "render_quality": 1.0,
  "change_count": 0,
  "changes": []
}

Real output, captured 2026-11-11. […] marks a cut.

What you send and get

FieldWhat it does
urlThe page to watch. Each check re-renders it in headless Chrome, with no stored credentials.
frequency_minutesFrom 60, the hourly floor, to 43,200, which is 30 days.
diff_modeAuto, text, structured, tables or metadata. track_fields narrows the diff to the fields you name.
webhook_urlAn HMAC-signed POST when a check detects a change. An email to the owner is optional.
changesOne record per change, with its section, kind, field, before and after.

What one watcher replaces

  • A cron job

    The schedule lives with the watcher, hourly at the fastest.

  • A diffing script

    Each good render is diffed against the last good one.

  • Alarms from bad renders

    A blocked or low-scoring render never becomes a baseline or fires a notification.

Left: binoculars on a tripod and an alarm clock aimed at a web page. Right: the same page with one block changed and a bell ringing above it.

Your first watcher

  1. Pick a paid plan

    Indie, Studio or Production
  2. Register a URL

    POST /v2/watch
  3. Receive the change

    has_changes: true

More of the same API

Questions about change monitoring

How do I get a webhook when a page changes?

Pass webhook_url when you create the watcher with POST /v2/watch, or add it later with PATCH /v2/watch/{watcher_id}. When a check detects a change, EnConvert sends an HMAC-signed POST to that URL.

How often can it check a page?

frequency_minutes sets the cadence, from 60 (the hard hourly floor) to 43,200 (30 days). The poller scans every 60 seconds, so a check fires within a minute of its scheduled time.

Can I watch only part of a page, like a price or a table?

Yes. track_fields narrows the diff to changes whose section, field or key matches a tracked term, and diff_mode can restrict detection to one strategy such as tables, structured, text or metadata.

Why did my watcher pause itself?

Three consecutive render failures pause a watcher and email the owner if notify_email is on. PATCH it back to active to re-arm the schedule; one successful check resets the error count.

Is Watch generally available?

Not yet. Watch is in private beta: it is callable today with your normal API key on any paid plan, and the request and response shapes can change without notice. The free Founding plan cannot create watchers.

What does it cost?

Watchers cost no ops. A plan holds a number of active watchers instead: 20 on Indie, 100 on Studio and 500 on Production.

Watch your first page