Allscreenshots
Guides

Schedule recurring screenshots

Capture a page on a repeating schedule and get notified only when it changes

Schedule recurring screenshots

If you've ever wired up a cron job that calls a screenshot API, writes the file somewhere, and diffs it against yesterday's copy to decide whether to ping you, this replaces all of it. A schedule captures a URL on a repeating cadence, keeps the results, and delivers them to email or a webhook — optionally only when the page actually changed.

You set one up in the dashboard. There's also an API for creating schedules programmatically, but most people configure them by hand and leave them running.

Common reasons to use one:

  • Watch a competitor's pricing or product page and get an email when it changes.
  • Snapshot a status page or dashboard every few hours for an audit trail.
  • Build a visual archive of a page over weeks or months.

Scheduled captures are available on every plan, including Free, and metered by your monthly screenshot quota. Webhook delivery is free on every plan; email delivery is a paid feature (Starter and above).

Set up a schedule in the dashboard

Create a schedule

Open Schedules in the dashboard and click Create schedule. Give it a name you'll recognize and paste the page URL.

Choose what to capture

Under Capture settings, pick a screen size and image format, and turn on Capture full page if you want the whole scrollable page rather than just the viewport.

Open Advanced settings for the rest: wait for a specific element before capturing, hide elements that move on their own (cookie banners, chat widgets, countdowns), inject custom CSS, or add extra outputs like a PDF. These are the same options as a regular screenshot, so a capture from a schedule looks identical to one you'd take directly.

Pick a cadence

Under When, choose how often it runs — hourly, every few hours, daily, weekly, or monthly — and set a timezone so the run times match yours. For a schedule that doesn't fit a preset, enter a custom cron expression.

Deliver to email or a webhook

By default a capture is stored and visible in the schedule's history. Under Delivery, add email recipients to have each run sent to them, or a webhook URL to POST it to your own server. You can add both, and up to 10 destinations in total — so you can archive every run to a webhook and email a teammate at the same time.

Only notify when the page changes

Capturing a page every hour is noisy if it rarely changes. Turn on only notify when the page changes and the schedule compares each run against the previous one. If nothing changed, the capture is still recorded but no email or webhook fires.

The sensitivity setting controls how much has to differ to count as a change. Raise it to ignore minor churn like a rotating banner; lower it to catch small edits.

The diff is pixel-based, not semantic. An ad slot or a "12 people viewing this" widget can register as a change. Hide those elements in the capture settings, or lower the sensitivity, to cut false positives.

Handle failures

Sites go down and pages get slow. Two settings keep a flaky target from spamming you or silently rotting: alert on failed runs, and auto-pause the schedule after a number of consecutive failures so a permanently broken URL stops burning quota. Resuming the schedule resets the counter.

Watch the runs

Once saved, the schedule appears on the Schedules page with its next run, last run, and capture count. Use Trigger now from its menu to run it immediately instead of waiting for the next slot, and open its history to see each run's status, the stored image, and — when change detection is on — how much changed.

Create schedules with the API

Most schedules are set up once in the dashboard. If you're managing a lot of them or want them created from your own code, every setting above maps to a field on POST /v1/schedules. This is the same competitor-pricing schedule as a single call:

curl -X POST 'https://api.allscreenshots.com/v1/schedules' \
  -H 'X-API-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Competitor pricing",
    "url": "https://competitor.com/pricing",
    "schedule": "hourly",
    "options": {
      "fullPage": true,
      "waitFor": ".pricing-table",
      "waitUntil": "networkidle"
    },
    "onlyOnChange": true,
    "diffThreshold": 0.01,
    "destinations": [
      { "type": "email", "to": ["[email protected]"], "subject": "Competitor pricing changed" }
    ],
    "alertOnFailure": true,
    "autoPauseAfterFailures": 5,
    "retentionDays": 90
  }'

The cadence accepts the same aliases as the dashboard (hourly, daily, weekly, monthly) or a 6-field cron expression with a timezone. See the API reference for every parameter and for the list, update, pause, trigger, and history endpoints.

Next steps

On this page