Fast Website Screenshot — full-page, pay only on success
Pricing
from $5.00 / 1,000 screenshots
Fast Website Screenshot — full-page, pay only on success
Full-page website screenshots that actually capture the full page. Fails fast instead of hanging, and only charges for screenshots that succeed.
Pricing
from $5.00 / 1,000 screenshots
Rating
0.0
(0)
Developer
Tit Slobodjanac
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Fast Website Screenshot
Full-page website screenshots that capture the whole page — fast, and you only pay for screenshots that actually come back.
Give it a URL, get a PNG, JPEG, WebP or PDF. No API key, no browser infrastructure to run.
Why this one
Most screenshot tools fail in the same four ways. This one is built around not doing that.
The full page really is the full page. Long pages are scrolled first so lazy-loaded images render, and sticky headers are pinned in place so your navigation bar isn't stamped down the image every 900 pixels. "Full page" that silently stops at the fold is the single most common complaint about screenshot tools, and it's the first thing this fixes.
It's quick, and the numbers below are real. Most pages finish in a couple of seconds. Very tall pages take longer, because time is dominated by encoding the image, and that scales with pixel count — so the honest range is seconds for ordinary pages, tens of seconds for the extremes. Measured on the Apify platform at default settings:
| Page | Page height | Captured | Time |
|---|---|---|---|
| news.ycombinator.com | 1,185 px | 1,185 px | 1.3 s |
| apify.com | 9,578 px | 9,578 px | 4.4 s |
| stripe.com | 14,759 px | 14,759 px | 11–27 s |
| en.wikipedia.org/wiki/Slovenia | 48,273 px | 20,000 px (capped) | 17.6 s |
Trackers, video and audio are skipped to save time. Images and web fonts are always loaded — blocking fonts would be faster still, but the screenshot would come back in fallback typefaces and no longer match the real page.
It fails fast, and failures are free. The per-page timeout (60 s by default) is a budget for the whole page, not for each internal step, so a slow page cannot quietly run several times longer than the limit you set. If a page won't render, the run moves on instead of hanging — and you are not charged for a screenshot that didn't happen. Every failed URL is written to the dataset with the reason.
Very long pages are capped, and the output says so. Encoding an unbounded capture of a 48,000 px article takes minutes, so captures stop at maxPageHeight (20,000 px by default, about 22 screens — set 0 to disable). Every record reports pageHeight, capturedHeight and clipped, read back from the encoded image itself, so you always know whether you got the whole page.
Cookie banners are out of the way. Common consent notices are hidden before capture. Note that they are hidden, never accepted — no consent is given on your behalf.
Input
{"urls": ["https://apify.com", "https://news.ycombinator.com"],"format": "png","fullPage": true,"viewportWidth": 1440,"deviceScaleFactor": 2,"hideCookieBanners": true}
| Option | Default | What it does |
|---|---|---|
urls | — | One or more URLs to capture |
format | png | png, jpeg, webp or pdf |
fullPage | true | Whole scrollable page vs. just the viewport |
viewportWidth / viewportHeight | 1440 × 900 | Browser window size |
deviceScaleFactor | 1 | Set to 2 for retina-resolution output |
hideCookieBanners | true | Hide common consent notices |
freezeStickyElements | true | Stop fixed headers repeating down the image |
scrollToLoadLazyImages | true | Scroll first so lazy images load |
hideSelectors | [] | Extra CSS selectors to remove (chat widgets, popups) |
waitForSelector | — | Wait for a specific element before capturing |
waitUntil | load | domcontentloaded (fastest) → networkidle (slowest) |
delayMs | 0 | Extra pause for animations |
timeoutSecs | 60 | Hard budget for the whole page, not per step |
maxPageHeight | 20000 | Cap for extremely long pages; 0 for no limit |
blockResources | true | Skip trackers, video and audio (images and fonts always load) |
concurrency | 4 | Pages captured in parallel |
proxyConfiguration | — | Optional, for geo-specific rendering |
Output
Images land in the key-value store. The dataset gets one row per URL:
{"url": "https://apify.com","success": true,"key": "screenshot-0001.png","imageUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/screenshot-0001.png","bytes": 835410,"durationMs": 4353,"title": "Apify: The largest marketplace of trusted tools for AI","httpStatus": 200,"pageWidth": 1454,"pageHeight": 9578,"capturedHeight": 9578,"clipped": false,"timings": { "goto": 968, "scroll": 1095, "freezeSticky": 43, "fonts": 38, "render": 1357 }}
capturedHeight is read back out of the encoded image rather than copied from what was requested, so clipped: false is a measurement, not a promise. timings breaks the duration down by phase, which makes a slow page diagnosable instead of mysterious.
Failures appear in the same dataset with "success": false and an error field, so a partial run is still useful.
Good for
- Visual change monitoring — schedule it and diff the images
- Link previews and Open Graph thumbnails
- Archiving pages as PDF
- Design and competitor reference shots
- QA across viewport sizes
Run locally
npm installPW_CHROME=/usr/bin/google-chrome-stable node test/local-run.js https://example.com
Deploy with the Apify CLI:
npx apify-cli loginnpx apify-cli push
Pricing
$5.00 per 1,000 screenshots — half a cent each, charged only for screenshots that actually come back. A URL that fails costs you nothing, and platform usage is included, so the price you see is the price you pay.
There is one exception worth stating plainly rather than hiding: starting a run costs $0.00001, one thousandth of a cent, which works out to a single cent per thousand runs. It exists because defining that event waives the first five seconds of container startup, and that saving is what keeps the per-screenshot price this low.