Why Use a Screenshot API Instead of Self-Hosting?
Running Playwright or Puppeteer yourself sounds simple until you're debugging why Chromium consumes 4GB of RAM, why screenshots time out on SPAs, or why your Lambda function exceeds the 512MB memory limit. A screenshot API offloads all of that:
- No browser binary to install, update, or patch
- No memory leak debugging at 3am
- No Docker image size issues
- Handles anti-bot detection, stealth mode, proxy rotation
- Scales to thousands of concurrent captures
The cost break-even point: if your engineering time is worth $100/hour, a screenshot API pays for itself after about 2 hours of debugging headless Chrome.
What to Look For
| Feature | Why It Matters |
|---|---|
| SPA / JavaScript rendering | Sites built with React, Vue, Next.js require full JS execution |
| Anti-bot / stealth mode | Many sites block headless browsers; stealth bypasses detection |
| wait_for options | networkidle vs domcontentloaded — determines render completeness |
| Full-page capture | Captures entire scrollable page, not just viewport |
| Custom viewport / device emulation | Mobile screenshots, responsive testing |
| PDF generation | Some APIs bundle PDF and screenshot in one endpoint |
| Webhook / async | Long captures return immediately, webhook fires when ready |
| Custom JS/CSS injection | Remove popups, hide dynamic content before capture |
1. SnapAPI Best Value
snapapi.pics
Screenshots, scraping, content extraction, PDF, video recording, and AI page analysis in one API.
| Plan | Calls/mo | Price | Per-call cost |
|---|---|---|---|
| Free | 200 | Free | — |
| Starter | 5,000 | $19/mo | $0.0038 |
| Pro | 50,000 | $79/mo | $0.0016 |
| Business | 500,000 | $299/mo | $0.0006 |
✓ Pros
- Best price at scale ($79/50K vs $79/30K at ScreenshotOne)
- Stealth mode for anti-bot sites
- PDF, video, scrape, extract all in one API
- MCP server — works with Claude/Cursor/VS Code
- Custom JS/CSS injection
- 30+ device presets
✗ Cons
- Newer service (smaller community)
- No managed proxy network (built-in stealth only)
// SnapAPI — screenshot endpoint
const response = await fetch('https://api.snapapi.pics/v1/screenshot', {
method: 'POST',
headers: {
'X-Api-Key': 'sk_live_YOUR_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com',
full_page: true,
width: 1280,
height: 800,
wait_for: 'networkidle',
block_ads: true,
format: 'png' // or 'jpeg', 'webp'
})
});
const data = await response.json();
// data.screenshot = base64-encoded PNG
const imageBuffer = Buffer.from(data.screenshot, 'base64');
require('fs').writeFileSync('screenshot.png', imageBuffer);
// With device emulation (iPhone 14)
const response = await fetch('https://api.snapapi.pics/v1/screenshot', {
method: 'POST',
headers: { 'X-Api-Key': 'sk_live_YOUR_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({
url: 'https://example.com',
device: 'iPhone 14',
wait_for: 'networkidle',
stealth: true // Bypass anti-bot detection
})
});
const { screenshot } = await response.json();
2. ScreenshotOne
screenshotone.com
Established screenshot API with strong documentation and a large user community.
| Plan | Calls/mo | Price | Per-call cost |
|---|---|---|---|
| Hobby | 2,500 | $19/mo | $0.0076 |
| Startup | 30,000 | $79/mo | $0.0026 |
| Business | 150,000 | $299/mo | $0.0020 |
✓ Pros
- Mature API, good docs
- AI-powered screenshot features
- Signed URLs for caching
- SDKs in 6+ languages
✗ Cons
- 30K calls for $79 (vs SnapAPI's 50K)
- No built-in PDF generation
- No scraping/extraction endpoint
// ScreenshotOne
const params = new URLSearchParams({
access_key: 'YOUR_ACCESS_KEY',
url: 'https://example.com',
full_page: true,
viewport_width: 1280,
viewport_height: 800,
format: 'png',
block_ads: true,
delay: 1000
});
const imageUrl = `https://api.screenshotone.com/take?${params}`;
// GET request returns the image directly
3. Urlbox
urlbox.io
Feature-rich screenshot API with extensive render options and a long track record.
| Plan | Calls/mo | Price | Per-call cost |
|---|---|---|---|
| Starter | 3,000 | $29/mo | $0.0097 |
| Growth | 20,000 | $99/mo | $0.0050 |
| Scale | 100,000 | $299/mo | $0.0030 |
✓ Pros
- Comprehensive render options
- Blocking specific elements by CSS selector
- Retina display support
- Asynchronous webhooks
✗ Cons
- Most expensive per-call at volume
- No extraction or PDF bundled
// Urlbox — signed URL approach
const crypto = require('crypto');
const API_KEY = 'YOUR_API_KEY';
const SECRET = 'YOUR_SECRET';
const options = new URLSearchParams({
url: 'https://example.com',
full_page: true,
width: 1280,
format: 'png',
block_ads: true
});
const token = crypto
.createHmac('sha256', SECRET)
.update(options.toString())
.digest('hex');
const screenshotUrl = `https://api.urlbox.io/v1/${API_KEY}/${token}/png?${options}`;
4. Apiflash
apiflash.com
Simple, affordable screenshot API built on headless Chrome.
| Plan | Calls/mo | Price |
|---|---|---|
| Free | 100 | Free |
| Basic | 2,000 | $10/mo |
| Medium | 20,000 | $50/mo |
| Advanced | 50,000 | $85/mo |
✓ Pros
- Very simple API (query params only)
- Competitive pricing
- Response caching
✗ Cons
- No stealth mode
- No extraction or PDF
- Limited JS injection
// Apiflash — query param API
const params = new URLSearchParams({
access_key: 'YOUR_KEY',
url: 'https://example.com',
full_page: true,
width: 1280,
format: 'png',
fresh: false, // Use cached version if available
response_type: 'json' // Get base64 in JSON instead of raw image
});
const res = await fetch(`https://api.apiflash.com/v1/urltoimage?${params}`);
const { url: imageUrl } = await res.json();
5. Microlink
microlink.io
Link preview and metadata API that also captures screenshots.
| Plan | Calls/mo | Price |
|---|---|---|
| Free | 50/day | Free |
| Pro | Unlimited | $9/mo |
✓ Pros
- Very cheap for low volume
- Includes meta tags, favicons, OG data
- PDF export included
✗ Cons
- Limited screenshot customization
- No stealth or device emulation
- Rate limits on free tier
// Microlink — returns metadata + screenshot URL
const params = new URLSearchParams({
url: 'https://example.com',
screenshot: true,
meta: false,
embed: 'screenshot.url'
});
const res = await fetch(`https://api.microlink.io?${params}`);
const { data } = await res.json();
console.log(data.screenshot.url); // CDN URL to the screenshot
6. Self-Hosted Playwright (for comparison)
Worth knowing what you're replacing. A minimal self-hosted screenshot service:
// server.js — DIY screenshot endpoint
const { chromium } = require('playwright');
const express = require('express');
const app = express();
let browser;
app.use(express.json());
app.post('/screenshot', async (req, res) => {
const { url, fullPage = true, width = 1280 } = req.body;
const page = await browser.newPage();
try {
await page.setViewportSize({ width, height: 800 });
await page.goto(url, { waitUntil: 'networkidle' });
const buffer = await page.screenshot({ fullPage, type: 'png' });
res.set('Content-Type', 'image/png');
res.send(buffer);
} finally {
await page.close();
}
});
(async () => {
browser = await chromium.launch();
app.listen(3000);
console.log('Running on :3000');
})();
This works for dev. In production you'll need: browser pool management, crash recovery, memory limits, Docker + shm, Lambda workarounds, anti-bot evasion, update schedules. That's why the APIs exist.
Full Comparison Table
| API | 50K calls/mo | SPA support | Stealth | Scraping | Device emulation | |
|---|---|---|---|---|---|---|
| SnapAPI | $79 | ✅ | ✅ | ✅ | ✅ | ✅ 30+ presets |
| ScreenshotOne | ~$120 | ✅ | Partial | ❌ | ❌ | ✅ |
| Urlbox | ~$180 | ✅ | ❌ | ❌ | ❌ | ✅ |
| Apiflash | $85 | ✅ | ❌ | ❌ | ❌ | Limited |
| Microlink | $9 (unlimited) | Partial | ❌ | ✅ | ❌ | ❌ |
Which API for Which Use Case?
OG Image Generation
You're rendering custom HTML to PNG for social sharing. You need speed (sub-500ms), reliability, and the ability to inject custom HTML.
Best choice: SnapAPI (use the html parameter to pass raw HTML instead of a URL) or ScreenshotOne. Both support custom viewport and output format.
Website Monitoring / Visual Regression
Scheduled captures every hour or day to detect page changes. You need consistent rendering, full-page support, and webhook delivery for async.
Best choice: SnapAPI or Urlbox. Both support webhooks and full-page. SnapAPI is cheaper at volume.
SaaS Dashboard Exports
Users export their dashboards as PNG or PDF. You're capturing authenticated pages. You need cookie/session passing and clean rendering of charts.
Best choice: SnapAPI (pass cookies via headers) or Urlbox (signed URLs + cookie support). Microlink won't work well here.
Competitive Intelligence / Research
Capturing competitor websites, many of which block headless browsers. You need stealth mode.
Best choice: SnapAPI (built-in stealth, "stealth": true). ScreenshotOne has partial anti-bot support. Others will get blocked on Cloudflare-protected sites.
Link Previews (Thumbnails)
User pastes a URL, you show a thumbnail. Low volume, speed matters, cost matters at scale.
Best choice: Microlink for very low volume ($9/mo unlimited). SnapAPI for higher volume with caching on your side.
Quickstart: SnapAPI in 5 Minutes
// 1. Install nothing — pure fetch
// 2. Get key at snapapi.pics/register.html
// 3. Make your first call:
const screenshot = await fetch('https://api.snapapi.pics/v1/screenshot', {
method: 'POST',
headers: { 'X-Api-Key': 'sk_live_YOUR_KEY', 'Content-Type': 'application/json' },
body: JSON.stringify({ url: 'https://news.ycombinator.com', full_page: true })
}).then(r => r.json()).then(d => d.screenshot);
// screenshot is a base64 PNG
require('fs').writeFileSync('hn.png', Buffer.from(screenshot, 'base64'));
console.log('Saved hn.png');
# Python equivalent
import requests, base64
resp = requests.post(
'https://api.snapapi.pics/v1/screenshot',
headers={'X-Api-Key': 'sk_live_YOUR_KEY'},
json={'url': 'https://news.ycombinator.com', 'full_page': True}
)
with open('hn.png', 'wb') as f:
f.write(base64.b64decode(resp.json()['screenshot']))
print('Saved hn.png')
Conclusion
If you're evaluating screenshot APIs in 2026, SnapAPI is the strongest option on price-per-call at volume, and the only one that bundles screenshots, scraping, extraction, PDF generation, and AI analysis into a single API. ScreenshotOne is a solid alternative with a larger community. Urlbox is the most feature-complete but the priciest. Apiflash wins for simplicity if you don't need stealth. Microlink is unbeatable for <$9/mo unlimited if your volume is low and your requirements basic.