Website Screenshot & PDF Generator: Full Page & Mobile icon

AI & documents · Live on Apify

Full Page Screenshot and PDF Generator for Many URLs

Make full-page pictures or PDFs of a list of web pages. Cookie banners are closed and lazy images are loaded first. You can pick a phone, tablet or desktop screen.

About $15.01 for 1,000 captures$0.015 per capture + $0.012 per run. Apify bills you, not us.Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Run it on Apify Opens apify.com, the website where our tools run. Sign up free with Google or email, no card needed.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure

What you get, for example

urlhttps://apify.com
finalUrlhttps://apify.com/
statusCode200

How to use it: 3 steps

  1. Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: https://apify.com in Website URLs. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Take full-page screenshots (PNG or JPEG) or PDFs of a list of public web pages. Cookie banners are closed for you, and you can pick a desktop, laptop, tablet, mobile or custom screen. Each page gets one Dataset row with a link to the file, its size, the page title, the HTTP status and a clear error code if something went wrong. No login needed.

  • Waits until the page has loaded (you choose how: load, domcontentloaded, networkidle or a CSS selector).
  • Closes the cookie consent banner. It uses the open-source Autoconsent rules, which know more than 200 consent tools such as OneTrust, Cookiebot, Didomi, Quantcast and Sourcepoint. It clicks "reject" or "save choices" when it can. Anything left is hidden with cosmetic filters.
  • Scrolls down the page so lazy images load, then goes back to the top.
  • Saves a full-page PNG or JPEG, a screenshot of the first screen only, or a PDF.
  • Stores the file in the run's Key-value store and writes one Dataset row with the file link and page details.

Good for

  • Visual archive of your own or competitors' landing pages, every day or week.
  • Mobile and desktop screenshots of the same page, for design and QA checks.
  • PDF copies of articles, policies and terms pages for records.
  • Screenshots for reports, link previews or AI agents that need to "see" a page.
  • Drop-in input for the apify/screenshot-url example Actor: its fields urls, waitUntil, delay, viewportWidth, scrollToBottom, selectorsToHide and proxy are accepted as they are.

Not a good fit

  • Pages behind a login. The Actor does not sign in, does not use your cookies and does not solve CAPTCHAs. A login or "access denied" page is captured as it is, with a warning.
  • Some sites block cloud browsers (for example some big news sites answer HTTP 401 or 403). You get a screenshot of what the site shows, plus a warning with the HTTP status.
  • Very long pages are cut at maxFullPageHeight (15,000 px by default, 30,000 px max) and the row has truncated: true.
  • No video, GIF or animation recording. Animations are stopped before the screenshot.
  • Local and private addresses (localhost, 192.168.x.x, 10.x.x.x and similar) are blocked.

Who uses it

Marketers

Keep a picture archive of your landing pages or rival pages each week.

Designers and QA testers

See the same page on phone and desktop side by side.

Legal and records teams

Save terms and policy pages as PDF for your files.

Price

Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.

What you pay forPriceWhen
Start fee$0.003Charged once per run, one fee per GB of memory. This tool uses 4 GB by default, so $0.012 per run.
Page captured$0.015 (from $0.013 on paid Apify plans)One saved screenshot (PNG or JPEG) or PDF of a web page. Failed, skipped and unprocessed URLs are not charged.
Extra wait$0.006Add-on per captured page when waitFor is networkidle or delayMs is above 0: the browser stays busy for longer. Not charged with default settings.

Examples

  • One capture: about $0.03.
  • 1,000 captures: about $15.01.
  • Every day 100 captures, for 30 days: about $45.36 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 330 captures.

Prices checked on 24 October 2026. See the current price on Apify.

Questions

Does it capture the whole page?

Yes, full page is the main mode. It scrolls down first so images load.

Can I save a page as PDF?

Yes. Choose PDF instead of PNG or JPEG.

Do I pay for broken links?

You pay per saved file. Invalid URLs and unknown domains never open a browser.

Can it capture pages after login?

No. It does not sign in. A login page is saved as it is, with a warning.

Can it screenshot pages that need a login?

No. It does not sign in and does not accept cookies or passwords. Only public pages.

Do I pay for failed URLs?

No. Only saved files are charged, plus the small start fee.

How long are the files kept?

They live in the run's default Key-value store, as long as your Apify plan keeps run storage. Download or copy them if you need them longer.

Is the full page always captured?

Up to maxFullPageHeight. For very long pages with many elements (for example long Wikipedia articles) the Actor makes the browser window as tall as the screenshot instead of scrolling; elements sized to the screen height may then look taller, and the row has a warning.

Can I use it instead of apify/screenshot-url?

Yes for input: its fields are accepted unchanged, within our limits (delay up to 5000 ms, up to 200 URLs). A network-idle waitUntil (their default is often networkidle2) or a delay above 0 adds the extra-wait add-on; use load and no delay for the base price. The output names differ: use url (their startUrl), fileUrl/screenshotUrl (their screenshotUrl) and kvsKey (their screenshotKey).

Details

Step by step on Apify
  1. Open the Input tab.
  2. In Website URLs (urls), keep the prefilled https://apify.com and https://example.com, or paste your own URLs, one per line.
  3. Keep Output format = png and Full page on.
  4. Click Start.
  5. Open the Output tab. The Captures view shows a preview of each screenshot. Click fileUrl to open or download the file.
Use cases
TaskInputYou getKey fieldsNext step
Archive landing pages every weekurls, format: "png"1 PNG per pagefileUrl, takenAt, titleSchedule + webhook, save files to your storage
Check a page on phonesviewport: "mobile"780 px wide PNG (390 px × 2)fileUrl, width, heightCompare with the desktop run
Save articles as PDFformat: "pdf", pdfFormat1 PDF per pagepdfUrl, pdfPages, bytesStore with your documents
Lighter files for many pagesformat: "jpeg", jpegQuality1 JPEG per pagefileUrl, bytesThumbnails, reports
Give an AI agent a "look" at a pageurls, fullPage: false1 screen-sized PNGscreenshotUrl, title, statusCodePass the link to a vision model
Tips for better results
  • Keep the default wait settings. Extra waits cost a little more per page.
  • For 200 URLs, set the run timeout to about 35 minutes.
  • If you used apify/screenshot-url before, you can keep your old input fields.
Limits and good to know
  • Up to 200 URLs per run. Larger lists: split them into several runs
  • About 7–8 full-page screenshots per minute at 4 GB (200 real sites took 26 minutes). 4 GB is the maximum memory; for 200 URLs set the run timeout to about 35 minutes
  • Each page has its own time limit (page load timeout + about 1 minute), so one slow site cannot block the run
  • If at least 3 pages time out or never show waitForSelector, and they are more than a third of the captured pages, the run stops with stopReason: "TOO_MANY_TIMEOUTS" so a list of dead sites or a wrong selector does not run for hours
  • In the same way, 10 or more failed pages of any kind (for example refused connections), when they are more than a third of the captured pages, stop the run with stopReason: "TOO_MANY_FAILURES". Invalid URLs and unknown domains do not count: they never open a browser

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "url": "https://apify.com",
  "finalUrl": "https://apify.com/",
  "status": "success",
  "statusCode": 200,
  "format": "png",
  "fileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/capture-0001-apify.com.png?signature=<signature>",
  "screenshotUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/capture-0001-apify.com.png?signature=<signature>",
  "pdfUrl": null,
  "kvsKey": "capture-0001-apify.com.png",
  "contentType": "image/png",
  "bytes": 1034646,
  "width": 1920,
  "height": 10052,
  "pageHeight": 10052,
  "truncated": false,
  "pdfPages": null,
  "title": "Apify: Marketplace of ready-to-run tools for AI",
  "viewport": "desktop",
  "viewportWidth": 1920,
  "viewportHeight": 1080,
  "deviceScaleFactor": 1,
  "fullPage": true,
  "cookieBanner": { "detected": false, "cmp": null, "handled": false },
  "warnings": [],
  "loadTimeMs": 6638,
  "takenAt": "2026-10-13T12:30:04.076Z",
  "errorCode": null,
  "error": null
}

Use it from code

Actor ID: cliqtomedia/website-screenshot-pdf. You need your Apify API token from Apify Console → Settings → API & Integrations.

Python · apify-client
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/website-screenshot-pdf").call(run_input={
    "urls": [
        "https://apify.com",
        "https://example.com"
    ],
    "format": "png"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
cURL
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~website-screenshot-pdf/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://apify.com", "https://example.com"], "format": "png"}'
LangChain · langchain-apify
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/website-screenshot-pdf")
result = tool.invoke({"run_input": {"urls": ["https://apify.com", "https://example.com"], "format": "png"}})
print(result)

The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.

Data fields (28)
FieldTypeMeaning
urlstringURL as given in the input.
finalUrlstringURL after redirects; null when the page did not load.
statusstringsuccess when a file was saved; failed otherwise (see errorCode).
statusCodeintegerHTTP status of the main page, e.g. 200 or 404.
formatstringOutput format of this run.
fileUrlstringPublic link to the saved file (image or PDF) in the run key-value store.
screenshotUrlstringSame as fileUrl for PNG/JPEG; null for PDF.
pdfUrlstringSame as fileUrl for PDF; null for images.
kvsKeystringKey of the file in the run key-value store, e.g. capture-0001-apify.com.png.
contentTypestringimage/png, image/jpeg or application/pdf.
bytesintegerFile size in bytes.
widthintegerImage width in pixels (CSS width × pixel density); null for PDF.
heightintegerImage height in pixels; null for PDF.
pageHeightintegerFull scrollable page height in CSS pixels at capture time.
truncatedbooleanTrue when a very long page was cut at the maximum height.
pdfPagesintegerNumber of PDF pages; null for images.
titlestringPage <title>.
viewportstringDevice preset: desktop, laptop, tablet, mobile or custom.
viewportWidthintegerViewport width in CSS pixels.
viewportHeightintegerViewport height in CSS pixels.
deviceScaleFactorintegerPixel density used (1 or 2 usually).
fullPagebooleanTrue for a full-page image.
cookieBannerobjectCookie consent handling: detected (pop-up shown), cmp (consent manager name), handled (rejected/closed). Null when hiding is off or the page failed.
warningsarrayNon-fatal notes, e.g. the page was cut or a load event was late.
loadTimeMsintegerTime from navigation start to capture, in milliseconds.
takenAtstringCapture time (ISO 8601, UTC).
errorCodestringINVALID_URL, BLOCKED_URL, DNS_ERROR, CONNECTION_FAILED, NAVIGATION_TIMEOUT, SELECTOR_NOT_FOUND, NOT_A_WEB_PAGE, CAPTURE_FAILED or OUTPUT_TOO_LARGE; null on success.
errorstringPlain-English error message; null on success.
Input settings (22)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Website URLs requiredurlsarray["https://apify.com", "https://example.com"]
Output formatformatstring"png"
Full pagefullPagebooleantrue
Device / viewportviewportstring"desktop"
Custom width (px)viewportWidthinteger1920
Custom height (px)viewportHeightinteger1080
Pixel densitydeviceScaleFactorinteger
Wait untilwaitForstring"load"
Element to wait for (CSS selector)waitForSelectorstring
Extra delay (ms)delayMsinteger0
Page load timeout (s)navigationTimeoutSecsinteger
Scroll to load lazy imagesscrollToLoadLazyContentbooleantrue
Hide cookie bannershideCookieBannersbooleantrue
Block ads and trackersblockAdsbooleanfalse
Hide elements (CSS selectors)hideSelectorsarray
Max full-page height (px)maxFullPageHeightinteger15000
JPEG qualityjpegQualityinteger80
PDF paper sizepdfFormatstring"A4"
PDF landscapepdfLandscapebooleanfalse
PDF background graphicspdfPrintBackgroundbooleantrue
PDF looks like the screenpdfUseScreenMediabooleanfalse
ProxyproxyConfigurationobject

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure