Running Puppeteer in the cloud costs more than you think. Here is what self-hosted Puppeteer actually costs per hour, how managed services like Browserless compare, and why a screenshot API often costs 10x less.
Try SnapAPI Free — 200 ScreenshotsPuppeteer is free as an npm package — but running it in production has real costs that add up fast. Before comparing cloud Puppeteer services, let's quantify what self-hosted Puppeteer actually costs per screenshot.
A Chromium instance under load uses 200-400MB RAM and 20-40% of a CPU core. On AWS, a t3.medium (2 vCPU, 4GB RAM, $0.0416/hour) can safely run 4-6 concurrent browser contexts. At 60 seconds per screenshot average (including page load, render, and capture), that's roughly 240-360 screenshots per hour per instance.
Cost per screenshot on self-hosted: $0.0416/hr ÷ 300 screenshots/hr = ~$0.000139/screenshot. Sounds cheap. But that's ignoring: engineering time to set up and maintain the cluster, Chromium crash recovery, memory leak monitoring, browser pool management, Xvfb on Linux, version compatibility, and the hidden cost of every 2AM incident when your browser pool locks up.
| Service | Free Tier | Entry Plan | Per Screenshot | Notes |
|---|---|---|---|---|
| Browserless.io | 6 hrs/month | $69/month | ~$0.008–0.02 | Billed by session-second + units |
| Apify | $5 credit/month | $49/month | ~$0.005–0.015 | Actor-based, compute unit pricing |
| ScrapingBee | 1,000 calls | $49/month | ~$0.005–0.01 | JS rendering adds cost multiplier |
| Bright Data Scraper | None | Pay-per-use | ~$0.01–0.05 | Residential proxy included |
| Self-hosted EC2 | — | ~$30–80/month | ~$0.0001–0.001 | Lowest cost, highest ops burden |
| SnapAPI ⭐ | 200/month | $19/month | $0.0038 | Screenshot-specific, no session billing |
At $19/month for 5,000 screenshots, SnapAPI comes out to $0.0038 per screenshot — significantly cheaper than session-based Puppeteer cloud services for screenshot-specific use cases.
Services like Browserless bill by session-seconds or compute units because Puppeteer is a general-purpose automation tool. You might use a browser session for 30 seconds or 30 minutes — the provider has no way to predict, so they charge for time.
For screenshot use cases, time-based billing is almost always worse than per-screenshot pricing. A screenshot typically takes 2-8 seconds of session time. At Browserless's $69/month entry plan (which includes roughly 4,000 session-minutes), you are paying for 240,000 seconds of browser time. If each screenshot takes 4 seconds, that is 60,000 screenshots — but at higher plans the math gets complicated quickly with concurrency limits and unit consumption rates.
SnapAPI charges only for completed screenshots, not for session time. No minimum session duration, no concurrency tiers — just a flat per-call rate.
Not every use case needs a screenshot API. If you need to fill forms, click buttons, navigate multi-step authentication flows, or intercept network requests, you genuinely need full browser automation — and Browserless or a similar service is the right tool.
Screenshot APIs like SnapAPI are purpose-built for read-only browser tasks: capture this URL as an image, scrape this page's rendered HTML, extract structured data from this page. For these use cases, a screenshot API is simpler, cheaper, and more reliable than renting general-purpose Puppeteer cloud time.
// Before: Puppeteer (local or cloud, ~10 lines, heavy deps)
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.setViewport({ width: 1280, height: 800 });
await page.goto(url, { waitUntil: 'networkidle2' });
const screenshot = await page.screenshot({ type: 'png' });
await browser.close();
// After: SnapAPI (3 lines, zero deps)
const params = new URLSearchParams({ access_key: KEY, url, width: 1280, height: 800, format: 'png' });
const res = await fetch(`https://api.snapapi.pics/screenshot?${params}`);
const screenshot = Buffer.from(await res.arrayBuffer());Get started free at snapapi.pics/dashboard. No credit card, API key in 60 seconds.
To understand Puppeteer cloud pricing per hour, you need to understand how different services structure their billing. No service bills purely by the hour like a VPS — they use compute units, session-seconds, or API calls. Here is how each major service translates to effective hourly cost for screenshot workloads.
Browserless charges by "units" — a combination of session time and concurrent browser count. Their $69/month Starter plan includes 1,000 units. One unit = one browser running for one minute. If your screenshots average 5 seconds each, you consume 5/60 = 0.083 units per screenshot. At 1,000 units, that is approximately 12,000 screenshots per month.
Per-hour equivalent: If you run screenshots continuously for one hour at 12 per minute (5 seconds each), you consume 60 units/hour. At $69/month and the included 1,000 units, your effective rate is $0.069/unit × 60 = $4.14/hour of continuous screenshot capture. For 720 screenshots captured in that hour (12/min × 60 min), that is $0.00575/screenshot.
At higher concurrency or longer page load times, the cost rises significantly. A page that takes 15 seconds to load and screenshot consumes 0.25 units — three times more than a 5-second page, at the same plan cost.
Self-hosting Puppeteer means paying for the compute that runs it. Here is a realistic per-hour cost breakdown for different AWS instance types:
AWS EC2 Puppeteer Cost Analysis (us-east-1, 2026 pricing):
t3.small (2 vCPU, 2GB): $0.0208/hr — 1-2 concurrent browsers
Risk: OOM kills under load, not recommended
t3.medium (2 vCPU, 4GB): $0.0416/hr — 3-4 concurrent browsers
Screenshots/hr: ~200-400 (varies by page complexity)
Cost/screenshot: $0.0001-0.0002
t3.large (2 vCPU, 8GB): $0.0832/hr — 6-8 concurrent browsers
Screenshots/hr: ~400-700
Cost/screenshot: $0.00012-0.0002
m5.xlarge (4 vCPU, 16GB): $0.192/hr — 12-16 concurrent browsers
Screenshots/hr: ~800-1400
Cost/screenshot: $0.00014-0.00024
Add to compute cost:
+ EBS storage: ~$0.002/hr for 20GB gp3
+ Data transfer: $0.09/GB out (screenshots avg 100-500KB each)
+ Engineering/ops time: $50-200/hr fully-loaded cost
True total at scale: $0.001-0.005/screenshot (when ops time included)
Browserless is an excellent product for full browser automation. But for the specific use case of URL-to-screenshot, it carries unnecessary complexity. Here is a direct feature comparison:
| Feature | Browserless | SnapAPI |
|---|---|---|
| Screenshot capture | ✅ | ✅ |
| Full-page screenshots | ✅ | ✅ |
| Custom viewport | ✅ | ✅ |
| Cookie/auth support | ✅ | ✅ |
| Form fill / click actions | ✅ | ❌ (read-only) |
| Network request interception | ✅ | ❌ |
| Entry price | $69/month | $19/month |
| Free tier | 6 hrs/month | 200/month |
| Billing model | Session-units | Per screenshot |
| Serverless compatible | ✅ | ✅ |
| Zero browser config | Partial | ✅ Full |
| Structured data extraction | ❌ | ✅ |
Bottom line: If you need full Puppeteer automation (form filling, multi-step flows, network interception), Browserless is worth the premium. If you need screenshots, scraping, and data extraction from URLs, SnapAPI is simpler and significantly cheaper.
How much does it cost to run Puppeteer on AWS Lambda? AWS Lambda does not support Chromium in the standard runtime — binary size exceeds 250MB limits. Workarounds exist (chrome-aws-lambda layer, custom containers) but each adds complexity. A screenshot API is the practical alternative for Lambda.
What is the cheapest way to run Puppeteer screenshots at scale? For high-volume screenshot workloads (100,000+/month), a dedicated EC2 instance with a managed browser pool is cheapest at pure compute cost. For most teams, a screenshot API is cheaper when engineering time is factored in.
Is Puppeteer free to use in the cloud? Puppeteer the library is free and open source. Cloud compute to run it is not — you pay for the server, the managed service, or the API.
How does SnapAPI handle JavaScript-heavy pages? SnapAPI uses Chromium under the hood, so it executes JavaScript the same way Puppeteer does. The delay parameter lets you wait for JS to finish rendering before capture. The wait_for_selector parameter waits for a specific element to appear.
Sign up at snapapi.pics/dashboard for 200 free screenshots. No credit card, no browser setup, API key in 60 seconds. Replace your Puppeteer screenshot code with a single fetch call and stop worrying about browser infrastructure.
Before switching entirely to a managed API, it's worth understanding the few scenarios where running your own Puppeteer instance remains reasonable. If you have a dedicated DevOps team already managing Kubernetes clusters, adding a Puppeteer pod might cost very little in operational overhead. Similarly, if you process hundreds of thousands of screenshots per day and your infrastructure is already paid for, the marginal cost of a few extra pods may be negligible.
But for the majority of teams — especially startups, solo developers, and growing SaaS companies — the economics tell a different story. Consider the fully-loaded cost of self-hosting: server time, memory overhead (Chromium is notoriously hungry), developer hours debugging flaky tests, dealing with bot detection failures, and the opportunity cost of not shipping product features. When you add all that up, a managed screenshot API at $19–$79/month is almost always cheaper.
The real question isn't "can we run Puppeteer ourselves?" — it's "should we?" For most teams, the answer is no.
SnapAPI runs a fleet of Chromium instances behind an intelligent load balancer that distributes requests across warm browser contexts. This means your first request doesn't wait for a cold browser start — the instance is already running and ready. We maintain a pool of pre-authenticated sessions, handle Puppeteer version management automatically, and upgrade to the latest Chromium builds as soon as they stabilize.
Our stealth layer uses a combination of user-agent rotation, canvas fingerprint spoofing, and WebGL randomization to pass standard bot-detection checks on most sites. We handle CAPTCHAs via retry logic and fallback strategies. You get all of this without writing a single line of anti-detection code.
For teams that need full-page screenshots, our scroll-and-stitch algorithm handles lazy-loaded content correctly — something that naive Puppeteer implementations routinely get wrong. We scroll the page, wait for new content to load, then capture the full composite. The result is accurate full-page renders even on JavaScript-heavy sites.
If you're migrating from Puppeteer, the integration is straightforward. Most teams replace their screenshot generation logic in a single afternoon. Here's a typical before-and-after:
// Before: DIY Puppeteer (simplified — real code is much longer)
const browser = await puppeteer.launch({ args: ['--no-sandbox'] });
const page = await browser.newPage();
await page.setViewport({ width: 1280, height: 800 });
await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 });
const buffer = await page.screenshot({ fullPage: true });
await browser.close();
return buffer;
// After: SnapAPI (2 lines)
const { data } = await axios.get('https://snapapi.pics/v1/screenshot', {
params: { access_key: process.env.SNAPAPI_KEY, url, full_page: true }
});
The SnapAPI version handles retries, browser lifecycle, memory cleanup, and error recovery automatically. You get a CDN-cached image URL back in milliseconds. No browser process to manage, no memory leaks to debug, no server crashes on traffic spikes.
SnapAPI's pricing is straightforward. The Free tier gives you 200 API calls per month at no cost — no credit card required. This is enough to prototype your integration and validate it works for your use case before committing to anything.
The Starter plan at $19/month covers 5,000 screenshots. That's $0.0038 per screenshot — well below what you'd pay in EC2 costs alone for self-hosted Puppeteer at comparable quality. The Growth plan at $79/month scales to 50,000 screenshots, dropping the per-unit cost to $0.00158. For high-volume use cases, custom enterprise pricing is available with volume discounts, SLA guarantees, and dedicated infrastructure.
There are no hidden fees for bandwidth, storage, or CDN delivery. The screenshot URL we return is publicly accessible and cached at our edge — you don't need to pay for your own CDN or S3 bucket to serve the images to your users.
Development teams that have migrated from self-hosted Puppeteer to SnapAPI consistently report the same outcomes: faster initial setup, fewer production incidents, and engineering time redirected to product work. A common pattern is that a team spends one to two days migrating, then never thinks about browser infrastructure again. The screenshots just work, reliably, at whatever scale the product demands.
For teams building social preview generators, PDF export features, website monitoring dashboards, or e-commerce product thumbnail pipelines, SnapAPI handles the complexity so you can focus on what makes your product unique.
Try it free today — 200 calls per month, no credit card required. If you're currently paying for Puppeteer cloud hosting or running your own Chromium fleet, the math is almost certainly in your favor to switch.