Screenshot API

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

Waiting...
// Capture any URL
await stack0.screenshots.captureAndWait({
url: "https://..."
})
1
2
3
4
5
6
7
8
9
10
11
import { Stack0 } from '@stack0/sdk'
const stack0 = new Stack0()
const screenshot = await stack0.screenshots.captureAndWait({
url: 'https://example.com',
fullPage: true,
blockAds: true,
})
// screenshot.imageUrl → 'https://cdn.stack0.io/...'

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

PDF

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: true

Element

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: true

Cookie Banners

Auto-dismiss GDPR consent dialogs

blockCookieBanners: true

Chat Widgets

Hide Intercom, Drift, and live chat popups

blockChatWidgets: true
Before/After comparison
Without blocking
With blocking
const 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: 2

Same page, different devices

Desktop
Tablet
Mobile
// 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: 2000

Click 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 result

Use 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.

<3s

Average capture time

CDN

Global edge delivery

99.9%

API uptime SLA

Pricing

Simple, usage-based pricing

Pay only for what you capture. No per-seat fees, no feature gates.

Screenshots
$1.00/ 1,000 screenshots

High-quality web screenshots with full customization.

All output formats included
Full browser rendering
Content blocking included
Device emulation
Batch processing & webhooks
Response caching
CDN delivery included
Get Started

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.