{
    "type": "object",
    "properties": {
        "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"
        },
        "labels": {
            "type": "array",
            "items": {
                "type": "string"
            },
            "default": []
        },
        "draft_only": {
            "description": "True when this row is a per-user draft with no deployed\ntrigger at the same path. Set by list endpoints when\n`include_draft_only=true` synthesizes the row from the\ndraft. 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"
        },
        "route_path": {
            "type": "string",
            "description": "The URL route path that will trigger this endpoint (e.g., 'api/myendpoint'). Must NOT start with a /."
        },
        "static_asset_config": {
            "type": "object",
            "nullable": true,
            "description": "Configuration for serving static assets (s3 bucket, storage path, filename)",
            "properties": {
                "s3": {
                    "type": "string",
                    "description": "S3 bucket path for static assets"
                },
                "storage": {
                    "type": "string",
                    "description": "Storage path for static assets"
                },
                "filename": {
                    "type": "string",
                    "description": "Filename for the static asset"
                }
            },
            "required": [
                "s3"
            ]
        },
        "http_method": {
            "type": "string",
            "enum": [
                "get",
                "post",
                "put",
                "delete",
                "patch"
            ],
            "description": "HTTP method (get, post, put, delete, patch) that triggers this endpoint"
        },
        "authentication_resource_path": {
            "type": "string",
            "nullable": true,
            "description": "Path to the resource containing authentication configuration (for api_key, basic_http, custom_script, signature methods)"
        },
        "summary": {
            "type": "string",
            "nullable": true,
            "description": "Short summary describing the purpose of this trigger"
        },
        "description": {
            "type": "string",
            "nullable": true,
            "description": "Detailed description of what this trigger does"
        },
        "request_type": {
            "type": "string",
            "enum": [
                "sync",
                "async",
                "sync_sse"
            ],
            "description": "How the request is handled - 'sync' waits for result, 'async' returns job ID immediately, 'sync_sse' streams results via Server-Sent Events"
        },
        "authentication_method": {
            "type": "string",
            "enum": [
                "none",
                "windmill",
                "api_key",
                "basic_http",
                "custom_script",
                "signature"
            ],
            "description": "How requests are authenticated - 'none' (public), 'windmill' (Windmill token), 'api_key', 'basic_http', 'custom_script', 'signature'"
        },
        "is_static_website": {
            "type": "boolean",
            "description": "If true, serves static files from S3/storage instead of running a script"
        },
        "workspaced_route": {
            "type": "boolean",
            "description": "If true, the route includes the workspace ID in the path"
        },
        "wrap_body": {
            "type": "boolean",
            "description": "If true, wraps the request body in a 'body' parameter"
        },
        "raw_string": {
            "type": "boolean",
            "description": "If true, passes the request body as a raw string instead of parsing as JSON"
        },
        "error_handler_path": {
            "type": "string",
            "description": "Path to a script or flow to run when the triggered job fails"
        },
        "error_handler_args": {
            "type": "object",
            "description": "Arguments to pass to the error handler",
            "additionalProperties": true
        },
        "retry": {
            "type": "object",
            "description": "Retry configuration for failed 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"
                    ]
                }
            }
        }
    },
    "required": [
        "script_path",
        "is_flow",
        "route_path",
        "request_type",
        "authentication_method",
        "http_method",
        "is_static_website",
        "workspaced_route",
        "wrap_body",
        "raw_string"
    ]
}
