Website Screenshot Generator - Full Page PNG and JPEG avatar

Website Screenshot Generator - Full Page PNG and JPEG

Pricing

from $2.85 / 1,000 screenshot takens

Go to Apify Store
Website Screenshot Generator - Full Page PNG and JPEG

Website Screenshot Generator - Full Page PNG and JPEG

Take screenshots of a list of websites as PNG or JPEG: full page or first screen, width 320 to 2,560 px, retina, dark mode, phone layout. CSS selectors remove cookie banners or capture one element. Each row has the image link, final URL, title and status. $3 per 1,000 screenshots.

Pricing

from $2.85 / 1,000 screenshot takens

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Paste a list of web addresses and get a screenshot of each page, full page or first screen, as PNG or JPEG: plus a row carrying the link to the image, the final URL after redirects, the page title, the HTTP status, the real image dimensions and the file size.

You control what the camera sees: the first screen or the whole page stitched together, any width from 320 to 2,560 pixels, normal or retina density, light or dark, desktop or phone layout. CSS selectors take out the cookie banner and the chat bubble before the shutter fires, or photograph one element on its own.

Worth knowing before the first run. A page that answers 404 or 500 and still renders is a real screenshot and is charged like any other, with statusCode on the row to tell you. A page that refuses to render at all still gets its image stored and handed to you, and that one is not charged.

InputPage addresses, up to 300 per run
OutputOne image per page, and one row per page with its link, final URL, title, status code, dimensions and file size
Ceiling300 pages per run, inside a total image size budget you set
Account neededNone
Price$3.00 per 1,000 screenshots ($0.003 each) on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 1,600

🔍 What Website Screenshot Generator does

It opens each address in a real browser at the size you asked for, waits as long as you told it to, applies your CSS, and takes the picture. Images land in the run's key-value store.

Full-page capture scrolls the page and stitches it into one tall image, up to the height ceiling you set, and marks truncated when it had to cut. Scrolling also happens on request without full-page capture, which is what makes lazy-loaded images below the fold actually appear.

The selector fields do most of the work. removeSelectors takes an element out of the layout, which is the one for cookie banners and pop-ups. hideSelectors makes it invisible but keeps its space, which is right for a sticky header you want gone without everything shifting up. selector narrows the shot to one element.

locale and timezone are passed to the browser, so a site that localises renders in the language and clock you asked for. Duplicate addresses are dropped before anything renders, so a messy list does not cost twice.

📋 What data you get from each screenshot

What you getField
A link to the image, and its name in the key-value storescreenshotUrl, screenshotKey
What you asked for, and where it ended up after redirectsurl, finalUrl
The page title and the main document's status codetitle, statusCode
The real image size, read from the fileimageWidth, imageHeight
How tall the page was, and whether the shot was cutpageHeight, truncated
File size and how long the page tookfileSizeBytes, loadTimeMs
The settings this shot was taken withformat, fullPage, darkMode, deviceScaleFactor, viewportWidth, viewportHeight

▶️ How to take screenshots of a list of websites

  1. Open Website Screenshot Generator and click Try for free.
  2. Put your addresses into Page addresses, one per line.
  3. Set Maximum screenshots low for the first run, so you can check the framing before paying for 300 of them.
  4. Add the cookie banner and chat bubble to Remove these elements. That one change improves more screenshots than any other setting here.
  5. Click Start, then open the rows to see the images, or pull them from the key-value store.

Leave Page addresses empty and you get one sample row showing the shape, with no browser started and nothing charged.

💰 How much does it cost to take a screenshot?

$3.00 per 1,000 screenshots on the Free plan, $2.95 on Starter, $2.90 on Scale and $2.85 on Business. The free plan's $5 a month covers about 1,600.

You pay per image taken. The sample row is not charged, nor are the diagnostics: a page that was refused, had no matching selector, could not be reached, or was skipped once the size budget ran out. A page that rendered is charged whatever its status code says.

Timeouts split two ways. A page that hits navigationTimeoutMs with enough on screen is still captured, and charged like any other. One with nothing usable gets an uncharged NAV_TIMEOUT row.

If you set a maximum charge for a run, it stops taking pictures once that is reached.

📥 What you give it

{
"urls": ["https://example.com", "https://news.ycombinator.com"],
"fullPage": true,
"viewportWidth": 1440,
"format": "jpeg",
"quality": 80,
"removeSelectors": ["#cookie-banner", ".intercom-launcher"],
"maxItems": 10
}
FieldDefaultWhat it is
urlsnone; the box starts with two examplesThe pages, one per line. A bare domain works. Up to 300.
maxItemsthe whole list; the form starts at 10Hard stop on how many pages this run photographs, 1 to 300. An API call that leaves it out photographs the whole list. Keep it low while testing.
fullPagefalseOff gives you exactly the viewport. On scrolls and stitches the whole page.
viewportWidth, viewportHeight1440, 900The browser window. 390 wide is a phone, 1920 a desktop monitor.
deviceScaleFactor12 is retina, 3 is print. Remember 2x is four times the file size.
format, qualityjpeg, 80JPEG is much smaller. PNG is lossless and can carry transparency. Quality applies to JPEG only.
darkMode, mobilefalseAsk the page for its dark theme, and render as a touch phone. Pair mobile with a narrow width.
waitUntildomcontentloadedHow ready the page must be: commit, domcontentloaded, load or networkidle. On an ad-funded page networkidle often waits for the timeout.
delayMs800Extra pause for animations and fonts, up to 15 seconds.
navigationTimeoutMs25000Give up on a page that has not become ready in this long. If enough of the page exists by then, it is still captured.
scrollToBottomfalseScroll first so lazy images load. On automatically with fullPage.
maxFullPageHeight8000Tallest a full-page shot may be before it is cut, up to 20,000 px.
maxTotalImageMb250The run stops once it has written this many megabytes. Pages it never reached are not charged.
selectoremptyA CSS selector to photograph one element instead of the page.
hideSelectors, removeSelectorsemptyUp to 30 selectors each: hide keeps the space, remove takes it out of the layout.
customCssemptyRaw CSS injected just before the shot, up to 4,000 characters.
transparentBackgroundfalsePNG only. Leaves the page background out, for dropping an element into a design.
locale, timezoneen-US, noneA language such as de-DE, and a zone such as Europe/Berlin or America/New_York.
concurrency3Pages rendered at once, 1 to 6. Drop to 1 for a site that objects.
useProxyfalseOptional.
proxyUrlsemptyYour own servers, as http://user:pass@host:port. Only the first entry in the list is used, and it takes precedence over everything else.

📤 What you get back

A real row from a run on 3 October 2026, with the image link cut short. The page was taller than the window, so pageHeight is 1215 while the image, without full-page capture, is 900.

{
"ok": true,
"charged": true,
"recordType": "screenshot",
"url": "https://news.ycombinator.com/",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/.../records/screenshot-002-news.ycombinator.com.jpg?signature=...",
"screenshotKey": "screenshot-002-news.ycombinator.com.jpg",
"finalUrl": "https://news.ycombinator.com/",
"title": "Hacker News",
"statusCode": 200,
"imageWidth": 1440,
"imageHeight": 900,
"format": "jpeg",
"fullPage": false,
"darkMode": false,
"deviceScaleFactor": 1,
"viewportWidth": 1440,
"viewportHeight": 900,
"pageHeight": 1215,
"truncated": false,
"fileSizeBytes": 123695,
"loadTimeMs": 1525,
"scrapedAt": "2026-10-03T00:26:08.195Z"
}
FieldHow to read it
screenshotUrlA direct link to the image in the run's key-value store. Download what you want to keep.
statusCodeThe main document's status. A page that rendered on a 404 says 404 here.
imageWidth, imageHeightRead from the image itself, so this is the real picture size, density included.
pageHeight, truncatedHow tall the document was, and whether the height ceiling cut a full-page shot.
fileSizeBytes, loadTimeMsUseful for spotting the page that is quietly eating your size budget.

🧾 Reading the output

recordType and ok separate the three kinds of row. charged is the flag that marks a real screenshot apart from the sample and the diagnostics; read it as that, not as a receipt.

RowHow to spot itCharged
A screenshotrecordType is screenshot, ok is trueyes
The sample row_sample is trueno
A diagnostic_diagnostic is true, with an errorCodeno

The table view has no errorCode column, so a failed row can look like a thin successful one. A NOT_SERVED row even carries an image. Filter on recordType when you are counting.

CodeWhat it means
NOT_SERVEDThis page was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
NAV_TIMEOUTNothing usable had loaded inside navigationTimeoutMs.
NAV_ABORTEDNot a page the browser can display. A PDF or other file lands here.
DNS_FAILED, CONNECTION_REFUSED, TLS_FAILEDThe address did not resolve, the server refused, or the certificate did not check out.
SELECTOR_NOT_FOUNDYour selector matched nothing on the page.
IMAGE_TOO_LARGEThe picture went past the encoder's ceiling of 16,000 pixels a side.
STORAGE_FAILEDThe image could not be saved.
BUDGET_REACHEDmaxTotalImageMb is spent. One row says so and the pages after it are skipped.
TIME_BUDGETThe run ran out of time before reaching that page.
RENDER_FAILED, RENDERER_CRASHEDThe browser failed on that page. Worth one re-run.
PROXY_INPUT_ADJUSTEDA network option you set was not one this actor uses, so it carried on without it.
CHARGE_ERROR, UNEXPECTED_ERRORSomething went wrong in the run itself. Send us the run ID.

💡 What people use it for

  • Thumbnails for a directory or a link roundup, generated from the list you already have.
  • Before and after shots of a redesign: same width, same settings, two runs.
  • Visual regression checks on a schedule: same pages, same size, compare the images.
  • Capturing one element cleanly, a pricing table or a chart, with a transparent background for a deck.
  • Evidence and archiving, with finalUrl, statusCode and a timestamp on every row.

🚧 What it does not do

  • Nothing behind a login. No cookies, no sign-in, no sessions.
  • 300 pages per run. Split a longer list, or schedule it.
  • The page is frozen once it has painted, so content that arrives very late can be missing.
  • Height and size ceilings. 20,000 pixels of page by your setting, 16,000 pixels a side at the encoder, and the total megabytes you allowed.
  • No PDF output. PNG and JPEG only.
  • No text extraction. For the words on the page, use the crawler linked below.
  • It cannot make a site render. A page that refuses gives you the image of the refusal, free.
  • Only the first entry in your own server list is used.
  • It is not an official tool of any platform or company named on this page. Dami's Studio is independent and is not affiliated with or endorsed by any of them.

🧭 Which site tool do you need?

If you wantUse
Pictures of pagesThis one
The same pages as text, Markdown and chunksWebsite Intelligence Crawler
A site's DNS, certificate, security headers and tech signalsDomain Inspector
What changed on a rival's pricing page or changelog since last weekSaaS Competitor Monitor

❓ Questions people ask

Put its CSS selector into Remove these elements. Open the site, inspect the banner, copy the id or class.

Why is my full-page screenshot cut off?

It hit maxFullPageHeight. The row says truncated: true. Raise the ceiling, but remember an endless feed has no bottom.

Can I screenshot one element?

Yes, with selector. Pair it with PNG and a transparent background to drop it straight into a design.

Where do the images live?

In the run's key-value store, linked from screenshotUrl on every row. Download the ones you want to keep.

Why do two runs of the same page look different?

Fonts, animations and ads settle at different speeds. Raise delayMs, or switch waitUntil to load, and the shots get more repeatable.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/website-screenshot-generator. Either way the run happens on your Apify account at the same price. Send maxItems from code, or the whole list is photographed.

It photographs public pages as a visitor sees them. What you do with the images afterwards is subject to copyright and the site's terms. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the address and the run ID. If a diagnostic row landed, its errorCode and details usually name the reason already.