Pixel-perfect screenshots
of any webpage
Full browser rendering with ad blocking, dark mode, and device emulation. One API call to capture any URL as PNG, JPEG, WebP, or PDF.
$1.00 / 1,000 screenshots • Plans start at $5/month
Output formats
PNG, JPEG, WebP, or PDF
Choose the format that fits your use case. Control quality, compression, and dimensions.
PNG
Lossless quality, perfect for UI captures
Best for: UI screenshots, documentation
JPEG
Smaller files with quality control
Best for: Photos, large pages
WebP
Modern format, best compression
Best for: Web delivery, og:image
Full documents, multi-page
Best for: Reports, archiving
Format options
await stack0.screenshots.captureAndWait({
url: 'https://example.com',
format: 'webp', // png | jpeg | webp | pdf
quality: 90, // 1-100 for jpeg/webp
width: 1200, // Custom width
height: 630, // Custom height (og:image size)
})Capture modes
Viewport, full page, element, or region
Capture exactly what you need. The visible viewport, entire scrollable page, a specific element, or a custom region.
Viewport
Capture visible browser area
format: 'png'Full Page
Entire scrollable page
fullPage: trueElement
Specific CSS selector
selector: '#hero'Region
Custom x, y, width, height
clip: { x: 0, y: 0, width: 800, height: 600 }Capture a specific element
// Capture just the hero section
const hero = await stack0.screenshots.captureAndWait({
url: 'https://example.com',
selector: '#hero-section',
format: 'png',
})
// Capture full scrollable page
const fullPage = await stack0.screenshots.captureAndWait({
url: 'https://example.com/pricing',
fullPage: true,
format: 'png',
})Content blocking
Clean screenshots without the noise
Automatically block ads, cookie consent banners, and chat widgets. Get clean captures without distractions.
Advertisements
Remove banner ads, popups, and ad networks
blockAds: trueCookie Banners
Auto-dismiss GDPR consent dialogs
blockCookieBanners: trueChat Widgets
Hide Intercom, Drift, and live chat popups
blockChatWidgets: trueconst clean = await stack0.screenshots.captureAndWait({
url: 'https://news.ycombinator.com',
blockAds: true,
blockCookieBanners: true,
blockChatWidgets: true,
})Device emulation
Desktop, tablet, or mobile
Capture how your page looks on any device. Built-in presets or custom viewport dimensions with Retina support.
Desktop
1280 × 720
deviceType: 'desktop'Tablet
768 × 1024
deviceType: 'tablet'Mobile
375 × 667
deviceType: 'mobile'Custom Viewport
Any size from 320×240 to 3840×2160 with 1-3× scale factor
width: 1200, height: 630, deviceScaleFactor: 2Same page, different devices
// Mobile screenshot with Retina resolution
const mobile = await stack0.screenshots.captureAndWait({
url: 'https://example.com',
deviceType: 'mobile',
deviceScaleFactor: 2, // Retina
format: 'webp',
})Dynamic content
Wait for content. Click elements. Inject code.
Handle SPAs, lazy-loaded content, and interactive pages. Wait for selectors, click buttons, and inject custom CSS or JavaScript.
Wait Conditions
Wait for specific elements to appear or a timeout before capturing
waitForSelector: '.chart-loaded'waitForTimeout: 2000Click Before Capture
Click a button or link to reveal content before taking the screenshot
clickSelector: '.show-more-btn'Code Injection
Inject custom CSS or JavaScript before capturing (up to 10KB)
customCss: '.banner { display: none }'customJs: 'document.body...'Wait for dynamic content
// Wait for chart to render, then capture
const dashboard = await stack0.screenshots.captureAndWait({
url: 'https://example.com/dashboard',
waitForSelector: '.chart-loaded',
waitForTimeout: 2000,
fullPage: true,
})
// Click to expand, then capture
const expanded = await stack0.screenshots.captureAndWait({
url: 'https://example.com/faq',
clickSelector: '.expand-all',
waitForTimeout: 500,
})Customization
Dark mode. Custom CSS. Hidden elements.
Render pages in dark mode, inject custom styles, or hide specific elements before capture.
Dark Mode Rendering
Force dark mode rendering using prefers-color-scheme emulation. Perfect for apps that respect system preferences.
const dark = await stack0.screenshots.captureAndWait({
url: 'https://example.com',
darkMode: true,
format: 'png',
})Custom CSS & Hide Elements
Inject custom styles to tweak appearance or hide distracting elements by selector.
const styled = await stack0.screenshots.captureAndWait({
url: 'https://example.com',
customCss: '.promo-banner { display: none; }',
hideSelectors: ['.popup', '.newsletter-modal'],
})Batch processing
Capture hundreds of URLs at once
Process multiple URLs in parallel. Get webhook notifications when jobs complete. Cache results to avoid redundant captures.
Batch Capture
Pass an array of URLs with shared configuration. Results are processed in parallel.
const batch = await stack0.screenshots.batchAndWait({
urls: [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
],
config: {
format: 'png',
fullPage: true,
blockAds: true,
},
})
batch.results.forEach(r => console.log(r.imageUrl))Async with Webhooks
Start capture and receive a webhook when complete. Perfect for background processing.
// Start capture (returns immediately)
const { id } = await stack0.screenshots.capture({
url: 'https://example.com',
webhookUrl: 'https://yourapp.com/webhook',
webhookSecret: 'your-secret',
})
// Webhook receives:
{
event: 'screenshot.completed',
data: {
id: 'scr_abc123',
imageUrl: 'https://cdn.stack0.dev/...',
processingTimeMs: 2340,
}
}Response Caching
Cache screenshots by key with custom TTL. Avoid redundant captures for static or slow-changing pages.
const cached = await stack0.screenshots.captureAndWait({
url: 'https://example.com',
cacheKey: 'homepage-v1',
cacheTtl: 3600, // Cache for 1 hour
})
// Subsequent calls with same cacheKey return cached resultUse cases
Built for real applications
og:image Generation
Generate social preview images for blog posts, product pages, and dynamic content. Perfect for Twitter cards and Open Graph.
Blog platforms, e-commerce, SaaS dashboards
Visual Regression Testing
Capture UI states before and after deployments. Integrate with your CI/CD pipeline to catch visual bugs.
QA automation, design systems, component libraries
Link Preview Thumbnails
Show website previews in your app. Generate thumbnails for bookmarks, link aggregators, and content feeds.
Notion, Slack, link shorteners
Documentation Screenshots
Keep documentation in sync with live products. Auto-update screenshots when UI changes.
API docs, help centers, tutorials
Website Archiving
Capture point-in-time snapshots for compliance, legal records, or competitive analysis.
Legal teams, compliance, research
PDF Reports
Convert dashboards, reports, and data visualizations to print-ready PDFs.
Analytics dashboards, invoices, certificates
Performance
Fast captures. Global delivery.
Average capture time
Global edge delivery
API uptime SLA
Pricing
Simple, usage-based pricing
Pay only for what you capture. No per-seat fees, no feature gates.
High-quality web screenshots with full customization.
Plans start at $5/month. No long-term contracts.
Start capturing in minutes
One API call to capture any webpage. Full browser rendering with content blocking, device emulation, and multiple formats.