{
  "data": {
    "id": "ugu5kWKeaoli71PqF",
    "actId": "oG0Mque4wwAd1e4EK",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-05T12:28:33.565Z",
    "finishedAt": "2026-11-05T12:29:19.262Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 45602,
      "runTimeSecs": 45.602,
      "computeUnits": 0.05066888888888889,
      "imageSizeBytes": 3230755328
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Screenshot URL Input\",\n  \"description\": \"Capture complete full-page screenshots or PDFs of any list of URLs. The actor scrolls lazy content, waits for images and fonts, removes fixed headers and consent overlays, and reports blocks and truncation honestly.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"urls\": {\n      \"title\": \"URLs to capture\",\n      \"type\": \"array\",\n      \"description\": \"Web pages to capture. Each item can be a URL object or a plain URL string. Bare domains such as example.com are accepted and use https.\",\n      \"editor\": \"requestListSources\",\n      \"prefill\": [\n        {\n          \"url\": \"https://www.apify.com/\"\n        }\n      ]\n    },\n    \"format\": {\n      \"title\": \"Output format\",\n      \"type\": \"string\",\n      \"description\": \"PNG is lossless, JPEG and WebP are smaller, PDF produces a printable document. WebP conversion uses Pillow after the browser capture.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"png\",\n        \"jpeg\",\n        \"webp\",\n        \"pdf\"\n      ],\n      \"enumTitles\": [\n        \"PNG image\",\n        \"JPEG image\",\n        \"WebP image\",\n        \"PDF document\"\n      ],\n      \"default\": \"png\",\n      \"prefill\": \"png\"\n    },\n    \"quality\": {\n      \"title\": \"Image quality\",\n      \"type\": \"integer\",\n      \"description\": \"Quality for JPEG and WebP output (1-100). Ignored for PNG and PDF.\",\n      \"default\": 85,\n      \"prefill\": 85,\n      \"minimum\": 1,\n      \"maximum\": 100\n    },\n    \"fullPage\": {\n      \"title\": \"Capture the whole page\",\n      \"type\": \"boolean\",\n      \"description\": \"Capture the full scrollable page. Turn off to capture only the visible viewport. A selector overrides this option.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"selector\": {\n      \"title\": \"Capture one element\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Optional CSS selector. When set, captures only that element and ignores fullPage. Example: main, #pricing, article.\"\n    },\n    \"device\": {\n      \"title\": \"Device\",\n      \"type\": \"string\",\n      \"description\": \"Device preset. Custom uses the viewport width, height and scale factor below. Presets emulate a real mobile or desktop browser.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"custom\",\n        \"desktop\",\n        \"desktop_hd\",\n        \"laptop\",\n        \"tablet\",\n        \"ipad\",\n        \"iphone_15\",\n        \"iphone_se\",\n        \"pixel_8\",\n        \"galaxy_s23\"\n      ],\n      \"enumTitles\": [\n        \"Custom viewport\",\n        \"Desktop 1280x1080\",\n        \"Desktop HD 1920x1080\",\n        \"Laptop 1366x768\",\n        \"Tablet 768x1024\",\n        \"iPad 1024x1366\",\n        \"iPhone 15\",\n        \"iPhone SE\",\n        \"Pixel 8\",\n        \"Galaxy S23\"\n      ],\n      \"default\": \"custom\",\n      \"prefill\": \"custom\",\n      \"sectionCaption\": \"Device & rendering\",\n      \"sectionDescription\": \"Viewport, scale, color scheme and language for the browser.\"\n    },\n    \"viewportWidth\": {\n      \"title\": \"Viewport width\",\n      \"type\": \"integer\",\n      \"description\": \"Browser viewport width in pixels when Device is Custom.\",\n      \"default\": 1280,\n      \"prefill\": 1280,\n      \"minimum\": 100,\n      \"maximum\": 3840\n    },\n    \"viewportHeight\": {\n      \"title\": \"Viewport height\",\n      \"type\": \"integer\",\n      \"description\": \"Browser viewport height in pixels when Device is Custom.\",\n      \"default\": 1080,\n      \"prefill\": 1080,\n      \"minimum\": 100,\n      \"maximum\": 4320\n    },\n    \"deviceScaleFactor\": {\n      \"title\": \"Device scale factor\",\n      \"type\": \"integer\",\n      \"description\": \"Pixel density for Device=Custom: 1 is standard, 2 is retina, 3 is high-DPI mobile. Device presets use their own scale factor.\",\n      \"default\": 1,\n      \"prefill\": 1,\n      \"minimum\": 1,\n      \"maximum\": 3\n    },\n    \"colorScheme\": {\n      \"title\": \"Color scheme\",\n      \"type\": \"string\",\n      \"description\": \"Request the site's light or dark theme through prefers-color-scheme where the site supports it.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"no-preference\",\n        \"light\",\n        \"dark\"\n      ],\n      \"enumTitles\": [\n        \"Follow the site\",\n        \"Force light\",\n        \"Force dark\"\n      ],\n      \"default\": \"no-preference\",\n      \"prefill\": \"no-preference\"\n    },\n    \"locale\": {\n      \"title\": \"Browser language\",\n      \"type\": \"string\",\n      \"description\": \"Locale used for navigator.language and localized pages.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en-US\",\n        \"en-GB\",\n        \"de-DE\",\n        \"fr-FR\",\n        \"es-ES\",\n        \"it-IT\",\n        \"pt-BR\",\n        \"nl-NL\",\n        \"pl-PL\",\n        \"ru-RU\",\n        \"tr-TR\",\n        \"ar-SA\",\n        \"hi-IN\",\n        \"ja-JP\",\n        \"zh-CN\",\n        \"ko-KR\"\n      ],\n      \"enumTitles\": [\n        \"English (US)\",\n        \"English (UK)\",\n        \"German\",\n        \"French\",\n        \"Spanish\",\n        \"Italian\",\n        \"Portuguese (Brazil)\",\n        \"Dutch\",\n        \"Polish\",\n        \"Russian\",\n        \"Turkish\",\n        \"Arabic\",\n        \"Hindi\",\n        \"Japanese\",\n        \"Chinese (Simplified)\",\n        \"Korean\"\n      ],\n      \"default\": \"en-US\",\n      \"prefill\": \"en-US\"\n    },\n    \"waitUntil\": {\n      \"title\": \"Wait until\",\n      \"type\": \"string\",\n      \"description\": \"Navigation readiness. DOM content loaded is the fastest reliable default; network idle can stall on analytics-heavy sites.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"load\",\n        \"domcontentloaded\",\n        \"networkidle\",\n        \"commit\"\n      ],\n      \"enumTitles\": [\n        \"Page load event\",\n        \"DOM content loaded (recommended)\",\n        \"Network idle (can stall)\",\n        \"Navigation committed\"\n      ],\n      \"default\": \"load\",\n      \"prefill\": \"domcontentloaded\",\n      \"sectionCaption\": \"Loading & timing\",\n      \"sectionDescription\": \"Controls for deciding when the page and its assets are ready.\"\n    },\n    \"waitForSelector\": {\n      \"title\": \"Wait for element\",\n      \"type\": \"string\",\n      \"editor\": \"textfield\",\n      \"description\": \"Optional CSS selector to wait for before capture. Useful for single-page apps. Fails the URL if the element never becomes visible.\"\n    },\n    \"waitForImages\": {\n      \"title\": \"Wait for images\",\n      \"type\": \"boolean\",\n      \"description\": \"Wait up to 5 seconds for images to finish loading after scrolling. Incomplete images are reported in warnings.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"waitForFonts\": {\n      \"title\": \"Wait for fonts\",\n      \"type\": \"boolean\",\n      \"description\": \"Wait up to 5 seconds for web fonts to finish loading.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"delay\": {\n      \"title\": \"Extra delay after load\",\n      \"type\": \"integer\",\n      \"description\": \"Additional milliseconds to wait after navigation before scrolling or capturing.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 600000\n    },\n    \"scrollToBottom\": {\n      \"title\": \"Scroll to load lazy content\",\n      \"type\": \"boolean\",\n      \"description\": \"Scroll through the page in steps to trigger lazy images, infinite-scroll widgets and content-visibility sections before capture.\",\n      \"default\": true,\n      \"prefill\": false,\n      \"sectionCaption\": \"Scrolling & cleanup\",\n      \"sectionDescription\": \"Controls for lazy content, fixed elements and consent overlays.\"\n    },\n    \"maxScrollSteps\": {\n      \"title\": \"Maximum scroll steps\",\n      \"type\": \"integer\",\n      \"description\": \"Stop after this many scroll steps. Prevents infinite-scroll pages from running forever. A cap hit sets truncated=true in the record.\",\n      \"default\": 400,\n      \"prefill\": 400,\n      \"minimum\": 1,\n      \"maximum\": 1000\n    },\n    \"scrollStepPx\": {\n      \"title\": \"Scroll step\",\n      \"type\": \"integer\",\n      \"description\": \"Pixels to scroll per step. Smaller steps trigger more IntersectionObserver content but take longer.\",\n      \"default\": 250,\n      \"prefill\": 250,\n      \"minimum\": 100,\n      \"maximum\": 2000\n    },\n    \"delayAfterScrolling\": {\n      \"title\": \"Delay after scrolling\",\n      \"type\": \"integer\",\n      \"description\": \"Milliseconds to wait after scrolling and before capture. Only used when scrolling is enabled.\",\n      \"default\": 1000,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 600000\n    },\n    \"waitUntilNetworkIdleAfterScroll\": {\n      \"title\": \"Wait for network idle after scrolling\",\n      \"type\": \"boolean\",\n      \"description\": \"After scrolling, wait until the network is idle before capture. Uses the timeout below.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"waitUntilNetworkIdleAfterScrollTimeout\": {\n      \"title\": \"Network idle timeout\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum milliseconds to wait for network idle after scrolling.\",\n      \"default\": 15000,\n      \"prefill\": 1000,\n      \"minimum\": 1000,\n      \"maximum\": 120000\n    },\n    \"hideFixedElements\": {\n      \"title\": \"Hide fixed headers and overlays\",\n      \"type\": \"boolean\",\n      \"description\": \"Hide real fixed headers, full-screen overlays and chat widgets before capture. Sticky content blocks are left in place. Default off because resetting to the top already prevents repeated headers on most pages.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"cookieBannerAction\": {\n      \"title\": \"Consent banners\",\n      \"type\": \"string\",\n      \"description\": \"Hide common cookie and consent overlays, click Accept first, or leave them untouched.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"hide\",\n        \"accept\",\n        \"off\"\n      ],\n      \"enumTitles\": [\n        \"Hide banners (recommended)\",\n        \"Click Accept\",\n        \"Leave banners\"\n      ],\n      \"default\": \"hide\",\n      \"prefill\": \"hide\"\n    },\n    \"selectorsToHide\": {\n      \"title\": \"Additional CSS selectors to hide\",\n      \"type\": \"string\",\n      \"editor\": \"textarea\",\n      \"description\": \"Comma or newline separated CSS selectors for extra elements to hide before capture. Example: .newsletter-popup, #chat-widget\"\n    },\n    \"pdfPageSize\": {\n      \"title\": \"PDF page size\",\n      \"type\": \"string\",\n      \"description\": \"Paper size for PDF output. Web page width preserves the previous 1280 px wide / Letter-height behavior.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"web\",\n        \"a4\",\n        \"letter\",\n        \"legal\",\n        \"a3\",\n        \"a5\",\n        \"tabloid\"\n      ],\n      \"enumTitles\": [\n        \"Web page width (current behavior)\",\n        \"A4\",\n        \"Letter\",\n        \"Legal\",\n        \"A3\",\n        \"A5\",\n        \"Tabloid\"\n      ],\n      \"default\": \"web\",\n      \"prefill\": \"web\",\n      \"sectionCaption\": \"PDF options\",\n      \"sectionDescription\": \"Only used when Output format is PDF.\"\n    },\n    \"pdfLandscape\": {\n      \"title\": \"Landscape PDF\",\n      \"type\": \"boolean\",\n      \"description\": \"Use landscape orientation for PDF pages.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"pdfPrintBackground\": {\n      \"title\": \"Print backgrounds\",\n      \"type\": \"boolean\",\n      \"description\": \"Include CSS backgrounds, colors and images in the PDF.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"pdfFitOnePage\": {\n      \"title\": \"Fit the whole page on one PDF page\",\n      \"type\": \"boolean\",\n      \"description\": \"Create one tall PDF page instead of paginated paper. Overrides the paper height but keeps the selected margins.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"pdfMargin\": {\n      \"title\": \"PDF margin\",\n      \"type\": \"string\",\n      \"description\": \"Page margins for PDF output.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"none\",\n        \"narrow\",\n        \"normal\",\n        \"wide\"\n      ],\n      \"enumTitles\": [\n        \"None\",\n        \"Narrow (0.25 in)\",\n        \"Normal (0.5 in)\",\n        \"Wide (1 in)\"\n      ],\n      \"default\": \"none\",\n      \"prefill\": \"none\"\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Concurrent URLs\",\n      \"type\": \"integer\",\n      \"description\": \"How many URLs to capture in parallel. Keep at 1 for long pages at 2048 MB; higher values need more memory.\",\n      \"default\": 1,\n      \"prefill\": 1,\n      \"minimum\": 1,\n      \"maximum\": 5,\n      \"sectionCaption\": \"Reliability\",\n      \"sectionDescription\": \"Retries, timeouts and page-size limits.\"\n    },\n    \"maxRetries\": {\n      \"title\": \"Retries per URL\",\n      \"type\": \"integer\",\n      \"description\": \"Retry transient navigation failures and block pages. Retries use the AUTO datacenter proxy when no user proxy is configured.\",\n      \"default\": 1,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 5\n    },\n    \"navigationTimeoutSecs\": {\n      \"title\": \"Navigation timeout\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum seconds to wait for navigation and selector readiness per URL.\",\n      \"default\": 60,\n      \"prefill\": 60,\n      \"minimum\": 5,\n      \"maximum\": 300\n    },\n    \"maxPageHeight\": {\n      \"title\": \"Maximum page height\",\n      \"type\": \"integer\",\n      \"description\": \"Clip full-page images at this CSS height. 0 means unlimited. PDFs keep their full document height and ignore this limit. Truncation is reported in the record.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 200000\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy configuration\",\n      \"type\": \"object\",\n      \"editor\": \"proxy\",\n      \"description\": \"Optional proxy override. The actor starts direct and uses an Apify AUTO datacenter proxy only after a real block when this is empty. Residential is never selected automatically.\",\n      \"sectionCaption\": \"Advanced\"\n    }\n  },\n  \"required\": [\n    \"urls\"\n  ]\n}",
    "readme": "# Complete Page Capture - Screenshot & PDF\n\nCapture complete full-page screenshots or PDFs of any URL list. This actor scrolls lazy content into view, waits for images and fonts, removes fixed headers and consent overlays, supports real device emulation, and tells you when a page was blocked or truncated instead of returning a broken image as a success.\n\n## Why this actor\n\n- **Complete captures** - scrolls through the page to trigger lazy images and infinite-scroll widgets, then captures with the page reset to the top.\n- **Clean captures** - can hide fixed headers, overlays and common cookie banners before the shot without deleting sticky content cards.\n- **Honest results** - reports HTTP status, page title, block reason, truncation, image failures and file metadata for every URL.\n- **Real device modes** - desktop, laptop, tablet, iPhone, Pixel and Galaxy presets with the right viewport, user agent, touch support and pixel density.\n- **Useful formats** - PNG, JPEG, WebP and PDF, with PDF paper size, orientation, margins, backgrounds and a one-page mode.\n- **Bulk friendly** - concurrent captures, bounded retries, per-URL timeouts and a hard cap for very long or infinite pages.\n\n## Quick start\n\n```json\n{\n  \"urls\": [\n    {\"url\": \"https://www.apify.com/\"},\n    {\"url\": \"https://en.wikipedia.org/wiki/World_War_II\"}\n  ],\n  \"format\": \"png\",\n  \"device\": \"desktop\",\n  \"scrollToBottom\": true\n}\n```\n\nEvery URL produces one dataset record and one file in the run's key-value store. The `screenshotUrl` field is a public download link; no Apify token is needed to open it.\n\n## Inputs\n\n| Field | Default | What it does |\n|---|---|---|\n| `urls` | - | Required. URL list; accepts URL objects or plain strings. Bare domains use https. |\n| `format` | `png` | `png`, `jpeg`, `webp` or `pdf`. |\n| `quality` | `85` | JPEG/WebP quality, 1-100. |\n| `fullPage` | `true` | Capture the whole scrollable page. Turn off for the first screen only. |\n| `selector` | - | Capture one element by CSS selector instead of the page. |\n| `device` | `custom` | `custom`, `desktop`, `desktop_hd`, `laptop`, `tablet`, `ipad`, `iphone_15`, `iphone_se`, `pixel_8`, `galaxy_s23`. |\n| `viewportWidth` | `1280` | Width for `device=custom`, 100-3840. |\n| `viewportHeight` | `1080` | Height for `device=custom`, 100-4320. |\n| `deviceScaleFactor` | `1` | Pixel density for `device=custom`, 1-3. |\n| `colorScheme` | `no-preference` | `no-preference`, `light` or `dark`. |\n| `locale` | `en-US` | Browser language for localized pages. |\n| `waitUntil` | `load` | `load`, `domcontentloaded`, `networkidle` or `commit`. |\n| `waitForSelector` | - | Wait for a selector to become visible before capture. |\n| `waitForImages` | `true` | Wait up to 5 seconds for images after scrolling. |\n| `waitForFonts` | `true` | Wait up to 5 seconds for web fonts. |\n| `delay` | `0` | Extra milliseconds after navigation. |\n| `scrollToBottom` | `true` | Scroll through the page to trigger lazy content. |\n| `maxScrollSteps` | `400` | Hard scroll-step cap. |\n| `scrollStepPx` | `250` | Pixels per scroll step. |\n| `delayAfterScrolling` | `1000` | Milliseconds to settle after scrolling. |\n| `waitUntilNetworkIdleAfterScroll` | `false` | Wait for network idle after scrolling. |\n| `waitUntilNetworkIdleAfterScrollTimeout` | `15000` | Network-idle timeout in milliseconds. |\n| `hideFixedElements` | `false` | Hide fixed headers, full-screen overlays and chat widgets. Sticky content blocks stay in place. |\n| `cookieBannerAction` | `hide` | `hide`, `accept` or `off`. |\n| `selectorsToHide` | - | Extra comma/newline-separated CSS selectors to hide. |\n| `pdfPageSize` | `web` | `web`, `a4`, `letter`, `legal`, `a3`, `a5` or `tabloid`. |\n| `pdfLandscape` | `false` | Landscape PDF pages. |\n| `pdfPrintBackground` | `true` | Include CSS backgrounds and colors in the PDF. |\n| `pdfFitOnePage` | `false` | One tall PDF page instead of paginated paper. |\n| `pdfMargin` | `none` | `none`, `narrow`, `normal` or `wide`. |\n| `maxConcurrency` | `1` | URLs captured in parallel, 1-5. Use 1 for long pages at 2048 MB. |\n| `maxRetries` | `1` | Retries for transient navigation failures and blocks. |\n| `navigationTimeoutSecs` | `60` | Per-URL navigation and selector timeout. |\n| `maxPageHeight` | `0` | Clip full-page images at this CSS height; 0 is unlimited. PDFs keep their full document height. |\n| `proxyConfiguration` | - | Optional proxy override. The actor starts direct and escalates to an AUTO datacenter proxy only after a real block. |\n\n## Output\n\nEach dataset record contains:\n\n| Field | Meaning |\n|---|---|\n| `startUrl` | URL you submitted. |\n| `url` | Final URL after redirects. |\n| `screenshotUrl` | Public download link for the file. |\n| `screenshotKey` | Key of the file in the run's key-value store. |\n| `format` | `png`, `jpeg`, `webp` or `pdf`. |\n| `status` | `success` for a real stored capture, otherwise `error: ...`. |\n| `timestamp` | ISO-8601 UTC capture time. |\n| `pageTitle` | Page title at capture time. |\n| `httpStatus` | Main document HTTP status. |\n| `contentType` | Main response content type. |\n| `blocked` / `blockReason` | Whether the page was a block, captcha or login wall, and which kind. |\n| `errorType` | Machine-readable error category. |\n| `device`, `viewportWidth`, `viewportHeight`, `deviceScaleFactor`, `colorScheme` | Rendering settings used. |\n| `fullPage`, `selector` | Capture scope. |\n| `imageWidth`, `imageHeight`, `fileSizeBytes` | File dimensions and size. |\n| `pageHeight`, `capturedHeight`, `truncated` | Page height, captured height and whether a cap clipped it. |\n| `pdfPages`, `pdfPageSize` | PDF page count and paper size. |\n| `durationMs`, `imagesTotal`, `imagesFailed`, `retries` | Capture evidence. Image counts cover visible images only; hidden tracking pixels are ignored. |\n| `warnings` | Human-readable notes such as failed images or a hit scroll cap. |\n\nBlocked pages are not stored as screenshots and do not produce a success record. The record says `blocked: true` and `status: error: blocked (...)`, so a challenge page cannot be mistaken for page content.\n\n## Examples\n\n### Mobile screenshot\n\n```json\n{\n  \"urls\": [{\"url\": \"https://stripe.com/\"}],\n  \"device\": \"iphone_15\",\n  \"format\": \"jpeg\",\n  \"quality\": 85\n}\n```\n\n### Full-page, dark PDF\n\n```json\n{\n  \"urls\": [{\"url\": \"https://tailwindcss.com/\"}],\n  \"format\": \"pdf\",\n  \"colorScheme\": \"dark\",\n  \"pdfPageSize\": \"a4\",\n  \"pdfFitOnePage\": true,\n  \"cookieBannerAction\": \"hide\"\n}\n```\n\n### Capture one section\n\n```json\n{\n  \"urls\": [{\"url\": \"https://www.apify.com/\"}],\n  \"selector\": \"main\",\n  \"fullPage\": false,\n  \"format\": \"png\"\n}\n```\n\n## What changed in this revamp\n\n- `scrollToBottom` now defaults to `true` so lazy images are actually loaded.\n- `hideFixedElements` defaults to `false`: resetting to the top already avoids repeated headers on most pages, and this keeps sticky content cards in the image. Turn it on to remove fixed headers/overlays.\n- `cookieBannerAction` now defaults to `hide`.\n- `maxConcurrency` now defaults to `1` for safe 2048 MB memory use; raise it only when you have memory headroom.\n- The `screenshotUrl` field now returns a working public link.\n- `waitUntil=domcontentloaded` is the prefill because `networkidle` can stall on analytics-heavy pages.\n- Pages that return 403/captcha/login walls are reported as blocked errors, not successes.\n\nYou can turn each of these off from the input form.\n\n## Limitations\n\n- Only public, anonymous pages are supported. Login-protected pages are outside this actor's design.\n- Some sites use CAPTCHA or bot defenses that cannot be bypassed. Those URLs are reported as blocked and are not charged as successful captures.\n- Consent banners are handled on a best-effort basis. Hide is more reliable than click-accept; use `selectorsToHide` for a site-specific banner.\n- Some lazy images never load because of the site's own rules or missing assets. Only visible images are counted in `imagesFailed` and listed in `warnings`; hidden tracking pixels and empty placeholders are ignored.\n- Fixed headers are kept by default. Enable `hideFixedElements` to remove fixed headers, full-screen overlays and chat widgets; sticky content cards are intentionally preserved.\n- Very long or infinite pages are capped by `maxScrollSteps` and `maxPageHeight`; the record sets `truncated: true` when a cap clips the capture.\n- A direct PDF URL is copied when `format=pdf`; asking for an image of a PDF is reported as an error because Chromium downloads the file instead of rendering it.\n- PDF pagination follows the browser's print layout, which can differ from the screen layout.\n\n## FAQ\n\n**Do I need a proxy?** No. The actor starts with a direct connection and only uses an AUTO datacenter proxy after a real block. If you supply your own proxy, it is used instead.\n\n**Can I capture a page that requires a login?** No. Authenticated pages are intentionally out of scope.\n\n**How do I hide a cookie banner?** Leave `cookieBannerAction` on `hide`. If a site uses a custom banner, add its selector to `selectorsToHide`.\n\n**Why is a page reported as blocked?** The actor saw an HTTP 403/429/451, a CAPTCHA/Cloudflare challenge, or a login wall. The block page is not saved as a normal screenshot.\n\n**Why is my image shorter than the page?** Check `truncated` and `warnings`. `maxPageHeight` or `maxScrollSteps` may have capped the capture.\n\n**Can I capture multiple URLs?** Yes. Each URL produces its own record and file. Keep `maxConcurrency` at 1 for very long pages at 2048 MB; use a larger memory setting before raising concurrency.\n\n**Can I make a single-page PDF?** Set `format=pdf` and `pdfFitOnePage=true`. For paper output, choose `pdfPageSize` and `pdfMargin`.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "full-page-website-screenshot-and-pdf-capture",
      "title": "Complete Page Capture - Screenshot & PDF",
      "description": "Capture complete full-page screenshots or PDFs of any URL list. Scrolls lazy content, waits for images and fonts, removes fixed headers and consent overlays, emulates real devices, and reports blocks and truncation instead of returning a broken image.",
      "version": "1.0",
      "buildTag": "latest",
      "input": {
        "title": "Screenshot URL Input",
        "description": "Capture complete full-page screenshots or PDFs of any list of URLs. The actor scrolls lazy content, waits for images and fonts, removes fixed headers and consent overlays, and reports blocks and truncation honestly.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "urls": {
            "title": "URLs to capture",
            "type": "array",
            "description": "Web pages to capture. Each item can be a URL object or a plain URL string. Bare domains such as example.com are accepted and use https.",
            "editor": "requestListSources",
            "prefill": [
              {
                "url": "https://www.apify.com/"
              }
            ]
          },
          "format": {
            "title": "Output format",
            "type": "string",
            "description": "PNG is lossless, JPEG and WebP are smaller, PDF produces a printable document. WebP conversion uses Pillow after the browser capture.",
            "editor": "select",
            "enum": [
              "png",
              "jpeg",
              "webp",
              "pdf"
            ],
            "enumTitles": [
              "PNG image",
              "JPEG image",
              "WebP image",
              "PDF document"
            ],
            "default": "png",
            "prefill": "png"
          },
          "quality": {
            "title": "Image quality",
            "type": "integer",
            "description": "Quality for JPEG and WebP output (1-100). Ignored for PNG and PDF.",
            "default": 85,
            "prefill": 85,
            "minimum": 1,
            "maximum": 100
          },
          "fullPage": {
            "title": "Capture the whole page",
            "type": "boolean",
            "description": "Capture the full scrollable page. Turn off to capture only the visible viewport. A selector overrides this option.",
            "default": true,
            "prefill": true
          },
          "selector": {
            "title": "Capture one element",
            "type": "string",
            "editor": "textfield",
            "description": "Optional CSS selector. When set, captures only that element and ignores fullPage. Example: main, #pricing, article."
          },
          "device": {
            "title": "Device",
            "type": "string",
            "description": "Device preset. Custom uses the viewport width, height and scale factor below. Presets emulate a real mobile or desktop browser.",
            "editor": "select",
            "enum": [
              "custom",
              "desktop",
              "desktop_hd",
              "laptop",
              "tablet",
              "ipad",
              "iphone_15",
              "iphone_se",
              "pixel_8",
              "galaxy_s23"
            ],
            "enumTitles": [
              "Custom viewport",
              "Desktop 1280x1080",
              "Desktop HD 1920x1080",
              "Laptop 1366x768",
              "Tablet 768x1024",
              "iPad 1024x1366",
              "iPhone 15",
              "iPhone SE",
              "Pixel 8",
              "Galaxy S23"
            ],
            "default": "custom",
            "prefill": "custom",
            "sectionCaption": "Device & rendering",
            "sectionDescription": "Viewport, scale, color scheme and language for the browser."
          },
          "viewportWidth": {
            "title": "Viewport width",
            "type": "integer",
            "description": "Browser viewport width in pixels when Device is Custom.",
            "default": 1280,
            "prefill": 1280,
            "minimum": 100,
            "maximum": 3840
          },
          "viewportHeight": {
            "title": "Viewport height",
            "type": "integer",
            "description": "Browser viewport height in pixels when Device is Custom.",
            "default": 1080,
            "prefill": 1080,
            "minimum": 100,
            "maximum": 4320
          },
          "deviceScaleFactor": {
            "title": "Device scale factor",
            "type": "integer",
            "description": "Pixel density for Device=Custom: 1 is standard, 2 is retina, 3 is high-DPI mobile. Device presets use their own scale factor.",
            "default": 1,
            "prefill": 1,
            "minimum": 1,
            "maximum": 3
          },
          "colorScheme": {
            "title": "Color scheme",
            "type": "string",
            "description": "Request the site's light or dark theme through prefers-color-scheme where the site supports it.",
            "editor": "select",
            "enum": [
              "no-preference",
              "light",
              "dark"
            ],
            "enumTitles": [
              "Follow the site",
              "Force light",
              "Force dark"
            ],
            "default": "no-preference",
            "prefill": "no-preference"
          },
          "locale": {
            "title": "Browser language",
            "type": "string",
            "description": "Locale used for navigator.language and localized pages.",
            "editor": "select",
            "enum": [
              "en-US",
              "en-GB",
              "de-DE",
              "fr-FR",
              "es-ES",
              "it-IT",
              "pt-BR",
              "nl-NL",
              "pl-PL",
              "ru-RU",
              "tr-TR",
              "ar-SA",
              "hi-IN",
              "ja-JP",
              "zh-CN",
              "ko-KR"
            ],
            "enumTitles": [
              "English (US)",
              "English (UK)",
              "German",
              "French",
              "Spanish",
              "Italian",
              "Portuguese (Brazil)",
              "Dutch",
              "Polish",
              "Russian",
              "Turkish",
              "Arabic",
              "Hindi",
              "Japanese",
              "Chinese (Simplified)",
              "Korean"
            ],
            "default": "en-US",
            "prefill": "en-US"
          },
          "waitUntil": {
            "title": "Wait until",
            "type": "string",
            "description": "Navigation readiness. DOM content loaded is the fastest reliable default; network idle can stall on analytics-heavy sites.",
            "editor": "select",
            "enum": [
              "load",
              "domcontentloaded",
              "networkidle",
              "commit"
            ],
            "enumTitles": [
              "Page load event",
              "DOM content loaded (recommended)",
              "Network idle (can stall)",
              "Navigation committed"
            ],
            "default": "load",
            "prefill": "domcontentloaded",
            "sectionCaption": "Loading & timing",
            "sectionDescription": "Controls for deciding when the page and its assets are ready."
          },
          "waitForSelector": {
            "title": "Wait for element",
            "type": "string",
            "editor": "textfield",
            "description": "Optional CSS selector to wait for before capture. Useful for single-page apps. Fails the URL if the element never becomes visible."
          },
          "waitForImages": {
            "title": "Wait for images",
            "type": "boolean",
            "description": "Wait up to 5 seconds for images to finish loading after scrolling. Incomplete images are reported in warnings.",
            "default": true,
            "prefill": false
          },
          "waitForFonts": {
            "title": "Wait for fonts",
            "type": "boolean",
            "description": "Wait up to 5 seconds for web fonts to finish loading.",
            "default": true,
            "prefill": true
          },
          "delay": {
            "title": "Extra delay after load",
            "type": "integer",
            "description": "Additional milliseconds to wait after navigation before scrolling or capturing.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 600000
          },
          "scrollToBottom": {
            "title": "Scroll to load lazy content",
            "type": "boolean",
            "description": "Scroll through the page in steps to trigger lazy images, infinite-scroll widgets and content-visibility sections before capture.",
            "default": true,
            "prefill": false,
            "sectionCaption": "Scrolling & cleanup",
            "sectionDescription": "Controls for lazy content, fixed elements and consent overlays."
          },
          "maxScrollSteps": {
            "title": "Maximum scroll steps",
            "type": "integer",
            "description": "Stop after this many scroll steps. Prevents infinite-scroll pages from running forever. A cap hit sets truncated=true in the record.",
            "default": 400,
            "prefill": 400,
            "minimum": 1,
            "maximum": 1000
          },
          "scrollStepPx": {
            "title": "Scroll step",
            "type": "integer",
            "description": "Pixels to scroll per step. Smaller steps trigger more IntersectionObserver content but take longer.",
            "default": 250,
            "prefill": 250,
            "minimum": 100,
            "maximum": 2000
          },
          "delayAfterScrolling": {
            "title": "Delay after scrolling",
            "type": "integer",
            "description": "Milliseconds to wait after scrolling and before capture. Only used when scrolling is enabled.",
            "default": 1000,
            "prefill": 0,
            "minimum": 0,
            "maximum": 600000
          },
          "waitUntilNetworkIdleAfterScroll": {
            "title": "Wait for network idle after scrolling",
            "type": "boolean",
            "description": "After scrolling, wait until the network is idle before capture. Uses the timeout below.",
            "default": false,
            "prefill": false
          },
          "waitUntilNetworkIdleAfterScrollTimeout": {
            "title": "Network idle timeout",
            "type": "integer",
            "description": "Maximum milliseconds to wait for network idle after scrolling.",
            "default": 15000,
            "prefill": 1000,
            "minimum": 1000,
            "maximum": 120000
          },
          "hideFixedElements": {
            "title": "Hide fixed headers and overlays",
            "type": "boolean",
            "description": "Hide real fixed headers, full-screen overlays and chat widgets before capture. Sticky content blocks are left in place. Default off because resetting to the top already prevents repeated headers on most pages.",
            "default": false,
            "prefill": false
          },
          "cookieBannerAction": {
            "title": "Consent banners",
            "type": "string",
            "description": "Hide common cookie and consent overlays, click Accept first, or leave them untouched.",
            "editor": "select",
            "enum": [
              "hide",
              "accept",
              "off"
            ],
            "enumTitles": [
              "Hide banners (recommended)",
              "Click Accept",
              "Leave banners"
            ],
            "default": "hide",
            "prefill": "hide"
          },
          "selectorsToHide": {
            "title": "Additional CSS selectors to hide",
            "type": "string",
            "editor": "textarea",
            "description": "Comma or newline separated CSS selectors for extra elements to hide before capture. Example: .newsletter-popup, #chat-widget"
          },
          "pdfPageSize": {
            "title": "PDF page size",
            "type": "string",
            "description": "Paper size for PDF output. Web page width preserves the previous 1280 px wide / Letter-height behavior.",
            "editor": "select",
            "enum": [
              "web",
              "a4",
              "letter",
              "legal",
              "a3",
              "a5",
              "tabloid"
            ],
            "enumTitles": [
              "Web page width (current behavior)",
              "A4",
              "Letter",
              "Legal",
              "A3",
              "A5",
              "Tabloid"
            ],
            "default": "web",
            "prefill": "web",
            "sectionCaption": "PDF options",
            "sectionDescription": "Only used when Output format is PDF."
          },
          "pdfLandscape": {
            "title": "Landscape PDF",
            "type": "boolean",
            "description": "Use landscape orientation for PDF pages.",
            "default": false,
            "prefill": false
          },
          "pdfPrintBackground": {
            "title": "Print backgrounds",
            "type": "boolean",
            "description": "Include CSS backgrounds, colors and images in the PDF.",
            "default": true,
            "prefill": true
          },
          "pdfFitOnePage": {
            "title": "Fit the whole page on one PDF page",
            "type": "boolean",
            "description": "Create one tall PDF page instead of paginated paper. Overrides the paper height but keeps the selected margins.",
            "default": false,
            "prefill": false
          },
          "pdfMargin": {
            "title": "PDF margin",
            "type": "string",
            "description": "Page margins for PDF output.",
            "editor": "select",
            "enum": [
              "none",
              "narrow",
              "normal",
              "wide"
            ],
            "enumTitles": [
              "None",
              "Narrow (0.25 in)",
              "Normal (0.5 in)",
              "Wide (1 in)"
            ],
            "default": "none",
            "prefill": "none"
          },
          "maxConcurrency": {
            "title": "Concurrent URLs",
            "type": "integer",
            "description": "How many URLs to capture in parallel. Keep at 1 for long pages at 2048 MB; higher values need more memory.",
            "default": 1,
            "prefill": 1,
            "minimum": 1,
            "maximum": 5,
            "sectionCaption": "Reliability",
            "sectionDescription": "Retries, timeouts and page-size limits."
          },
          "maxRetries": {
            "title": "Retries per URL",
            "type": "integer",
            "description": "Retry transient navigation failures and block pages. Retries use the AUTO datacenter proxy when no user proxy is configured.",
            "default": 1,
            "prefill": 0,
            "minimum": 0,
            "maximum": 5
          },
          "navigationTimeoutSecs": {
            "title": "Navigation timeout",
            "type": "integer",
            "description": "Maximum seconds to wait for navigation and selector readiness per URL.",
            "default": 60,
            "prefill": 60,
            "minimum": 5,
            "maximum": 300
          },
          "maxPageHeight": {
            "title": "Maximum page height",
            "type": "integer",
            "description": "Clip full-page images at this CSS height. 0 means unlimited. PDFs keep their full document height and ignore this limit. Truncation is reported in the record.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 200000
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "editor": "proxy",
            "description": "Optional proxy override. The actor starts direct and uses an Apify AUTO datacenter proxy only after a real block when this is empty. Residential is never selected automatically.",
            "sectionCaption": "Advanced"
          }
        },
        "required": [
          "urls"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Complete Page Capture Output",
        "description": "One record per captured URL, with the file link, page metadata, block/error classification and capture evidence.",
        "properties": {
          "screenshots": {
            "type": "string",
            "title": "Capture results",
            "description": "Dataset containing one result per URL, including status, HTTP status, page title, image dimensions and public file URL.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "screenshotFiles": {
            "type": "string",
            "title": "Capture files",
            "description": "Key-value store containing the PNG, JPEG, WebP or PDF files.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "readme": "# Complete Page Capture - Screenshot & PDF\n\nCapture complete full-page screenshots or PDFs of any URL list. This actor scrolls lazy content into view, waits for images and fonts, removes fixed headers and consent overlays, supports real device emulation, and tells you when a page was blocked or truncated instead of returning a broken image as a success.\n\n## Why this actor\n\n- **Complete captures** - scrolls through the page to trigger lazy images and infinite-scroll widgets, then captures with the page reset to the top.\n- **Clean captures** - can hide fixed headers, overlays and common cookie banners before the shot without deleting sticky content cards.\n- **Honest results** - reports HTTP status, page title, block reason, truncation, image failures and file metadata for every URL.\n- **Real device modes** - desktop, laptop, tablet, iPhone, Pixel and Galaxy presets with the right viewport, user agent, touch support and pixel density.\n- **Useful formats** - PNG, JPEG, WebP and PDF, with PDF paper size, orientation, margins, backgrounds and a one-page mode.\n- **Bulk friendly** - concurrent captures, bounded retries, per-URL timeouts and a hard cap for very long or infinite pages.\n\n## Quick start\n\n```json\n{\n  \"urls\": [\n    {\"url\": \"https://www.apify.com/\"},\n    {\"url\": \"https://en.wikipedia.org/wiki/World_War_II\"}\n  ],\n  \"format\": \"png\",\n  \"device\": \"desktop\",\n  \"scrollToBottom\": true\n}\n```\n\nEvery URL produces one dataset record and one file in the run's key-value store. The `screenshotUrl` field is a public download link; no Apify token is needed to open it.\n\n## Inputs\n\n| Field | Default | What it does |\n|---|---|---|\n| `urls` | - | Required. URL list; accepts URL objects or plain strings. Bare domains use https. |\n| `format` | `png` | `png`, `jpeg`, `webp` or `pdf`. |\n| `quality` | `85` | JPEG/WebP quality, 1-100. |\n| `fullPage` | `true` | Capture the whole scrollable page. Turn off for the first screen only. |\n| `selector` | - | Capture one element by CSS selector instead of the page. |\n| `device` | `custom` | `custom`, `desktop`, `desktop_hd`, `laptop`, `tablet`, `ipad`, `iphone_15`, `iphone_se`, `pixel_8`, `galaxy_s23`. |\n| `viewportWidth` | `1280` | Width for `device=custom`, 100-3840. |\n| `viewportHeight` | `1080` | Height for `device=custom`, 100-4320. |\n| `deviceScaleFactor` | `1` | Pixel density for `device=custom`, 1-3. |\n| `colorScheme` | `no-preference` | `no-preference`, `light` or `dark`. |\n| `locale` | `en-US` | Browser language for localized pages. |\n| `waitUntil` | `load` | `load`, `domcontentloaded`, `networkidle` or `commit`. |\n| `waitForSelector` | - | Wait for a selector to become visible before capture. |\n| `waitForImages` | `true` | Wait up to 5 seconds for images after scrolling. |\n| `waitForFonts` | `true` | Wait up to 5 seconds for web fonts. |\n| `delay` | `0` | Extra milliseconds after navigation. |\n| `scrollToBottom` | `true` | Scroll through the page to trigger lazy content. |\n| `maxScrollSteps` | `400` | Hard scroll-step cap. |\n| `scrollStepPx` | `250` | Pixels per scroll step. |\n| `delayAfterScrolling` | `1000` | Milliseconds to settle after scrolling. |\n| `waitUntilNetworkIdleAfterScroll` | `false` | Wait for network idle after scrolling. |\n| `waitUntilNetworkIdleAfterScrollTimeout` | `15000` | Network-idle timeout in milliseconds. |\n| `hideFixedElements` | `false` | Hide fixed headers, full-screen overlays and chat widgets. Sticky content blocks stay in place. |\n| `cookieBannerAction` | `hide` | `hide`, `accept` or `off`. |\n| `selectorsToHide` | - | Extra comma/newline-separated CSS selectors to hide. |\n| `pdfPageSize` | `web` | `web`, `a4`, `letter`, `legal`, `a3`, `a5` or `tabloid`. |\n| `pdfLandscape` | `false` | Landscape PDF pages. |\n| `pdfPrintBackground` | `true` | Include CSS backgrounds and colors in the PDF. |\n| `pdfFitOnePage` | `false` | One tall PDF page instead of paginated paper. |\n| `pdfMargin` | `none` | `none`, `narrow`, `normal` or `wide`. |\n| `maxConcurrency` | `1` | URLs captured in parallel, 1-5. Use 1 for long pages at 2048 MB. |\n| `maxRetries` | `1` | Retries for transient navigation failures and blocks. |\n| `navigationTimeoutSecs` | `60` | Per-URL navigation and selector timeout. |\n| `maxPageHeight` | `0` | Clip full-page images at this CSS height; 0 is unlimited. PDFs keep their full document height. |\n| `proxyConfiguration` | - | Optional proxy override. The actor starts direct and escalates to an AUTO datacenter proxy only after a real block. |\n\n## Output\n\nEach dataset record contains:\n\n| Field | Meaning |\n|---|---|\n| `startUrl` | URL you submitted. |\n| `url` | Final URL after redirects. |\n| `screenshotUrl` | Public download link for the file. |\n| `screenshotKey` | Key of the file in the run's key-value store. |\n| `format` | `png`, `jpeg`, `webp` or `pdf`. |\n| `status` | `success` for a real stored capture, otherwise `error: ...`. |\n| `timestamp` | ISO-8601 UTC capture time. |\n| `pageTitle` | Page title at capture time. |\n| `httpStatus` | Main document HTTP status. |\n| `contentType` | Main response content type. |\n| `blocked` / `blockReason` | Whether the page was a block, captcha or login wall, and which kind. |\n| `errorType` | Machine-readable error category. |\n| `device`, `viewportWidth`, `viewportHeight`, `deviceScaleFactor`, `colorScheme` | Rendering settings used. |\n| `fullPage`, `selector` | Capture scope. |\n| `imageWidth`, `imageHeight`, `fileSizeBytes` | File dimensions and size. |\n| `pageHeight`, `capturedHeight`, `truncated` | Page height, captured height and whether a cap clipped it. |\n| `pdfPages`, `pdfPageSize` | PDF page count and paper size. |\n| `durationMs`, `imagesTotal`, `imagesFailed`, `retries` | Capture evidence. Image counts cover visible images only; hidden tracking pixels are ignored. |\n| `warnings` | Human-readable notes such as failed images or a hit scroll cap. |\n\nBlocked pages are not stored as screenshots and do not produce a success record. The record says `blocked: true` and `status: error: blocked (...)`, so a challenge page cannot be mistaken for page content.\n\n## Examples\n\n### Mobile screenshot\n\n```json\n{\n  \"urls\": [{\"url\": \"https://stripe.com/\"}],\n  \"device\": \"iphone_15\",\n  \"format\": \"jpeg\",\n  \"quality\": 85\n}\n```\n\n### Full-page, dark PDF\n\n```json\n{\n  \"urls\": [{\"url\": \"https://tailwindcss.com/\"}],\n  \"format\": \"pdf\",\n  \"colorScheme\": \"dark\",\n  \"pdfPageSize\": \"a4\",\n  \"pdfFitOnePage\": true,\n  \"cookieBannerAction\": \"hide\"\n}\n```\n\n### Capture one section\n\n```json\n{\n  \"urls\": [{\"url\": \"https://www.apify.com/\"}],\n  \"selector\": \"main\",\n  \"fullPage\": false,\n  \"format\": \"png\"\n}\n```\n\n## What changed in this revamp\n\n- `scrollToBottom` now defaults to `true` so lazy images are actually loaded.\n- `hideFixedElements` defaults to `false`: resetting to the top already avoids repeated headers on most pages, and this keeps sticky content cards in the image. Turn it on to remove fixed headers/overlays.\n- `cookieBannerAction` now defaults to `hide`.\n- `maxConcurrency` now defaults to `1` for safe 2048 MB memory use; raise it only when you have memory headroom.\n- The `screenshotUrl` field now returns a working public link.\n- `waitUntil=domcontentloaded` is the prefill because `networkidle` can stall on analytics-heavy pages.\n- Pages that return 403/captcha/login walls are reported as blocked errors, not successes.\n\nYou can turn each of these off from the input form.\n\n## Limitations\n\n- Only public, anonymous pages are supported. Login-protected pages are outside this actor's design.\n- Some sites use CAPTCHA or bot defenses that cannot be bypassed. Those URLs are reported as blocked and are not charged as successful captures.\n- Consent banners are handled on a best-effort basis. Hide is more reliable than click-accept; use `selectorsToHide` for a site-specific banner.\n- Some lazy images never load because of the site's own rules or missing assets. Only visible images are counted in `imagesFailed` and listed in `warnings`; hidden tracking pixels and empty placeholders are ignored.\n- Fixed headers are kept by default. Enable `hideFixedElements` to remove fixed headers, full-screen overlays and chat widgets; sticky content cards are intentionally preserved.\n- Very long or infinite pages are capped by `maxScrollSteps` and `maxPageHeight`; the record sets `truncated: true` when a cap clips the capture.\n- A direct PDF URL is copied when `format=pdf`; asking for an image of a PDF is reported as an error because Chromium downloads the file instead of rendering it.\n- PDF pagination follows the browser's print layout, which can differ from the screen layout.\n\n## FAQ\n\n**Do I need a proxy?** No. The actor starts with a direct connection and only uses an AUTO datacenter proxy after a real block. If you supply your own proxy, it is used instead.\n\n**Can I capture a page that requires a login?** No. Authenticated pages are intentionally out of scope.\n\n**How do I hide a cookie banner?** Leave `cookieBannerAction` on `hide`. If a site uses a custom banner, add its selector to `selectorsToHide`.\n\n**Why is a page reported as blocked?** The actor saw an HTTP 403/429/451, a CAPTCHA/Cloudflare challenge, or a login wall. The block page is not saved as a normal screenshot.\n\n**Why is my image shorter than the page?** Check `truncated` and `warnings`. `maxPageHeight` or `maxScrollSteps` may have capped the capture.\n\n**Can I capture multiple URLs?** Yes. Each URL produces its own record and file. Keep `maxConcurrency` at 1 for very long pages at 2048 MB; use a larger memory setting before raising concurrency.\n\n**Can I make a single-page PDF?** Set `format=pdf` and `pdfFitOnePage=true`. For paper output, choose `pdfPageSize` and `pdfMargin`.\n",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Screenshots",
              "transformation": {
                "fields": [
                  "startUrl",
                  "url",
                  "pageTitle",
                  "status",
                  "httpStatus",
                  "blocked",
                  "format",
                  "imageWidth",
                  "imageHeight",
                  "fileSizeBytes",
                  "screenshotUrl",
                  "timestamp"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "startUrl": {
                    "label": "Input URL",
                    "format": "link"
                  },
                  "url": {
                    "label": "Final URL",
                    "format": "link"
                  },
                  "pageTitle": {
                    "label": "Page title",
                    "format": "text"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "httpStatus": {
                    "label": "HTTP",
                    "format": "number"
                  },
                  "blocked": {
                    "label": "Blocked",
                    "format": "text"
                  },
                  "format": {
                    "label": "Format",
                    "format": "text"
                  },
                  "imageWidth": {
                    "label": "Width",
                    "format": "number"
                  },
                  "imageHeight": {
                    "label": "Height",
                    "format": "number"
                  },
                  "fileSizeBytes": {
                    "label": "Bytes",
                    "format": "number"
                  },
                  "screenshotUrl": {
                    "label": "Screenshot",
                    "format": "link"
                  },
                  "timestamp": {
                    "label": "Timestamp",
                    "format": "text"
                  }
                }
              }
            }
          }
        }
      },
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 2048
      }
    },
    "buildNumber": "1.0.2",
    "imageDigest": "d4a706a9fbab48977ad22915a95e947a5225a1cbff452a2fa25e39fbdf94a90f",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.05066888888888889
    }
  }
}