Live · 100 free screenshots/month

URLShot —
Screenshot Any URL
in Milliseconds

Free tier. No account needed. API key in 5 seconds.
PNG, JPEG, WebP. Full-page. One HTTP call.

No credit card 100 free calls/month Works in any language API key in 30 seconds

See it in action

Enter any public URL below. We'll screenshot it live using the actual API.

URLShot Live Demo
Format: Options:
📸
Enter a URL above and click Screenshot →
Capturing screenshot...
Demo is rate-limited to 5 requests/min. Get a free key for 100/month with no limits.

Everything you need, nothing you don't.

Six powerful features baked into one endpoint. No config files, no deploys.

Blazing Fast
Average response under 2 seconds. Pre-warmed browser pool eliminates cold starts. Your users won't wait.
🎨
3 Output Formats
PNG for crisp screenshots, JPEG for compact previews, WebP for the best compression. Set format=webp.
📐
Full-Page Capture
Capture the entire page, not just the viewport. Set full_page=true to scroll and stitch the whole thing.
🚫
Banner Blocking
Auto-hide cookie consent banners, GDPR overlays, and popups before capture. Set block_banners=true.
🎨
Custom CSS Injection
Inject any CSS before the screenshot. Hide elements, override colors, change fonts. Pass a custom_css string.
Wait for Selector
Wait for a specific element to appear before capture. Perfect for SPAs and React apps. Use wait_for_selector.

Dead simple to integrate.

GET or POST. JSON or query params. Works with any HTTP client.

# GET — simplest possible call
curl "https://devtoolsapi.com/v1/screenshot
  ?url=https://github.com
  &key=dta_YOUR_KEY
  &format=png
  &encoding=binary" -o screenshot.png

# POST — full power with options
curl -X POST https://devtoolsapi.com/v1/screenshot \
  -H "Content-Type: application/json" \
  -H "X-API-Key: dta_YOUR_KEY" \
  -d '{
    "url": "https://stripe.com",
    "format": "webp",
    "full_page": true,
    "block_banners": true,
    "wait_ms": 500,
    "encoding": "binary"
  }' -o screenshot.webp

# OG Image — 1200×630, banners blocked by default
curl -X POST https://devtoolsapi.com/v1/og-image \
  -H "Content-Type: application/json" \
  -H "X-API-Key: dta_YOUR_KEY" \
  -d '{"url":"https://example.com","encoding":"binary"}' \
  -o og-image.png
// GET — one-liner
const url = `https://devtoolsapi.com/v1/screenshot?url=${
  encodeURIComponent('https://github.com')}&key=dta_YOUR_KEY&encoding=binary`;
const blob = await (await fetch(url)).blob();

// POST — full options
async function screenshot(targetUrl) {
  const res = await fetch('https://devtoolsapi.com/v1/screenshot', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'dta_YOUR_KEY',
    },
    body: JSON.stringify({
      url: targetUrl,
      format: 'webp',
      full_page: true,
      block_banners: true,
      wait_ms: 500,
    }),
  });
  const { image, duration_ms } = await res.json();
  // image is base64 — use in an <img> tag or decode
  return `data:image/webp;base64,${image}`;
}

// Batch — up to 10 URLs in one call
const { results } = await (await fetch('https://devtoolsapi.com/v1/screenshots/batch', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', 'X-API-Key': 'dta_YOUR_KEY' },
  body: JSON.stringify({ urls: ['https://a.com', 'https://b.com'] }),
})).json();
import requests, base64

API_KEY = "dta_YOUR_KEY"
HEADERS = {"X-API-Key": API_KEY, "Content-Type": "application/json"}

# GET — simple
response = requests.get(
    "https://devtoolsapi.com/v1/screenshot",
    params={"url": "https://github.com", "key": API_KEY, "encoding": "binary"},
    stream=True
)
with open("screenshot.png", "wb") as f:
    f.write(response.content)

# POST — full options
data = requests.post(
    "https://devtoolsapi.com/v1/screenshot",
    json={
        "url": "https://stripe.com",
        "format": "webp",
        "full_page": True,
        "block_banners": True,
        "wait_ms": 500,
        "encoding": "base64",
    },
    headers=HEADERS,
).json()

# Decode base64 and save
img_bytes = base64.b64decode(data["image"])
with open("screenshot.webp", "wb") as f:
    f.write(img_bytes)

print(f"Done in {data['duration_ms']}ms — {data['credits_remaining']} credits left")

All Parameters

Parameter Type Default Description
urlstringrequiredFull URL to screenshot (must start with http:// or https://)
formatstringpngOutput format: png, jpeg, jpg, or webp
widthinteger1280Viewport width in pixels (max 3840)
heightinteger800Viewport height in pixels (max 2160)
full_pagebooleanfalseCapture full scrollable page height, not just the viewport
wait_msinteger0Extra wait time in milliseconds after page load (max 10000)
wait_for_selectorstringnullCSS selector to wait for before capturing. Useful for SPAs and lazy-loaded content
hide_selectorsarray[]CSS selectors to hide before capture (e.g. [".cookie-banner", "#chat-widget"])
block_adsbooleanfalseBlock common ad networks, trackers, and analytics scripts before capture
custom_headersobject{}HTTP headers to pass to the target URL (e.g. {"Authorization": "Bearer token"})
clickstringnullCSS selector of an element to click before capturing (e.g. close a modal)
encodingstringbase64Response encoding: base64 (JSON) or binary (raw image bytes)
qualityinteger90Image quality 1–100. Applies to JPEG and WebP formats only

All POST body parameters also work as GET query string params. Auth: X-API-Key header or ?key= query param.

Start for free. No card needed.

100 screenshots/month on the free tier. Takes 5 seconds to generate your key.

Already have a key? View your dashboard →

Transparent, No-Gimmick Pricing.

Start free. Pay only when you need more. No hidden fees, no surprise charges, no dark patterns.

✓ No credit card to start ✓ Cancel anytime, instantly ✓ No hidden fees, ever ✓ Hit your limit? We stop — no surprise bill
Free
$0/mo
100 screenshots/month
  • PNG, JPEG, WebP formats
  • Full-page capture
  • Custom viewport size
  • Ad & banner blocking
  • Custom wait time
  • 10 req/minute
  • No credit card needed
Get Free Key →
Starter
$7/mo
2,500 screenshots/month
  • Everything in Free
  • Custom headers support
  • Hide elements (CSS selectors)
  • Wait for selector
  • Click before screenshot
  • 30 req/minute
  • Usage dashboard
  • Email support
Get Starter →
Most Popular
Pro
$19/mo
15,000 screenshots/month
  • Everything in Starter
  • Batch endpoint (10 URLs)
  • OG image endpoint (1200×630)
  • PDF generation
  • 60 req/minute
  • Priority support
  • Usage alerts (80% + 100%)
Get Pro →
Business
$49/mo
100,000 screenshots/month
  • Everything in Pro
  • 120 req/minute
  • PDF (all page sizes)
  • Uptime SLA guarantee
  • Dedicated support
  • Bulk usage discounts
Get Business →

What people build with URLShot.

From simple previews to complex monitoring pipelines.

🖼️
OG Image Generation
Auto-generate social share preview cards for articles, products, or any dynamic URL.
🔍
Uptime Monitoring
Visually verify your site looks correct, not just that it returns 200. Catch layout breaks instantly.
📧
Email Thumbnails
Embed live URL previews in newsletters, notifications, and digest emails.
📦
Web Archiving
Snapshot pages at a point in time. Document UI states, capture legal evidence, save receipts.