New to Kestra?
Use blueprints to kickstart your first workflows.
Fan out over a list of Sifflet rule IDs with Kestra ForEach, launch a rule run for each, and post a count summary to Discord after the pack completes.
A data domain is rarely guarded by one rule. Freshness, volume, and schema checks pile up, and running them as a coherent pack usually means a script nobody maintains or a person clicking through the Sifflet UI. This blueprint makes the pack a flow: io.kestra.plugin.core.flow.ForEach iterates over a JSON list of rule IDs, io.kestra.plugin.sifflet.RunRule launches each run with the iteration value, and Discord gets one summary message with the count instead of a message per rule.
rule_ids input holds the pack as a JSON array. Editing the list is the whole maintenance story, no code changes when a rule is added or retired.run_each_rule (io.kestra.plugin.core.flow.ForEach) renders values from the input and creates one child task run per rule ID.run_rule (io.kestra.plugin.sifflet.RunRule) reads the current ID from {{ taskrun.value }} and launches the rule run against your tenant.errors block posts a Discord alert; the execution view shows exactly which iteration broke.notify_summary posts one message with the pack size computed from {{ inputs.rule_ids | length }}.Schedule trigger runs the pack nightly at 05:00, after batch loads settle.Looping over an API is easy; making the loop observable is not. Kestra gives every iteration its own task run with logs and state, fails the pack loudly when one launch breaks, and keeps the rule list as a declared input rather than a hardcoded array in a script. The same pattern scales from two rules to two hundred by editing one JSON list.
SIFFLET_API_KEY: Sifflet API bearer token used to run the rules.SIFFLET_BASE_URL: base URL of your Sifflet tenant API.DISCORD_WEBHOOK_URL: Discord incoming webhook URL.SIFFLET_API_KEY, SIFFLET_BASE_URL, and DISCORD_WEBHOOK_URL secrets to your Kestra namespace.rule_ids input to two or three real rule IDs and execute the flow.nightly trigger.concurrencyLimit on the ForEach to launch several rule runs in parallel when the pack is large.rule_ids default.