Website Screenshot API: Full-Page PNG, JPEG and PDF Captures avatar

Website Screenshot API: Full-Page PNG, JPEG and PDF Captures

Pricing

from $0.60 / 1,000 screenshots

Go to Apify Store
Website Screenshot API: Full-Page PNG, JPEG and PDF Captures

Website Screenshot API: Full-Page PNG, JPEG and PDF Captures

Capture full-page or viewport screenshots of any public web page as PNG, JPEG or WebP, with an optional A4 PDF. Desktop or mobile width, cookie banners hidden, robots.txt obeyed, and you pay only for each image saved.

Pricing

from $0.60 / 1,000 screenshots

Rating

0.0

(0)

Developer

Rowcraft

Rowcraft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

Take a website screenshot of any public page by giving the actor a list of addresses. It opens each page in a real Chromium browser, waits until the page has settled, hides the cookie banner, and saves a full-page, window-sized or single-element picture as PNG, JPEG or WebP, with an A4 PDF on request. You get one dataset row per picture with the page title, the image size and a direct download link, as JSON, CSV or Excel, and the files themselves in the key-value store of the run.

It is built for the jobs that come back every week: visual archives of competitor pages, pictures of landing pages for reports and tickets, mobile and desktop previews, thumbnails for a directory, and proof of what a page looked like on a given day. It respects robots.txt, never logs in and never clicks anything on the page, and it charges only for pictures that were actually saved.

Input form of Website Screenshot API: Full-Page PNG, JPEG and PDF Captures

What you get

One row per saved screenshot:

  • The page: the address you gave, the address after redirects, the HTTP status and the page title
  • The picture: format, width and height in pixels, size in bytes, and screenshotUrl, a download link to the file in the key-value store of the run
  • How it was taken: full page or not, desktop or mobile view, the CSS selector if you captured one element, and truncated when a very tall page was cut at 16,000 pixels
  • The PDF (optional): pdfUrl, a link to an A4 PDF of the same page, included in the price of the screenshot
  • Timing: how many milliseconds the capture took and when it was taken

The run also writes a COVERAGE record with one line per address you asked for (ok, blocked, robots_disallowed, not_found, timeout, error or not_checked, with the reason) and a RUN_SUMMARY with the counts, the average capture time, the browser version and any warnings.

Why this actor

  • Pay for pictures, not attempts. A page that times out, answers with an anti-bot page, returns an HTTP error or is refused by robots.txt is listed in COVERAGE and costs nothing. So do duplicates and invalid entries.
  • Clean pictures by default. Common cookie banners and consent pop-ups are hidden with CSS before the capture, tracking and analytics scripts are not loaded (images, fonts and styles are), and lazy images are scrolled into view so a long page is not full of blank boxes.
  • One input for every shape. Full page, the window only, or one element picked by a CSS selector; desktop or phone; 1x to 3x pixel ratio; PNG, JPEG or WebP; an optional PDF.
  • Polite by design. robots.txt is read for every site (and for every redirect target) before the page is opened, requests to the same site are spaced out, and the visit carries a user agent that names Rowcraft so site owners can recognise it.
  • Fast. One browser per run, a fresh isolated context for each page, two pages at a time by default. In our test runs a typical page took two to four seconds.
  • Built for schedules. Turn on Only new addresses and a scheduled run captures only the addresses it has not delivered before; a webhook tells you when it finishes.

How to use it

  1. Open the Actor and fill in Website URLs (the other fields are optional filters).
  2. Set Maximum screenshots to a small number for a first try (the default is a safe start).
  3. Click Start. The status line shows progress; the run stops cleanly at your limit or at the charge limit you set in the run options.
  4. Open the Dataset tab and download JSON, CSV, Excel, XML or HTML, or send the rows to Google Sheets, Slack, Make, n8n or Zapier with the Integrations tab.
  5. To run it on a schedule, use Schedules in Apify Console and turn on Only new rows since the last run below: every run then costs only the new rows, and a webhook URL tells you when something new came in.

For the first try keep the list short. The picture of each address is in the key-value store of the run, under the key that ends .png, .jpg or .webp (and .pdf); the same link is in the screenshotUrl and pdfUrl columns of the dataset.

Input

FieldWhat it does
urlsPages to capture, one per line: a full address (https://example.com/pricing) or a domain (example.com). Up to 100,000 per run.
formatpng (lossless, default), jpeg or webp.
fullPageCapture the whole scrollable page (default on) or only the window. Pages taller than 16,000 px are cut at that height.
width, heightWindow size in pixels. Default 1280 x 800 on desktop, 390 x 844 on mobile.
mobileOpen the page as a phone: touch device, mobile Chrome user agent, 390 px wide unless you set a width.
deviceScaleFactorPixel ratio 1 to 3. Use 2 for retina-sharp pictures; the file has 4 times the pixels.
quality1 to 100 for JPEG and WebP (default 80).
selectorA CSS selector: only the first matching visible element is captured.
pdfAlso save an A4 PDF of the page (up to 50 pages).
delayMsExtra wait after the page has loaded, for late animations or widgets.
timeoutMsLongest time to let a page load (default 20 s).
hideCookieBannersHide the common consent banners with CSS (default on). Nothing is clicked.
scrollToLoadScroll through a full-page capture once so lazy images appear (default on).
maxItemsStop after this many saved screenshots. 0 = the whole list.
onlyNew, stateNameCapture only addresses not delivered in an earlier run with the same state name.
notifyUrl, notifyWhenEmptyA webhook that receives one message when the run ends; see Automation below.
maxConcurrencyPages open at the same time, 1 to 4 (default 2).
requestIntervalMsPause between page loads to the same site, default 1000 ms, minimum 250 ms.

Example: three pages as full-page PNG files.

{
"urls": ["https://example.com", "https://www.wikipedia.org", "https://developer.mozilla.org"]
}

Example: phone previews as small JPEG files, with a PDF of each page.

{
"urls": ["https://www.python.org", "https://nodejs.org"],
"mobile": true,
"format": "jpeg",
"quality": 70,
"pdf": true
}

Example: only the infobox of three articles, as WebP.

{
"urls": ["https://en.wikipedia.org/wiki/France", "https://en.wikipedia.org/wiki/Germany"],
"selector": ".infobox",
"format": "webp"
}

Output

18 fields per row. Empty values are null, never missing, so CSV and Excel columns are stable.

FieldTypeExample
idstringhttps://developer.mozilla.org/
urlstringhttps://developer.mozilla.org/
finalUrlstringhttps://developer.mozilla.org/en-US/
statusCodeinteger200
titlestringMDN Web Docs
widthinteger1280
heightinteger3232
formatstringpng
bytesinteger470323
fullPagebooleanTrue
mobileViewbooleanFalse
selectorstringCSS selector of the element captured, or null
truncatedbooleanFalse
screenshotUrlstringhttps://api.apify.com/v2/key-value-stores/abc123/records/screenshot…
pdfUrlstringDownload link of the PDF, or null when no PDF was asked for or it failed
tookMsinteger3390
capturedAtstring2026-10-17T08:16:43.973Z
errorstringProblem with an extra output (for example the PDF) when the picture itself was saved, else null

Example rows

Two real rows from a run (long texts shortened here, complete in the dataset):

[
{
"id": "https://developer.mozilla.org/",
"url": "https://developer.mozilla.org/",
"finalUrl": "https://developer.mozilla.org/en-US/",
"statusCode": 200,
"title": "MDN Web Docs",
"width": 1280,
"height": 3232,
"format": "png",
"bytes": 470323,
"fullPage": true,
"mobileView": false,
"selector": null,
"truncated": false,
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/ecc3ab23-88c3-4df1-a99b-aae57e923bd7/records/screenshot-630a82fd-developer-mozilla-org.png",
"pdfUrl": "https://api.apify.com/v2/key-value-stores/ecc3ab23-88c3-4df1-a99b-aae57e923bd7/records/screenshot-630a82fd-developer-mozilla-org.pdf",
"tookMs": 3926,
"capturedAt": "2026-10-17T08:26:34.041Z",
"error": null
},
{
"id": "https://www.wikipedia.org/",
"url": "https://www.wikipedia.org/",
"finalUrl": "https://www.wikipedia.org/",
"statusCode": 200,
"title": "Wikipedia",
"width": 390,
"height": 1580,
"format": "jpeg",
"bytes": 78182,
"fullPage": true,
"mobileView": true,
"selector": null,
"truncated": false,
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/f41fb955-8406-42ec-a30c-728f79ebcfc4/records/screenshot-72e64cab-wikipedia-org.jpg",
"pdfUrl": null,
"tookMs": 2542,
"capturedAt": "2026-10-17T08:26:37.673Z",
"error": null
}
]

Results can be downloaded as JSON, CSV, Excel, XML or HTML from the Dataset tab, or read through the Apify API.

Results of Website Screenshot API: Full-Page PNG, JPEG and PDF Captures in the Apify dataset view

Pricing

Pay per result. You pay for each screenshot saved and delivered to your dataset, nothing else: no subscription, no minimum, no charge for pages that could not be captured (timeout, anti-bot page, robots.txt, HTTP errors), for invalid or repeated entries, or for addresses skipped by Only new addresses. The PDF of a page is included in the price of its screenshot.

Your Apify planPrice per 1,000 rowsPrice per row
Free plan$0.80$0.0008
Starter plan$0.70$0.0007
Scale plan$0.65$0.00065
Business plan and above$0.60$0.0006

Example: 1,000 screenshots cost $0.80 on the Free plan and $0.60 on the Business plan. A start event of $0.00005 is charged once per run (Apify default).

Platform usage is separate and is not small for a browser. Apify bills the compute and storage of every run on top of the price per screenshot. This actor runs a Chromium browser in 1,024 MB. As an estimate, not a promise, expect about $0.10 to $0.40 of platform usage per 1,000 screenshots at two to four seconds each, depending on how heavy the pages are and on your plan; the Usage of each run in Console shows the real figure. Turning off the PDF, using JPEG or WebP for long pages, and leaving maxConcurrency at 2 keep it low.

Cap your spend: set Maximum total charge in the run options. The actor stops cleanly when the cap is reached and you keep everything delivered until then. The run summary (RUN_SUMMARY in the key-value store) says why a run stopped.

Automation: only new addresses, notifications, schedules

Only new addresses since the last run. Turn on onlyNew and the actor remembers every address it delivered to you (in a key-value store named rowcraft-website-screenshot-api-state in your Apify account). The next run with the same stateName skips those addresses and you pay only for new ones. It remembers the address, not the settings: if you change the width, the format or the selector and want fresh pictures of the same pages, use a different stateName. The first run captures everything it can. Use a different stateName for each list or schedule so they keep separate memories.

Notification when the run ends. Put a webhook address in notifyUrl and the actor sends one JSON POST with the number of delivered screenshots, links to the dataset (JSON and CSV) and the run. It works with Slack and Discord incoming webhooks (the message is in text and content), with Make, n8n and Zapier catch hooks, and with your own endpoint. By default it is sent only when at least one screenshot was saved; notifyWhenEmpty sends it every time.

Schedules. Create a schedule in Apify Console (hourly, daily, weekly or cron). For a visual archive of pages that must be photographed again every time, leave onlyNew off and the schedule produces a fresh set of pictures each run; for a growing list of pages where each should be captured once, turn it on.

Integrations. Send the rows, with their image links, to Make, n8n, Zapier, Google Sheets, Slack, Google Drive, Airtable or any webhook from the Integrations tab of the Actor, with no code.

API, SDKs and AI agents. Every run is available through the Apify API and the official JavaScript and Python clients. A call can wait for the run and read the dataset, then download each screenshotUrl. The Actor can also be called by AI agents through the Apify MCP server. The example input in the API tab is a working call.

Use cases

  • Visual archive of competitor pages: a weekly schedule over their pricing and landing pages gives you a dated picture of every change, in the same width every time.
  • Reports and tickets: drop the screenshotUrl into a report, an issue or a client update instead of pasting browser screenshots by hand.
  • Mobile and desktop previews: run the same list twice, once with mobile on, and compare how a page looks on a phone and on a laptop.
  • Thumbnails for a directory or a catalogue: a window-sized JPEG of each site, with a quality setting that keeps the files small.
  • Evidence of a page's state: the picture, the title, the status code and the capture time in one row.
  • One block of a page: a pricing table, a chart or a product card, captured alone with a CSS selector.
  • Printable copies: the optional A4 PDF of a page for records.

Ready-made examples, each with the input filled in (open one and press Start, or save it as your own task):

What this actor does not do

  • Log in, fill in forms or click: pages behind a login, a paywall or a pop-up that must be accepted show what any new visitor sees. The cookie banner is hidden, never accepted.
  • Solve CAPTCHAs or get around anti-bot protection: a page that answers with a challenge or an access-denied page is reported as blocked and not charged.
  • Use proxies or hide where it runs: every page is opened from the Apify platform's own network.
  • Open private or local addresses: addresses that resolve to a private network (localhost, 10.x, 192.168.x, 169.254.x and similar) are refused on the platform.
  • Wait for a page forever: a page that has not loaded within the page timeout is a timeout, and a page that keeps the network busy is captured after at most ten more seconds.
  • Crawl: it captures the addresses you list, never links found on the pages.
  • Record video, play media or capture a page after scripted steps such as typing in a search box.
  • Read the text or the data of the page: the row holds the title and the picture link, nothing else from the page.

Limits and fair use

  • Pace. Requests to the same site are spaced at least 1,000 ms apart by default (minimum 250 ms); different sites are not delayed. Two pages are open at once by default.
  • Page height. Pictures are at most 16,000 pixels high (at pixel ratio 1; 8,000 page pixels at ratio 2, 5,333 at ratio 3). A taller page is cut there and its row has truncated: true, with a warning in the run summary.
  • Page width. The picture is as wide as the window. Content that sticks out to the right of the window is not included.
  • What is captured is what a visitor sees after the page has settled. The actor waits for the page's load event, then for the network to go quiet for half a second, up to ten seconds, and then for delayMs. Content that appears later, after a long animation or on a user action, needs a longer delayMs or cannot be captured.
  • Sticky and fixed elements (headers, chat buttons) are drawn where the browser puts them: at the top of a full-page picture, or over the content in a window-sized one.
  • Anti-bot pages. Websites behind a bot challenge (Cloudflare, Akamai, DataDome and similar) are reported as blocked and not charged. After 10 blocked pages in a row the run stops and says why in the run summary, because the rest of the list would most likely be blocked too.
  • robots.txt is obeyed for every address the visit touches in the main window, including redirect targets. If robots.txt disallows the address, the page is robots_disallowed; if robots.txt answers with a server error, the page is not opened, as the robots.txt standard (RFC 9309) requires.
  • Memory. The run uses 1,024 MB. Very heavy pages, very tall pages at pixel ratio 3 and more than two pages at a time need more memory: raise it in the run options together with maxConcurrency.
  • Up to 100,000 addresses per run. The run stops two minutes before its timeout with the summary, the coverage and the Only new addresses memory saved.

Data source and licence

There is no third-party data source: the actor opens the addresses you give it and saves what each page shows to a visitor, after checking robots.txt. The pictures belong to the people who made the pages; the actor gives you a copy of what was publicly shown, and whether you may keep, publish or reuse it depends on the page and on the law that applies to you. The rows contain the address, the title, the size of the picture and its link, and nothing else from the page.

The browser is Chromium, driven with Playwright. Rowcraft is independent and not affiliated with or endorsed by the makers of Chromium or Playwright, or by the websites the actor opens. The visit identifies itself with a Chrome user agent that ends with Rowcraft-Screenshot/1.0 (+https://apify.com/rowcraft); robots.txt is read under the product token rowcraft.

Privacy: no personal data

Rowcraft actors are built not to collect personal data:

  • The rows hold no names, e-mail addresses, phone numbers or other fields about people. An e-mail address or phone number inside a page title is removed from the row.
  • The picture is a different matter: it shows whatever the page shows to every visitor, which can include names or photos that the page's owner published. You choose the pages, so you are responsible for what you capture and keep.
  • Each page is opened in a fresh browser context with no cookies, no login and no stored data, and the context is deleted after the capture.
  • The actor sends no form data, stores nothing about the pages outside your run and your own Only new addresses memory, and does not open private network addresses.

Other Rowcraft actors

All Rowcraft actors read official or public sources, deliver flat rows without personal data and support only-new runs and notifications:

FAQ

How much does it cost? $0.80 per 1,000 screenshots on the Free plan and $0.60 on the Business plan, only for pictures that were saved (see Pricing). Apify bills the platform usage of the run separately; set a maximum total charge in the run options to cap a run.

Why is my screenshot blank or missing content? The page was captured as it stood after its load event and a short quiet period. If the page builds itself slowly with scripts, raise delayMs (try 2000 to 5000). If images are missing, keep scrollToLoad on for full-page pictures. If the picture shows an error or a challenge page, look at the row's statusCode and at the COVERAGE record. Pages that need a login or a click to show content cannot be captured.

Why is there a cookie banner in my screenshot, or why is something hidden that should be there? Hiding works by CSS for the common consent platforms and for elements whose id or class names say cookie banner or consent banner. A banner with an unusual name stays visible; set hideCookieBanners to false and use selector or a different page address if it is in the way. In rare cases a page element with "cookie-consent" in its class name is real content and is hidden with the banners; turn the option off for that page.

How long are the files kept? In the default key-value store of the run, which Apify keeps for the retention period of unnamed storages (7 days at the time of writing; the Apify documentation has the current figure). Download the files you need, or copy them to your own storage or cloud bucket, before then. The dataset rows follow the same retention.

Who can open the download links? The links in screenshotUrl and pdfUrl point to files in the run's key-value store. On the Apify platform they carry a signature, so they open without logging in for as long as the files exist; the same files are listed in the Storage tab of the run.

Why is the result empty? Every address in the list could not be captured, or was skipped. The COVERAGE record gives the reason per address: an anti-bot page (blocked), robots.txt (robots_disallowed), no website or an HTTP 404 (not_found), a page that did not load in time (timeout), an invalid entry or another problem (error). With Only new addresses on, addresses delivered in an earlier run are skipped. Nothing is charged for any of those, apart from the start event.

Is it legal? The actor opens public pages as any visitor's browser would, obeys robots.txt, never logs in and does not collect personal data in its rows. Whether and how you may use a picture of a page (for example in a publication or for marketing) depends on the page's owner and on the law that applies to you.

Does it collect personal data? No personal data in the rows: no names, e-mail addresses or phone numbers. A picture can show what the page shows, so choose pages with care. See the Privacy section.

Do I pay for pages that fail? No. Timeouts, blocked pages, robots.txt refusals, HTTP errors, a selector that matches nothing, invalid entries and duplicates are never charged. A row exists only when the picture was saved. If a PDF was asked for and fails while the picture succeeds, you get the row with pdfUrl empty and the reason in error, and you pay for the picture.

Can I capture a phone view? Yes: turn on mobile. The window is 390 pixels wide unless you set width, the page sees a touch device and a mobile Chrome user agent, and many sites then serve their mobile layout.

Can I capture only a part of a page? Yes: give a CSS selector in selector. The first visible match is captured on its own. If nothing visible matches within three seconds the address is reported as an error and not charged.

What is the maximum size of a picture? 16,000 pixels in height at pixel ratio 1, and as wide as the window (up to 3,840 pixels). A taller page is cut and marked truncated.

How does Only new addresses work here? The actor remembers the addresses it delivered to you. The next run with the same state name skips them, so a list that grows over time costs only the new pages. It does not compare the pages' content; to photograph the same pages again, leave the option off or change the state name.

Why do some sites return a blocked page? Sites that use bot protection often refuse automated browsers, from any provider. The actor does not try to get around that: the page is reported as blocked and is not charged.

Support and reviews

Problems, missing fields, questions: open an issue on the Issues tab of this Actor. We answer within one working day and fix confirmed bugs in the next release; the changelog lists every change.

If this Actor saved you time, a short review on its page helps other users find it and helps us keep improving it.