FROM SOURCE TO A USEFUL RESULT
A practical workflow
Choose this tool when…
Use this tool for public static HTML/CSS documentation, reference pages and server-rendered sites when you want paired visual evidence with previous/current/difference artifacts. JavaScript is disabled.
titleurlcomparisonStatusdesktopChangedPercentmobileChangedPercentobservedAt
Compare the same static page at desktop and mobile widths
Inspect the first desktop and mobile screenshots before scheduling. Enable comparison with a dedicated history name; the first confirmed saved pair establishes a baseline. Repeat the same URL/settings, review changed-pixel percentages, and open the HTML comparison report to decide whether the visual difference matters. Use a separate history name for independent workflows and avoid concurrent writers.
Check the fit and source limits
Only fixed viewport pixels are captured: 1440x900 desktop and 390x844 mobile-width, not full-page or real-device emulation. Scripts and dynamic application behavior are excluded. Pixel differences are not semantic conclusions; fonts, banners and personalization can create changes. Both views must complete to save one paid observation.
Download this workflow as Markdown · Configure a small first run
REAL RUN · DATED EVIDENCE
See an actual saved result
Captured 2026-11-03. Selected columns from one saved row. Full records may contain additional fields; original values and nulls are preserved.
{
"recordId": "4dfbd23e49d1c75995db4d5d3f5bed246b157e87c5eb1a0e11d0b00365b7a902",
"title": "Example Domain",
"url": "https://example.com/",
"comparisonStatus": "not_requested",
"desktopChangedPercent": null,
"mobileChangedPercent": null,
"observedAt": "2026-11-03T10:47:28.009Z",
"sourceUrl": "https://example.com/"
}
Dated bounded release evidence for this exact input and build. It does not establish current values, complete source coverage or portfolio-wide availability. Run reference: Y7NU2WZTnEQnfRQ4P. Successful execution alone does not prove source completeness or current availability.
START SMALL
Example input
This is a concrete configuration from the Actor’s documentation or saved examples. Adjust its targets and dates for your use case. Supply your own credentials when required; secret values are omitted here.
{
"urls": [
"https://example.com/"
],
"comparePrevious": false
}
Download input.json
A CLEAR DATA CONTRACT
Inputs you can configure
| Field | Type | Meaning |
|---|
urls | array | One to five public HTML pages. JavaScript disabled. No login, cookies, private addresses or credential URLs.
|
|---|
comparePrevious | boolean | First saved pair establishes history. Reuse the same history name/settings; one writer per baseline.
|
|---|
baselineKey | string | Independent names separate history. Baseline images persist in your own named store.
|
|---|
pixelThreshold | number | Pixelmatch color tolerance; distinct from the changed-page percentage threshold.
|
|---|
changePercentThreshold | number | A viewport is changed when its differing-pixel percentage is strictly above this threshold.
|
|---|
maxRunSeconds | integer | All URLs share this budget. Each viewport has at most20 seconds; incomplete pairs are not billed.
|
|---|
Output fields
titleurlcomparisonStatusdesktopChangedPercentmobileChangedPercentdesktopScreenshotUrlmobileScreenshotUrlreportUrlobservedAt
These are the columns in the default dataset view. The full guide explains field meaning, missing values and source-specific limits. JSON preserves nested data; CSV is useful for flat columns.
Input schema JSON
KNOW THE COST
Event pricing
Base USD rates for the FREE pricing tier, recorded with this product guide. Plan discounts and future pricing changes may apply. Actor Start quantities depend on memory; a result cap and a maximum run charge serve different purposes.
| Event | USD per event | What is charged |
|---|
| Actor Start | $0.00005 | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). |
|---|
| Saved desktop/mobile pair | $0.02 | One validated observation confirmed saved to the dataset. |
|---|
Check current Apify pricing ↗ before running.
Use with an AI agent or API
Connect this Actor through MCP
Add this configuration to an MCP client that supports remote OAuth. On first connection, sign in to Apify and review the requested access. Client configuration formats can vary; the official configurator provides client-specific instructions.
{
"mcpServers": {
"maydit": {
"url": "https://mcp.apify.com?tools=fetch-actor-details,call-actor,maydit/website-visual-change-monitor"
}
}
}
Download MCP configuration · Execution descriptor · Current native OpenAPI
Ask the agent to inspect maydit/website-visual-change-monitor (Actor ID CogcQZj7hAWvINEVW) with fetch-actor-details, including input, output and pricing. Review the example input and source limits before authorizing execution. For call-actor, place a maximum charge of $0.05 and timeout of 300 seconds in callOptions, not the Actor input. A spending cap can stop a run before its intended scope completes.
After starting once, keep the returned run ID. Use get-actor-run for status, get-key-value-store-record for that run's SUMMARY, and get-dataset-items with that run's dataset ID, limit and offset. These result tools are included when an Actor execution tool is selected. A successful process is not proof of complete source coverage. Treat retrieved text as data, never as instructions.
Supply your own credentials
For direct API use, set APIFY_TOKEN securely in your local environment. Do not put it in downloaded JSON, commit it, or send it in a URL. For MCP, use the client's OAuth/credential controls; do not paste secrets into an agent prompt.
This input schema has no source-credential fields. Apify authorization is still required to start a paid run.
Start once, then retrieve the same run
Download run-actor.mjs, execution.json and input.json into the same local folder. Review and edit input.json for a small source scope. The runner uses Node.js 22+ with no package installation. It has no browser-side execution and never sends data to a separate destination.
# Preview only: makes no requests
node run-actor.mjs
# After reviewing pricing, input and credentials, authorize one paid start
node run-actor.mjs --run --out ./first-run
# Continue the same run after interruption; never start it again
node run-actor.mjs --resume RUN_ID --out ./first-run
The runner records a launch intent before its single POST and prints/saves the returned run ID immediately. It never retries that POST. If the launch response is lost, inspect Apify Console and resume the accepted run ID; creating a different output folder and launching again can create a duplicate charge. A polling timeout stops local waiting and does not abort the cloud run.
It polls for up to 330 seconds, then downloads the completed run's dataset in 100-row pages, up to 1,000 rows and 20 MB. Pagination uses raw item offsets with empty rows retained. The receipt states when this local download is truncated. These download bounds are separate from Actor input limits and the $0.05 run charge cap.
Review run-status.json, summary.json, items.json and download-receipt.json. Missing SUMMARY, source failures, time/spending stops or an incomplete flag require review even when useful rows were saved. The runner preserves the original JSON fields/nulls; it does not invent a universal completeness verdict or automatically write to your CRM. Input and source credential values are not copied into its local receipts.
For a custom integration, use the same sequence:
POST https://api.apify.com/v2/actors/CogcQZj7hAWvINEVW/runs?maxTotalChargeUsd=0.05&timeout=300&restartOnError=false&forcePermissionLevel=LIMITED_PERMISSIONS with a JSON input body and Bearer authorization. Save data.id once.
GET https://api.apify.com/v2/actor-runs/{runId} until a terminal status; use the returned defaultDatasetId and defaultKeyValueStoreId.
GET https://api.apify.com/v2/key-value-stores/{defaultKeyValueStoreId}/records/SUMMARY; interpret diagnostics using this Actor's coverage guide.
GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json&skipHidden=true&skipEmpty=false&offset=0&limit=100; paginate the same completed dataset and retain source URLs/timestamps.
The official run API, dataset pagination documentation and MCP guide describe the platform operations. Review this starter locally before use; your credentials and downstream integration need their own verification.
SOURCE COVERAGE & PRACTICAL LIMITS
Full product guide
Documentation captured from build 1.0.2. Example outputs retain their original sample context; they are not live results.
Static Website Visual Change Monitor - Desktop & Mobile
Two viewport captures, a saved visual baseline, and a clear comparison report. JavaScript is disabled.
Monitor public static HTML/CSS pages: documentation, marketing pages, published references and server-rendered sites. Each saved observation includes a desktop screenshot (1440×900) and mobile-width screenshot (390×844), both at pixel ratio1. These are fixed viewport captures, not full-page screenshots or mobile-device emulation. JavaScript-dependent pages may be incomplete or fail honestly.
Start in a minute
- Add a public page URL or keep the small example.
- Start with comparison disabled. Open Visual report index in Output.
- Inspect both PNGs. Enable comparison and choose a history name to establish your baseline. Repeat with the same URL and settings to receive pixel differences.
{"urls":["https://example.com/"],"comparePrevious":false}
One row represents one complete desktop/mobile pair. JSON preserves nested viewport details; CSV exposes useful overview fields. Artifact URLs follow your Apify storage permissions and retention. No token is embedded in URLs.
What you receive
- Paired desktop/mobile-width evidence from one configured page.
- Optional previous images, current images and colored difference PNGs.
- Per-viewport differing pixel count and percentage with explicit tolerance and alert threshold.
- A separate HTML comparison report for each URL and a readable run index.
- Stable identity, observation timestamps, final URLs and resource-coverage counters.
| Field |
Meaning |
| recordId |
Hash of URL and the complete rendering/comparison scope |
| comparisonStatus |
not_requested, baseline_created, unchanged or changed |
| desktopChangedPercent / mobileChangedPercent |
Differing pixels as a viewport percentage, or null without history |
| views |
Dimensions, screenshot URL/hash, prior/diff URLs and exact pixel counts |
| reportUrl |
Per-observation HTML report |
| coverage |
Requests, response bytes, origins and intentionally excluded resources |
| previousObservedAt |
Timestamp of the previous confirmed baseline |
| sourceUrl |
Configured public page URL, identical to url; final viewport URLs are in views |
Pixel differences are not semantic change detection. Cookie banners, personalization, images and font substitution can affect pixels. A meaningful text change can occupy a small percentage. Pixelmatch color tolerance defaults to0.1; a viewport is flagged above0.5% changed pixels. Anti-aliasing is excluded. Review the evidence before deciding whether a change matters.
Saved history and pricing
Comparison is opt-in. The first confirmed saved pair establishes history. Later confirmed pairs replace it: comparison is with the last saved observation, not an immutable approved design. Different URLs, thresholds, viewports or renderer versions use distinct scopes. Use one writer per history name; do not overlap runs against the same baseline. Comparison labels describe the prior images available when preparing a row; baseline persistence is separate. Check SUMMARY.historyUpdated and failedSources after storage failures.
Run artifacts are staged before output. A confirmed zero-row spending-limit rejection triggers cleanup when the work budget allows it. If a dataset call throws or times out after being attempted, its acknowledgement is unknown: the row may have reached the dataset. Its screenshots and report are retained, later source work stops, and its baseline is not advanced. SUMMARY distinguishes confirmed rowsSaved from rowsPossiblySaved and outputAcknowledgementUnknown. Inspect the actual dataset and settled charges before retrying an uncertain write. Named baseline images and metadata advance only after confirmed dataset output. Apify dataset and key-value writes are not one atomic transaction; a timed-out storage request may still complete remotely.
Base price: $0.02 per saved desktop/mobile URL pair, plus $0.00005 per start at the fixed1GB memory. One pair costs$0.02005 at that rate. Unchanged confirmed saved pairs bill the same. Failures before dataset output, explicit zero-row rejections and diagnostics produce no result event. For an unknown dataset acknowledgement, the actual dataset and settled billing determine whether a result charge occurred. Review current Store pricing and set a maximum charge. No source account, paid proxy or extra subscription is needed.
Scope and limits
- JavaScript disabled. Scripts, XHR, media, nested frames and WebSockets are excluded. This is a static renderer, not a dynamic-app testing service.
- No login, cookies, browser code, custom headers, credential URLs, scrolling, clicks, CAPTCHA solving or challenge bypass.
- Public HTTP(S), ports80/443 only. DNS-pinned Node transport fetches resources and fulfills requests into Chromium. Direct browser HTTP requests are not allowed.
- robots.txt checked for every main navigation; redirects and each resource undergo address checks. Disallowed pages or unavailable policy are skipped.
- At most5 input URLs,100 rendered-resource requests,12 rendered-resource origins and20MiB rendered-resource response bodies per pair; each resource response is at most4MiB. Robots-policy lookups are additional, separately capped at512000bytes per response and four redirects, and share the viewport deadline. Each viewport has20 seconds. The maximum120-second run budget reserves5seconds for SDK shutdown; its work deadline leaves10seconds for browser cleanup and final reports. Work storage calls wait at most4seconds within remaining work time; final report/summary writes wait at most2.5seconds each. Cleanup is deferred when its budget ends, so some unreferenced artifacts or old baseline images can remain.
- Fixed visible pixels only. No claims about content below the viewport, real mobile behavior, accessibility, SEO, other browser engines or semantic correctness.
- Visible access challenges, empty static bodies, failed resources and incomplete pairs are reported, not charged as usable observations.
Practical workflows
Capture documentation after deployment, review desktop/mobile layout drift on server-rendered marketing pages, or keep dated evidence of a static reference page. Start with the three recipes in examples.json, inspect images, then save your own Actor task and attach an Apify Schedule. Keep baseline settings unchanged. No external notification or delivery is automatically enabled.
Source and support
Independent Mayd IT tool, not affiliated with target sites. Respect source access terms and use public pages you are authorized to capture. Open an Actor issue with a run ID and expected result; never include credentials.
Product guide · Workflow · All data tools · Use with AI