Back to blog
screenshot apipuppeteerweb scrapingdevops costsaas infrastructure

Screenshot API vs Self-Hosted Puppeteer: The Real Cost Breakdown

Screenshot API vs self hosted Puppeteer cost comparison: real infra, maintenance, and dev-hour numbers to help you pick the right approach.

2026-08-095 min read

Every developer who needs to generate screenshots at scale eventually asks the same question: should I run Puppeteer myself, or pay for a screenshot API? The honest answer is "it depends," but most people underestimate the true cost of self-hosting by a wide margin. Let's put actual numbers on both sides.

What "Self-Hosted Puppeteer" Actually Costs

On paper, Puppeteer is free. You npm install puppeteer, write 15 lines of code, and get a PNG. The problem is that "works on my laptop" and "works reliably in production, at scale, for months" are two completely different engineering problems.

1. Server Infrastructure

Headless Chrome is memory-hungry. A single Chrome instance rendering a moderately complex page can consume 200–400MB of RAM, and that spikes hard on image-heavy or JS-heavy sites. If you're running concurrent screenshots, you need real headroom:

  • Small setup (2 vCPU, 4GB RAM, ~5 concurrent renders): $20–40/month on a VPS like DigitalOcean or Hetzner
  • Medium setup (4–8 vCPU, 16GB RAM, ~20 concurrent renders): $80–160/month
  • Autoscaling container setup (AWS Fargate/ECS with Chrome layers): often $150–400/month once you factor in idle capacity for traffic spikes

And that's before you add a load balancer, a queue (BullMQ/Redis or SQS), and storage for the output files.

2. Chrome Crashes and Zombie Processes

This is the part nobody mentions in tutorials. Headless Chrome leaks memory over long-running processes and occasionally leaves zombie processes that eat CPU until the box falls over. In production you need:

  • A process supervisor that kills and restarts Chrome after N renders (commonly every 50–100 screenshots)
  • Memory watchdogs that OOM-kill and relaunch the browser
  • Timeout handling for pages that hang on networkidle0 forever

Teams that skip this discover it the hard way — usually at 2am when the server runs out of memory during a traffic spike.

3. Font, Emoji, and Rendering Fixes

Fresh Docker images (like node:18-slim) don't ship with fonts. You'll spend hours installing fonts-liberation, fonts-noto-color-emoji, and CJK font packages just to stop screenshots from rendering with missing glyphs or boxes instead of emoji. This is a one-time cost, but it's real dev-hour cost.

4. Maintenance Over Time

Chrome updates monthly. Puppeteer versions need to track those updates or your renders silently break (a new Chrome flag deprecation, a changed default viewport, a broken PDF module). Ongoing maintenance typically looks like:

  • Dependency bumps every 4–6 weeks (~1–2 hours)
  • Occasional emergency fixes when a site's anti-bot detection flags your headless Chrome fingerprint (~2–4 hours per incident)
  • Scaling adjustments as traffic grows (~2–3 hours per quarter)

At a conservative $50/hr developer rate, that's roughly $150–400/month in ongoing labor for a system serving moderate traffic — and that number climbs fast if you're not the one maintaining it and have to onboard someone else.

What a Screenshot API Actually Costs

Pricing for hosted screenshot APIs is usually tiered by request volume. Using PxShot as a reference point, plans scale with usage and include a free tier for testing — no server provisioning, no Chrome version chasing, no font packages to install.

The real cost comparison isn't "$X/month vs $0/month." It's:

  • API cost = predictable monthly fee based on request volume
  • Self-hosted cost = infrastructure + maintenance hours + incident response + opportunity cost of engineering time not spent on your actual product

Break-Even Volume: A Rough Model

Here's a simplified way to estimate where the crossover point sits:

  1. Estimate your monthly server + ops cost for self-hosting (infra + labor). Call it C_self.
  2. Check the API pricing tier that covers your expected monthly request volume. Call it C_api.
  3. If C_api < C_self, the API wins on cost alone — before even counting reliability and dev-time savings.

In practice, most teams under ~50,000 screenshots/month find that a hosted API is cheaper once labor is factored in, simply because the fixed cost of maintaining a reliable rendering pipeline doesn't scale down — a server running 100 screenshots/day still needs the same crash-recovery logic as one running 10,000/day.

When Self-Hosting Actually Makes Sense

Self-hosted Puppeteer isn't always the wrong call. It tends to make sense when:

  • You're already running Chrome for other tasks (PDF generation, scraping) and can share infrastructure
  • You have very high volume (millions of renders/month) where per-request API pricing exceeds infra costs even with labor included
  • You need heavily customized browser behavior — custom extensions, non-standard proxy chains, or exotic viewport/device emulation that a generic API doesn't expose
  • You have a dedicated infra team already maintaining container fleets, so the marginal cost of adding Chrome workers is low

When a Screenshot API Wins

  • You need OG image generation for a SaaS product and don't want to own browser infra
  • You're building visual regression testing or uptime/change monitoring and need reliability more than raw customization
  • You need PDF generation from HTML/URLs without wiring up print CSS handling in Puppeteer yourself
  • Your team is small and every hour spent debugging Chrome flags is an hour not spent on your product

A Practical Test Before You Commit

Before building out self-hosted infra, run this quick experiment:

  1. Take your top 10 most-requested URL patterns (product pages, blog posts, dashboards)
  2. Render them through a hosted API like PxShot with a single HTTP GET request per URL
  3. Time the requests and compare output quality (font rendering, lazy-loaded images, viewport accuracy) against a local Puppeteer script
  4. Multiply your expected monthly volume against the API's pricing tier and compare it to a realistic self-hosted budget, including at least 2–3 hours/month of maintenance time

This takes under an hour and gives you real numbers instead of guesses — which matters more than any generic advice about "it depends on your use case."

If you want to run that test yourself, PxShot has a free tier that covers exactly this kind of evaluation — no credit card, no server to provision, just an API key and a URL to capture as PNG, JPEG, WebP, or PDF.