{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/windmill/refs/heads/main/json-schema/windmill-schedule-schema.json",
  "title": "Schedule",
  "description": "Windmill Schedule schema",
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "The unique Windmill path for this schedule. Must be of the form `u/<user>/<path>` or `f/<folder>/<path>`."
    },
    "edited_by": {
      "type": "string",
      "description": "Username of the last person who edited this schedule"
    },
    "edited_at": {
      "type": "string",
      "format": "date-time",
      "description": "Timestamp of the last edit"
    },
    "schedule": {
      "type": "string",
      "description": "Cron expression with 6 fields (seconds, minutes, hours, day of month, month, day of week). Example '0 0 12 * * *' for daily at noon"
    },
    "timezone": {
      "type": "string",
      "description": "IANA timezone for the schedule (e.g., 'UTC', 'Europe/Paris', 'America/New_York')"
    },
    "enabled": {
      "type": "boolean",
      "description": "Whether the schedule is currently active and will trigger jobs"
    },
    "script_path": {
      "type": "string",
      "description": "Path to the script or flow to execute when triggered"
    },
    "is_flow": {
      "type": "boolean",
      "description": "True if script_path points to a flow, false if it points to a script"
    },
    "args": {
      "$ref": "#/components/schemas/ScriptArgs",
      "nullable": true
    },
    "extra_perms": {
      "type": "object",
      "additionalProperties": {
        "type": "boolean"
      },
      "description": "Additional permissions for this schedule"
    },
    "email": {
      "type": "string",
      "description": "Email of the user who owns this schedule, used for permissioned_as"
    },
    "permissioned_as": {
      "type": "string",
      "description": "The user or group this schedule runs as (e.g., 'u/admin' or 'g/mygroup')"
    },
    "error": {
      "type": "string",
      "nullable": true,
      "description": "Last error message if the schedule failed to trigger"
    },
    "on_failure": {
      "type": "string",
      "nullable": true,
      "description": "Path to a script or flow to run when the scheduled job fails"
    },
    "on_failure_times": {
      "type": "number",
      "nullable": true,
      "description": "Number of consecutive failures before the on_failure handler is triggered (default 1)"
    },
    "on_failure_exact": {
      "type": "boolean",
      "nullable": true,
      "description": "If true, trigger on_failure handler only on exactly N failures, not on every failure after N"
    },
    "on_failure_extra_args": {
      "$ref": "#/components/schemas/ScriptArgs",
      "nullable": true
    },
    "on_recovery": {
      "type": "string",
      "nullable": true,
      "description": "Path to a script or flow to run when the schedule recovers after failures"
    },
    "on_recovery_times": {
      "type": "number",
      "nullable": true,
      "description": "Number of consecutive successes before the on_recovery handler is triggered (default 1)"
    },
    "on_recovery_extra_args": {
      "$ref": "#/components/schemas/ScriptArgs",
      "nullable": true
    },
    "on_success": {
      "type": "string",
      "nullable": true,
      "description": "Path to a script or flow to run after each successful execution"
    },
    "on_success_extra_args": {
      "$ref": "#/components/schemas/ScriptArgs",
      "nullable": true
    },
    "ws_error_handler_muted": {
      "type": "boolean",
      "description": "If true, the workspace-level error handler will not be triggered for this schedule's failures"
    },
    "retry": {
      "$ref": "../../openflow.openapi.yaml#/components/schemas/Retry",
      "nullable": true
    },
    "summary": {
      "type": "string",
      "nullable": true,
      "description": "Short summary describing the purpose of this schedule"
    },
    "description": {
      "type": "string",
      "nullable": true,
      "description": "Detailed description of what this schedule does"
    },
    "no_flow_overlap": {
      "type": "boolean",
      "description": "If true, skip this schedule's execution if the previous run is still in progress (prevents concurrent runs)"
    },
    "tag": {
      "type": "string",
      "nullable": true,
      "description": "Worker tag to route jobs to specific worker groups"
    },
    "paused_until": {
      "type": "string",
      "format": "date-time",
      "nullable": true,
      "description": "ISO 8601 datetime until which the schedule is paused. Schedule resumes automatically after this time"
    },
    "cron_version": {
      "type": "string",
      "nullable": true,
      "description": "Cron parser version. Use 'v2' for extended syntax with additional features"
    },
    "dynamic_skip": {
      "type": "string",
      "nullable": true,
      "description": "Path to a script that validates scheduled datetimes. Receives scheduled_for datetime and returns boolean to skip (true) or run (false)"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "default": []
    }
  },
  "required": [
    "path",
    "edited_by",
    "edited_at",
    "schedule",
    "script_path",
    "timezone",
    "extra_perms",
    "is_flow",
    "enabled",
    "email",
    "permissioned_as"
  ]
}