← Blog

How to take full-page website screenshots automatically

September 7, 2026 · 6 min read

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?

If you picked the last one, the docs will get you to your first full-page capture in about five minutes.