{"uid":"cap_b9dFaJSo1J4nIf7jqlaKa","slug":"watch-diff-9e432119","name":"Watch & Diff","description":"Did this URL change since my last check? Fetch, normalize, hash and diff any page, region or JSON for AI agents running recurring tasks. State per paying wallet, 90 days. Pay per call over x402, no API key.","url":"https://watch-diff.agent-utils.workers.dev/v1/check","method":"GET","headers":{},"bodySchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["input"],"properties":{"input":{"type":"object","required":["type","method"],"properties":{"type":{"type":"string","const":"http"},"method":{"enum":["GET"],"type":"string"},"queryParams":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Absolute http(s) URL to fetch (max 2 MB body)"},"mode":{"enum":["text","html","json"],"type":"string","default":"text","description":"text = readable text (default); html = normalized markup; json = canonicalized JSON body"},"watcher":{"type":"string","description":"Optional watcher id (3-64 chars) to scope state; defaults to the paying wallet address"},"selector":{"type":"string","description":"Optional CSS selector; only text inside matching elements is compared (e.g. '#price', 'main', 'table.results')"}}}},"additionalProperties":false},"output":{"type":"object","required":["type"],"properties":{"type":{"type":"string"},"example":{"type":"object","properties":{"url":{"type":"string"},"diff":{"anyOf":[{"type":"object","properties":{"added":{"type":"array","items":{"type":"string"}},"removed":{"type":"array","items":{"type":"string"}},"truncated":{"type":"boolean"},"addedLines":{"type":"integer"},"removedLines":{"type":"integer"}}},{"type":"null"}]},"etag":{"type":["string","null"]},"mode":{"enum":["text","html","json"],"type":"string","default":"text","description":"text = readable text (default); html = normalized markup; json = canonicalized JSON body"},"bytes":{"type":"integer"},"status":{"type":"integer"},"changed":{"type":["boolean","null"],"description":"null on the first check"},"excerpt":{"type":"string"},"watcher":{"type":"string"},"finalUrl":{"type":"string"},"selector":{"type":["string","null"]},"checkedAt":{"type":"string"},"firstCheck":{"type":"boolean"},"responseMs":{"type":"integer"},"contentHash":{"type":"string"},"contentType":{"type":"string"},"lastModified":{"type":["string","null"]},"previousHash":{"type":["string","null"]},"previousCheckedAt":{"type":["string","null"]}}}}}}},"responseSchema":{"type":"json","example":{"url":"https://example.com/","diff":null,"etag":"\"84238dfc8092e5d9c0dac8ef93371a07:1736799080.121134\"","mode":"text","bytes":1256,"status":200,"changed":false,"excerpt":"Example Domain\nThis domain is for use in illustrative examples in documents.","watcher":"evm:0xabc…","finalUrl":"https://example.com/","selector":"body","checkedAt":"2026-09-06T21:10:00.000Z","firstCheck":false,"responseMs":143,"contentHash":"7f3b…","contentType":"text/html; charset=UTF-8","lastModified":"Mon, 13 Jan 2025 20:11:20 GMT","previousHash":"7f3b…","previousCheckedAt":"2026-09-05T21:10:00.000Z"}},"example":null,"exampleRequest":null,"tags":["x402"],"displayCostAmount":"0.01","displayCostAsset":"USDC","priceDynamic":false,"priceHint":null,"priceStatus":"priced","priceSource":"probe","requiresHandshake":false,"reviewCount":0,"rating":{"score":"0.00","successRate":"0.00","reviews":0,"stars":null,"state":"unrated"},"availabilityStatus":"unknown","priceObserved":null,"sessionDeposit":null,"pricing":{"kind":"static","summary":"$0.01/call","primary":{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.01","per":"call","confidence":"exact"},"accepted":[{"kind":"static","protocol":"x402","network":"base","amountUsd":"0.01","per":"call","confidence":"exact"}]},"paymentMethods":[{"uid":"pm_fCCWSvOKoEh99PaagF4hh","protocol":"x402","methodType":"crypto","chain":"base","mode":"charge","costAmount":"0.01","costPer":"request","priority":0,"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","unit":"request","depositMicros":null,"planRef":null}],"brandName":null,"brandSlug":null,"brandBaseUrl":null,"brandDocsUrl":null,"whatItDoes":"Fetches a URL, normalizes and hashes its content, then diffs it against the last known state to tell you whether it changed","exampleAgentPrompt":"Check if https://example.com/pricing has changed since the last time you looked — compare just the text inside '.pricing-table' and tell me what lines were added or removed.","exampleUseCases":[{"title":"Price drop alert for e-commerce","prompt":"Watch https://shop.example.com/product/widget for me — focus on the '#price' element in text mode — and tell me if the price has changed since the last check."},{"title":"Competitor blog post tracker","prompt":"Has https://competitor.com/blog changed since yesterday? Check it in text mode and show me what content was added or removed."},{"title":"JSON API response monitoring","prompt":"Monitor https://api.example.com/status.json in JSON mode and let me know if any fields have changed since the last time you checked it — I want to catch any new keys or value changes."}],"resultDescription":"Returns a JSON object indicating whether the page changed (boolean, or null on first check), the current and previous content hashes, a structured diff with added and removed lines, an excerpt of current content, HTTP status, response time in ms, etag, last-modified header, timestamps of the current and previous checks, content type, byte size, and the watcher ID scoping the state.","failureModes":["URL unreachable or returns non-200 — status field reflects HTTP error, changed may be null","First check always returns changed: null and firstCheck: true with no diff","CSS selector matches nothing — diff is empty or excerpt is blank","URL body exceeds 2 MB — request rejected","Invalid URL format — request rejected at validation","State not found after 90 days — treated as first check"],"whenToPreferThis":"Choose this endpoint when an AI agent needs to detect whether a specific web page, sub-region (via CSS selector), or JSON API response has changed between periodic runs, without storing state itself. It is purpose-built for recurring agent tasks where the agent's paying wallet address automatically scopes state, eliminating the need for a separate database or API key. Prefer it over generic scrapers when you need a normalized diff (added/removed lines) rather than raw HTML, and over full crawlers when you only care about a single URL.","instructions":null,"reviewSummary":null,"reviewSummaryHighlights":null,"reviewSummaryConcerns":null,"reviewSummaryGeneratedAt":null,"activationCount":0,"lastUsedAt":null,"lastSuccessfullyRanAt":null,"lastHealthCheckAt":"2026-09-14T18:32:58.586Z","isFirstParty":false}