Docs
← Home Sign In Get Started

What are scheduled scans?

Scheduled scans automatically run at a set interval without any manual action. They are useful for:

  • Continuous security monitoring of production sites
  • Detecting new vulnerabilities introduced by updates or configuration changes
  • Generating regular compliance evidence with a reproducible audit trail
  • Tracking security posture improvements over time without manual effort
📋
Plan limits: Scheduled scans count toward your plan's monthly scan limit (Starter: 10/month). Professional and Business subscribers have unlimited scans and can run schedules as frequently as needed.

Creating a scheduled scan

Step-by-step from the UI

  1. Open the Scan History page from the main navigation.
  2. Click the Scheduled Scans tab at the top of the page.
  3. Click the + New Schedule button.
  4. Enter the target hostname or URL (e.g. https://example.com).
  5. Choose a frequency: Daily, Weekly, or Monthly (see details below).
  6. Set the run time - the hour of day (0–23) when the scan should start.
  7. Select your time zone from the dropdown so the run time reflects your local clock, not UTC.
  8. Optionally attach a scan profile (see Combining with scan profiles below).
  9. Click Save Schedule.

The new schedule appears in the Scheduled Scans list with its next run time shown. The first run triggers at the next scheduled slot - it does not run immediately on creation.

ℹ️
If your plan's monthly scan limit is reached when a scheduled run is due, the run is skipped and a notification email is sent. Skipped runs do not accumulate - the next run fires at the next scheduled interval.

Supported frequencies

FrequencyAdditional optionsTypical use case
Daily Choose the hour of day (0–23) Most production sites - recommended default for active applications
Weekly Choose the day of the week (Mon–Sun) and the hour Lower-traffic sites; supplement to CI/CD scans; staging environments
Monthly Choose the day of the month (1–28) and the hour Compliance evidence; infrequently updated sites; cost-sensitive accounts
💡
Schedule outside business hours. Set the run hour to a low-traffic period (e.g. 03:00) to avoid adding latency noise to performance metrics. The scanner sends real HTTP requests - running during peak hours can skew TTFB readings.

Email notifications - delta alerts

Shieldome does not send an email after every scheduled scan. Instead it sends a delta alert - an email only when the results differ from the previous scan of the same target. This keeps your inbox quiet unless something actually changed.

A delta alert is sent when:

  • One or more new findings appeared that were not present in the last scan
  • One or more previously open findings are now resolved (optional, off by default)

The delta email contains:

  • The target URL and scan timestamp
  • A count of new findings, grouped by severity
  • A short summary of each new finding (name, severity, OWASP category)
  • A direct link to the full scan diff view in the app
💡
No noise on clean runs. If nothing changed between two weekly scans, you receive no email at all. You can view the full scan result any time in Scan History.

You can configure notification preferences per schedule in the schedule settings: choose whether to also be notified on resolved findings, and whether to CC additional addresses.

Combining with scan profiles

A scan profile is a saved set of scan configuration options - for example, a profile named "Authenticated + Stealth" might have Playwright enabled for cookie injection, a custom User-Agent header, and a slower request rate to avoid triggering WAF rate limits.

You can attach any saved scan profile to a scheduled scan. The scheduled run then uses all settings from the profile on every execution, without you having to re-enter them. To attach a profile:

  1. In the + New Schedule dialog (or when editing an existing schedule), expand the Advanced options section.
  2. Select a profile from the Scan Profile dropdown. Only profiles you have saved appear in the list.
  3. Save the schedule.

If you later edit the profile (for example, to update credentials), the next scheduled run automatically picks up the updated profile - you do not need to edit the schedule itself.

Managing schedules

Enable and disable

Each schedule has an on/off toggle in the Scheduled Scans list. Disabling a schedule pauses future runs without deleting the schedule or its history. Re-enabling it resumes runs at the next scheduled interval.

Editing a schedule

Click the pencil icon next to a schedule to edit any field: target URL, frequency, run time, time zone, profile, or notification settings. Changes take effect immediately - the next run will use the updated configuration.

Deleting a schedule

Click the trash icon and confirm. Deleting a schedule does not delete past scan results - they remain in your Scan History. Only the recurrence rule is removed.

API reference

Create a schedule

POST /api/scheduled-scans
Creates a new scheduled scan. Returns the created schedule object including its id and next_run_at.
json - request body
{
  "target_url":    "https://example.com",
  "frequency":     "weekly",          // "daily" | "weekly" | "monthly"
  "hour":          3,                 // 0–23, in the time zone below
  "day_of_week":   1,                 // 0=Mon … 6=Sun; only used when frequency="weekly"
  "day_of_month":  15,                // 1–28; only used when frequency="monthly"
  "timezone":      "Europe/Belgrade", // IANA time zone string
  "use_playwright": false,            // enable JS-rendered scanning
  "profile_id":    "a1b2c3d4-...",    // optional: attach a saved scan profile
  "notify_email":  "[email protected]"  // optional override; defaults to account email
}

List schedules

GET /api/scheduled-scans
Returns all scheduled scans for the authenticated account, including enabled status, next_run_at, and the last scan result summary.
bash
curl -H "X-Shieldome-Key: YOUR_API_KEY" \
  https://yourdomain.com/api/scheduled-scans

Enable / disable a schedule

PATCH /api/scheduled-scans/{schedule_id}
Update any field of an existing schedule. Pass only the fields you want to change. Set "enabled": false to pause without deleting.
bash - pause a schedule
curl -X PATCH \
  -H "X-Shieldome-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled": false}' \
  https://yourdomain.com/api/scheduled-scans/{schedule_id}

Delete a schedule

DELETE /api/scheduled-scans/{schedule_id}
Permanently removes the schedule. Past scan history is preserved.
bash
curl -X DELETE \
  -H "X-Shieldome-Key: YOUR_API_KEY" \
  https://yourdomain.com/api/scheduled-scans/{schedule_id}

Scan history from scheduled runs

Every scheduled run creates a regular scan entry in Scan History, labelled with a calendar icon to distinguish it from manually triggered scans. You can compare runs over time using the Trends chart or the Scan Comparison feature.

Trends chart

The Trends chart plots the risk score and finding counts across your most recent scans for a given target. To view it: open Scan History, filter by a specific target URL, then click Show Trends. The chart shows:

  • Risk score over time - rises when new vulnerabilities appear, drops when they are resolved
  • Finding counts by severity - separate lines for critical, high, medium, and low
  • Time range - the last 30 scans for the selected target

Webhook notifications

Attach a webhook URL to any scheduled scan to receive a POST request the moment each run completes. Add "webhook_url" to the schedule creation payload or update it with PATCH. The webhook fires on every run, regardless of whether findings changed. The payload includes a new_findings array listing only findings not present in the previous scan:

json - webhook payload
{
  "scan_id":      "a1b2c3d4-...",
  "target_url":   "https://example.com",
  "status":       "completed",
  "schedule_id":  "s9f8e7d6-...",
  "summary": {
    "risk_score": 35,
    "critical": 0, "high": 1, "medium": 3, "low": 5
  },
  "new_findings": [/* findings not present in the previous scan */],
  "fixed_findings": [/* findings present in previous scan, now gone */]
}