Test
10,000 pages
$3.75
$0.38/1K pages
- Try it on your real URLs
- Same API as the biggest pack
- Credits never expire
Use case · monitoring · /batch
Comparing raw HTML raises an alert every time an ad or a token changes. Comparing the main content as Markdown only flags what a reader would notice: a new price, a reworded clause, a fresh changelog entry.
Quick answer
How can I monitor web pages for content changes?
Read each page on a schedule as Markdown of its main content, store the text, and compare it with the previous version; alert only when the text changes. WebReaderAPI reads up to 100 URLs per batch job, removes ads and menus so they cannot trigger false alarms, and charges one credit per page from $0.07/1K pages as of October 2026. No KYC; pay in crypto.
| Endpoint | POST https://webreaderapi.com/api/v1/batch, then GET https://webreaderapi.com/api/v1/jobs/{job_id} |
|---|---|
| Batch size | Up to 100 URLs per batch job |
| What is compared | Markdown of the main content, without ads, menus or banners |
| Billing | 1 credit = 1 page read without a browser; 2 credits when the page needs a browser to render JavaScript. A request that fails, or that a site's robots.txt refuses, is not charged |
| Example volume | 200 pages checked daily = about 6,000 pages a month |
| Price | $3.75 for 10,000 pages; credits never expire |
Pages whose wording matters to your business and that change without notice:
Keep the list to public pages. Personal profiles and pages behind a login are out of scope.
Because HTML changes all the time without the content changing. Rotating ads, session tokens, timestamps in footers and A/B test markup make two loads of the same page differ. A diff on HTML turns that noise into alerts, and people stop reading them.
Main-content Markdown removes most of the noise before you compare. What is left is the text a person reads: headings, paragraphs, lists and tables. A diff on that text is short, readable and worth an alert.
import difflib
import json
import os
import pathlib
import time
import requests
API = "https://webreaderapi.com/api/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["WEBREADER_API_KEY"]}
STORE = pathlib.Path("snapshots.json")
URLS = [
"https://example.com/pricing",
"https://example.com/legal/terms",
"https://example.com/changelog",
]
old = json.loads(STORE.read_text(encoding="utf-8")) if STORE.exists() else {}
job = requests.post(API + "/batch", headers=HEADERS, json={"urls": URLS}, timeout=60).json()
results, cursor, delay = [], None, 5
while True:
params = {"cursor": cursor} if cursor else {}
page = requests.get(API + "/jobs/" + job["job_id"], headers=HEADERS, params=params, timeout=60).json()
results += page.get("results", [])
cursor = page.get("next_cursor")
if page["status"] == "done" and not cursor:
break
if not cursor:
time.sleep(delay)
delay = min(delay * 2, 60)
new = dict(old)
for item in results:
if "markdown" not in item:
print("not read:", item["url"], item.get("error", {}).get("code"))
continue
before = old.get(item["url"], "")
if before and before != item["markdown"]:
diff = difflib.unified_diff(before.splitlines(), item["markdown"].splitlines(), lineterm="", n=0)
print("CHANGED:", item["url"])
print("\n".join(list(diff)[:40]))
new[item["url"]] = item["markdown"]
STORE.write_text(json.dumps(new, ensure_ascii=False), encoding="utf-8")
Check as often as the page realistically changes, and no more. Daily suits pricing pages and changelogs; weekly suits policies and documentation. A page read every hour rarely tells you more than one read every day, and it costs 24 times as much.
WebReaderAPI follows robots.txt for every page and honours a site's Crawl-delay in crawl jobs. Pages the site disallows are skipped and not charged, so a strict site simply drops out of your report. Ask the owner if you need access to a page that refuses robots.
One credit per page per check. Some examples at the prices of October 2026:
Pages that need a browser use two credits; set render=false for pages you know are plain HTML to keep the count at one.
Multiply pages by checks per month, then pick a pack that lasts a few months. Credits never expire.
10,000 pages
$3.75
$0.38/1K pages
50,000 pages
$14.25
$0.28/1K pages
100,000 pages
$21.75
$0.22/1K pages
In every plan: Main-content extraction · JavaScript rendering when needed · Failed and refused pages not charged · Credits never expire
No. It reads pages and returns Markdown; your script compares versions and sends the alert by email, chat or ticket. The code above prints the changed lines as a starting point.
Compare main-content Markdown, not HTML, and strip lines you know change on every load, such as "updated 5 minutes ago", before diffing. Most rotating elements are already removed by main-content extraction.
Yes. With render=auto, pages that are empty without JavaScript are rendered in a browser for two credits. Pages that work without it stay at one.
Yes: run a crawl job instead of a batch, then compare page by page. For large sites, compare the sitemap's lastmod dates first and re-read only the pages that moved.
From $0.07/1K pages · no KYC
Get an API key