Website Screenshot & Visual Diff
Pricing
from $20.00 / 1,000 successful captures
Website Screenshot & Visual Diff
Capture desktop and mobile website screenshots, compare them against saved baselines, and highlight visual changes. Download screenshots, diff images, HTML reports, and ZIP archives.
Pricing
from $20.00 / 1,000 successful captures
Rating
0.0
(0)
Developer
Yuki Okushi
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
What does Bulk Website Screenshots & Visual Diff do?
Capture website screenshots in bulk and compare visual changes at desktop and mobile widths. Supply public URLs such as example.com, run a capture, and download PNG images, standalone HTML reports, and ZIP archives. Apify provides API access, scheduling, integrations, and run monitoring; this Actor uses a restricted rendering service and does not expose customer proxy settings.
Use capture to take current screenshots, baseline to explicitly create or update reference images, and compare to compare against those references. A visual difference is a measurement, not a verdict that a website contains a bug.
Why use bulk website screenshots and visual diffs?
Check public landing pages after a release, keep a visual record of product pages, or monitor a set of pages on an Apify Schedule. Each URL is checked at the selected screen widths, with consistent Chromium, fonts, locale, timezone, and rendering settings. Mask clocks, advertisements, or other changing elements when you want the rest of the page to remain comparable.
This product does not log into websites, accept cookies or JavaScript, crawl links, solve CAPTCHAs, or reproduce Safari or physical iPhone rendering.
How to use Bulk Website Screenshots & Visual Diff
- Open the Input tab and enter one or more public website URLs.
- Select desktop, mobile, or both widths. Start with
capture. - Set a finite maximum run charge; the initial suggested limit is $5.
- Run the Actor, then use the Output tab to download screenshots, the HTML report, or the ZIP index.
- To track changes, run
baselinewith a baseline name, then runcomparewith the same URLs, widths, masks, and name. Updating a baseline always requires another explicitbaselinerun.
Baselines belong to the Apify user who runs the Actor. Missing or incompatible baselines produce an error before a browser starts; they are never silently replaced.
Input for website screenshot capture
The Input tab documents every supported field. Unknown fields are rejected.
{"urls": ["https://example.com/"],"viewports": ["desktop", "mobile"],"mode": "capture","baselineKey": "main-site","maskSelectors": [],"changeThreshold": 0.005}
| Field | Limits and defaults |
|---|---|
urls | 1–100 public HTTP/HTTPS URLs, at most 2,048 characters each; ports 80/443; no credentials |
viewports | desktop (1440 × 900), mobile (390 × 844), or both; default both |
mode | capture (default), baseline, or compare |
baselineKey | 1–64 letters, digits, underscores, or hyphens; default main-site |
maskSelectors | Up to 20 CSS selectors, 200 characters each; default empty; fixed pink mask |
changeThreshold | Difference ratio from 0 to 1; default 0.005 |
Duplicate normalized URLs are removed, preserving their first position. Query parameter order and URL fragments are preserved, including single-page application routes. Units are processed in URL order, desktop before mobile.
Output and downloadable visual reports
Each successful result includes an image and an embedded-image HTML report. Comparison results also include the reference and difference images. ZIP parts contain self-contained reports and a JSON manifest, so they work after extraction without network access. The ZIP index lists all parts; a final archive failure does not remove individual saved results.
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
The following is a shortened illustration of the row format; generated examples from the actual local fixture run are in examples/output.
[{"schemaVersion": 1,"url": "https://example.com/","viewport": "desktop","mode": "capture","status": "SUCCEEDED","width": 1440,"truncated": false,"diffRatio": null,"changed": null,"billable": true}]
Result data table
| Field | Meaning |
|---|---|
unitId | Stable identifier for one URL and screen width within a run |
status | SUCCEEDED after publication requirements, or FAILED |
currentImageUrl, baselineImageUrl, diffImageUrl | Saved image links; comparison images appear only in compare mode |
width, height, truncated | Output dimensions and whether the page exceeded the height cap |
diffRatio, changed | Differing pixels divided by comparison canvas pixels; changed uses a strict > threshold |
dimensionsChanged | Whether dimensions changed; images are aligned at the top left without resizing |
baselineRevision, rendererSignature | Reference revision and rendering environment identity |
warnings, pageErrors, brokenImages | Bounded observations about loading and dynamic pages |
unitReportUrl, billingReceiptKey | Standalone report and separate mutable billing receipt |
billable | Eligible for a capture event; this does not mean paid |
error | Stable error code and explanation for a failed result |
OUTPUT contains planned, successful, failed, SDK-confirmed charge, and unprocessed counts, the stop reason, unknown billing units, and report/archive links.
How much does it cost to capture websites?
One successfully delivered URL × screen width is one capture event. The actual current price is shown in Apify; the Actor reads it at runtime. If the provisional capture price is configured as $0.02, 100 URLs at two widths produce 200 events, or $4 in capture events. A separate Actor-start event can increase the final total. This example is conditional on that pricing configuration and is not a fixed price promise.
The Actor checks remaining budget before each new capture, including start-event spending. With less than one event remaining, it stops and reports a partial result. Capture errors, missing references, baseline conflicts, and failed saves do not produce a capture charge. A successfully captured page with broken images, JavaScript errors, or cropping can still be billable.
Free-plan trials allow 10 attempts per run, 20 per user per UTC day, and 200 across all free users per UTC day. Oversized trial inputs are rejected in full. Accepted attempts consume trial quota even when the website fails or the run is cancelled; retries of the same unit do not consume another attempt.
If billing becomes uncertain because a response is lost, the run stops for operator reconciliation and does not automatically request the charge again. Saved results remain available.
Tips, limits, and scheduled comparisons
Screenshots use Chromium, device scale 1, en-US, UTC, light theme, reduced motion, and fixed fonts. Pages are cropped at 12,000 pixels. Each rendering attempt has a 45-second hard limit, navigation has a 20-second limit, and pages receive no automatic browser retry. Private, loopback, metadata, and other non-public destinations are blocked, including redirected and embedded requests.
A baseline is kept for 30 days after its last successful use. Temporary backend results normally expire after 24 hours, while an active transfer retains its results. Apify storage retention follows the user's storage settings. Rendering environment updates require new baselines.
Create an Apify Task using compare, then attach a Schedule for the desired frequency. Keep the baseline name and capture settings unchanged. API users can use Apify's Actor run endpoint; see the repository's docs/apify-publishing.md for a request example.
FAQ, limitations, and support
Can I capture private or authenticated pages? No. Only public HTTP/HTTPS pages are supported. Use this Actor only for pages you are authorized to access and follow website terms and applicable law.
Are image links private? Backend Blob storage is private. Apify-generated record URLs can be accessed by people who possess those links; do not treat them as confidential file sharing. The Apify KeyValueStore reference describes public record URLs.
Does mobile mean iPhone? No. It is a Chromium screenshot at a narrow width, not Safari, a physical device, or a mobile hardware test.
Is the service highly available? The initial backend uses one CPU VM with at most two renderers at once and one per user. Maintenance or queue limits may temporarily prevent new captures.
Report problems through this Actor's Issues tab in Apify Console, including the run ID and unit ID rather than secrets or private URLs. Custom requirements can be discussed there, but custom implementation is not included in a capture event.
For self-hosting and development, see docs/local-development.md, docs/deployment.md, docs/operations.md, and docs/verification.md.