New to Kestra?
Use blueprints to kickstart your first workflows.
Monitor multiple websites every 5 minutes with Kestra. Detects HTTP outages and recoveries using KV state tracking, and fires Slack and email alerts.
Run lightweight, fully programmable website uptime monitoring directly inside Kestra. This blueprint polls a configurable list of URLs every 5 minutes, performs concurrent HTTP health checks, tracks each site's last known status in the KV store, and fires instant Slack and email alerts when a site goes down or recovers. It replaces standalone uptime tools (Pingdom, UptimeRobot, StatusCake) with a declarative YAML workflow that lives next to the rest of your orchestration, with full execution history, retries, and observability built in.
io.kestra.plugin.core.trigger.Schedule trigger (every_5_minutes, cron */5 * * * *) launches the flow on a 5 minute cadence.check_sites (io.kestra.plugin.core.flow.Loop) iterates over the websites input array with a concurrencyLimit of 5, so multiple URLs are probed in parallel.http_check (io.kestra.plugin.core.http.Request) issues a GET with allowFailed: true, a 10 second connect timeout and a 15 second read timeout.get_previous_status (io.kestra.plugin.core.kv.Get) reads the prior UP or DOWN value from the KV store using a key derived from the URL, with errorOnMissing: false for first runs.is_down (io.kestra.plugin.core.flow.If) flags the site as down when the response code is >= 400 or null. On a failure it persists DOWN via io.kestra.plugin.core.kv.Set, then sends a red alert through io.kestra.plugin.slack.notifications.SlackIncomingWebhook and an HTML email through io.kestra.plugin.email.MailSend (SMTP on port 465).UP and, if the previous status was DOWN, posts a green recovery message to Slack to close the incident loop.A cron job with curl can ping a URL, but it cannot remember state, fan out in parallel, deduplicate alerts, or send a recovery message when a site comes back. Kestra adds an event-driven Schedule trigger, durable KV state, declarative YAML, automatic retries, structured outputs, and full lineage across every probe and every alert. The same flow can be triggered ad hoc, on a schedule, or from a webhook, and every run is auditable from the UI.
Configure the following secrets in Kestra before running the flow:
SLACK_WEBHOOK_URL: Slack Incoming Webhook URL used for both downtime and recovery alerts.ALERT_EMAIL_FROM: From address for outbound alert emails.ALERT_EMAIL_TO: Destination address (or comma separated list) for alert emails.SMTP_HOST: SMTP server hostname.SMTP_USERNAME: SMTP authentication username.SMTP_PASSWORD: SMTP authentication password or app password.company.team.websites input default list, or pass a custom list per execution.every_5_minutes schedule trigger to start continuous monitoring.Query task to log every probe for historical SLA reporting.If task.