Screenshots and PDFs of web pages are a common chore: link previews, visual regression checks, archiving a page as evidence, feeding page images to a vision model. Running your own headless browser works, but you end up maintaining Chromium, fonts and timeouts. Here is a small pay-per-result alternative, with the real output of a test run.
I am building Pageframe, an Apify Actor that captures full-page PNG/JPEG screenshots or print-ready PDFs. It costs $0.0015 per successful capture, and failed URLs are not charged.
The input
{ "urls": ["https://example.com"], "format": "png", "fullPage": true, "viewportWidth": 1280, "viewportHeight": 800, "deviceScaleFactor": 1, "blockCookieBanners": true, "delaySec": 0 } Other options: format can be png, jpeg or pdf (with pdfPageFormat A4, A3, Letter or Legal), deviceScaleFactor 2 or 3 gives retina captures, waitForSelector waits for an element before capturing, and blockCookieBanners makes a best-effort click on common consent buttons.
From Python
from apify_client import ApifyClient client = ApifyClient("<YOUR_APIFY_TOKEN>") run = client.actor("siftwright/pageframe-screenshots").call(run_input={ "urls": ["https://example.com"], "format": "png", "fullPage": True, }) for item in client.dataset(run["defaultDatasetId"]).iterate_items(): print(item["url"], item["status"], item["fileUrl"]) From curl
curl -X POST "https://api.apify.com/v2/acts/siftwright~pageframe-screenshots/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \ -H "Content-Type: application/json" \ -d '{"urls":["https://example.com"],"format":"pdf","pdfPageFormat":"A4"}' Real output
This is the dataset item from an actual run on Apify, capturing https://example.com:
{ "url": "https://example.com", "status": "ok", "format": "png", "fileUrl": "https://api.apify.com/v2/key-value-stores/iSfPTldM2Pvavg8Ac/records/capture-1791797595722-zokzr1.png", "sizeBytes": 71152, "durationMs": 289 } The run billed one capture event (plus Apify's tiny per-run start fee). The image itself is stored in the run's key-value store at fileUrl.
Honest limits
- Pages behind a login are not supported.
- Cookie banner dismissal is best-effort; unusual consent widgets may still show.
- Heavy pages that load content late may need
waitForSelectorordelaySec.
Use it from an AI agent
Every Siftwright Actor works through Apify's MCP server, so an agent can call Pageframe as a tool. There is also a free tool page at siftwright.com if you just want to try one capture first.
Feedback or a missing option? Write to support@siftwright.com.