Capture
PNG, JPEG, WebP or PDF. Any viewport from 320 to 3840 px, full pages up to 10,000 px, iPhone, Pixel, iPad and MacBook presets, dark mode.
device=iphone_15_pro&full_page=true&dark_mode=true
Real Chrome captures as PNG, JPEG, WebP or PDF, cookie walls cleared. Watch any page for changes, or give your AI agent eyes on the web.
200 captures a month freeNo card
Most of the web greets a fresh browser with a consent dialog. SnapRender clears it before the shutter fires, on every plan, with nothing to configure.
Plain headless browser
SnapRender
Keeping Chrome alive in production is a job of its own. SnapRender does that job: every problem your script handles by hand is solved before the image comes back.
35 lines to keep alive
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
args: ['--no-sandbox', '--disable-dev-shm-usage'],
});
export async function screenshot(url) {
const page = await browser.newPage();
try {
await page.setViewport({ width: 1440, height: 900 });
await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
// Cookie walls: one selector per consent vendor
for (const sel of ['#onetrust-accept-btn-handler', '.fc-cta-consent', '[aria-label="Accept all"]']) {
const button = await page.$(sel);
if (button) { await button.click(); break; }
}
// Lazy images only load once they are scrolled into view
await page.evaluate(async () => {
for (let y = 0; y < document.body.scrollHeight; y += 600) {
window.scrollTo(0, y);
await new Promise((r) => setTimeout(r, 120));
}
window.scrollTo(0, 0);
});
await page.evaluate(() => document.fonts.ready);
return await page.screenshot({ type: 'png' });
} catch (err) {
// Retry? Restart Chrome? Page someone?
throw err;
} finally {
await page.close();
}
}
The same result, one call
curl "https://app.snap-render.com/v1/screenshot?url=example.com" \
-H "X-API-Key: $SNAPRENDER_KEY" -o page.pngconst png = await snap.capture({ url: 'example.com' });png = snap.capture("example.com")png, err := client.Capture(ctx, "example.com", nil)you: Capture example.com and tell me what changed.
agent: snaprender · take_screenshot { url: "example.com" }
200 OKimage/pngX-Response-Time: 2481 msX-Remaining-Credits: 199
Change a parameter and see what comes back. Every frame is a real capture of tailwindcss.com.
Playing a demo. Click any option to take over.
Request
GET /v1/screenshot?url=tailwindcss.com
Response
200 OK image/png
Put a URL on a schedule and SnapRender captures it hourly, daily or weekly, keeps every version with its SHA-256, compares it with the last one and emails you or calls your endpoint the moment it changes. Set it up in the dashboard, no code needed.
news.ycombinator.com · 02:14
change.detectednews.ycombinator.com · 01:24
8.2% of the page changed
POST your-app.com/hooks/snaprender
X-SnapRender-Event: change.detected
{
"url": "https://news.ycombinator.com/",
"status": "completed",
"changed": true,
"diffPercent": 8.21,
"threshold": 0.5,
"sha256": "5be85efc930dcfc5…",
"capturedAt": "2026-10-07T01:24:00+03:00"
}
change.detectednews.ycombinator.com · 01:49
8.4% of the page changed
POST your-app.com/hooks/snaprender
X-SnapRender-Event: change.detected
{
"url": "https://news.ycombinator.com/",
"status": "completed",
"changed": true,
"diffPercent": 8.361,
"threshold": 0.5,
"sha256": "aea08090fb118d4a…",
"capturedAt": "2026-10-07T01:49:00+03:00"
}
change.detectednews.ycombinator.com · 02:14
6.5% of the page changed
POST your-app.com/hooks/snaprender
X-SnapRender-Event: change.detected
{
"url": "https://news.ycombinator.com/",
"status": "completed",
"changed": true,
"diffPercent": 6.479,
"threshold": 0.5,
"sha256": "bd36b3a89a33c65b…",
"capturedAt": "2026-10-07T02:14:00+03:00"
}
Every shared link gets a picture of the page it points to.
width=1200height=630
Keep thousands of listing images current without a crawler.
batch: 50 URLswebhook
Every client site on desktop and phone, as PDFs, every week.
format=pdfdevice=iphone_15_pro
Rival pricing and landing pages, with a webhook when they move.
schedule: dailychange.detected
Dated, hashed full-page captures of what a page showed.
full_page=truesha256
Your agent sees any page and reads it as markdown.
MCPextract: markdown
Every plan includes every feature. Save 17% with yearly billing, which is two months free.
| Captures a month | Free plan | 2,000 | 10,000 | 50,000 | 200,000 |
|---|---|---|---|---|---|
| SnapRender | 200 | $9 | $29 | $79 | $199 |
| ScreenshotOne | 100 | $17 | $79 | $259 | $859 |
| Urlbox (Hi-Fi) | None | $49 | $67 | $240 | $800 |
| ApiFlash | 100 | $35 | $35 | $180 | Quote |
| CaptureKit | 100 | $16 | $29 | $89 | $1,214 |
| Microlink | 25 a day | $49 | $49 | $90 | $300 |
| htmlcsstoimage | 50 | $24 | $69 | $249 | $749 |
Cheapest published monthly plan that covers each volume, from each vendor's pricing page on October 6 and 7, 2026, in USD. Urlbox lists its Hi-Fi plans; ApiFlash quotes 200,000 a month on request; Microlink stops at its plan's cap. Detailed comparisons
Add the hosted MCP server and Claude, Cursor or Codex can take screenshots and read pages as markdown. There is no key to paste.
Or let your agent set itself up. Paste one prompt; it adds the server, walks you through sign-in and takes a test capture.
Screenshots for AI agentsEvery AI client guide
AI agent? Start here: snap-render.com/llms.txt
$claude mcp add --transport http --scope user snaprender \ https://app.snap-render.com/mcpThen type /mcp, choose snaprender and Authenticate.
Then click Needs authentication under snaprender and sign in.
Choose Allow when VS Code asks to sign in.
$codex mcp add snaprender --url \ https://app.snap-render.com/mcpCodex opens your browser to sign in.
https://app.snap-render.com/mcpCustomize, Connectors, Add custom connector, paste the URL.
No feature tiers. Plans differ only in volume and in how many schedules they keep.
PNG, JPEG, WebP or PDF. Any viewport from 320 to 3840 px, full pages up to 10,000 px, iPhone, Pixel, iPad and MacBook presets, dark mode.
device=iphone_15_pro&full_page=true&dark_mode=true
Consent dialogs removed, ads blocked, lazy images loaded and web fonts waited for. On by default, off per request.
block_cookie_banners=true&block_ads=true
## Built for the modern web. Tailwind is unapologetically modern, and takes advantage of all the latest and greatest CSS features… ## Ship faster and smaller. Tailwind automatically removes all unused CSS…
The same render as markdown, the main article, links or metadata, for your code or your model.
GET /v1/extract?type=markdown
Batches of 50 URLs with a webhook when they finish, schedules, caching for up to 30 days and signed links.
POST /v1/screenshot/batch
99.9% uptime with a public status page, private networks refused, limits in every response, signed webhooks.
GET /health
Node.jsnpm install snaprender
Pythonpip install snaprender
Gogo get github.com/User0856/snaprender-go
MCPhttps://app.snap-render.com/mcp
Official SDKs, a hosted MCP server with 11 tools, an OpenAPI spec, a Postman collection, an n8n node and RapidAPI.
API referenceSDKs and integrationsContent extractionBatch screenshotsHTML to PDF
Send a GET request with the page URL and your API key. SnapRender opens the page in real Chrome, clears cookie walls and ads, waits for images and fonts, and returns the image. One HTTP call, with no browser to run yourself.
Yes. The free plan includes 200 captures a month with every feature, and no credit card. Sign in with Google, GitHub or email and your API key is ready at once.
PNG, JPEG, WebP and PDF, from 320 to 3840 pixels wide, with full-page captures up to 32,768 pixels tall. Device presets cover iPhone, Pixel, iPad and MacBook, and dark_mode=true captures the page in its dark theme.
A fresh capture usually takes 2 to 5 seconds, depending on the page. With caching on, a repeat request for the same page returns in well under a second.
No, by default they are removed before the capture. You can turn either off per request with block_cookie_banners=false or block_ads=false, and hide anything else with a CSS selector.
Yes. Scheduled captures render a page hourly, daily or weekly, keep every capture with its SHA-256, compare it with the previous one, and send an email, a signed change.detected webhook, or both when the share of changed pixels passes your threshold. Set them up in the dashboard or with the API. Every plan includes them; the free plan runs one schedule, daily or weekly.
SnapRender opens pages without your browser session, so it captures public pages, preview deployments included. You can send custom request headers with POST /v1/screenshot. If a site you own shows a security check, one firewall rule lets SnapRender through; the guide is at snap-render.com/docs/allow-snaprender.
Requests return a clear quota message with the date your allowance resets, and nothing is charged automatically. Upgrade from the dashboard whenever you need more, or wait for the next month.
Yes: official SDKs for Node.js, Python and Go. The REST API works from any language, and there is an OpenAPI spec, a Postman collection and an n8n node.
Yes. The hosted MCP server at https://app.snap-render.com/mcp gives Claude, Cursor, Codex, VS Code and other clients 11 tools, including screenshots, device emulation and page content as markdown. You sign in through your browser the first time, so there is no key to paste.
A managed screenshot API. Instead of keeping Chrome, its fonts, memory and consent-dialog workarounds alive yourself, you make one call and get the finished image. The free plan covers most development and small production workloads.
At 2,000 captures a month SnapRender is $9; at 50,000 it is $79; at 200,000 it is $199, about $0.001 a capture. Every feature is on every plan, and annual billing gives two months free. The table on this page compares published prices from other screenshot APIs.
Your free API key is ready in 30 seconds.