AgentShot avatar

AgentShot

Pricing

from $4.00 / 1,000 screenshot captureds

Go to Apify Store
AgentShot

AgentShot

Screenshot + clean markdown + metadata of a web page in one call, built for AI agents. Full-page, mobile, PDF. Pay only for successful captures.

Pricing

from $4.00 / 1,000 screenshot captureds

Rating

0.0

(0)

Developer

Justin Rooschuz

Justin Rooschuz

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

AgentShot: screenshot + markdown + metadata in one call

AgentShot gives you a screenshot of a web page and, if you ask, the page's main content as clean markdown plus its metadata, all in one dataset row. It's built so AI agents and LLM pipelines can see a page and read it in a single call. It also works as a precise screenshot tool:

  • exact width and height, or the full page with sticky headers shown once
  • mobile presets
  • emoji and CJK fonts
  • cookie banners hidden
  • PNG, JPEG, WebP or PDF

You're only charged for captures that succeed. Failed, blocked, timed-out, invalid or skipped URLs cost nothing, so there's nothing to refund. Charges happen only after the files are saved. The only other charge is Apify's standard run-start fee of $0.00005 per GB of memory ($0.0001 per run at the default 2 GB).

For AI agents (quick start)

Minimal input:

{ "urls": ["https://example.com"], "snapshot": true }

One row per URL (abridged real output from a test run):

{
"url": "https://www.python.org/",
"status": "success",
"title": "Welcome to Python.org",
"finalUrl": "https://www.python.org/",
"httpStatus": 200,
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/0005-www.python.org.jpg",
"metadata": {
"title": "Welcome to Python.org",
"description": "The official home of the Python Programming Language",
"canonical": null,
"language": "en",
"siteName": "Python.org",
"openGraph": { "type": "website", "site_name": "Python.org", "title": "Welcome to Python.org", "image": "https://www.python.org/static/opengraph-icon-200x200.png", "...": "..." },
"twitter": {},
"headings": [{ "level": 2, "text": "Get Started" }, { "level": 2, "text": "Download" }, "..."],
"links": { "total": 227, "internal": 147, "external": 80 },
"images": 1,
"wordCount": 303
},
"contentSource": "article",
"markdown": "# Welcome to Python.org\n\n## Download\n\nPython source code and installers are available for download for all versions! ...",
"markdownChars": 3007,
"markdownTruncated": false,
"markdownUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/0005-www.python.org.md",
"warnings": [],
"chargedEvents": ["screenshot", "snapshot"]
}
  • status is always success or failed. Failed rows carry error and charged: false, so agents can branch on it.
  • markdown is capped by maxMarkdownChars (default 30,000 ≈ 7–8k tokens) to fit a context window. The full text is always available at markdownUrl.
  • contentSource:
    • article means the main content was detected and navigation and boilerplate were dropped.
    • fullPage means all visible text was kept, for pages without a clear main article such as home pages.
  • screenshotUrl is a direct image link that vision models can open.

Use it from an MCP client (Claude, VS Code, Cursor, and others) through Apify's hosted MCP server:

https://mcp.apify.com?tools=roosch/agentshot

Use it from code with one synchronous HTTP call that returns the rows:

curl -X POST "https://api.apify.com/v2/acts/roosch~agentshot/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"urls":["https://example.com"],"snapshot":true}'

Agents without an Apify account can pay on their own through Apify agentic payments: buy a prepaid, spend-capped Apify token with x402 (USDC on Base or Solana) or MPP (stablecoins on Tempo or Solana), or pay per call with Skyfire. AgentShot runs with limited permissions and pay-per-event pricing only, so it works with all three.

Use it from an MCP client (Claude, Cursor, and others)

Add Apify's MCP server with just this Actor loaded:

{
"mcpServers": {
"agentshot": {
"url": "https://mcp.apify.com?tools=roosch/agentshot"
}
}
}

On first connection your browser opens so you can sign in to Apify. To skip sign-in, add "headers": { "Authorization": "Bearer <APIFY_TOKEN>" }. A prepaid token bought through agentic payments works there too.

Your client then gets a tool called roosch--agentshot. The server also adds get-dataset-items, get-key-value-store-record, get-actor-run and abort-actor-run. Example call:

{ "name": "roosch--agentshot", "arguments": { "urls": ["https://example.com"], "snapshot": true } }

The tool returns the run's status and storage details (status, runId, storages.datasets.default.id, the available fields), not the dataset rows. If the run is still running, check get-actor-run until it finishes. Then call get-dataset-items with that dataset ID to get the rows described under "What you get" below: screenshotUrl, markdown, metadata, chargedEvents. Each run is billed at the prices below.

Why this Actor

Frequent requests for screenshot tools, and how this one handles them:

RequestWhat this Actor does
Set the exact image heightExact width and height for viewport shots, plus 10 device presets (iPhone, Pixel, iPad, retina desktop).
Capture only part of a pageCapture just one element with a CSS selector (e.g. #pricing, main), even if it's taller than the screen.
Handle sticky headersFull-page shots are stitched as you'd scroll. Fixed and sticky headers, chat bubbles and bottom bars appear once, not repeated or missing. 100vh hero sections keep their real height.
Render emoji and CJK textShips with Noto Color Emoji and Noto CJK fonts, so 😀, 日本語 and 한국어 render properly.
Wait for the page properlyChoose networkidle, load or domcontentloaded. Busy sites that never go quiet are captured after a capped wait with a warning instead of failing. Optional wait-for-selector and extra delay.
Lazy images missingScrolls through the page first so lazy images and sections load, then waits for images and fonts.
Cookie pop-ups covering the pageHides 30+ common consent tools (OneTrust, Cookiebot, Quantcast, Didomi, Usercentrics, Sourcepoint…) plus anything that looks like a consent overlay, and re-enables scrolling. Nothing is clicked or accepted.
Don't pay for failuresPay per successful screenshot. Failed URLs appear in the dataset with the reason and charged: false.

What you get

For every URL, one row in the dataset:

{
"url": "https://tailwindcss.com/",
"status": "success",
"screenshotUrl": "https://api.apify.com/v2/key-value-stores/<id>/records/0003-tailwindcss.com.jpg",
"pdfUrl": null,
"title": "Tailwind CSS - Rapidly build modern websites without ever leaving your HTML.",
"format": "image/jpeg",
"imageWidth": 1440,
"imageHeight": 10345,
"fullPage": true,
"pageHeight": 10345,
"truncated": false,
"device": "none",
"httpStatus": 200,
"warnings": [],
"chargedEvents": ["screenshot", "full-page"],
"capturedAt": "2026-10-11T18:21:07.000Z"
}

Failed URLs look like { "url": "...", "status": "failed", "error": "Request blocked - received 403 status code.", "charged": false }.

The image (and the PDF, if requested) is saved in the run's key-value store. screenshotUrl links straight to it.

Optional receipt (receipt: true, free). Each successful row gets a receipt with the capture time (UTC), the settings that shaped the capture, and the SHA-256 hash and size of every saved file (screenshot, PDF, markdown). Check a file later with sha256sum. The receipt is written by the run itself; it is not a signed or third-party timestamp.

"receipt": {
"receiptVersion": 1,
"capturedAt": "2026-10-12T20:15:03.412Z",
"url": "https://example.com/",
"finalUrl": "https://example.com/",
"httpStatus": 200,
"settings": { "width": 1280, "height": 800, "devicePreset": "none", "fullPage": false, "format": "png", "waitUntil": "load", "hideCookieBanners": true, "snapshot": false, "proxy": "none" },
"files": [{ "key": "0000-example.com.png", "contentType": "image/png", "bytes": 18734, "sha256": "9f2c…" }],
"run": { "actorId": "…", "runId": "…", "buildNumber": "1.0.5" },
"note": "Self-reported by this Actor run; not a signed or third-party timestamp. Verify a file with: sha256sum <file>."
}

Input example

{
"urls": ["https://stripe.com", "example.com", { "url": "https://www.bbc.co.uk/news" }],
"fullPage": true,
"width": 1440,
"height": 900,
"format": "webp",
"quality": 85,
"hideCookieBanners": true,
"hideSelectors": ["#intercom-container", ".promo-bar"],
"pdf": false
}

Mobile: set "devicePreset": "iphone-15". Element only: set "selector": "#pricing".

Pricing (pay per event)

EventPriceWhen
Screenshot captured$0.004Each successful screenshot (viewport or element)
Full-page add-on$0.004When the successful screenshot is a full-page capture
Agent snapshot add-on$0.002Each successful markdown + metadata extraction (snapshot: true)
PDF generated$0.004Each successful PDF

So 1,000 screenshots cost $4, 1,000 screenshot + snapshot pairs cost $6, and 1,000 full-page screenshots cost $6 (plus the run-start fee above). Failed URLs cost nothing. You can cap any run with Apify's "Max cost per run" setting, and the Actor stops cleanly when it's reached.

Limits and safeguards

These protect you from surprise costs and the sites you capture from overload:

SettingDefaultHard limit
URLs per run (maxUrls)1,00010,000. Extra URLs are skipped, not charged.
Pages per minute (maxRequestsPerMinute)60300
Parallel pages (maxConcurrency)Auto: 2 per GB (4 at 2 GB)10
Retries per URL (maxRetries)13
Page timeout (navigationTimeoutSecs)30 s120 s
Full-page height (maxFullPageHeight)15,000 px30,000 px
File size (maxFileSizeMb)25 MB50 MB. Oversized PNGs are saved as JPEG; anything still larger fails without charge.
Memory2 GB2 to 4 GB
  • Early stop: after 20 URLs, if 80% or more have failed (usually a block or outage), the run stops and the remaining URLs aren't attempted. Turn this off with stopOnHighFailureRate: false.
  • Private networks are blocked: localhost, private IP ranges, cloud metadata addresses and hostnames that resolve to them are refused, including via redirects.
  • Proxies: Apify datacenter proxy or your own proxy URLs. Residential proxy isn't supported.
  • Bad input fails fast with a message saying what to fix, before any page is opened. Out-of-range values are adjusted and logged as warnings.

Tips

  • Infinite-scroll pages: full-page capture stops at maxFullPageHeight (default 15,000 px) and sets truncated: true.
  • Bot-protected sites: some news and retail sites return 403 to cloud servers. Apify datacenter proxy or your own proxy may help, but heavily protected sites will still block. Blocked pages fail without charge. In our tests, 2 of 31 real sites (Daily Mail, New York Times) blocked us without a proxy.
  • Pop-ups that aren't cookie banners (newsletter, sign-in): add their selectors to hideSelectors.
  • WebP is limited to 16,383 px tall. Taller images are saved as PNG automatically, with a warning.
  • Dark mode: darkMode: true sets prefers-color-scheme: dark.

Support and reliability

  • We reply to every issue within 48 hours, usually much sooner. Please use the Issues tab and include the run ID.
  • Daily public canary: every day the Actor's own code captures the same 30 well-known sites, screenshot plus snapshot with no proxy. The success rate, per-site results and a check that no failed URL was charged are published in STATUS.md. Failures are listed too, including sites that block automated browsers.
  • Changelog: every change is listed below and in CHANGELOG.md.

Changelog

  • 1.0 (Oct 2026):
    • Agent snapshot: clean markdown + metadata in the same row (snapshot: true), as its own $0.002 event.
    • Agent-friendly input, dataset and output schemas.
    • Daily canary and STATUS page.
    • 48-hour support promise.
  • 0.2 (Oct 2026):
    • Safeguards: URL cap, rate limit, file-size cap, early stop on mass failure, private-network blocking.
    • Clearer errors.
    • Automatic concurrency.
  • 0.1 (Oct 2026):
    • Stitched full-page capture, device presets, emoji/CJK fonts, consent hiding.
    • Charges only after a successful save.

FAQ

Is it legal? The Actor renders publicly reachable pages the way a browser does. You choose the pages, so you are responsible for having the right to capture them and for how you use the images. That includes site terms, copyright and data-protection law if pages contain personal data. This isn't legal advice.

Is my data kept? Screenshots are stored in your own Apify run storage. They are subject to your Apify data-retention settings and aren't sent anywhere else.

Does it work on every site? No. Some sites block automated browsers, and some layouts (canvas apps, heavy animations, infinite feeds) may not capture perfectly. Failed captures are free, and warnings in each row explain anything unusual.

How good is the markdown? It uses Mozilla's Readability (the engine behind Firefox Reader View) to find the main content, then converts it to GitHub-flavoured markdown with links and tables kept. Pages with no clear article (home pages, app shells) fall back to all visible text. Content drawn on canvas or inside images isn't extracted.

Does it accept cookies or log in? No. Consent banners are hidden visually, never accepted.

Why is a page blank or different from my browser? Some sites serve different content by region, or block data-centre traffic. Try a proxy in the right country, add a waitForSelector, or add a delayMs.