{
    "type": "object",
    "properties": {
        "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": {
            "type": "object",
            "description": "The arguments to pass to the script or flow",
            "additionalProperties": true,
            "nullable": true
        },
        "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": {
            "type": "object",
            "description": "The arguments to pass to the script or flow",
            "additionalProperties": true,
            "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": {
            "type": "object",
            "description": "The arguments to pass to the script or flow",
            "additionalProperties": true,
            "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": {
            "type": "object",
            "description": "The arguments to pass to the script or flow",
            "additionalProperties": true,
            "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": {
            "type": "object",
            "description": "Retry configuration for failed module executions",
            "properties": {
                "constant": {
                    "type": "object",
                    "description": "Retry with constant delay between attempts",
                    "properties": {
                        "attempts": {
                            "type": "integer",
                            "description": "Number of retry attempts"
                        },
                        "seconds": {
                            "type": "integer",
                            "description": "Seconds to wait between retries"
                        }
                    }
                },
                "exponential": {
                    "type": "object",
                    "description": "Retry with exponential backoff (delay doubles each time)",
                    "properties": {
                        "attempts": {
                            "type": "integer",
                            "description": "Number of retry attempts"
                        },
                        "multiplier": {
                            "type": "integer",
                            "description": "Multiplier for exponential backoff"
                        },
                        "seconds": {
                            "type": "integer",
                            "minimum": 1,
                            "description": "Initial delay in seconds"
                        },
                        "random_factor": {
                            "type": "integer",
                            "minimum": 0,
                            "maximum": 100,
                            "description": "Random jitter percentage (0-100) to avoid thundering herd"
                        }
                    }
                },
                "retry_if": {
                    "type": "object",
                    "description": "Conditional retry based on error or result",
                    "properties": {
                        "expr": {
                            "type": "string",
                            "description": "JavaScript expression that returns true to retry. Has access to 'result' and 'error' variables"
                        }
                    },
                    "required": [
                        "expr"
                    ]
                }
            },
            "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": []
        },
        "draft_only": {
            "description": "True when this row is a per-user draft with no deployed\nschedule at the same path. Frontend renders a \"Draft\" badge.\n",
            "type": "boolean"
        },
        "is_draft": {
            "description": "True when the authed user has a per-user draft at this path\n(over a deployed row or a synthesized draft-only row).\nFrontend appends a `*` to the displayed name.\n",
            "type": "boolean"
        },
        "inherited_labels": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "description": "Labels inherited from the parent folder, computed at read time. Read-only — edit them on the folder.\n"
        }
    },
    "required": [
        "schedule",
        "script_path",
        "timezone",
        "is_flow",
        "enabled"
    ]
}
