How to take full-page website screenshots automatically
Whether you're monitoring a competitor's pricing page, archiving your own landing pages, or generating previews for a link preview service — manual screenshots don't scale. Here are five ways to automate full-page captures, from easiest to most flexible.
1. Browser extensions
Tools like GoFullPage capture what you see in one click. Great for a one-off capture of a page you're already visiting. But they run on your machine, on your schedule — there's no API, no automation, and every capture is a manual step.
2. Device built-in tools
Chrome DevTools (Ctrl+Shift+P → "Capture full size screenshot") produces clean, viewport-independent captures. Same catch: manual, local, and no way to trigger from code.
3. DIY with Puppeteer or Playwright
The developer's rite of passage: install Chromium, write ten lines, get a screenshot. It works — until you need retina scaling, cookie-banner suppression, dark mode, timeouts for slow pages, multiple viewports, and a queue so you don't DDoS yourself. The script grows, the browser version drifts, the 2 AM failures start.
// The day it works
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: "networkidle0" });
await page.screenshot({ path: "shot.png", fullPage: true });
// The month it breaks: proxy support, font
// rendering, CAPTCHA walls, retries, disk
// space for browser updates...4. A rendering API
This is the problem OtterSnap exists to solve. The same capture as a single API call:
import { OtterSnap } from "ottersnap";
const otter = new OtterSnap(process.env.OTTERSNAP_KEY);
const png = await otter.screenshot("https://example.com", {
fullPage: true,
scale: 2,
cookieBlock: true,
});Retina quality, banner suppression and dark mode are just options. The Free plan includes 100 full-page renders a month, and cached repeats don't count against your quota.
5. Scheduled capture pipelines
Combine the API with a cron job and you have a monitoring system: capture daily, diff the images, alert on visual changes. Because the capture is an API, the schedule can live anywhere — GitHub Actions, Vercel Cron, your Raspberry Pi.
Which should you pick?
- One-off captures → extension or DevTools.
- Learning project → DIY Puppeteer.
- Anything that runs unattended, at volume, or inside a product → a rendering API.
If you picked the last one, the docs will get you to your first full-page capture in about five minutes.