Free tier. No account needed. API key in 5 seconds.
PNG, JPEG, WebP. Full-page. One HTTP call.
Enter any public URL below. We'll screenshot it live using the actual API.
Six powerful features baked into one endpoint. No config files, no deploys.
format=webp.full_page=true to scroll and stitch the whole thing.block_banners=true.custom_css string.wait_for_selector.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")
| Parameter | Type | Default | Description |
|---|---|---|---|
| url | string | required | Full URL to screenshot (must start with http:// or https://) |
| format | string | png | Output format: png, jpeg, jpg, or webp |
| width | integer | 1280 | Viewport width in pixels (max 3840) |
| height | integer | 800 | Viewport height in pixels (max 2160) |
| full_page | boolean | false | Capture full scrollable page height, not just the viewport |
| wait_ms | integer | 0 | Extra wait time in milliseconds after page load (max 10000) |
| wait_for_selector | string | null | CSS selector to wait for before capturing. Useful for SPAs and lazy-loaded content |
| hide_selectors | array | [] | CSS selectors to hide before capture (e.g. [".cookie-banner", "#chat-widget"]) |
| block_ads | boolean | false | Block common ad networks, trackers, and analytics scripts before capture |
| custom_headers | object | {} | HTTP headers to pass to the target URL (e.g. {"Authorization": "Bearer token"}) |
| click | string | null | CSS selector of an element to click before capturing (e.g. close a modal) |
| encoding | string | base64 | Response encoding: base64 (JSON) or binary (raw image bytes) |
| quality | integer | 90 | Image 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.
100 screenshots/month on the free tier. Takes 5 seconds to generate your key.
Already have a key? View your dashboard →
Start free. Pay only when you need more. No hidden fees, no surprise charges, no dark patterns.
From simple previews to complex monitoring pipelines.