agentsvc.io

services / page-watch

weboperational · 133 ms

Web Page Change Monitor (diff since last check)

Website change monitoring for agents that check in a loop: send a URL and get only what changed since your last call (added and removed lines of the page text), plus optional keyword alerts. First call saves a baseline and returns a cursor; pass the cursor on the next call. The cursor only advances when a change is reported, so nothing slips through between polls. Good for price pages, docs and changelogs, job boards, status pages, competitor sites, government notices. Params: url, cursor, keywords (list, alert when a keyword newly appears), ignore (list of substrings; lines containing them are ignored, e.g. timestamps or ads), render (true for JavaScript pages).

Run free trial ↗1 free call per day with the example input. Paid: $0.003 USDC, no limit.

Call it

import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const client = new x402Client();
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.EVM_PRIVATE_KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);

const res = await payFetch("https://agentsvc.io/api/v1/proxy/page-watch", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({"url":"https://www.python.org/downloads/","keywords":["3.15"]}),
});
const { data, payment } = await res.json();  // payment.transaction = on-chain receipt

Input

FieldTypeDescription
url *stringPage to watch (http or https)
cursorstringCursor from your previous call; omit on the first call
keywordsarrayAlert when one of these appears in newly added text (case-insensitive)
ignorearrayIgnore lines containing any of these substrings
renderboolean = falseRender JavaScript before reading

Output

FieldTypeDescription
urlstring
titlestring
http_statusinteger
first_checkboolean
changedboolean
cursorstring
sincestring
checked_atstring
cursor_helpstring
summarystring
diffobject
keywordsarray
keyword_alertboolean
content_hashstring
line_countinteger
word_countinteger

Example response (data)

{
  "url": "https://www.python.org/downloads/",
  "title": "Download Python | Python.org",
  "http_status": 200,
  "first_check": false,
  "changed": true,
  "cursor": "OiXuu1BiPRMC2YpW",
  "since": "2026-10-09T06:57:46.355Z",
  "checked_at": "2026-10-09T06:57:46.512Z",
  "cursor_help": "Pass this cursor on your next call. It only advances when a change is reported.",
  "summary": "1 line(s) added, 0 removed since 2026-10-09T06:57:46.355Z. First new line: \"![Python release cycle](https://devguide.python.org/_static/release-cycle.svg)\"",
  "diff": {
    "added": [
      "![Python release cycle](https://devguide.python.org/_static/release-cycle.svg)"
    ],
    "removed": [],
    "added_count": 1,
    "removed_count": 0,
    "truncated": false
  },
  "keywords": [
    {
      "keyword": "3.15",
      "present": true,
      "newly_appeared": false
    }
  ],
  "keyword_alert": false,
  "content_hash": "8eb1656e342b8803149a57e36e6885a9",
  "line_count": 346,
  "word_count": 3196
}