New to Kestra?
Use blueprints to kickstart your first workflows.
Audit Aikido domain scan coverage and alert Slack when a monitored domain has never been scanned or has gone stale.
A domain sitting in Aikido's surface monitoring with a scan from six months ago, or one that was added and never scanned at all, looks identical to a freshly-scanned domain in a dashboard list until someone checks the timestamp. This blueprint lists every domain Aikido tracks on a schedule, checks each one's last-scanned time, and pages Slack the moment coverage degrades instead of waiting for someone to notice during a security review.
list_monitored_domains (io.kestra.plugin.aikido.domains.List) lists every domain connected to Aikido's surface/DAST monitoring, including each domain's lastScannedAt Unix timestamp (-1 if never scanned). allowFailure: true means a connection or authentication failure still lets the flow continue instead of aborting.classify_scan_coverage (io.kestra.plugin.core.debug.Return) checks whether outputs.list_monitored_domains.rows is defined; if not, UNREACHABLE. Otherwise it runs a jq filter counting domains with lastScannedAt == -1 (never scanned) for CRITICAL, then a second filter counting domains scanned longer ago than staleness_threshold_days for AT_RISK, falling back to HEALTHY.route_by_coverage (io.kestra.plugin.core.flow.Switch) branches on that string: HEALTHY logs a quiet confirmation, AT_RISK pages Slack naming the stale domains, CRITICAL pages Slack naming the never-scanned domains, UNREACHABLE pages Slack separately, and defaults logs the raw outcome.log_audit_status records a status line on every run regardless of branch, so the execution history is a continuous scan-coverage trend.errors block pages Slack separately if the flow itself fails outright.domain_scan_coverage_schedule trigger polls once a day with explicit input overrides, shipped disabled: true until you add real Aikido credentials.status output (HEALTHY / AT_RISK / CRITICAL / UNREACHABLE) you can chart or gate other flows on.Aikido's own dashboard shows scan coverage when someone opens it; this flow watches it continuously. Every check is recorded in the execution history, the coverage classification becomes a typed output other flows can depend on, and the Switch branch is one edit away from real remediation (triggering io.kestra.plugin.aikido.domains.Scan on the stale domains, opening a ticket) instead of a one-off dashboard glance.
domains:read scope. Aikido's free-tier availability was not independently confirmed while building this blueprint; check Aikido's current plans before relying on it for scan volume.AIKIDO_CLIENT_ID: Aikido API client ID.AIKIDO_CLIENT_SECRET: Aikido API client secret.SLACK_WEBHOOK_URL: Slack incoming webhook used for the at-risk alert, the critical alert, the unreachable alert, and the flow-failure alert.SECRET_AIKIDO_CLIENT_ID, SECRET_AIKIDO_CLIENT_SECRET, and SECRET_SLACK_WEBHOOK_URL as base64, for example echo -n "<your-client-id>" | base64.AIKIDO_CLIENT_ID, AIKIDO_CLIENT_SECRET, and SLACK_WEBHOOK_URL secrets.staleness_threshold_days to the scan cadence your team expects.status reflects your account's real scan coverage.domain_scan_coverage_schedule.io.kestra.plugin.aikido.domains.Scan task inside the AT_RISK/CRITICAL cases to trigger a rescan automatically instead of only alerting.io.kestra.plugin.aikido.repositories.List and io.kestra.plugin.aikido.containers.List, which expose comparable scan-coverage fields for code repositories and container images.lastScannedAt in a KV store and alert only when a previously-fresh domain newly crosses the staleness threshold, instead of on every run.