Free Tier Comparison
| API | Free calls/mo | CC required | Watermark | Rate limit | Features included |
|---|---|---|---|---|---|
| SnapAPI | 200 | ❌ No | ❌ No | 10/min | Full features (stealth, device, PDF, scrape) |
| ScreenshotOne | 100/mo | ❌ No | ❌ No | 1/min | Basic screenshot only |
| Apiflash | 100/mo | ❌ No | ❌ No | 1/min | Basic screenshot |
| Microlink | 50/day (1,500/mo) | ❌ No | ❌ No | 3/min | Screenshot + metadata |
| Urlbox | ❌ Trial only | ✅ Yes | ❌ No | — | Full features |
| Screenshotmachine | 100/mo | ❌ No | ✅ Yes | 1/min | Basic screenshot |
| Self-hosted Playwright | Unlimited | — | ❌ No | Your hardware | Full control |
SnapAPI Free Tier (Best Value)
What's included:
200 calls is enough to: screenshot your entire site (20–50 pages), run visual regression tests on every PR for a small site, monitor 5 pages daily, or test a full integration before committing to a paid plan.
// SnapAPI free tier — no API key payment required
// Sign up at snapapi.pics/register.html, get key immediately
const response = await fetch('https://api.snapapi.pics/v1/screenshot', {
method: 'POST',
headers: {
'X-Api-Key': 'sk_live_YOUR_FREE_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
url: 'https://example.com',
full_page: true,
wait_for: 'networkidle',
block_ads: true
})
});
const { screenshot } = await response.json();
// Returns full-resolution PNG, no watermark
What 200 Free Calls Gets You
- Development testing: Build and test your full integration before going live
- Small personal project: Screenshot 6–7 pages per day (200 ÷ 30 ≈ 6.6/day)
- Weekly monitoring: Monitor 25 pages once per week
- Link preview thumbnails: 200 unique page thumbnails for a bookmarking tool
- CI visual tests: ~40 test runs with 5 screenshots each
Microlink: Most Generous Daily Limit
Microlink's free tier allows 50 requests per day (1,500/month) — the highest daily volume of any free tier. The catch: limited viewport customization and no stealth mode. Good for simple link preview thumbnails.
// Microlink free — link preview screenshot
const params = new URLSearchParams({
url: 'https://example.com',
screenshot: true,
meta: false
});
const response = await fetch(`https://api.microlink.io?${params}`);
const { data } = await response.json();
console.log(data.screenshot.url); // CDN URL of the screenshot
Self-Hosted Playwright: Truly Free (At Scale)
If you need more than 200 calls per month and can manage a server, self-hosted Playwright is free to run. The real costs are time (debugging Chromium issues) and server ($5–20/mo on DigitalOcean/Hetzner).
// Minimal self-hosted screenshot service — free to run
// node server.js
const { chromium } = require('playwright');
const http = require('http');
let browser;
http.createServer(async (req, res) => {
if (req.method !== 'POST') { res.writeHead(405); return res.end(); }
const body = await new Promise(r => { let d=''; req.on('data', c => d+=c); req.on('end', () => r(JSON.parse(d))); });
const page = await browser.newPage();
try {
await page.goto(body.url, { waitUntil: 'networkidle', timeout: 30000 });
const screenshot = await page.screenshot({ fullPage: true });
res.writeHead(200, { 'Content-Type': 'image/png' });
res.end(screenshot);
} finally {
await page.close();
}
}).listen(3000);
(async () => { browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] }); })();
// Runs on any $5/mo VPS. Free forever.
When to Upgrade from Free
The SnapAPI free tier (200/mo) covers development and light personal use. When to upgrade to Starter ($19/mo, 5,000 calls):
- You're monitoring more than 6 pages daily
- You're running CI visual regression tests on every PR
- Your app generates screenshots for users (even 1 active user will hit 200/mo quickly)
- You need more than 1 concurrent screenshot (free tier is sequential)
At 5,000 calls/month on Starter, the per-call cost is $0.0038 — that's $0.38 per 100 screenshots. Most apps don't notice it.
Quick Integration (All Languages)
# Python
import requests, base64
r = requests.post('https://api.snapapi.pics/v1/screenshot',
headers={'X-Api-Key': 'YOUR_FREE_KEY'},
json={'url': 'https://example.com', 'full_page': True})
open('out.png','wb').write(base64.b64decode(r.json()['screenshot']))
# cURL
curl -s -X POST https://api.snapapi.pics/v1/screenshot \
-H "X-Api-Key: YOUR_FREE_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","full_page":true}' \
| jq -r .screenshot | base64 -d > out.png