Change watchers with proof attached
Pay once and jurat watches a URL, JSON field, regex or sports fixture on your cadence, webhooking your agent on change with a signed source attestation attached.
How a watcher works
GET /v1/watch/create ($0.05) registers a watcher. jurat checks the target on your cadence (15 to 1440 minutes) for up to 7 days. On change, your webhook receives a POST with the old value, the new value, and (by default) a fresh attestation of the source: not just "it changed" but proof of what it changed to.
Modes
hash: sha256 of the whole body. Fires on any change.json:<dot.path>: fetch, parse JSON, extract the path (json:price.usd,json:items.0.status). Fires when the extracted value changes.regex:<pattern>: first match (group 1 if present) of the pattern over the body text.result:<league>:<event_id>: watches a sports fixture and fires exactly once, on the final whistle, with the final result and a source attestation.league:<slug>(via/v1/watch/league, $0.10): every final in a league's day, delivered as each lands.
Webhook delivery
Webhooks must be public HTTPS. Delivery is a POST with a JSON body; a 2xx response marks it delivered. Failures retry up to 3 times (backoff 0s, 60s, 300s), then the delivery is marked failed honestly. Example change payload:
{
"kind": "change",
"watch_id": "c376ea36-...",
"url": "https://api.example.com/state",
"mode": "json:serverTime",
"old": "1752999210000",
"new": "1753000113455",
"changed_at": "2026-07-20T08:48:59.911Z",
"attestation": { "signed": { "sha256": "..." }, "signature": "..." }
}
Status, free
GET /v1/watch/<id> is free: status, checks performed, changes seen, next check time. DELETE cancels. Watcher state survives service restarts; a slow pass never overlaps the next one; 50 watchers on one URL collapse into shared fetches.