# Changelog of AgentShot (`roosch/agentshot`) Actor

- **URL**: https://apify.com/roosch/agentshot/changelog.md
- **Full Actor documentation**: https://apify.com/roosch/agentshot.md

## Changelog

### 1.0 (2026-10-11): AgentShot, agent-first release

#### Added

- **Agent snapshot mode** (`snapshot: true`). Each dataset row now also contains:
  - `metadata`: title, description, canonical, language, siteName, author, publishedTime, robots, favicon, Open Graph and Twitter tags, headings, link counts (total, internal, external), image count and word count.
  - `markdown`: clean GitHub-flavoured markdown of the main content, extracted with Mozilla Readability and converted with Turndown and GFM tables. Hidden elements, including hidden cookie banners, are excluded. Layout tables are flattened, and images are dropped unless `markdownImages` is set.
  - `markdownUrl`: link to the full text. The dataset copy is capped by `maxMarkdownChars` (default 30,000).
  - `contentSource`: `article` or `fullPage`.
  - Priced as its own `snapshot` event at $0.002, charged only when extraction succeeds.
- **Output schema** (`.actor/output_schema.json`), which Apify requires for publishing and agents use to discover outputs.
- Dataset schema `fields` with per-field descriptions, a new "Agent snapshot" view, and `scripts/validate-dataset.mjs` to check rows against the schema.
- **Trust layer:**
  - `scripts/canary.mjs` runs 30 real sites with screenshot + snapshot and writes `STATUS.md`, `status/latest.json` and `status/history.json`, including a "failed URLs charged" check.
  - `ci/canary.workflow.yml` runs it daily and commits the result, once it is copied to `.github/workflows/`.
  - README now has a 48-hour response promise and a changelog.
- Agent-friendly input schema:
  - top-level description with a minimal example
  - `urls` as a plain string list
  - examples in field descriptions
- README now has a quick start for agents (MCP URL, synchronous API call) and agentic-payments notes.

#### Changed

- Renamed to **AgentShot** (`agentshot`). Version 1.0.
- Input schema title now matches the product name (was still "Website Screenshot Pro").
- `urls` description documents string or `{ "url": "..." }` items (product already accepted both; README showed objects).
- Failed navigation errors with Chromium `net::*` codes are rewritten to short agent-friendly messages; already-friendly messages (e.g. 403 blocked) pass through.
- Missing `urls` vs empty `urls` now get distinct validation messages.

### 0.2 (2026-10-11), pre-publication hardening

#### Added

- Input guardrails with defaults and hard caps:
  - `maxUrls`: default 1,000, hard cap 10,000. Extra URLs are skipped and not charged.
  - `maxRequestsPerMinute`: default 60, hard cap 300.
  - `sameDomainDelaySecs`: 0 to 60.
  - `maxFileSizeMb`: default 25, hard cap 50. Oversized PNGs are re-encoded to JPEG; anything still too large fails without charge.
- `stopOnHighFailureRate` circuit breaker, on by default. After 20 URLs, the run stops if 80% or more have failed.
- SSRF protection. Navigations, redirects and sub-resources whose hostname *resolves* to a private, loopback, link-local, CGNAT or unique-local address are blocked. Previously only literal private hostnames and IPs were rejected.
- Helpful validation:
  - Fatal problems fail the run before any page opens, with a message saying what to fix. These are: empty or non-list `urls`, an unknown `devicePreset`, a residential proxy, and oversized `customCss`.
  - Out-of-range or unsupported values are adjusted and logged as warnings.
  - `jpg` is accepted as `jpeg`.
- A graceful `aborting` handler that stops taking new URLs.
- Memory limits in `actor.json`: default and minimum 2048 MB, maximum 4096 MB.
- LICENSE (proprietary), this changelog, `PRE-PUBLISH-CHECKLIST.md` and `ICON.md`.
- Tests for validation, caps, the circuit breaker, private-IP ranges and parity between schema defaults and code defaults.

#### Changed

- Default `maxRetries` is now 1 (was 2), max 3 (was 5). This limits uncharged compute spent on blocked sites.
- `maxConcurrency` now defaults to auto (2 parallel pages per GB of memory, so compute per screenshot stays flat if a user raises memory), max 10 (was a fixed 4, max 20). `navigationTimeoutSecs` max is now 120 (was 180).
- Residential Apify Proxy groups are rejected. Their bandwidth cost ($7–8/GB, paid by the creator under pay-per-event) exceeds the per-screenshot price.
- README honesty pass:
  - Removed "just work", "pixel-accurate" and "any public web page".
  - Stated the only-charged-on-success policy and the run-start fee precisely.
  - Added a limits table and the measured block rate, and made the legal FAQ more careful.

### 0.1 (2026-10-11), first private build

- Viewport, element, stitched full-page and PDF capture.
- Device presets, emoji and CJK fonts, cookie-banner hiding, lazy-load scrolling, and pay-per-event charging only after the file is saved.
