Website Monitoring
Visual Change Detection via Screenshots
Monitor any website for visual changes. Take scheduled screenshots, compare them automatically, and get alerts when something changes — competitor pricing, site outages, UI regressions, or content updates. Simple cron + API setup.
What can you monitor?
Competitor pricing
Get alerted when competitors change their pricing pages. Track feature changes, plan restructuring, and promotional offers.
Visual regression testing
Catch UI bugs before your users do. Compare screenshots across deployments to detect unintended layout changes, broken images, or CSS issues.
Uptime monitoring
Go beyond HTTP status codes. Verify that pages render correctly — a 200 status doesn't mean the content loaded properly.
Content change tracking
Monitor news sites, job boards, government filings, or any page for content updates. Get notified when new information appears.
Build a monitoring script in minutes
import requests
import hashlib
import os
TARGETS = [
'https://competitor.com/pricing',
'https://yoursite.com/landing',
'https://partner.com/status',
]
def take_screenshot(url):
resp = requests.post('https://api.snaprender.dev/v1/screenshot',
headers={'Authorization': 'Bearer YOUR_KEY'},
json={'url': url, 'full_page': True, 'width': 1280})
return resp.content
def check_for_changes(url, screenshot):
slug = url.replace('https://', '').replace('/', '_')
hash_file = f'/tmp/monitor_{slug}.hash'
current_hash = hashlib.sha256(screenshot).hexdigest()
if os.path.exists(hash_file):
with open(hash_file) as f:
old_hash = f.read().strip()
if old_hash != current_hash:
send_alert(url, screenshot) # Your alert function
with open(hash_file, 'w') as f:
f.write(current_hash)
for url in TARGETS:
img = take_screenshot(url)
check_for_changes(url, img)import crypto from 'crypto';
import fs from 'fs';
const TARGETS = [
'https://competitor.com/pricing',
'https://yoursite.com/landing',
'https://partner.com/status',
];
async function takeScreenshot(url) {
const res = await fetch('https://api.snaprender.dev/v1/screenshot', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({ url, full_page: true, width: 1280 }),
});
return Buffer.from(await res.arrayBuffer());
}
async function monitor() {
for (const url of TARGETS) {
const screenshot = await takeScreenshot(url);
const hash = crypto.createHash('sha256').update(screenshot).digest('hex');
const slug = url.replace('https://', '').replace(/\//g, '_');
const hashFile = `/tmp/monitor_${slug}.hash`;
if (fs.existsSync(hashFile)) {
const oldHash = fs.readFileSync(hashFile, 'utf8').trim();
if (oldHash !== hash) {
console.log(`Change detected: ${url}`);
// Send alert via Slack, email, webhook, etc.
}
}
fs.writeFileSync(hashFile, hash);
}
}
monitor();
// Run with: cron "*/30 * * * * node monitor.js"Three steps to visual monitoring
Schedule screenshot captures
Set up a cron job or scheduled task to call SnapRender's /screenshot endpoint at your desired interval — every 30 minutes, hourly, or daily.
Compare screenshots
Hash each screenshot and compare against the previous version. For more granular detection, use pixel-diff libraries to calculate visual similarity scores.
Alert on changes
When a change is detected, send a notification via Slack, email, or webhook. Include the before/after screenshots for quick visual review.
Monitoring at scale
Each screenshot counts as one request. Monitor more pages or more frequently as you scale.
Frequently asked questions
Take periodic screenshots of your target pages using cron jobs or scheduled tasks. Compare each new screenshot against the previous one — either visually (pixel diff) or by comparing file hashes. When changes are detected, trigger an alert via email, Slack, or webhook.
As often as your plan allows. The free tier gives you 100 requests/month (~3 per day). The $9/mo plan gives you 1,500 (~50 per day). The $29/mo plan gives you 5,000 (~160 per day). For more frequent monitoring, the $79/mo plan includes 15,000 requests.
SnapRender captures screenshots — change detection is done on your end. You can use simple file hash comparison, pixel-diff libraries (like pixelmatch for Node.js or Pillow for Python), or dedicated visual regression tools.
Yes. Add use_flaresolverr: true to bypass Cloudflare protection. This is essential for monitoring competitor sites or third-party pages that use Cloudflare, DataDome, or similar anti-bot services.
Yes. Use the selector parameter to capture screenshots of specific CSS selectors. For example, monitor only a pricing table, hero section, or product listing without capturing the entire page.
SnapRender uses a full headless browser, so React, Vue, Angular, and other JavaScript frameworks are fully rendered before the screenshot is taken. The wait_for parameter lets you wait for specific elements to appear.
Never miss a change.
Visual monitoring in minutes. Start free with 100 screenshots/month.
Start Free — 100 requests/month