openapi: "3.0.3"

info:
  version: 1.618.0
  title: Windmill API

  contact:
    name: Windmill Team
    email: contact@windmill.dev
    url: https://windmill.dev

  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html

  x-logo:
    url: https://windmill.dev/img/windmill.svg
externalDocs:
  description: documentation portal
  url: https://windmill.dev

servers:
  - url: /api

security:
  - bearerAuth: []
  - cookieAuth: []

paths:
  /version:
    get:
      summary: get backend version
      operationId: backendVersion
      tags:
        - settings
      responses:
        "200":
          description: git version of backend
          content:
            text/plain:
              schema:
                type: string

  /uptodate:
    get:
      summary: is backend up to date
      operationId: backendUptodate
      tags:
        - settings
      responses:
        "200":
          description: is backend up to date
          content:
            text/plain:
              schema:
                type: string

  /ee_license:
    get:
      summary: get license id
      operationId: getLicenseId
      tags:
        - settings
      responses:
        "200":
          description: get license id (empty if not ee)
          content:
            text/plain:
              schema:
                type: string

  /inkeep:
    post:
      summary: query Windmill AI documentation assistant (EE only)
      operationId: queryDocumentation
      x-mcp-tool: true
      tags:
        - documentation
      requestBody:
        description: query to send to the AI documentation assistant
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                query:
                  type: string
                  description: The documentation query to send to the AI assistant
              required:
                - query
      responses:
        "200":
          description: AI documentation assistant response
          content:
            application/json:
              schema:
                type: object
                description: Response from Inkeep service
        "403":
          description: Enterprise Edition required
          content:
            text/plain:
              schema:
                type: string

  /openapi.yaml:
    get:
      summary: get openapi yaml spec
      operationId: getOpenApiYaml
      tags:
        - settings
      responses:
        "200":
          description: openapi yaml file content
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/audit/get/{id}:
    get:
      summary: get audit log (requires admin privilege)
      operationId: getAuditLog
      tags:
        - audit
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: an audit log
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AuditLog"

  /w/{workspace}/audit/list:
    get:
      summary: list audit logs (requires admin privilege)
      operationId: listAuditLogs
      tags:
        - audit
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/Before"
        - $ref: "#/components/parameters/After"
        - $ref: "#/components/parameters/Username"
        - $ref: "#/components/parameters/Operation"
        - name: operations
          in: query
          description: comma separated list of exact operations to include
          schema:
            type: string
        - name: exclude_operations
          in: query
          description: comma separated list of operations to exclude
          schema:
            type: string
        - $ref: "#/components/parameters/ResourceName"
        - $ref: "#/components/parameters/ActionKind"
        - name: all_workspaces
          in: query
          description: get audit logs for all workspaces
          schema:
            type: boolean

      responses:
        "200":
          description: a list of audit logs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AuditLog"

  /auth/login:
    post:
      security: []
      summary: login with password
      operationId: login
      tags:
        - user
      requestBody:
        description: credentials
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Login"

      responses:
        "200":
          description: >
            Successfully authenticated. The session ID is returned in a cookie
            named `token` and as plaintext response. Preferred method of
            authorization is through the bearer token. The cookie is only for
            browser convenience.

          headers:
            Set-Cookie:
              schema:
                type: string
                example: token=abcde12345; Path=/; HttpOnly
          content:
            text/plain:
              schema:
                type: string

  /auth/logout:
    post:
      security: []
      summary: logout
      operationId: logout
      tags:
        - user

      responses:
        "200":
          description: clear cookies and clear token (if applicable)
          headers:
            Set-Cookie:
              schema:
                type: string
          content:
            text/plain:
              schema:
                type: string

  /auth/is_smtp_configured:
    get:
      security: []
      summary: check if SMTP is configured for password reset
      operationId: isSmtpConfigured
      tags:
        - user
      responses:
        "200":
          description: returns true if SMTP is configured
          content:
            application/json:
              schema:
                type: boolean

  /auth/request_password_reset:
    post:
      security: []
      summary: request password reset email
      operationId: requestPasswordReset
      tags:
        - user
      requestBody:
        description: email to send password reset link to
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - email
              properties:
                email:
                  type: string
                  format: email
      responses:
        "200":
          description: password reset email sent (if user exists)
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PasswordResetResponse"
        "400":
          description: SMTP not configured

  /auth/reset_password:
    post:
      security: []
      summary: reset password using token
      operationId: resetPassword
      tags:
        - user
      requestBody:
        description: token and new password
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - token
                - new_password
              properties:
                token:
                  type: string
                new_password:
                  type: string
      responses:
        "200":
          description: password reset successfully
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PasswordResetResponse"
        "400":
          description: invalid or expired token

  /w/{workspace}/users/get/{username}:
    get:
      summary: get user (require admin privilege)
      operationId: getUser
      tags:
        - user
        - admin
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"

  /w/{workspace}/users/update/{username}:
    post:
      summary: update user (require admin privilege)
      operationId: updateUser
      tags:
        - user
        - admin
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: new user
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditWorkspaceUser"
      responses:
        "200":
          description: edited user
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/is_owner/{path}:
    get:
      summary: is owner of path
      operationId: isOwnerOfPath
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: is owner
          content:
            application/json:
              schema:
                type: boolean

  /users/setpassword:
    post:
      summary: set password
      operationId: setPassword
      tags:
        - user
      requestBody:
        description: set password
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                password:
                  type: string
              required:
                - password
      responses:
        "200":
          description: password set
          content:
            text/plain:
              schema:
                type: string

  /users/set_password_of/{user}:
    post:
      summary: set password for a specific user (require super admin)
      operationId: setPasswordForUser
      tags:
        - user
      parameters:
        - name: user
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: set password
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                password:
                  type: string
              required:
                - password
      responses:
        "200":
          description: password set
          content:
            text/plain:
              schema:
                type: string

  /users/set_login_type/{user}:
    post:
      summary: set login type for a specific user (require super admin)
      operationId: setLoginTypeForUser
      tags:
        - user
      parameters:
        - name: user
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: set login type
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                login_type:
                  type: string
              required:
                - login_type
      responses:
        "200":
          description: login type set
          content:
            text/plain:
              schema:
                type: string

  /users/create:
    post:
      summary: create user
      operationId: createUserGlobally
      tags:
        - user
      requestBody:
        description: user info
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                password:
                  type: string
                super_admin:
                  type: boolean
                name:
                  type: string
                company:
                  type: string
                skip_email:
                  type: boolean
                  description: Skip sending email notifications to the user
              required:
                - email
                - password
                - super_admin
      responses:
        "201":
          description: user created
          content:
            text/plain:
              schema:
                type: string

  /users/update/{email}:
    post:
      summary: global update user (require super admin)
      operationId: globalUserUpdate
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: new user info
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                is_super_admin:
                  type: boolean
                is_devops:
                  type: boolean
                name:
                  type: string
      responses:
        "200":
          description: user updated
          content:
            text/plain:
              schema:
                type: string

  /users/username_info/{email}:
    get:
      summary: global username info (require super admin)
      operationId: globalUsernameInfo
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user renamed
          content:
            application/json:
              schema:
                type: object
                properties:
                  username:
                    type: string
                  workspace_usernames:
                    type: array
                    items:
                      type: object
                      properties:
                        workspace_id:
                          type: string
                        username:
                          type: string
                      required:
                        - workspace_id
                        - username
                required:
                  - username
                  - workspace_usernames

  /users/rename/{email}:
    post:
      summary: global rename user (require super admin)
      operationId: globalUserRename
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: new username
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                new_username:
                  type: string
              required:
                - new_username
      responses:
        "200":
          description: user renamed
          content:
            text/plain:
              schema:
                type: string

  /users/delete/{email}:
    delete:
      summary: global delete user (require super admin)
      operationId: globalUserDelete
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user deleted
          content:
            text/plain:
              schema:
                type: string
  /users/overwrite:
    post:
      summary: global overwrite users (require super admin and EE)
      operationId: globalUsersOverwrite
      tags:
        - user
      requestBody:
        description: List of users
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/ExportedUser"
      responses:
        "200":
          description: Success message
          content:
            text/plain:
              schema:
                type: string

  /users/export:
    get:
      summary: global export users (require super admin and EE)
      operationId: globalUsersExport
      tags:
        - user
      responses:
        "200":
          description: exported users
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ExportedUser"

  /users/onboarding:
    post:
      summary: Submit user onboarding data
      operationId: submitOnboardingData
      tags:
        - user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                touch_point:
                  type: string
                use_case:
                  type: string
      responses:
        "200":
          description: Onboarding data submitted successfully
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/users/delete/{username}:
    delete:
      summary: delete user (require admin privilege)
      operationId: deleteUser
      tags:
        - user
        - admin
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: delete user
          content:
            text/plain:
              schema:
                type: string
  /w/{workspace}/users/convert_to_group/{username}:
    post:
      summary: convert manual user to group user (require admin privilege)
      operationId: convertUserToGroup
      tags:
        - user
        - admin
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: convert user to group user
          content:
            text/plain:
              schema:
                type: string

  /github_app/connected_repositories:
    get:
      summary: get connected repositories
      operationId: getGlobalConnectedRepositories
      tags:
        - Git Sync
      parameters:
        - name: page
          in: query
          description: Page number for pagination (default 1)
          required: false
          schema:
            type: integer
            default: 1
      responses:
        "200":
          description: connected repositories
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GithubInstallations"

  /workspaces/list:
    get:
      summary: list all workspaces visible to me
      operationId: listWorkspaces
      tags:
        - workspace
      responses:
        "200":
          description: all workspaces
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Workspace"

  /workspaces/allowed_domain_auto_invite:
    get:
      summary: is domain allowed for auto invi
      operationId: isDomainAllowed
      tags:
        - workspace
      responses:
        "200":
          description: domain allowed or not
          content:
            application/json:
              schema:
                type: boolean

  /workspaces/users:
    get:
      summary: list all workspaces visible to me with user info
      operationId: listUserWorkspaces
      tags:
        - workspace
      responses:
        "200":
          description: workspace with associated username
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UserWorkspaceList"

  /w/{workspace}/workspaces/get_as_superadmin:
    get:
      summary: get workspace as super admin (require to be super admin)
      operationId: getWorkspaceAsSuperAdmin
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: workspace
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Workspace"

  /workspaces/list_as_superadmin:
    get:
      summary: list all workspaces as super admin (require to be super admin)
      operationId: listWorkspacesAsSuperAdmin
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: workspaces
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Workspace"

  /workspaces/create:
    post:
      summary: create workspace
      operationId: createWorkspace
      tags:
        - workspace
      requestBody:
        description: new token
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateWorkspace"
      responses:
        "201":
          description: token created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/create_workspace_fork_branch:
    post:
      summary: create forked workspace branch with git sync
      operationId: createWorkspaceForkGitBranch
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new forked workspace
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateWorkspaceFork"
      responses:
        "201":
          description: forked workspace branch created
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                  format: uuid

  /w/{workspace}/workspaces/create_fork:
    post:
      summary: create forked workspace
      operationId: createWorkspaceFork
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new forked workspace
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateWorkspaceFork"
      responses:
        "201":
          description: forked workspace created
          content:
            text/plain:
              schema:
                type: string

  /workspaces/exists:
    post:
      summary: exists workspace
      operationId: existsWorkspace
      tags:
        - workspace
      requestBody:
        description: id of workspace
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
              required:
                - id
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: boolean

  /workspaces/exists_username:
    post:
      summary: exists username
      operationId: existsUsername
      tags:
        - workspace
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                username:
                  type: string
              required:
                - id
                - username
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: boolean

  /settings/refresh_custom_instance_user_pwd:
    post:
      summary: Refreshes the password for the custom_instance_user
      operationId: refreshCustomInstanceUserPwd
      tags:
        - setting
      responses:
        "200":
          description: Success
          content:
            application/json:
              schema:
                type: object

  /settings/list_custom_instance_pg_databases:
    post:
      summary: Returns the set-up statuses of custom instance pg databases
      operationId: listCustomInstanceDbs
      tags:
        - setting
      responses:
        "200":
          description: Statuses of all custom instance dbs
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: "#/components/schemas/CustomInstanceDb"

  /settings/setup_custom_instance_pg_database/{name}:
    post:
      summary: Runs CREATE DATABASE on the Windmill Postgres and grants access to the custom_instance_user
      operationId: setupCustomInstanceDb
      tags:
        - setting
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                tag:
                  $ref: "#/components/schemas/CustomInstanceDbTag"
      parameters:
        - in: path
          name: name
          required: true
          schema:
            type: string
          description: The name of the database to create
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomInstanceDb"

  /settings/global/{key}:
    get:
      summary: get global settings
      operationId: getGlobal
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/Key"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

    post:
      summary: post global settings
      operationId: setGlobal
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/Key"
      requestBody:
        description: value set
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                value: {}

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/local:
    get:
      summary: get local settings
      operationId: getLocal
      tags:
        - setting
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /settings/test_smtp:
    post:
      summary: test smtp
      operationId: testSmtp
      tags:
        - setting
      requestBody:
        description: test smtp payload
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                to:
                  type: string
                smtp:
                  type: object
                  properties:
                    host:
                      type: string
                    username:
                      type: string
                    password:
                      type: string
                    port:
                      type: integer
                    from:
                      type: string
                    tls_implicit:
                      type: boolean
                    disable_tls:
                      type: boolean
                  required:
                    - host
                    - username
                    - password
                    - port
                    - from
                    - tls_implicit
                    - disable_tls
              required:
                - to
                - smtp
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/test_critical_channels:
    post:
      summary: test critical channels
      operationId: testCriticalChannels
      tags:
        - setting
      requestBody:
        description: test critical channel payload
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                type: object
                properties:
                  email:
                    type: string
                  slack_channel:
                    type: string
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/critical_alerts:
    get:
      summary: Get all critical alerts
      operationId: getCriticalAlerts
      tags:
        - setting
      parameters:
        - in: query
          name: page
          schema:
            type: integer
            default: 1
            description: The page number to retrieve (minimum value is 1)
        - in: query
          name: page_size
          schema:
            type: integer
            default: 10
            maximum: 100
            description: Number of alerts per page (maximum is 100)
        - in: query
          name: acknowledged
          schema:
            type: boolean
            nullable: true
            description: Filter by acknowledgment status; true for acknowledged, false for unacknowledged, and omit for all alerts
      responses:
        "200":
          description: Successfully retrieved all critical alerts
          content:
            application/json:
              schema:
                type: object
                properties:
                  alerts:
                    type: array
                    items:
                      $ref: "#/components/schemas/CriticalAlert"
                  total_rows:
                    type: integer
                    description: Total number of rows matching the query.
                    example: 100
                  total_pages:
                    type: integer
                    description: Total number of pages based on the page size.
                    example: 10

  /settings/critical_alerts/{id}/acknowledge:
    post:
      summary: Acknowledge a critical alert
      operationId: acknowledgeCriticalAlert
      tags:
        - setting
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: integer
          description: The ID of the critical alert to acknowledge
      responses:
        "200":
          description: Successfully acknowledged the critical alert
          content:
            application/json:
              schema:
                type: string
                example: "Critical alert acknowledged"

  /settings/critical_alerts/acknowledge_all:
    post:
      summary: Acknowledge all unacknowledged critical alerts
      operationId: acknowledgeAllCriticalAlerts
      tags:
        - setting
      responses:
        "200":
          description: Successfully acknowledged all unacknowledged critical alerts.
          content:
            application/json:
              schema:
                type: string
                example: "All unacknowledged critical alerts acknowledged"

  /settings/test_license_key:
    post:
      summary: test license key
      operationId: testLicenseKey
      tags:
        - setting
      requestBody:
        description: test license key
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                license_key:
                  type: string
              required:
                - license_key
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

    # pub use_ssl: Option<bool>,
    # #[serde(rename = "accountName")]
    # pub account_name: String,
    # #[serde(rename = "tenantId")]
    # pub tenant_id: Option<String>,
    # #[serde(rename = "clientId")]
    # pub client_id: Option<String>,
    # #[serde(rename = "containerName")]
    # pub container_name: String,
    # #[serde(rename = "accessKey")]
    # pub access_key: Option<String>,

  /settings/test_object_storage_config:
    post:
      summary: test object storage config
      operationId: testObjectStorageConfig
      tags:
        - setting
      requestBody:
        description: test object storage config
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/send_stats:
    post:
      summary: send stats
      operationId: sendStats
      tags:
        - setting
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/latest_key_renewal_attempt:
    get:
      summary: get latest key renewal attempt
      operationId: getLatestKeyRenewalAttempt
      tags:
        - setting
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string
                  attempted_at:
                    type: string
                    format: date-time
                required:
                  - result
                  - attempted_at
                nullable: true

  /settings/renew_license_key:
    post:
      summary: renew license key
      operationId: renewLicenseKey
      tags:
        - setting
      parameters:
        - name: license_key
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/customer_portal:
    post:
      summary: create customer portal session
      operationId: createCustomerPortalSession
      tags:
        - setting
      parameters:
        - name: license_key
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: url to portal
          content:
            text/plain:
              schema:
                type: string

  /saml/test_metadata:
    post:
      summary: test metadata
      operationId: testMetadata
      tags:
        - setting
      requestBody:
        description: test metadata
        required: true
        content:
          application/json:
            schema:
              type: string
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /settings/list_global:
    get:
      summary: list global settings
      operationId: listGlobalSettings
      tags:
        - setting
      responses:
        "200":
          description: list of settings
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/GlobalSetting"

  /min_keep_alive_version:
    get:
      summary: get minimum worker versions required to stay alive
      operationId: getMinKeepAliveVersion
      tags:
        - setting
      responses:
        "200":
          description: minimum keep-alive versions for workers and agents
          content:
            application/json:
              schema:
                type: object
                required:
                  - worker
                  - agent
                properties:
                  worker:
                    type: string
                    description: minimum version for normal workers
                  agent:
                    type: string
                    description: minimum version for agent workers

  /.well-known/jwks.json:
    get:
      summary: get JWKS for Vault JWT authentication
      operationId: getJwks
      tags:
        - setting
      responses:
        "200":
          description: JSON Web Key Set
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JwksResponse"

  /settings/test_secret_backend:
    post:
      summary: test secret backend connection (HashiCorp Vault)
      operationId: testSecretBackend
      tags:
        - setting
      requestBody:
        description: Vault settings to test
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/VaultSettings"
      responses:
        "200":
          description: connection successful
          content:
            text/plain:
              schema:
                type: string

  /settings/migrate_secrets_to_vault:
    post:
      summary: migrate secrets from database to HashiCorp Vault
      operationId: migrateSecretsToVault
      tags:
        - setting
      requestBody:
        description: Vault settings for migration target
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/VaultSettings"
      responses:
        "200":
          description: migration report
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SecretMigrationReport"

  /settings/migrate_secrets_to_database:
    post:
      summary: migrate secrets from HashiCorp Vault to database
      operationId: migrateSecretsToDatabase
      tags:
        - setting
      requestBody:
        description: Vault settings for migration source
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/VaultSettings"
      responses:
        "200":
          description: migration report
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SecretMigrationReport"

  /users/email:
    get:
      summary: get current user email (if logged in)
      operationId: getCurrentEmail
      tags:
        - user
      responses:
        "200":
          description: user email
          content:
            text/plain:
              schema:
                type: string

  /users/refresh_token:
    get:
      summary: refresh the current token
      operationId: refreshUserToken
      tags:
        - user
      parameters:
        - name: if_expiring_in_less_than_s
          in: query
          required: false
          schema:
            type: integer
      responses:
        "200":
          description: new token
          content:
            text/plain:
              schema:
                type: string

  /users/tutorial_progress:
    get:
      summary: get tutorial progress
      operationId: getTutorialProgress
      tags:
        - user
      responses:
        "200":
          description: tutorial progress
          content:
            application/json:
              schema:
                type: object
                properties:
                  progress:
                    type: integer
                  skipped_all:
                    type: boolean
    post:
      summary: update tutorial progress
      operationId: updateTutorialProgress
      tags:
        - user
      requestBody:
        description: progress update
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                progress:
                  type: integer
                skipped_all:
                  type: boolean
      responses:
        "200":
          description: tutorial progress
          content:
            text/plain:
              schema:
                type: string

  /users/leave_instance:
    post:
      summary: leave instance
      operationId: leaveInstance
      tags:
        - user
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /users/usage:
    get:
      summary: get current usage outside of premium workspaces
      operationId: getUsage
      tags:
        - user
      responses:
        "200":
          description: free usage
          content:
            text/plain:
              schema:
                type: number

  /users/all_runnables:
    get:
      summary: get all runnables in every workspace
      operationId: getRunnable
      tags:
        - user
      responses:
        "200":
          description: free all runnables
          content:
            application/json:
              schema:
                type: object
                properties:
                  workspace:
                    type: string
                  endpoint_async:
                    type: string
                  endpoint_sync:
                    type: string
                  summary:
                    type: string
                  description:
                    type: string
                  kind:
                    type: string
                required:
                  - workspace
                  - endpoint_async
                  - endpoint_sync
                  - summary
                  - kind

  /users/whoami:
    get:
      summary: get current global whoami (if logged in)
      operationId: globalWhoami
      tags:
        - user
      responses:
        "200":
          description: user email
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GlobalUserInfo"

  /users/list_invites:
    get:
      summary: list all workspace invites
      operationId: listWorkspaceInvites
      tags:
        - user
      responses:
        "200":
          description: list all workspace invites
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkspaceInvite"

  /w/{workspace}/users/whoami:
    get:
      summary: whoami
      operationId: whoami
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"

  /w/{workspace}/github_app/token:
    post:
      summary: get github app token
      operationId: getGithubAppToken
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: jwt job token
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                job_token:
                  type: string
              required:
                - job_token
      responses:
        "200":
          description: github app token
          content:
            application/json:
              schema:
                type: object
                properties:
                  token:
                    type: string
                required:
                  - token

  /w/{workspace}/github_app/install_from_workspace:
    post:
      tags:
        - Git Sync
      summary: Install a GitHub installation from another workspace
      operationId: installFromWorkspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                source_workspace_id:
                  type: string
                  description: The ID of the workspace containing the installation to copy
                installation_id:
                  type: number
                  description: The ID of the GitHub installation to copy
              required:
                - source_workspace_id
                - installation_id
      responses:
        "200":
          description: Installation successfully copied

  /w/{workspace}/github_app/installation/{installation_id}:
    delete:
      summary: Delete a GitHub installation from a workspace
      operationId: deleteFromWorkspace
      description: Removes a GitHub installation from the specified workspace. Requires admin privileges.
      tags:
        - Git Sync
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: installation_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The ID of the GitHub installation to delete
      responses:
        "200":
          description: Installation successfully deleted

  /w/{workspace}/github_app/export/{installationId}:
    get:
      summary: Export GitHub installation JWT token
      description: Exports the JWT token for a specific GitHub installation in the workspace
      operationId: exportInstallation
      tags:
        - Git Sync
      parameters:
        - name: workspace
          in: path
          required: true
          schema:
            type: string
        - name: installationId
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: Successfully exported the JWT token
          content:
            application/json:
              schema:
                type: object
                properties:
                  jwt_token:
                    type: string

  /w/{workspace}/github_app/import:
    post:
      summary: Import GitHub installation from JWT token
      description: Imports a GitHub installation from a JWT token exported from another instance
      operationId: importInstallation
      tags:
        - Git Sync
      parameters:
        - name: workspace
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - jwt_token
              properties:
                jwt_token:
                  type: string
      responses:
        "200":
          description: Successfully imported the installation

  /users/accept_invite:
    post:
      summary: accept invite to workspace
      operationId: acceptInvite
      tags:
        - user
      requestBody:
        description: accept invite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                workspace_id:
                  type: string
                username:
                  type: string
              required:
                - workspace_id
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /users/decline_invite:
    post:
      summary: decline invite to workspace
      operationId: declineInvite
      tags:
        - user
      requestBody:
        description: decline invite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                workspace_id:
                  type: string
              required:
                - workspace_id
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/invite_user:
    post:
      summary: invite user to workspace
      operationId: inviteUser
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                is_admin:
                  type: boolean
                operator:
                  type: boolean
                parent_workspace_id:
                  type: string
                  nullable: true
              required:
                - email
                - is_admin
                - operator
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/add_user:
    post:
      summary: add user to workspace
      operationId: addUser
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                is_admin:
                  type: boolean
                username:
                  type: string
                operator:
                  type: boolean
              required:
                - email
                - is_admin
                - operator
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/delete_invite:
    post:
      summary: delete user invite
      operationId: delete invite
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                is_admin:
                  type: boolean
                operator:
                  type: boolean
              required:
                - email
                - is_admin
                - operator
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/archive:
    post:
      summary: archive workspace
      operationId: archiveWorkspace
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /workspaces/unarchive/{workspace}:
    post:
      summary: unarchive workspace
      operationId: unarchiveWorkspace
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /workspaces/delete/{workspace}:
    delete:
      summary: delete workspace (require super admin)
      operationId: deleteWorkspace
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: only_delete_forks
          in: query
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/leave:
    post:
      summary: leave workspace
      operationId: leaveWorkspace
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/get_workspace_name:
    get:
      summary: get workspace name
      operationId: getWorkspaceName
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/change_workspace_name:
    post:
      summary: change workspace name
      operationId: changeWorkspaceName
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                new_name:
                  type: string
              required:
                - username
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/change_workspace_id:
    post:
      summary: change workspace id
      operationId: changeWorkspaceId
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                new_id:
                  type: string
                new_name:
                  type: string
              required:
                - username
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/change_workspace_color:
    post:
      summary: change workspace id
      operationId: changeWorkspaceColor
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                color:
                  type: string
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/users/whois/{username}:
    get:
      summary: whois
      operationId: whois
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/User"

  /w/{workspace}/workspaces/operator_settings:
    post:
      operationId: updateOperatorSettings
      summary: Update operator settings for a workspace
      description: Updates the operator settings for a specific workspace. Requires workspace admin privileges.
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/OperatorSettings"
      responses:
        "200":
          description: Operator settings updated successfully
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/compare/{target_workspace_id}:
    get:
      operationId: compareWorkspaces
      summary: Compare two workspaces
      description: Compares the current workspace with a target workspace to find differences in scripts, flows, apps, resources, and variables. Returns information about items that are ahead, behind, or in conflict.
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: target_workspace_id
          in: path
          required: true
          schema:
            type: string
          description: The ID of the workspace to compare with
      responses:
        "200":
          description: Workspace comparison results
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WorkspaceComparison"

  /w/{workspace}/workspaces/reset_diff_tally/{fork_workspace_id}:
    post:
      operationId: resetDiffTally
      summary: Resets the ahead and behind deployement counter after a deployement
      description: This endpoint should be called after a fork deployement
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: fork_workspace_id
          in: path
          required: true
          schema:
            type: string
          description: The ID of the workspace to compare with

      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /users/exists/{email}:
    get:
      summary: exists email
      operationId: existsEmail
      tags:
        - user
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: boolean

  /users/list_as_super_admin:
    get:
      summary: list all users as super admin (require to be super amdin)
      operationId: listUsersAsSuperAdmin
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: active_only
          in: query
          description: filter only active users
          schema:
            type: boolean
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/GlobalUserInfo"

  /w/{workspace}/workspaces/list_pending_invites:
    get:
      summary: list pending invites for a workspace
      operationId: listPendingInvites
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkspaceInvite"

  /w/{workspace}/workspaces/get_settings:
    get:
      summary: get settings
      operationId: getSettings
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  workspace_id:
                    type: string
                  slack_name:
                    type: string
                  slack_team_id:
                    type: string
                  slack_command_script:
                    type: string
                  slack_oauth_client_id:
                    type: string
                  slack_oauth_client_secret:
                    type: string
                  teams_team_id:
                    type: string
                  teams_command_script:
                    type: string
                  teams_team_name:
                    type: string
                  teams_team_guid:
                    type: string
                  auto_invite:
                    $ref: "#/components/schemas/AutoInviteConfig"
                  plan:
                    type: string
                  customer_id:
                    type: string
                  webhook:
                    type: string
                  deploy_to:
                    type: string
                  ai_config:
                    $ref: "#/components/schemas/AIConfig"
                  error_handler:
                    $ref: "#/components/schemas/ErrorHandlerConfig"
                  success_handler:
                    $ref: "#/components/schemas/SuccessHandlerConfig"
                  large_file_storage:
                    $ref: "#/components/schemas/LargeFileStorage"
                  ducklake:
                    $ref: "#/components/schemas/DucklakeSettings"
                  datatable:
                    $ref: "#/components/schemas/DataTableSettings"
                  git_sync:
                    $ref: "#/components/schemas/WorkspaceGitSyncSettings"
                  deploy_ui:
                    $ref: "#/components/schemas/WorkspaceDeployUISettings"
                  default_app:
                    type: string
                  default_scripts:
                    $ref: "#/components/schemas/WorkspaceDefaultScripts"
                  mute_critical_alerts:
                    type: boolean
                  color:
                    type: string
                  operator_settings:
                    $ref: "#/components/schemas/OperatorSettings"

  /w/{workspace}/workspaces/get_deploy_to:
    get:
      summary: get deploy to
      operationId: getDeployTo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  deploy_to:
                    type: string

  /w/{workspace}/workspaces/is_premium:
    get:
      summary: get if workspace is premium
      operationId: getIsPremium
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/workspaces/premium_info:
    get:
      summary: get premium info
      operationId: getPremiumInfo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: skip_subscription_fetch
          in: query
          description: skip fetching subscription status from stripe
          schema:
            type: boolean

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  premium:
                    type: boolean
                  usage:
                    type: number
                  owner:
                    type: string
                  status:
                    type: string
                  is_past_due:
                    type: boolean
                  max_tolerated_executions:
                    type: number
                required:
                  - premium
                  - owner
                  - is_past_due

  /w/{workspace}/workspaces/threshold_alert:
    get:
      summary: get threshold alert info
      operationId: getThresholdAlert
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  threshold_alert_amount:
                    type: number
                  last_alert_sent:
                    type: string
                    format: date-time
    post:
      summary: set threshold alert info
      operationId: setThresholdAlert
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: threshold alert info
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                threshold_alert_amount:
                  type: number

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/rebuild_dependency_map:
    post:
      summary: rebuild dependency map
      operationId: rebuildDependencyMap
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string
  /w/{workspace}/workspaces/get_dependents/{imported_path}:
    get:
      summary: get dependents of an imported path
      operationId: getDependents
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: imported_path
          in: path
          required: true
          schema:
            type: string
          description: The imported path to get dependents for
      responses:
        "200":
          description: list of dependents
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/DependencyDependent"

  /w/{workspace}/workspaces/get_dependents_amounts:
    post:
      summary: get dependents amounts for multiple imported paths
      operationId: getDependentsAmounts
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: List of imported paths to get dependents counts for
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
      responses:
        "200":
          description: list of dependents amounts
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/DependentsAmount"

  /w/{workspace}/workspaces/get_dependency_map:
    get:
      summary: get dependency map
      operationId: getDependencyMap
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: dmap
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/DependencyMap"

  /w/{workspace}/workspaces/edit_slack_command:
    post:
      summary: edit slack command
      operationId: editSlackCommand
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                slack_command_script:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/slack_oauth_config:
    get:
      summary: get workspace slack oauth config
      operationId: getWorkspaceSlackOauthConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: slack oauth config
          content:
            application/json:
              schema:
                type: object
                properties:
                  slack_oauth_client_id:
                    type: string
                    nullable: true
                  slack_oauth_client_secret:
                    type: string
                    nullable: true
                    description: Masked with *** if set
    post:
      summary: set workspace slack oauth config
      operationId: setWorkspaceSlackOauthConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Slack OAuth Configuration
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - slack_oauth_client_id
                - slack_oauth_client_secret
              properties:
                slack_oauth_client_id:
                  type: string
                slack_oauth_client_secret:
                  type: string
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string
    delete:
      summary: delete workspace slack oauth config
      operationId: deleteWorkspaceSlackOauthConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_teams_command:
    post:
      summary: edit teams command
      operationId: editTeamsCommand
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                slack_command_script:
                  type: string
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/available_teams_ids:
    get:
      summary: list available teams ids
      operationId: listAvailableTeamsIds
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: search
          in: query
          description: Search teams by name. If omitted, returns first page of all teams.
          required: false
          schema:
            type: string
        - name: next_link
          in: query
          description: Pagination cursor URL from previous response. Pass this to fetch the next page of results.
          required: false
          schema:
            type: string
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  teams:
                    type: array
                    items:
                      type: object
                      properties:
                        team_name:
                          type: string
                        team_id:
                          type: string
                  total_count:
                    type: integer
                    description: Total number of teams across all pages
                  per_page:
                    type: integer
                    description: Number of teams per page (configurable via TEAMS_PER_PAGE env var)
                  next_link:
                    type: string
                    nullable: true
                    description: URL to fetch next page of results. Null if no more pages.

  /w/{workspace}/workspaces/available_teams_channels:
    get:
      summary: list available channels for a specific team
      operationId: listAvailableTeamsChannels
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: team_id
          in: query
          description: Microsoft Teams team ID
          required: true
          schema:
            type: string
      responses:
        "200":
          description: List of channels for the specified team
          content:
            application/json:
              schema:
                type: object
                properties:
                  channels:
                    type: array
                    items:
                      type: object
                      properties:
                        channel_name:
                          type: string
                        channel_id:
                          type: string
                  total_count:
                    type: integer

  /w/{workspace}/workspaces/connect_teams:
    post:
      summary: connect teams
      operationId: connectTeams
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: connect teams
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                team_id:
                  type: string
                team_name:
                  type: string
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/run_slack_message_test_job:
    post:
      summary: run a job that sends a message to Slack
      operationId: runSlackMessageTestJob
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: path to hub script to run and its corresponding args
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                hub_script_path:
                  type: string
                channel:
                  type: string
                test_msg:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/json:
              schema:
                type: object
                properties:
                  job_uuid:
                    type: string

  /w/{workspace}/workspaces/run_teams_message_test_job:
    post:
      summary: run a job that sends a message to Teams
      operationId: runTeamsMessageTestJob
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: path to hub script to run and its corresponding args
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                hub_script_path:
                  type: string
                channel:
                  type: string
                test_msg:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/json:
              schema:
                type: object
                properties:
                  job_uuid:
                    type: string

  /w/{workspace}/workspaces/edit_deploy_to:
    post:
      summary: edit deploy to
      operationId: editDeployTo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deploy_to:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_auto_invite:
    post:
      summary: edit auto invite
      operationId: editAutoInvite
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceInvite
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                operator:
                  type: boolean
                invite_all:
                  type: boolean
                auto_add:
                  type: boolean

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_instance_groups:
    post:
      summary: edit instance groups
      operationId: editInstanceGroups
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Instance Groups Configuration
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                groups:
                  type: array
                  items:
                    type: string
                roles:
                  type: object
                  additionalProperties:
                    type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_webhook:
    post:
      summary: edit webhook
      operationId: editWebhook
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceWebhook
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                webhook:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_copilot_config:
    post:
      summary: edit copilot config
      operationId: editCopilotConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceCopilotConfig
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/AIConfig"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/get_copilot_info:
    get:
      summary: get copilot info
      operationId: getCopilotInfo
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AIConfig"

  /w/{workspace}/workspaces/edit_error_handler:
    post:
      summary: edit error handler
      operationId: editErrorHandler
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceErrorHandler
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditErrorHandler"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_success_handler:
    post:
      summary: edit success handler
      operationId: editSuccessHandler
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: WorkspaceSuccessHandler
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditSuccessHandler"
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/edit_large_file_storage_config:
    post:
      summary: edit large file storage settings
      operationId: editLargeFileStorageConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: LargeFileStorage info
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                large_file_storage:
                  $ref: "#/components/schemas/LargeFileStorage"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspaces/list_ducklakes:
    get:
      summary: list ducklakes
      operationId: listDucklakes
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/workspaces/list_datatables:
    get:
      summary: list Datatables
      operationId: listDataTables
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/workspaces/list_datatable_schemas:
    get:
      summary: list schemas of all connected Datatables
      operationId: listDataTableSchemas
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: schemas of all datatables
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/DataTableSchema"

  /w/{workspace}/workspaces/edit_ducklake_config:
    post:
      summary: edit ducklake settings
      operationId: editDucklakeConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Ducklake settings
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [settings]
              properties:
                settings:
                  $ref: "#/components/schemas/DucklakeSettings"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspaces/edit_datatable_config:
    post:
      summary: edit datatable settings
      operationId: editDataTableConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: DataTable settings
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [settings]
              properties:
                settings:
                  $ref: "#/components/schemas/DataTableSettings"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspaces/edit_git_sync_config:
    post:
      summary: edit workspace git sync settings
      operationId: editWorkspaceGitSyncConfig
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Workspace Git sync settings
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                git_sync_settings:
                  $ref: "#/components/schemas/WorkspaceGitSyncSettings"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspaces/edit_git_sync_repository:
    post:
      summary: add or update individual git sync repository
      operationId: editGitSyncRepository
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Git sync repository settings to add or update
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                git_repo_resource_path:
                  type: string
                  description: The resource path of the git repository to update
                repository:
                  $ref: "#/components/schemas/GitRepositorySettings"
              required:
                - git_repo_resource_path
                - repository
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspaces/delete_git_sync_repository:
    delete:
      summary: delete individual git sync repository
      operationId: deleteGitSyncRepository
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Git sync repository to delete
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                git_repo_resource_path:
                  type: string
                  description: The resource path of the git repository to delete
              required:
                - git_repo_resource_path
      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspaces/edit_deploy_ui_config:
    post:
      summary: edit workspace deploy ui settings
      operationId: editWorkspaceDeployUISettings
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Workspace deploy UI settings
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deploy_ui_settings:
                  $ref: "#/components/schemas/WorkspaceDeployUISettings"

      responses:
        "200":
          description: status
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspaces/edit_default_app:
    post:
      summary: edit default app for workspace
      operationId: editWorkspaceDefaultApp
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Workspace default app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                default_app_path:
                  type: string

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/default_scripts:
    post:
      summary: edit default scripts for workspace
      operationId: editDefaultScripts
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Workspace default app
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkspaceDefaultScripts"

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string
    get:
      summary: get default scripts for workspace
      operationId: get default scripts
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WorkspaceDefaultScripts"

  /w/{workspace}/workspaces/set_environment_variable:
    post:
      summary: set environment variable
      operationId: setEnvironmentVariable
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Workspace default app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                value:
                  type: string
              required: [name]
      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/encryption_key:
    get:
      summary: retrieves the encryption key for this workspace
      operationId: getWorkspaceEncryptionKey
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  key:
                    type: string
                required:
                  - key
    post:
      summary: update the encryption key for this workspace
      operationId: setWorkspaceEncryptionKey
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: New encryption key
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                new_key:
                  type: string
                skip_reencrypt:
                  type: boolean
              required:
                - new_key

      responses:
        "200":
          description: status
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspaces/default_app:
    get:
      summary: get default app for workspace
      operationId: getWorkspaceDefaultApp
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  default_app_path:
                    type: string

  /w/{workspace}/workspaces/usage:
    get:
      summary: get usage
      operationId: getWorkspaceUsage
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: usage
          content:
            text/plain:
              schema:
                type: number

  /w/{workspace}/workspaces/used_triggers:
    get:
      summary: get used triggers
      operationId: getUsedTriggers
      tags:
        - workspace
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: object
                properties:
                  http_routes_used:
                    type: boolean
                  websocket_used:
                    type: boolean
                  kafka_used:
                    type: boolean
                  nats_used:
                    type: boolean
                  postgres_used:
                    type: boolean
                  mqtt_used:
                    type: boolean
                  gcp_used:
                    type: boolean
                  sqs_used:
                    type: boolean
                  email_used:
                    type: boolean
                  nextcloud_used:
                    type: boolean
                required:
                  - http_routes_used
                  - websocket_used
                  - kafka_used
                  - nats_used
                  - postgres_used
                  - mqtt_used
                  - gcp_used
                  - sqs_used
                  - email_used
                  - nextcloud_used
  /w/{workspace}/users/list:
    get:
      summary: list users
      operationId: listUsers
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/User"

  /w/{workspace}/users/list_usage:
    get:
      summary: list users usage
      operationId: listUsersUsage
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/UserUsage"

  /w/{workspace}/users/list_usernames:
    get:
      summary: list usernames
      operationId: listUsernames
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: user
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/users/username_to_email/{username}:
    get:
      summary: get email from username
      operationId: usernameToEmail
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: username
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: email
          content:
            text/plain:
              schema:
                type: string

  /tokens/list/scopes:
    get:
      summary: list of available scopes
      operationId: ListAvailableScopes
      tags:
        - token
      responses:
        "200":
          description: list of available scopes
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ScopeDomain"

  /users/tokens/create:
    post:
      summary: create token
      operationId: createToken
      tags:
        - user
      requestBody:
        description: new token
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewToken"
      responses:
        "201":
          description: token created
          content:
            text/plain:
              schema:
                type: string

  /users/tokens/impersonate:
    post:
      summary: create token to impersonate a user (require superadmin)
      operationId: createTokenImpersonate
      tags:
        - user
      requestBody:
        description: new token
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewTokenImpersonate"
      responses:
        "201":
          description: token created
          content:
            text/plain:
              schema:
                type: string

  /users/tokens/delete/{token_prefix}:
    delete:
      summary: delete token
      operationId: deleteToken
      tags:
        - user
      parameters:
        - name: token_prefix
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: delete token
          content:
            text/plain:
              schema:
                type: string

  /users/tokens/list:
    get:
      summary: list token
      operationId: listTokens
      tags:
        - user
      parameters:
        - name: exclude_ephemeral
          in: query
          schema:
            type: boolean
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: truncated token
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TruncatedToken"

  /w/{workspace}/oidc/token/{audience}:
    post:
      summary: get OIDC token (ee only)
      operationId: getOidcToken
      tags:
        - oidc
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: audience
          in: path
          required: true
          schema:
            type: string
        - name: expires_in
          in: query
          schema:
            type: number

      responses:
        "200":
          description: new oidc token
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/create:
    post:
      summary: create variable
      operationId: createVariable
      x-mcp-tool: true
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: already_encrypted
          description: whether the variable is already encrypted (default false)
          in: query
          schema:
            type: boolean
      requestBody:
        description: new variable
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateVariable"
      responses:
        "201":
          description: variable created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/encrypt:
    post:
      summary: encrypt value
      operationId: encryptValue
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new variable
        required: true
        content:
          application/json:
            schema:
              type: string
      responses:
        "200":
          description: encrypted value
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/delete/{path}:
    delete:
      summary: delete variable
      operationId: deleteVariable
      x-mcp-tool: true
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: variable deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/delete_bulk:
    delete:
      summary: delete variables in bulk
      operationId: deleteVariablesBulk
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: paths to delete
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                paths:
                  type: array
                  items:
                    type: string
              required:
                - paths
      responses:
        "200":
          description: deleted paths
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/variables/update/{path}:
    post:
      summary: update variable
      operationId: updateVariable
      x-mcp-tool: true
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: already_encrypted
          description: whether the variable is already encrypted (default false)
          in: query
          schema:
            type: boolean
      requestBody:
        description: updated variable
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditVariable"
      responses:
        "200":
          description: variable updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/variables/get/{path}:
    get:
      summary: get variable
      operationId: getVariable
      x-mcp-tool: true
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: decrypt_secret
          description: |
            ask to decrypt secret if this variable is secret
            (if not secret no effect, default: true)
          in: query
          schema:
            type: boolean
        - name: include_encrypted
          description: |
            ask to include the encrypted value if secret and decrypt secret is not true (default: false)
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: variable
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ListableVariable"

  /w/{workspace}/variables/get_value/{path}:
    get:
      summary: get variable value
      operationId: getVariableValue
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: allow_cache
          description: |
            allow getting a cached value for improved performance
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: variable
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/variables/exists/{path}:
    get:
      summary: does variable exists at path
      operationId: existsVariable
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: variable
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/variables/list:
    get:
      summary: list variables
      operationId: listVariable
      x-mcp-tool: true
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: path_start
          description: filter variables by path prefix
          in: query
          schema:
            type: string
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: variable list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableVariable"

  /w/{workspace}/variables/list_contextual:
    get:
      summary: list contextual variables
      operationId: listContextualVariables
      tags:
        - variable
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: contextual variable list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ContextualVariable"

  /w/{workspace}/workspaces/get_secondary_storage_names:
    get:
      summary: get secondary storage names
      operationId: getSecondaryStorageNames
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: status
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/workspaces/critical_alerts:
    get:
      summary: Get all critical alerts for this workspace
      operationId: workspaceGetCriticalAlerts
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - in: query
          name: page
          schema:
            type: integer
            default: 1
            description: The page number to retrieve (minimum value is 1)
        - in: query
          name: page_size
          schema:
            type: integer
            default: 10
            maximum: 100
            description: Number of alerts per page (maximum is 100)
        - in: query
          name: acknowledged
          schema:
            type: boolean
            nullable: true
            description: Filter by acknowledgment status; true for acknowledged, false for unacknowledged, and omit for all alerts
      responses:
        "200":
          description: Successfully retrieved all critical alerts
          content:
            application/json:
              schema:
                type: object
                properties:
                  alerts:
                    type: array
                    items:
                      $ref: "#/components/schemas/CriticalAlert"
                  total_rows:
                    type: integer
                    description: Total number of rows matching the query.
                    example: 100
                  total_pages:
                    type: integer
                    description: Total number of pages based on the page size.
                    example: 10

  /w/{workspace}/workspaces/critical_alerts/{id}/acknowledge:
    post:
      summary: Acknowledge a critical alert for this workspace
      operationId: workspaceAcknowledgeCriticalAlert
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - in: path
          name: id
          required: true
          schema:
            type: integer
          description: The ID of the critical alert to acknowledge
      responses:
        "200":
          description: Successfully acknowledged the critical alert
          content:
            application/json:
              schema:
                type: string
                example: "Critical alert acknowledged"

  /w/{workspace}/workspaces/critical_alerts/acknowledge_all:
    post:
      summary: Acknowledge all unacknowledged critical alerts for this workspace
      operationId: workspaceAcknowledgeAllCriticalAlerts
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: Successfully acknowledged all unacknowledged critical alerts.
          content:
            application/json:
              schema:
                type: string
                example: "All unacknowledged critical alerts acknowledged"

  /w/{workspace}/workspaces/critical_alerts/mute:
    post:
      summary: Mute critical alert UI for this workspace
      operationId: workspaceMuteCriticalAlertsUI
      tags:
        - setting
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Boolean flag to mute critical alerts.
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mute_critical_alerts:
                  type: boolean
                  description: Whether critical alerts should be muted.
                  example: true
      responses:
        "200":
          description: Successfully updated mute critical alert settings.
          content:
            application/json:
              schema:
                type: string
                example: "Updated mute critical alert UI settings for workspace: workspace_id"

  /oauth/login_callback/{client_name}:
    post:
      security: []
      summary: login with oauth authorization flow
      operationId: loginWithOauth
      tags:
        - user
      parameters:
        - $ref: "#/components/parameters/ClientName"
      requestBody:
        description: Partially filled script
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                state:
                  type: string

      responses:
        "200":
          description: >
            Successfully authenticated. The session ID is returned in a cookie
            named `token` and as plaintext response. Preferred method of
            authorization is through the bearer token. The cookie is only for
            browser convenience.

          headers:
            Set-Cookie:
              schema:
                type: string
                example: token=abcde12345; Path=/; HttpOnly
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/connect_slack_callback:
    post:
      summary: connect slack callback
      operationId: connectSlackCallback
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: code endpoint
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                state:
                  type: string
              required:
                - code
                - state
      responses:
        "200":
          description: slack token
          content:
            text/plain:
              schema:
                type: string

  /oauth/connect_slack_callback:
    post:
      summary: connect slack callback instance
      operationId: connectSlackCallbackInstance
      tags:
        - oauth
      requestBody:
        description: code endpoint
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                state:
                  type: string
              required:
                - code
                - state
      responses:
        "200":
          description: success message
          content:
            text/plain:
              schema:
                type: string

  /oauth/connect_callback/{client_name}:
    post:
      summary: connect callback
      operationId: connectCallback
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/ClientName"
      requestBody:
        description: code endpoint
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                state:
                  type: string
              required:
                - code
                - state
      responses:
        "200":
          description: oauth token
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TokenResponse"

  /w/{workspace}/oauth/create_account:
    post:
      summary: create OAuth account
      operationId: createAccount
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: code endpoint
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                refresh_token:
                  type: string
                  description: "OAuth refresh token. For authorization_code flow, this contains the actual refresh token. For client_credentials flow, this must be set to an empty string."
                expires_in:
                  type: integer
                client:
                  type: string
                grant_type:
                  type: string
                  default: "authorization_code"
                cc_client_id:
                  type: string
                  description: "OAuth client ID for resource-level credentials (client_credentials flow only)"
                cc_client_secret:
                  type: string
                  description: "OAuth client secret for resource-level credentials (client_credentials flow only)"
                cc_token_url:
                  type: string
                  description: "OAuth token URL override for resource-level authentication (client_credentials flow only)"
                mcp_server_url:
                  type: string
                  description: "MCP server URL for MCP OAuth token refresh"
              required:
                - refresh_token
                - expires_in
                - client
      responses:
        "200":
          description: account set
          content:
            text/plain:
              schema:
                type: string

  /oauth/connect_client_credentials/{client}:
    post:
      summary: connect OAuth using client credentials
      operationId: connectClientCredentials
      tags:
        - oauth
      parameters:
        - name: client
          in: path
          description: OAuth client name
          required: true
          schema:
            type: string
      requestBody:
        description: client credentials flow parameters
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                scopes:
                  type: array
                  items:
                    type: string
                cc_client_id:
                  type: string
                  description: "OAuth client ID for resource-level authentication"
                cc_client_secret:
                  type: string
                  description: "OAuth client secret for resource-level authentication"
                cc_token_url:
                  type: string
                  description: "OAuth token URL override for resource-level authentication"
              required:
                - cc_client_id
                - cc_client_secret
      responses:
        "200":
          description: OAuth token response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TokenResponse"

  /w/{workspace}/oauth/refresh_token/{id}:
    post:
      summary: refresh token
      operationId: refreshToken
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/AccountId"
      requestBody:
        description: variable path
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
              required:
                - path
      responses:
        "200":
          description: token refreshed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/disconnect/{id}:
    post:
      summary: disconnect account
      operationId: disconnectAccount
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/AccountId"
      responses:
        "200":
          description: disconnected client
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/disconnect_slack:
    post:
      summary: disconnect slack
      operationId: disconnectSlack
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: disconnected slack
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/oauth/disconnect_teams:
    post:
      summary: disconnect teams
      operationId: disconnectTeams
      tags:
        - oauth
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: disconnected teams
          content:
            text/plain:
              schema:
                type: string

  /oauth/list_logins:
    get:
      summary: list oauth logins
      operationId: listOAuthLogins
      tags:
        - oauth
      responses:
        "200":
          description: list of oauth and saml login clients
          content:
            application/json:
              schema:
                type: object
                properties:
                  oauth:
                    type: array
                    items:
                      type: object
                      properties:
                        type:
                          type: string
                        display_name:
                          type: string
                      required:
                        - type
                  saml:
                    type: string
                required:
                  - oauth

  /oauth/list_connects:
    get:
      summary: list oauth connects
      operationId: listOAuthConnects
      tags:
        - oauth
      responses:
        "200":
          description: list of oauth connects clients
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /oauth/get_connect/{client}:
    get:
      summary: get oauth connect
      operationId: getOAuthConnect
      tags:
        - oauth
      parameters:
        - name: client
          description: client name
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: get
          content:
            application/json:
              schema:
                type: object
                properties:
                  extra_params:
                    type: object
                  scopes:
                    type: array
                    items:
                      type: string
                  grant_types:
                    type: array
                    items:
                      type: string

  /teams/activities:
    post:
      summary: send update to Microsoft Teams activity
      description: Respond to a Microsoft Teams activity after a workspace command is run
      operationId: sendMessageToConversation
      tags:
        - teams
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - conversation_id
                - text
              properties:
                conversation_id:
                  type: string
                  description: The ID of the Teams conversation/activity
                success:
                  type: boolean
                  description: Used for styling the card conditionally
                  default: true
                text:
                  type: string
                  description: The message text to be sent in the Teams card
                card_block:
                  type: object
                  description: The card block to be sent in the Teams card

      responses:
        "200":
          description: Activity processed successfully

  /w/{workspace}/resources/create:
    post:
      summary: create resource
      operationId: createResource
      x-mcp-tool: true
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: update_if_exists
          description: update the resource if it already exists (default false)
          in: query
          schema:
            type: boolean
      requestBody:
        description: new resource
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateResource"
      responses:
        "201":
          description: resource created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/delete/{path}:
    delete:
      summary: delete resource
      operationId: deleteResource
      x-mcp-tool: true
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/delete_bulk:
    delete:
      summary: delete resources in bulk
      operationId: deleteResourcesBulk
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: paths to delete
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                paths:
                  type: array
                  items:
                    type: string
              required:
                - paths
      responses:
        "200":
          description: deleted paths
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/resources/update/{path}:
    post:
      summary: update resource
      operationId: updateResource
      x-mcp-tool: true
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated resource
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditResource"
      responses:
        "200":
          description: resource updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/update_value/{path}:
    post:
      summary: update resource value
      operationId: updateResourceValue
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated resource
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                value: {}
      responses:
        "200":
          description: resource value updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/get/{path}:
    get:
      summary: get resource
      operationId: getResource
      x-mcp-tool: true
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Resource"

  /w/{workspace}/resources/get_value_interpolated/{path}:
    get:
      summary: get resource interpolated (variables and resources are fully unrolled)
      operationId: getResourceValueInterpolated
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: job_id
          description: job id
          in: query
          schema:
            type: string
            format: uuid
        - name: allow_cache
          description: allow getting a cached value for improved performance
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: resource value
          content:
            application/json:
              schema: {}

  /w/{workspace}/resources/get_value/{path}:
    get:
      summary: get resource value
      operationId: getResourceValue
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource value
          content:
            application/json:
              schema: {}

  /w/{workspace}/resources/git_commit_hash/{path}:
    get:
      summary: get git repository latest commit hash
      operationId: getGitCommitHash
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: git_ssh_identity
          in: query
          schema:
            type: string
      responses:
        "200":
          description: git commit hash
          content:
            application/json:
              schema:
                type: object
                properties:
                  commit_hash:
                    type: string
                    description: Latest commit hash from git ls-remote
                required:
                  - commit_hash

  /w/{workspace}/resources/exists/{path}:
    get:
      summary: does resource exists
      operationId: existsResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: does resource exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/resources/list:
    get:
      summary: list resources
      operationId: listResource
      x-mcp-tool: true
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: resource_type
          description: resource_types to list from, separated by ',',
          in: query
          schema:
            type: string
        - name: resource_type_exclude
          description: resource_types to not list from, separated by ',',
          in: query
          schema:
            type: string
        - name: path_start
          description: filter resources by path prefix
          in: query
          schema:
            type: string
      responses:
        "200":
          description: resource list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableResource"

  /w/{workspace}/resources/list_search:
    get:
      summary: list resources for search
      operationId: listSearchResource
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: resource list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    value: {}
                  required:
                    - path
                    - value

  /w/{workspace}/resources/mcp_tools/{path}:
    get:
      summary: get MCP tools from resource
      operationId: getMcpTools
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: list of MCP tools
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                    description:
                      type: string
                    parameters:
                      type: object
                  required:
                    - name
                    - parameters

  /w/{workspace}/resources/list_names/{name}:
    get:
      summary: list resource names
      operationId: listResourceNames
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: resource list names
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                    path:
                      type: string
                  required:
                    - name
                    - path

  /w/{workspace}/resources/type/create:
    post:
      summary: create resource_type
      operationId: createResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new resource_type
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ResourceType"
      responses:
        "201":
          description: resource_type created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/file_resource_type_to_file_ext_map:
    get:
      summary: get map from resource type to format extension
      operationId: fileResourceTypeToFileExtMap
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: map from resource type to file ext
          content:
            application/json:
              schema: {}

  /w/{workspace}/resources/type/delete/{path}:
    delete:
      summary: delete resource_type
      operationId: deleteResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource_type deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/type/update/{path}:
    post:
      summary: update resource_type
      operationId: updateResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated resource_type
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditResourceType"
      responses:
        "200":
          description: resource_type updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/resources/type/get/{path}:
    get:
      summary: get resource_type
      operationId: getResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource_type deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ResourceType"

  /w/{workspace}/resources/type/exists/{path}:
    get:
      summary: does resource_type exists
      operationId: existsResourceType
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: does resource_type exist
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/resources/type/list:
    get:
      summary: list resource_types
      operationId: listResourceType
      x-mcp-tool: true
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: resource_type list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ResourceType"

  /w/{workspace}/resources/type/listnames:
    get:
      summary: list resource_types names
      operationId: listResourceTypeNames
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: resource_type list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/npm_proxy/metadata/{package}:
    get:
      summary: get npm package metadata from private registry
      operationId: getNpmPackageMetadata
      tags:
        - npm_proxy
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: package
          description: npm package name
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: package metadata
          content:
            application/json:
              schema:
                type: object
                properties:
                  tags:
                    type: object
                    additionalProperties:
                      type: string
                  versions:
                    type: array
                    items:
                      type: string

  /w/{workspace}/npm_proxy/resolve/{package}:
    get:
      summary: resolve npm package version from private registry
      operationId: resolveNpmPackageVersion
      tags:
        - npm_proxy
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: package
          description: npm package name
          in: path
          required: true
          schema:
            type: string
        - name: tag
          description: version tag or reference
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: resolved version
          content:
            application/json:
              schema:
                type: object
                properties:
                  version:
                    type: string
                    nullable: true

  /w/{workspace}/npm_proxy/filetree/{package}/{version}:
    get:
      summary: get npm package file tree from private registry
      operationId: getNpmPackageFiletree
      tags:
        - npm_proxy
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: package
          description: npm package name
          in: path
          required: true
          schema:
            type: string
        - name: version
          description: package version
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: package file tree
          content:
            application/json:
              schema:
                type: object
                properties:
                  default:
                    type: string
                  files:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string

  /w/{workspace}/npm_proxy/file/{package}/{version}/{filepath}:
    get:
      summary: get specific file from npm package in private registry
      operationId: getNpmPackageFile
      tags:
        - npm_proxy
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: package
          description: npm package name
          in: path
          required: true
          schema:
            type: string
        - name: version
          description: package version
          in: path
          required: true
          schema:
            type: string
        - name: filepath
          description: file path within package
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: file content
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/embeddings/query_resource_types:
    get:
      summary: query resource types by similarity
      operationId: queryResourceTypes
      tags:
        - resource
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: text
          description: query text
          in: query
          required: true
          schema:
            type: string
        - name: limit
          description: query limit
          in: query
          required: false
          schema:
            type: number
      responses:
        "200":
          description: resource type details
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                    score:
                      type: number
                    schema: {}
                  required:
                    - name
                    - score

  /integrations/hub/list:
    get:
      summary: list hub integrations
      operationId: listHubIntegrations
      tags:
        - integration
      parameters:
        - name: kind
          description: query integrations kind
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: integrations details
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                  required:
                    - name

  /flows/hub/list:
    get:
      summary: list all hub flows
      operationId: listHubFlows
      tags:
        - flow
      responses:
        "200":
          description: hub flows list
          content:
            application/json:
              schema:
                type: object
                properties:
                  flows:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                        flow_id:
                          type: number
                        summary:
                          type: string
                        apps:
                          type: array
                          items:
                            type: string
                        approved:
                          type: boolean
                        votes:
                          type: number

                      required:
                        - id
                        - flow_id
                        - summary
                        - apps
                        - approved
                        - votes

  /flows/hub/get/{id}:
    get:
      summary: get hub flow by id
      operationId: getHubFlowById
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: flow
          content:
            application/json:
              schema:
                type: object
                properties:
                  flow:
                    $ref: "../../openflow.openapi.yaml#/components/schemas/OpenFlow"

  /apps/hub/list:
    get:
      summary: list all hub apps
      operationId: listHubApps
      tags:
        - app
      responses:
        "200":
          description: hub apps list
          content:
            application/json:
              schema:
                type: object
                properties:
                  apps:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                        app_id:
                          type: number
                        summary:
                          type: string
                        apps:
                          type: array
                          items:
                            type: string
                        approved:
                          type: boolean
                        votes:
                          type: number
                      required:
                        - id
                        - app_id
                        - summary
                        - apps
                        - approved
                        - votes

  /apps/hub/get/{id}:
    get:
      summary: get hub app by id
      operationId: getHubAppById
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: app
          content:
            application/json:
              schema:
                type: object
                properties:
                  app:
                    type: object
                    properties:
                      summary:
                        type: string
                      value: {}
                    required:
                      - summary
                      - value
                required:
                  - app

  /apps_u/public_app_by_custom_path/{custom_path}:
    get:
      summary: get public app by custom path
      operationId: getPublicAppByCustomPath
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/CustomPath"
      responses:
        "200":
          description: app details
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/AppWithLastVersion"
                  - type: object
                    properties:
                      workspace_id:
                        type: string

  /scripts/hub/get/{path}:
    get:
      summary: get hub script content by path
      operationId: getHubScriptContentByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script details
          content:
            text/plain:
              schema:
                type: string

  /scripts/hub/get_full/{path}:
    get:
      summary: get full hub script by path
      operationId: getHubScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: string
                  lockfile:
                    type: string
                  schema: {}
                  language:
                    type: string
                  summary:
                    type: string
                required:
                  - content
                  - language

  /scripts/hub/pick/{path}:
    get:
      summary: record hub script pick
      operationId: pickHubScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script pick recorded
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                required:
                  - success

  /scripts/hub/top:
    get:
      summary: get top hub scripts
      operationId: getTopHubScripts
      tags:
        - script
      parameters:
        - name: limit
          description: query limit
          in: query
          required: false
          schema:
            type: number
        - name: app
          description: query scripts app
          in: query
          required: false
          schema:
            type: string
        - name: kind
          description: query scripts kind
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: hub scripts list
          content:
            application/json:
              schema:
                type: object
                properties:
                  asks:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: number
                        ask_id:
                          type: number
                        summary:
                          type: string
                        app:
                          type: string
                        version_id:
                          type: number
                        kind:
                          $ref: "#/components/schemas/HubScriptKind"
                        votes:
                          type: number
                        views:
                          type: number
                      required:
                        - id
                        - ask_id
                        - summary
                        - app
                        - version_id
                        - kind
                        - views
                        - votes

  /embeddings/query_hub_scripts:
    get:
      summary: query hub scripts by similarity
      operationId: queryHubScripts
      tags:
        - script
      parameters:
        - name: text
          description: query text
          in: query
          required: true
          schema:
            type: string
        - name: kind
          description: query scripts kind
          in: query
          required: false
          schema:
            type: string
        - name: limit
          description: query limit
          in: query
          required: false
          schema:
            type: number
        - name: app
          description: query scripts app
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    ask_id:
                      type: number
                    id:
                      type: number
                    version_id:
                      type: number
                    summary:
                      type: string
                    app:
                      type: string
                    kind:
                      $ref: "#/components/schemas/HubScriptKind"
                    score:
                      type: number
                  required:
                    - ask_id
                    - id
                    - version_id
                    - summary
                    - app
                    - kind
                    - score

  /w/{workspace}/scripts/list_search:
    get:
      summary: list scripts for search
      operationId: listSearchScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: script list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    content:
                      type: string
                  required:
                    - path
                    - content

  /w/{workspace}/scripts/list:
    get:
      summary: list all scripts
      operationId: listScripts
      x-mcp-tool: true
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: first_parent_hash
          description: mask to filter scripts whom first direct parent has exact hash
          in: query
          schema:
            type: string
        - name: last_parent_hash
          description: |
            mask to filter scripts whom last parent in the chain has exact hash.
            Beware that each script stores only a limited number of parents. Hence
            the last parent hash for a script is not necessarily its top-most parent.
            To find the top-most parent you will have to jump from last to last hash
             until finding the parent
          in: query
          schema:
            type: string
        - name: parent_hash
          description: |
            is the hash present in the array of stored parent hashes for this script.
            The same warning applies than for last_parent_hash. A script only store a
            limited number of direct parent
          in: query
          schema:
            type: string
        - name: show_archived
          description: |
            (default false)
            show only the archived files.
            when multiple archived hash share the same path, only the ones with the latest create_at
            are
            ed.
          in: query
          schema:
            type: boolean
        - name: include_without_main
          description: |
            (default false)
            include scripts without an exported main function
          in: query
          schema:
            type: boolean
        - name: include_draft_only
          description: |
            (default false)
            include scripts that have no deployed version
          in: query
          schema:
            type: boolean
        - name: is_template
          description: |
            (default regardless)
            if true show only the templates
            if false show only the non templates
            if not defined, show all regardless of if the script is a template
          in: query
          schema:
            type: boolean
        - name: kinds
          description: |
            (default regardless)
            script kinds to filter, split by comma
          in: query
          schema:
            type: string
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
        - name: with_deployment_msg
          description: |
            (default false)
            include deployment message
          in: query
          schema:
            type: boolean
        - name: languages
          in: query
          description: |
            Filter to only include scripts written in the given languages.
            Accepts multiple values as a comma-separated list.
          schema:
            type: string
        - name: without_description
          in: query
          description: |
            (default false)
            If true, the description field will be omitted from the response.
          schema:
            type: boolean

      responses:
        "200":
          description: All scripts
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/list_paths:
    get:
      summary: list all scripts paths
      operationId: listScriptPaths
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: list of script paths
          content:
            text/plain:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/drafts/create:
    post:
      summary: create draft
      operationId: createDraft
      tags:
        - draft
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                typ:
                  type: string
                  enum: ["flow", "script", "app"]
                value: {}
              required:
                - path
                - typ
                - enum
      responses:
        "201":
          description: draft created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/drafts/delete/{kind}/{path}:
    delete:
      summary: delete draft
      operationId: deleteDraft
      tags:
        - draft
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              - script
              - flow
              - app
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: draft deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/create:
    post:
      summary: create script
      operationId: createScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Partially filled script
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewScript"

      responses:
        "201":
          description: script created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/toggle_workspace_error_handler/p/{path}:
    post:
      summary: Toggle ON and OFF the workspace error handler for a given script
      operationId: toggleWorkspaceErrorHandlerForScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: Workspace error handler enabled
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                muted:
                  type: boolean
      responses:
        "200":
          description: error handler toggled
          content:
            text/plain:
              schema:
                type: string

  /workers/custom_tags:
    get:
      summary: get all instance custom tags (tags are used to dispatch jobs to
        different worker groups)
      operationId: getCustomTags
      tags:
        - worker
      parameters:
        - name: show_workspace_restriction
          in: query
          schema:
            type: boolean
          required: false
      responses:
        "200":
          description: list of custom tags
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/workers/custom_tags:
    get:
      summary: get custom tags available for this workspace
      operationId: getCustomTagsForWorkspace
      tags:
        - worker
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: list of custom tags for workspace
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /workers/get_default_tags:
    get:
      summary: get all instance default tags
      operationId: geDefaultTags
      tags:
        - worker
      responses:
        "200":
          description: list of default tags
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /workers/is_default_tags_per_workspace:
    get:
      summary: is default tags per workspace
      operationId: isDefaultTagsPerWorkspace
      tags:
        - worker
      responses:
        "200":
          description: is the default tags per workspace
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/workspace_dependencies/create:
    post:
      summary: create workspace dependencies
      operationId: createWorkspaceDependencies
      tags:
        - workspace_dependencies
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: New workspace dependencies
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewWorkspaceDependencies"

      responses:
        "201":
          description: workspace dependencies created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/workspace_dependencies/archive/{language}:
    post:
      summary: archive workspace dependencies (require admin)
      operationId: archiveWorkspaceDependencies
      tags:
        - workspace_dependencies
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: language
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/ScriptLang"
        - name: name
          in: query
          required: false
          schema:
            type: string

      responses:
        "200":
          description: result
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspace_dependencies/delete/{language}:
    post:
      summary: delete workspace dependencies (require admin)
      operationId: deleteWorkspaceDependencies
      tags:
        - workspace_dependencies
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: language
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/ScriptLang"
        - name: name
          in: query
          required: false
          schema:
            type: string

      responses:
        "200":
          description: result
          content:
            application/json:
              schema: {}

  /w/{workspace}/workspace_dependencies/list:
    get:
      summary: list all workspace dependencies
      operationId: listWorkspaceDependencies
      tags:
        - workspace_dependencies
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: All workspace dependencies
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkspaceDependencies"

  /w/{workspace}/workspace_dependencies/get_latest/{language}:
    get:
      summary: get latest workspace dependencies by language and name
      operationId: getLatestWorkspaceDependencies
      tags:
        - workspace_dependencies
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: language
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/ScriptLang"
        - name: name
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Latest workspace dependencies
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WorkspaceDependencies"

  /w/{workspace}/scripts/archive/p/{path}:
    post:
      summary: archive script by path
      operationId: archiveScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script archived
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/archive/h/{hash}:
    post:
      summary: archive script by hash
      operationId: archiveScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/delete/h/{hash}:
    post:
      summary: delete script by hash (erase content but keep hash, require admin)
      operationId: deleteScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/delete/p/{path}:
    post:
      summary: delete script at a given path (require admin)
      operationId: deleteScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: keep_captures
          description: keep captures
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: script path
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/scripts/delete_bulk:
    delete:
      summary: delete scripts in bulk
      operationId: deleteScriptsBulk
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: paths to delete
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                paths:
                  type: array
                  items:
                    type: string
              required:
                - paths
      responses:
        "200":
          description: deleted paths
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/scripts/get/p/{path}:
    get:
      summary: get script by path
      operationId: getScriptByPath
      x-mcp-tool: true
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: with_starred_info
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/get_triggers_count/{path}:
    get:
      summary: get triggers count of script
      operationId: getTriggersCountOfScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: triggers count
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TriggersCount"

  /w/{workspace}/scripts/list_tokens/{path}:
    get:
      summary: get tokens with script scope
      operationId: listTokensOfScript
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: tokens list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TruncatedToken"

  /w/{workspace}/scripts/get/draft/{path}:
    get:
      summary: get script by path with draft
      operationId: getScriptByPathWithDraft
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NewScriptWithDraft"

  /w/{workspace}/scripts/history/p/{path}:
    get:
      summary: get history of a script by path
      operationId: getScriptHistoryByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script history
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ScriptHistory"

  /w/{workspace}/scripts/list_paths_from_workspace_runnable/{path}:
    get:
      summary: list script paths using provided script as a relative import
      operationId: listScriptPathsFromWorkspaceRunnable
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: list of script paths
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/scripts/get_latest_version/{path}:
    get:
      summary: get scripts's latest version (hash)
      operationId: getScriptLatestVersion
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      tags:
        - script
      responses:
        "200":
          description: Script version/hash
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ScriptHistory"

  /w/{workspace}/scripts/history_update/h/{hash}/p/{path}:
    post:
      summary: update history of a script
      operationId: updateScriptHistory
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: Script deployment message
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deployment_msg:
                  type: string
      responses:
        "200":
          description: success
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/raw/p/{path}:
    get:
      summary: raw script by path
      operationId: rawScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script content
          content:
            text/plain:
              schema:
                type: string

  /scripts_u/tokened_raw/{workspace}/{token}/{path}:
    get:
      summary:
        raw script by path with a token (mostly used by lsp to be used with
        import maps to resolve scripts)
      operationId: rawScriptByPathTokened
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Token"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script content
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/exists/p/{path}:
    get:
      summary: exists script by path
      operationId: existsScriptByPath
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: does it exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/scripts/get/h/{hash}:
    get:
      summary: get script by hash
      operationId: getScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
        - name: with_starred_info
          in: query
          schema:
            type: boolean
        - name: authed
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Script"

  /w/{workspace}/scripts/raw/h/{path}:
    get:
      summary: raw script by hash
      operationId: rawScriptByHash
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: script content
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/scripts/deployment_status/h/{hash}:
    get:
      summary: get script deployment status
      operationId: getScriptDeploymentStatus
      tags:
        - script
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
      responses:
        "200":
          description: script details
          content:
            application/json:
              schema:
                type: object
                properties:
                  lock:
                    type: string
                  lock_error_logs:
                    type: string
                  job_id:
                    type: string
                    format: uuid

  /w/{workspace}/jobs/list_selected_job_groups:
    # We use post because sending a huge array as a query param can produce
    # URLs that may be too long
    post:
      summary: list selected jobs script/flow schemas grouped by (kind, path)
      operationId: listSelectedJobGroups
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
                format: uuid
      responses:
        "200":
          description: result
          content:
            text/plain:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    kind:
                      type: string
                      enum: ["script", "flow"]
                    script_path:
                      type: string
                    latest_schema:
                      type: object
                    schemas:
                      type: array
                      items:
                        type: object
                        properties:
                          schema:
                            type: object
                          script_hash:
                            type: string
                          job_ids:
                            type: array
                            items:
                              type: string
                        required: [schema, script_hash, job_ids]
                  required:
                    - kind
                    - script_path
                    - latest_schema
                    - schemas

  /w/{workspace}/jobs/run/p/{path}:
    post:
      summary: run script by path
      operationId: runScriptByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - name: skip_preprocessor
          description: skip the preprocessor
          in: query
          schema:
            type: boolean
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run_wait_result/p/{path}:
    post:
      summary: run script by path
      operationId: runWaitResultScriptByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/SkipPreprocessor"

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

    get:
      summary: run script by path with get
      operationId: runWaitResultScriptByPathGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/Payload"
        - $ref: "#/components/parameters/SkipPreprocessor"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/run_wait_result/f/{path}:
    post:
      summary: run flow by path and wait until completion
      operationId: runWaitResultFlowByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/run_wait_result/fv/{version}:
    post:
      summary: run flow by version and wait until completion
      operationId: runWaitResultFlowByVersion
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: version
          description: flow version ID
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

    get:
      summary: run flow by version with GET and wait until completion
      operationId: runWaitResultFlowByVersionGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: version
          description: flow version ID
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/Payload"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/run_and_stream/f/{path}:
    post:
      summary: run flow by path and stream updates via SSE
      operationId: runAndStreamFlowByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      requestBody:
        description: flow args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

    get:
      summary: run flow by path with GET and stream updates via SSE
      operationId: runAndStreamFlowByPathGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/Payload"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

  /w/{workspace}/jobs/run_and_stream/fv/{version}:
    post:
      summary: run flow by version and stream updates via SSE
      operationId: runAndStreamFlowByVersion
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: version
          description: flow version ID
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      requestBody:
        description: flow args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

    get:
      summary: run flow by version with GET and stream updates via SSE
      operationId: runAndStreamFlowByVersionGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: version
          description: flow version ID
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/Payload"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

  /w/{workspace}/jobs/run_and_stream/p/{path}:
    post:
      summary: run script by path and stream updates via SSE
      operationId: runAndStreamScriptByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

    get:
      summary: run script by path with GET and stream updates via SSE
      operationId: runAndStreamScriptByPathGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/Payload"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

  /w/{workspace}/jobs/run_and_stream/h/{hash}:
    post:
      summary: run script by hash and stream updates via SSE
      operationId: runAndStreamScriptByHash
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: hash
          in: path
          required: true
          schema:
            type: string
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      requestBody:
        description: script args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

    get:
      summary: run script by hash with GET and stream updates via SSE
      operationId: runAndStreamScriptByHashGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: hash
          in: path
          required: true
          schema:
            type: string
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - $ref: "#/components/parameters/QueueLimit"
        - $ref: "#/components/parameters/Payload"
        - $ref: "#/components/parameters/SkipPreprocessor"
        - name: poll_delay_ms
          description: delay between polling for job updates in milliseconds
          in: query
          schema:
            type: integer
            format: int64

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

  /w/{workspace}/jobs/result_by_id/{flow_job_id}/{node_id}:
    get:
      summary: get job result by id
      operationId: resultById
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: flow_job_id
          in: path
          required: true
          schema:
            type: string
        - name: node_id
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/flows/list_paths:
    get:
      summary: list all flow paths
      operationId: listFlowPaths
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: list of flow paths
          content:
            text/plain:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/flows/list_search:
    get:
      summary: list flows for search
      operationId: listSearchFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: flow list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    value: {}
                  required:
                    - path
                    - value

  /w/{workspace}/flows/list:
    get:
      summary: list all flows
      operationId: listFlows
      x-mcp-tool: true
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: show_archived
          description: |
            (default false)
            show only the archived files.
            when multiple archived hash share the same path, only the ones with the latest create_at
            are displayed.
          in: query
          schema:
            type: boolean
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
        - name: include_draft_only
          description: |
            (default false)
            include items that have no deployed version
          in: query
          schema:
            type: boolean
        - name: with_deployment_msg
          description: |
            (default false)
            include deployment message
          in: query
          schema:
            type: boolean
        - name: without_description
          in: query
          description: |
            (default false)
            If true, the description field will be omitted from the response.
          schema:
            type: boolean
      responses:
        "200":
          description: All flow
          content:
            application/json:
              schema:
                type: array
                items:
                  allOf:
                    - $ref: "#/components/schemas/Flow"
                    - type: object
                      properties:
                        has_draft:
                          type: boolean
                        draft_only:
                          type: boolean

  /w/{workspace}/flows/history/p/{path}:
    get:
      summary: get flow history by path
      operationId: getFlowHistory
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      tags:
        - flow
      responses:
        "200":
          description: Flow history
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/FlowVersion"

  /w/{workspace}/flows/get_latest_version/{path}:
    get:
      summary: get flow's latest version
      operationId: getFlowLatestVersion
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      tags:
        - flow
      responses:
        "200":
          description: Flow version
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FlowVersion"

  /w/{workspace}/flows/list_paths_from_workspace_runnable/{runnable_kind}/{path}:
    get:
      summary: list flow paths from workspace runnable
      operationId: listFlowPathsFromWorkspaceRunnable
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableKind"
        - $ref: "#/components/parameters/ScriptPath"
        - name: match_path_start
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: list of flow paths
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/flows/get/v/{version}:
    get:
      summary: get flow version
      operationId: getFlowVersion
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: version
          in: path
          required: true
          schema:
            type: number
      tags:
        - flow
      responses:
        "200":
          description: flow details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Flow"

  /w/{workspace}/flows/history_update/v/{version}:
    post:
      summary: update flow history
      operationId: updateFlowHistory
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: version
          in: path
          required: true
          schema:
            type: number
      requestBody:
        description: Flow deployment message
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deployment_msg:
                  type: string
              required:
                - deployment_msg
      tags:
        - flow
      responses:
        "200":
          description: success
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/get/{path}:
    get:
      summary: get flow by path
      operationId: getFlowByPath
      x-mcp-tool: true
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: with_starred_info
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: flow details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Flow"

  /w/{workspace}/flows/deployment_status/p/{path}:
    get:
      summary: get flow deployment status
      operationId: getFlowDeploymentStatus
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: flow status
          content:
            application/json:
              schema:
                type: object
                properties:
                  lock_error_logs:
                    type: string
                  job_id:
                    type: string
                    format: uuid

  /w/{workspace}/flows/get_triggers_count/{path}:
    get:
      summary: get triggers count of flow
      operationId: getTriggersCountOfFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: triggers count
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/TriggersCount"

  /w/{workspace}/flows/list_tokens/{path}:
    get:
      summary: get tokens with flow scope
      operationId: listTokensOfFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: tokens list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/TruncatedToken"

  /w/{workspace}/flows/toggle_workspace_error_handler/{path}:
    post:
      summary: Toggle ON and OFF the workspace error handler for a given flow
      operationId: toggleWorkspaceErrorHandlerForFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: Workspace error handler enabled
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                muted:
                  type: boolean
      responses:
        "200":
          description: error handler toggled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/get/draft/{path}:
    get:
      summary: get flow by path with draft
      operationId: getFlowByPathWithDraft
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: flow details with draft
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "#/components/schemas/Flow"
                  - type: object
                    properties:
                      draft:
                        $ref: "#/components/schemas/Flow"

  /w/{workspace}/flows/exists/{path}:
    get:
      summary: exists flow by path
      operationId: existsFlowByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: flow details
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/flows/create:
    post:
      summary: create flow
      operationId: createFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Partially filled flow
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: "#/components/schemas/OpenFlowWPath"
                - type: object
                  properties:
                    draft_only:
                      type: boolean
                    deployment_message:
                      type: string
      responses:
        "201":
          description: flow created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/update/{path}:
    post:
      summary: update flow
      operationId: updateFlow
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: Partially filled flow
        required: true
        content:
          application/json:
            schema:
              allOf:
                - $ref: "#/components/schemas/OpenFlowWPath"
                - type: object
                  properties:
                    deployment_message:
                      type: string

      responses:
        "200":
          description: flow updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/archive/{path}:
    post:
      summary: archive flow by path
      operationId: archiveFlowByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: archiveFlow
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                archived:
                  type: boolean
      responses:
        "200":
          description: flow archived
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flows/delete/{path}:
    delete:
      summary: delete flow by path
      operationId: deleteFlowByPath
      tags:
        - flow
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: keep_captures
          description: keep captures
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: flow delete
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flow_conversations/list:
    get:
      summary: list flow conversations
      operationId: listFlowConversations
      tags:
        - flow_conversation
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: flow_path
          description: filter conversations by flow path
          in: query
          schema:
            type: string
      responses:
        "200":
          description: flow conversations list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/FlowConversation"

  /w/{workspace}/flow_conversations/delete/{conversation_id}:
    delete:
      summary: delete flow conversation
      operationId: deleteFlowConversation
      tags:
        - flow_conversation
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: conversation_id
          description: conversation id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        "200":
          description: flow conversation deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/flow_conversations/{conversation_id}/messages:
    get:
      summary: list conversation messages
      operationId: listConversationMessages
      tags:
        - flow_conversation
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: conversation_id
          description: conversation id
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - name: after_id
          description: id to fetch only the messages after that id
          in: query
          required: false
          schema:
            type: string
            format: uuid
      responses:
        "200":
          description: conversation messages
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/FlowConversationMessage"

  /w/{workspace}/raw_apps/list:
    get:
      summary: list all raw apps
      operationId: listRawApps
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All raw apps
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableRawApp"

  /w/{workspace}/raw_apps/exists/{path}:
    get:
      summary: does an app exisst at path
      operationId: existsRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/apps/get_data/{version}/{path}:
    get:
      summary: get app by path
      operationId: getRawAppData
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/VersionId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: app details
          content:
            text/javascript:
              schema:
                type: string

  /w/{workspace}/apps/list_search:
    get:
      summary: list apps for search
      operationId: listSearchApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: app list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    value: {}
                  required:
                    - path
                    - value

  /w/{workspace}/apps/list:
    get:
      summary: list all apps
      operationId: listApps
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - name: path_start
          description: mask to filter matching starting path
          in: query
          schema:
            type: string
        - name: path_exact
          description: mask to filter exact matching path
          in: query
          schema:
            type: string
        - name: starred_only
          description: |
            (default false)
            show only the starred items
          in: query
          schema:
            type: boolean
        - name: include_draft_only
          description: |
            (default false)
            include items that have no deployed version
          in: query
          schema:
            type: boolean
        - name: with_deployment_msg
          description: |
            (default false)
            include deployment message
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All apps
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListableApp"

  /w/{workspace}/apps/create:
    post:
      summary: create app
      operationId: createApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                value: {}
                summary:
                  type: string
                policy:
                  $ref: "#/components/schemas/Policy"
                draft_only:
                  type: boolean
                deployment_message:
                  type: string
                custom_path:
                  type: string
              required:
                - path
                - value
                - summary
                - policy
      responses:
        "201":
          description: app created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/create_raw:
    post:
      summary: create app raw
      operationId: createAppRaw
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new app
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                app:
                  type: object
                  properties:
                    path:
                      type: string
                    value: {}
                    summary:
                      type: string
                    policy:
                      $ref: "#/components/schemas/Policy"
                    draft_only:
                      type: boolean
                    deployment_message:
                      type: string
                    custom_path:
                      type: string
                  required:
                    - path
                    - value
                    - summary
                    - policy
                js:
                  type: string
                css:
                  type: string
      responses:
        "201":
          description: app created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/exists/{path}:
    get:
      summary: does an app exisst at path
      operationId: existsApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/apps/get/p/{path}:
    get:
      summary: get app by path
      operationId: getAppByPath
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: with_starred_info
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: app details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersion"

  /w/{workspace}/apps/get/lite/{path}:
    get:
      summary: get app lite by path
      operationId: getAppLiteByPath
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: app lite details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersion"

  /w/{workspace}/apps/get/draft/{path}:
    get:
      summary: get app by path with draft
      operationId: getAppByPathWithDraft
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: app details with draft
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersionWDraft"

  /w/{workspace}/apps/history/p/{path}:
    get:
      summary: get app history by path
      operationId: getAppHistoryByPath
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: app history
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AppHistory"

  /w/{workspace}/apps/get_latest_version/{path}:
    get:
      summary: get apps's latest version
      operationId: getAppLatestVersion
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      tags:
        - app
      responses:
        "200":
          description: App version
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppHistory"
  /w/{workspace}/apps/list_paths_from_workspace_runnable/{runnable_kind}/{path}:
    get:
      summary: list app paths from workspace runnable
      operationId: listAppPathsFromWorkspaceRunnable
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableKind"
        - $ref: "#/components/parameters/ScriptPath"
      responses:
        "200":
          description: list of app paths
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/apps/history_update/a/{id}/v/{version}:
    post:
      summary: update app history
      operationId: updateAppHistory
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/PathId"
        - $ref: "#/components/parameters/PathVersion"
      requestBody:
        description: App deployment message
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deployment_msg:
                  type: string
      responses:
        "200":
          description: success
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps_u/public_app/{path}:
    get:
      summary: get public app by secret
      operationId: getPublicAppBySecret
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersion"

  /w/{workspace}/apps_u/public_resource/{path}:
    get:
      summary: get public resource
      operationId: get public resource
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: resource value
          content:
            application/json:
              schema: {}

  /w/{workspace}/apps/secret_of/{path}:
    get:
      summary: get public secret of app
      operationId: getPublicSecretOfApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app secret
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/secret_of_latest_version/{path}:
    get:
      summary: get public secret of latest version of an app bundle
      operationId: getPublicSecretOfLatestVersionOfApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app secret
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/get/v/{id}:
    get:
      summary: get app by version
      operationId: getAppByVersion
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/PathId"
      responses:
        "200":
          description: app details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AppWithLastVersion"

  /w/{workspace}/raw_apps/create:
    post:
      summary: create raw app
      operationId: createRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new raw app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                value:
                  type: string
                summary:
                  type: string
              required:
                - path
                - value
                - summary
      responses:
        "201":
          description: raw app created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/raw_apps/update/{path}:
    post:
      summary: update app
      operationId: updateRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: updateraw  app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                summary:
                  type: string
                value:
                  type: string
      responses:
        "200":
          description: app updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/raw_apps/delete/{path}:
    delete:
      summary: delete raw app
      operationId: deleteRawApp
      tags:
        - raw_app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/delete/{path}:
    delete:
      summary: delete app
      operationId: deleteApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: app deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/update/{path}:
    post:
      summary: update app
      operationId: updateApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: update app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                summary:
                  type: string
                value: {}
                policy:
                  $ref: "#/components/schemas/Policy"
                deployment_message:
                  type: string
                custom_path:
                  type: string
      responses:
        "200":
          description: app updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/update_raw/{path}:
    post:
      summary: update app
      operationId: updateAppRaw
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: update app
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                app:
                  type: object
                  properties:
                    path:
                      type: string
                    summary:
                      type: string
                    value: {}
                    policy:
                      $ref: "#/components/schemas/Policy"
                    deployment_message:
                      type: string
                    custom_path:
                      type: string
                js:
                  type: string
                css:
                  type: string
      responses:
        "200":
          description: app updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps/custom_path_exists/{custom_path}:
    get:
      summary: check if custom path exists
      operationId: customPathExists
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/CustomPath"
      responses:
        "200":
          description: custom path exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/apps/sign_s3_objects:
    post:
      summary: sign s3 objects, to be used by anonymous users in public apps
      operationId: signS3Objects
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: s3 objects to sign
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                s3_objects:
                  type: array
                  items:
                    $ref: "#/components/schemas/S3Object"
              required:
                - s3_objects
      responses:
        "200":
          description: signed s3 objects
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/S3Object"

  /w/{workspace}/apps_u/execute_component/{path}:
    post:
      summary: executeComponent
      operationId: executeComponent
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
      requestBody:
        description: update app
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                component:
                  type: string
                #script: script/<path>
                #flow: flow/<path>
                path:
                  type: string
                version:
                  type: integer
                args: {}
                raw_code:
                  type: object
                  properties:
                    content:
                      type: string
                    language:
                      type: string
                    path:
                      type: string
                    lock:
                      type: string
                    cache_ttl:
                      type: integer
                  required:
                    - content
                    - language
                id:
                  type: integer
                force_viewer_static_fields:
                  type: object
                force_viewer_one_of_fields:
                  type: object
                force_viewer_allow_user_resources:
                  type: array
                  items:
                    type: string
                run_query_params:
                  type: object
                  description: Runnable query parameters
              required:
                - args
                - component

      responses:
        "200":
          description: job uuid
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/apps_u/upload_s3_file/{path}:
    post:
      summary: upload s3 file from app
      operationId: uploadS3FileFromApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: file_key
          in: query
          required: false
          schema:
            type: string
        - name: file_extension
          in: query
          required: false
          schema:
            type: string
        - name: s3_resource_path
          in: query
          required: false
          schema:
            type: string
        - name: resource_type
          in: query
          required: false
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
        - name: content_type
          in: query
          schema:
            type: string
        - name: content_disposition
          in: query
          schema:
            type: string
      requestBody:
        description: File content
        required: true
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
      responses:
        "200":
          description: file uploaded
          content:
            application/json:
              schema:
                type: object
                properties:
                  file_key:
                    type: string
                  delete_token:
                    type: string
                required:
                  - file_key
                  - delete_token

  /w/{workspace}/apps_u/delete_s3_file:
    delete:
      summary: delete s3 file from app
      operationId: deleteS3FileFromApp
      tags:
        - app
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: delete_token
          in: query
          required: true
          schema:
            type: string
      responses:
        "200":
          description: file deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/run/f/{path}:
    post:
      summary: run flow by path
      operationId: runFlowByPath
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptPath"
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/SkipPreprocessor"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the flow owner (default false)
          in: query
          schema:
            type: boolean
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid
      requestBody:
        description: flow args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"
      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/fv/{version}:
    post:
      summary: run flow by version
      operationId: runFlowByVersion
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: version
          description: flow version ID
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/SkipPreprocessor"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the flow owner (default false)
          in: query
          schema:
            type: boolean
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid
      requestBody:
        description: flow args
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/ScriptArgs"
      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/batch_rerun_jobs:
    post:
      summary: re-run multiple jobs
      operationId: batchReRunJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: list of job ids to re run and arg tranforms
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [job_ids, script_options_by_path, flow_options_by_path]
              properties:
                job_ids:
                  type: array
                  items:
                    type: string
                script_options_by_path:
                  type: object
                  additionalProperties:
                    type: object
                    properties:
                      input_transforms:
                        type: object
                        additionalProperties:
                          $ref: "#/components/schemas/InputTransform"
                      use_latest_version:
                        type: boolean
                flow_options_by_path:
                  type: object
                  additionalProperties:
                    type: object
                    properties:
                      input_transforms:
                        type: object
                        additionalProperties:
                          $ref: "#/components/schemas/InputTransform"
                      use_latest_version:
                        type: boolean
      responses:
        "201":
          description: stream of created job uuids separated by \n. Lines may start with 'Error:'
          content:
            text/event-stream:
              schema:
                type: string

  /w/{workspace}/jobs/restart/f/{id}:
    post:
      summary: restart a completed flow at a given step
      operationId: restartFlowAtStep
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the flow owner (default false)
          in: query
          schema:
            type: boolean

      requestBody:
        description: restart flow parameters
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - step_id
              properties:
                step_id:
                  type: string
                  description: step id to restart the flow from
                branch_or_iteration_n:
                  type: integer
                  description: for branchall or loop, the iteration at which the flow should restart (optional)
                flow_version:
                  type: integer
                  description: specific flow version to use for restart (optional, uses current version if not specified)

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/h/{hash}:
    post:
      summary: run script by hash
      operationId: runScriptByHash
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/ScriptHash"
        - name: scheduled_for
          description: when to schedule this job (leave empty for immediate run)
          in: query
          schema:
            type: string
            format: date-time
        - name: scheduled_in_secs
          description: schedule the script to execute in the number of seconds starting now
          in: query
          schema:
            type: integer
        - $ref: "#/components/parameters/SkipPreprocessor"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/WorkerTag"
        - $ref: "#/components/parameters/CacheTtl"
        - $ref: "#/components/parameters/NewJobId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
      requestBody:
        description: Partially filled args
        required: true
        content:
          application/json:
            schema:
              type: object

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/preview:
    post:
      summary: run script preview
      operationId: runScriptPreview
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
        - $ref: "#/components/parameters/NewJobId"

      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Preview"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run_inline/preview:
    post:
      summary: run script preview without starting a new job
      operationId: runScriptPreviewInline
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PreviewInline"

      responses:
        "200":
          description: script result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/run_wait_result/preview:
    post:
      summary: run script preview and wait for result
      operationId: runScriptPreviewAndWaitResult
      x-mcp-tool: true
      x-mcp-instructions: Allows testing a script before deploying it. For typescript code, the language to send is either bun or deno. By default, send bun if no deno specific code is detected.
      x-mcp-required-fields:
        - content
        - language
        - args
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Preview"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/workflow_as_code/{job_id}/{entrypoint}:
    post:
      summary: run code-workflow task
      operationId: runCodeWorkflowTask
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

        - name: job_id
          in: path
          required: true
          schema:
            type: string
        - name: entrypoint
          in: path
          required: true
          schema:
            type: string

      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkflowTask"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run/dependencies:
    post:
      summary: run a one-off dependencies job
      operationId: runRawScriptDependencies
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"

      requestBody:
        description: raw script content
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                raw_scripts:
                  type: array
                  items:
                    $ref: "#/components/schemas/RawScriptForDependencies"
                entrypoint:
                  type: string
              required:
                - entrypoint
                - raw_scripts
      responses:
        "201":
          description: dependency job result
          content:
            application/json:
              schema:
                type: object
                properties:
                  lock:
                    type: string
                required:
                  - lock

  /w/{workspace}/jobs/run/preview_flow:
    post:
      summary: run flow preview
      operationId: runFlowPreview
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/IncludeHeader"
        - name: invisible_to_owner
          description: make the run invisible to the the script owner (default false)
          in: query
          schema:
            type: boolean
        - $ref: "#/components/parameters/NewJobId"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid

      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowPreview"

      responses:
        "201":
          description: job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/run_wait_result/preview_flow:
    post:
      summary: run flow preview and wait for result
      operationId: runFlowPreviewAndWaitResult
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: memory_id
          description: memory ID for chat-enabled flows
          in: query
          schema:
            type: string
            format: uuid

      requestBody:
        description: preview
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/FlowPreview"

      responses:
        "200":
          description: job result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/run/dynamic_select:
    post:
      summary: run dynamic select helper function
      operationId: runDynamicSelect
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: dynamic select request
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DynamicInputData"
      responses:
        "201":
          description: dynamic select job created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/jobs/queue/list:
    get:
      summary: list all queued jobs
      operationId: listQueue
      x-mcp-tool: true
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/Worker"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/TriggerPath"
        - $ref: "#/components/parameters/JobTriggerKind"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/Success"
        - $ref: "#/components/parameters/ScheduledForBeforeNow"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/Suspended"
        - $ref: "#/components/parameters/Running"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/AllowWildcards"
        - $ref: "#/components/parameters/Tag"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: all_workspaces
          description: get jobs from all workspaces (only valid if request come from the `admins` workspace)
          in: query
          schema:
            type: boolean
        - name: is_not_schedule
          description: is not a scheduled job
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All queued jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/QueuedJob"

  /w/{workspace}/jobs/queue/count:
    get:
      summary: get queue count
      operationId: getQueueCount
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: all_workspaces
          description: get jobs from all workspaces (only valid if request come from the `admins` workspace)
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: queue count
          content:
            application/json:
              schema:
                type: object
                properties:
                  database_length:
                    type: integer
                  suspended:
                    type: integer
                required:
                  - database_length

  /w/{workspace}/jobs/completed/count:
    get:
      summary: get completed count
      operationId: getCompletedCount
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: completed count
          content:
            application/json:
              schema:
                type: object
                properties:
                  database_length:
                    type: integer
                required:
                  - database_length

  /w/{workspace}/jobs/completed/count_jobs:
    get:
      summary: count number of completed jobs with filter
      operationId: countCompletedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: completed_after_s_ago
          in: query
          schema:
            type: integer
        - name: success
          in: query
          schema:
            type: boolean
        - name: tags
          in: query
          schema:
            type: string
        - name: all_workspaces
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: Count of completed jobs
          content:
            application/json:
              schema:
                type: integer

  /w/{workspace}/jobs/list_filtered_uuids:
    get:
      summary: get the ids of all jobs matching the given filters
      operationId: listFilteredJobsUuids
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/Label"
        - $ref: "#/components/parameters/Worker"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/CreatedBefore"
        - $ref: "#/components/parameters/CreatedAfter"
        - $ref: "#/components/parameters/CompletedBefore"
        - $ref: "#/components/parameters/CompletedAfter"
        - $ref: "#/components/parameters/CreatedBeforeQueue"
        - $ref: "#/components/parameters/CreatedAfterQueue"
        - $ref: "#/components/parameters/Running"
        - $ref: "#/components/parameters/ScheduledForBeforeNow"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/Suspended"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/Tag"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: is_skipped
          description: is the job skipped
          in: query
          schema:
            type: boolean
        - name: is_flow_step
          description: is the job a flow step
          in: query
          schema:
            type: boolean
        - name: has_null_parent
          description: has null parent
          in: query
          schema:
            type: boolean
        - name: success
          description: filter on successful jobs
          in: query
          schema:
            type: boolean
        - name: all_workspaces
          description: get jobs from all workspaces (only valid if request come from the `admins` workspace)
          in: query
          schema:
            type: boolean
        - name: is_not_schedule
          description: is not a scheduled job
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: uuids of jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/jobs/queue/list_filtered_uuids:
    get:
      summary: get the ids of all queued jobs matching the given filters
      operationId: listFilteredQueueUuids
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/Success"
        - $ref: "#/components/parameters/ScheduledForBeforeNow"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/Suspended"
        - $ref: "#/components/parameters/Running"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/AllowWildcards"
        - $ref: "#/components/parameters/Tag"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: concurrency_key
          in: query
          required: false
          schema:
            type: string
        - name: all_workspaces
          description: get jobs from all workspaces (only valid if request come from the `admins` workspace)
          in: query
          schema:
            type: boolean
        - name: is_not_schedule
          description: is not a scheduled job
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: uuids of jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/jobs/queue/cancel_selection:
    post:
      summary: cancel jobs based on the given uuids
      operationId: cancelSelection
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: force_cancel
          in: query
          schema:
            type: boolean
      requestBody:
        description: uuids of the jobs to cancel
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
      responses:
        "200":
          description: uuids of canceled jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/jobs/get_otel_traces/{id}:
    get:
      summary: get OpenTelemetry traces for a job
      operationId: getJobOtelTraces
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: list of OTEL Span objects (compatible with OpenTelemetry Span proto)
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object

  /w/{workspace}/trigger/{trigger_kind}/resume_suspended_trigger_jobs/{trigger_path}:
    post:
      summary: resume all suspended jobs for a specific trigger
      operationId: resumeSuspendedTriggerJobs
      tags:
        - trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: trigger_kind
          description: The kind of trigger
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/JobTriggerKind"
        - name: trigger_path
          description: The path of the trigger (can contain forward slashes)
          in: path
          required: true
          schema:
            type: string
          style: simple
          explode: false
      requestBody:
        description: Optional list of job IDs to reassign
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                job_ids:
                  type: array
                  items:
                    type: string
                    format: uuid
                  description: Optional list of specific job UUIDs to reassign. If not provided, all suspended jobs for the trigger will be reassigned.
      responses:
        "200":
          description: confirmation message
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/trigger/{trigger_kind}/cancel_suspended_trigger_jobs/{trigger_path}:
    post:
      summary: cancel all suspended jobs for a specific trigger
      operationId: cancelSuspendedTriggerJobs
      tags:
        - trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: trigger_kind
          description: The kind of trigger
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/JobTriggerKind"
        - name: trigger_path
          description: The path of the trigger (can contain forward slashes)
          in: path
          required: true
          schema:
            type: string
          style: simple
          explode: false
      requestBody:
        description: Optional list of job IDs to cancel
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                job_ids:
                  type: array
                  items:
                    type: string
                    format: uuid
                  description: Optional list of specific job UUIDs to cancel. If not provided, all suspended jobs for the trigger will be canceled.
      responses:
        "200":
          description: confirmation message
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/jobs/completed/list:
    get:
      summary: list all completed jobs
      operationId: listCompletedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/OrderDesc"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/Label"
        - $ref: "#/components/parameters/Worker"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/Success"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/AllowWildcards"
        - $ref: "#/components/parameters/Tag"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: is_skipped
          description: is the job skipped
          in: query
          schema:
            type: boolean
        - name: is_flow_step
          description: is the job a flow step
          in: query
          schema:
            type: boolean
        - name: has_null_parent
          description: has null parent
          in: query
          schema:
            type: boolean
        - name: is_not_schedule
          description: is not a scheduled job
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All completed jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CompletedJob"

  /w/{workspace}/jobs/completed/export:
    get:
      summary: export all completed jobs for backup/migration
      operationId: exportCompletedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: All completed jobs exported
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ExportableCompletedJob"

  /w/{workspace}/jobs/completed/import:
    post:
      summary: import completed jobs from backup/migration
      operationId: importCompletedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/ExportableCompletedJob"
      responses:
        "200":
          description: Successfully imported completed jobs
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/queue/export:
    get:
      summary: export all queued jobs for backup/migration
      operationId: exportQueuedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: All queued jobs exported
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ExportableQueuedJob"

  /w/{workspace}/jobs/queue/import:
    post:
      summary: import queued jobs from backup/migration
      operationId: importQueuedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/ExportableQueuedJob"
      responses:
        "200":
          description: Successfully imported queued jobs
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/delete:
    post:
      summary: delete jobs by IDs from all related tables
      operationId: deleteJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
                format: uuid
              description: Array of job IDs to delete
      responses:
        "200":
          description: Successfully deleted jobs
          content:
            text/plain:
              schema:
                type: string
                description: Summary of deleted jobs and rows

  /w/{workspace}/jobs/list:
    get:
      summary: list all jobs
      operationId: listJobs
      x-mcp-tool: true
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/Label"
        - $ref: "#/components/parameters/Worker"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/CreatedBefore"
        - $ref: "#/components/parameters/CreatedAfter"
        - $ref: "#/components/parameters/CompletedBefore"
        - $ref: "#/components/parameters/CompletedAfter"
        - $ref: "#/components/parameters/CreatedBeforeQueue"
        - $ref: "#/components/parameters/CreatedAfterQueue"
        - $ref: "#/components/parameters/Running"
        - $ref: "#/components/parameters/ScheduledForBeforeNow"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/Suspended"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/Tag"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/AllowWildcards"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/JobTriggerKind"
        - name: is_skipped
          description: is the job skipped
          in: query
          schema:
            type: boolean
        - name: is_flow_step
          description: is the job a flow step
          in: query
          schema:
            type: boolean
        - name: has_null_parent
          description: has null parent
          in: query
          schema:
            type: boolean
        - name: success
          description: filter on successful jobs
          in: query
          schema:
            type: boolean
        - name: all_workspaces
          description: get jobs from all workspaces (only valid if request come from the `admins` workspace)
          in: query
          schema:
            type: boolean
        - name: is_not_schedule
          description: is not a scheduled job
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: All jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Job"

  /jobs/db_clock:
    get:
      summary: get db clock
      operationId: getDbClock
      tags:
        - job
      responses:
        "200":
          description: the timestamp of the db that can be used to compute the drift
          content:
            application/json:
              schema:
                type: integer

  /jobs/completed/count_by_tag:
    get:
      summary: Count jobs by tag
      operationId: countJobsByTag
      tags:
        - job
      parameters:
        - name: horizon_secs
          in: query
          description: Past Time horizon in seconds (when to start the count = now - horizon) (default is 3600)
          required: false
          schema:
            type: integer
        - name: workspace_id
          in: query
          description: Specific workspace ID to filter results (optional)
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Job counts by tag
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    tag:
                      type: string
                    count:
                      type: integer
                  required:
                    - tag
                    - count

  /w/{workspace}/jobs_u/get/{id}:
    get:
      summary: get job
      operationId: getJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: no_logs
          in: query
          schema:
            type: boolean
        - name: no_code
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Job"

  /w/{workspace}/jobs_u/get_root_job_id/{id}:
    get:
      summary: get root job id
      operationId: getRootJobId
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: get root job id
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/jobs_u/get_logs/{id}:
    get:
      summary: get job logs
      operationId: getJob logs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: remove_ansi_warnings
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: job details
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/get_completed_logs_tail/{id}:
    get:
      summary: get completed job logs tail
      operationId: getCompletedJobLogsTail
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: completed job logs tail
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/get_args/{id}:
    get:
      summary: get job args
      operationId: getJobArgs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job args
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs_u/queue/get_started_at_by_ids:
    post:
      summary: get started at by ids
      operationId: getStartedAtByIds
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: ids
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                type: string
      responses:
        "200":
          description: started at by ids
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                  format: date-time

  /w/{workspace}/jobs_u/getupdate/{id}:
    get:
      summary: get job updates
      operationId: getJobUpdates
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: running
          in: query
          schema:
            type: boolean
        - name: log_offset
          in: query
          schema:
            type: integer
        - name: stream_offset
          in: query
          schema:
            type: integer
        - name: get_progress
          in: query
          schema:
            type: boolean
        - name: no_logs
          in: query
          schema:
            type: boolean

      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                type: object
                properties:
                  running:
                    type: boolean
                  completed:
                    type: boolean
                  new_logs:
                    type: string
                  log_offset:
                    type: integer
                  mem_peak:
                    type: integer
                  progress:
                    type: integer
                  stream_offset:
                    type: integer
                  new_result_stream:
                    type: string
                  flow_status:
                    $ref: "../../openflow.openapi.yaml#/components/schemas/FlowStatus"
                  workflow_as_code_status:
                    $ref: "#/components/schemas/WorkflowStatus"

  /w/{workspace}/jobs_u/getupdate_sse/{id}:
    get:
      summary: get job updates via server-sent events
      operationId: getJobUpdatesSSE
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: running
          in: query
          schema:
            type: boolean
        - name: log_offset
          in: query
          schema:
            type: integer
        - name: stream_offset
          in: query
          schema:
            type: integer
        - name: get_progress
          in: query
          schema:
            type: boolean
        - name: only_result
          in: query
          schema:
            type: boolean
        - name: no_logs
          in: query
          schema:
            type: boolean

      responses:
        "200":
          description: server-sent events stream of job updates
          content:
            text/event-stream:
              schema:
                type: string

  /w/{workspace}/jobs_u/get_log_file/{path}:
    get:
      summary: get log file from object store
      operationId: getLogFileFromStore
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: path
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: job log
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/get_flow_debug_info/{id}:
    get:
      summary: get flow debug info
      operationId: getFlowDebugInfo
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: flow debug info details
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs_u/completed/get/{id}:
    get:
      summary: get completed job
      operationId: getCompletedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CompletedJob"

  /w/{workspace}/jobs_u/completed/get_result/{id}:
    get:
      summary: get completed job result
      operationId: getCompletedJobResult
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: suspended_job
          in: query
          schema:
            type: string
        - name: resume_id
          in: query
          schema:
            type: integer
        - name: secret
          in: query
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "200":
          description: result
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs_u/completed/get_result_maybe/{id}:
    get:
      summary: get completed job result if job is completed
      operationId: getCompletedJobResultMaybe
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - $ref: "#/components/parameters/GetStarted"

      responses:
        "200":
          description: result
          content:
            application/json:
              schema:
                type: object
                properties:
                  completed:
                    type: boolean
                  result: {}
                  success:
                    type: boolean
                  started:
                    type: boolean
                required:
                  - completed
                  - result

  /w/{workspace}/jobs_u/completed/get_timing/{id}:
    get:
      summary: get completed job timing
      operationId: getCompletedJobTiming
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job timing details
          content:
            application/json:
              schema:
                type: object
                properties:
                  created_at:
                    type: string
                    format: date-time
                  started_at:
                    type: string
                    format: date-time
                  duration_ms:
                    type: integer
                required:
                  - created_at

  /w/{workspace}/jobs/completed/delete/{id}:
    post:
      summary: delete completed job (erase content but keep run id)
      operationId: deleteCompletedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CompletedJob"

  /w/{workspace}/jobs_u/queue/cancel/{id}:
    post:
      summary: cancel queued or running job
      operationId: cancelQueuedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        description: reason
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string

      responses:
        "200":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/queue/cancel_persistent/{path}:
    post:
      summary: cancel all queued jobs for persistent script
      operationId: cancelPersistentQueuedJobs
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: reason
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string

      responses:
        "200":
          description: persistent job scaled down to zero
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/queue/force_cancel/{id}:
    post:
      summary: force cancel queued job
      operationId: forceCancelQueuedJob
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        description: reason
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string

      responses:
        "200":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/queue/position/{scheduled_for}:
    get:
      summary: get queue position for a job
      operationId: getQueuePosition
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: scheduled_for
          in: path
          required: true
          schema:
            type: integer
            description: The scheduled for timestamp in milliseconds
      responses:
        "200":
          description: queue position information
          content:
            application/json:
              schema:
                type: object
                properties:
                  position:
                    type: integer
                    description: The position in queue (1-based), null if not in queue or already running

  /w/{workspace}/jobs/queue/scheduled_for/{id}:
    get:
      summary: get scheduled for timestamp for a job
      operationId: getScheduledFor
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: scheduled for timestamp
          content:
            application/json:
              schema:
                type: integer

  /w/{workspace}/jobs/job_signature/{id}/{resume_id}:
    get:
      summary: create an HMac signature given a job id and a resume id
      operationId: createJobSignature
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "200":
          description: job signature
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/resume_urls/{id}/{resume_id}:
    get:
      summary: get resume urls given a job_id, resume_id and a nonce to resume a flow
      operationId: getResumeUrls
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: approver
          in: query
          schema:
            type: string
        - name: flow_level
          in: query
          description: If true, generate resume URLs for the parent flow instead of the specific step. This allows pre-approvals that can be consumed by any later suspend step in the same flow.
          schema:
            type: boolean
      responses:
        "200":
          description: url endpoints
          content:
            application/json:
              schema:
                type: object
                properties:
                  approvalPage:
                    type: string
                  resume:
                    type: string
                  cancel:
                    type: string
                required:
                  - approvalPage
                  - resume
                  - cancel

  /w/{workspace}/jobs/slack_approval/{id}:
    get:
      summary: generate interactive slack approval for suspended job
      operationId: getSlackApprovalPayload
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: approver
          in: query
          schema:
            type: string
        - name: message
          in: query
          schema:
            type: string
        - name: slack_resource_path
          in: query
          required: true
          schema:
            type: string
        - name: channel_id
          in: query
          required: true
          schema:
            type: string
        - name: flow_step_id
          in: query
          required: true
          schema:
            type: string
        - name: default_args_json
          in: query
          required: false
          schema:
            type: string
        - name: dynamic_enums_json
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Interactive slack approval message sent successfully

  /w/{workspace}/jobs/teams_approval/{id}:
    get:
      summary: generate interactive teams approval for suspended job
      operationId: getTeamsApprovalPayload
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: approver
          in: query
          schema:
            type: string
        - name: message
          in: query
          schema:
            type: string
        - name: team_name
          in: query
          required: true
          schema:
            type: string
        - name: channel_name
          in: query
          required: true
          schema:
            type: string
        - name: flow_step_id
          in: query
          required: true
          schema:
            type: string
        - name: default_args_json
          in: query
          required: false
          schema:
            type: string
        - name: dynamic_enums_json
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: Interactive slack approval message sent successfully

  /w/{workspace}/jobs_u/resume/{id}/{resume_id}/{signature}:
    get:
      summary: resume a job for a suspended flow
      operationId: resumeSuspendedJobGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - $ref: "#/components/parameters/Payload"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "201":
          description: job resumed
          content:
            text/plain:
              schema:
                type: string

    post:
      summary: resume a job for a suspended flow
      operationId: resumeSuspendedJobPost
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        "201":
          description: job resumed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs/flow/user_states/{id}/{key}:
    post:
      summary: set flow user state at a given key
      operationId: setFlowUserState
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: key
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: new value
        required: true
        content:
          application/json:
            schema: {}
      responses:
        "200":
          description: flow user state updated
          content:
            text/plain:
              schema:
                type: string
    get:
      summary: get flow user state at a given key
      operationId: getFlowUserState
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: key
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: flow user state updated
          content:
            application/json:
              schema: {}

  /w/{workspace}/jobs/flow/resume/{id}:
    post:
      summary: resume a job for a suspended flow as an owner
      operationId: resumeSuspendedFlowAsOwner
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        "201":
          description: job resumed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/cancel/{id}/{resume_id}/{signature}:
    get:
      summary: cancel a job for a suspended flow
      operationId: cancelSuspendedJobGet
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "201":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

    post:
      summary: cancel a job for a suspended flow
      operationId: cancelSuspendedJobPost
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        "201":
          description: job canceled
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/jobs_u/get_flow/{id}/{resume_id}/{signature}:
    get:
      summary: get parent flow job of suspended job
      operationId: getSuspendedJobFlow
      tags:
        - job
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
        - name: resume_id
          in: path
          required: true
          schema:
            type: integer
        - name: signature
          in: path
          required: true
          schema:
            type: string
        - name: approver
          in: query
          schema:
            type: string
      responses:
        "200":
          description: parent flow details
          content:
            application/json:
              schema:
                type: object
                properties:
                  job:
                    $ref: "#/components/schemas/Job"
                  approvers:
                    type: array
                    items:
                      type: object
                      properties:
                        resume_id:
                          type: integer
                        approver:
                          type: string
                      required:
                        - resume_id
                        - approver
                required:
                  - job
                  - approvers

  /schedules/preview:
    post:
      summary: preview schedule
      operationId: previewSchedule
      tags:
        - schedule
      requestBody:
        description: schedule
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                schedule:
                  type: string
                timezone:
                  type: string
                cron_version:
                  type: string
              required:
                - schedule
                - timezone
      responses:
        "200":
          description: List of 5 estimated upcoming execution events (in UTC)
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                  format: date-time

  /w/{workspace}/schedules/create:
    post:
      summary: create schedule
      operationId: createSchedule
      x-mcp-tool: true
      x-mcp-instructions: |
        Creates a new schedule.
        The schedule should include seconds.
        You should get the schema of the script or flow before creating the schedule to correctly specify the arguments needed.
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new schedule
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewSchedule"
      responses:
        "201":
          description: schedule created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/update/{path}:
    post:
      summary: update schedule
      operationId: updateSchedule
      x-mcp-tool: true
      x-mcp-instructions: |
        Updates a schedule.
        The schedule should include seconds.
        You should get the schema of the script or flow before updating the schedule to correctly specify the arguments needed.
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated schedule
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditSchedule"
      responses:
        "200":
          description: schedule updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/setenabled/{path}:
    post:
      summary: set enabled schedule
      operationId: setScheduleEnabled
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated schedule enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                enabled:
                  type: boolean
              required:
                - enabled

      responses:
        "200":
          description: schedule enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/delete/{path}:
    delete:
      summary: delete schedule
      operationId: deleteSchedule
      x-mcp-tool: true
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: schedule deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/schedules/get/{path}:
    get:
      summary: get schedule
      operationId: getSchedule
      x-mcp-tool: true
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: schedule deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Schedule"

  /w/{workspace}/schedules/exists/{path}:
    get:
      summary: does schedule exists
      operationId: existsSchedule
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: schedule exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/schedules/list:
    get:
      summary: list schedules
      operationId: listSchedules
      x-mcp-tool: true
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/ArgsFilter"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          description: filter schedules by whether they target a flow
          in: query
          schema:
            type: boolean
        - name: path_start
          description: filter schedules by path prefix
          in: query
          schema:
            type: string
      responses:
        "200":
          description: schedule list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Schedule"

  /w/{workspace}/schedules/list_with_jobs:
    get:
      summary: list schedules with last 20 jobs
      operationId: listSchedulesWithJobs
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: schedule list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ScheduleWJobs"

  /w/{workspace}/schedules/setdefaulthandler:
    post:
      summary: Set default error or recoevery handler
      operationId: setDefaultErrorOrRecoveryHandler
      tags:
        - schedule
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: Handler description
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                handler_type:
                  type: string
                  enum: ["error", "recovery", "success"]
                override_existing:
                  type: boolean
                path:
                  type: string
                extra_args:
                  type: object
                number_of_occurence:
                  type: integer
                number_of_occurence_exact:
                  type: boolean
                workspace_handler_muted:
                  type: boolean
              required:
                - handler_type
                - override_existing
      responses:
        "201":
          description: default error handler set

  /w/{workspace}/openapi/generate:
    post:
      summary: generate openapi spec from http routes/webhook
      operationId: generateOpenapiSpec
      tags:
        - openapi
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: openapi spec info and url
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GenerateOpenapiSpec"
      responses:
        "200":
          description: openapi spec
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/openapi/download:
    post:
      summary: Download the OpenAPI v3.1 spec as a file
      operationId: DownloadOpenapiSpec
      tags:
        - openapi
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: openapi spec info and url
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GenerateOpenapiSpec"
      responses:
        "200":
          description: Downloaded OpenAPI spec
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary

  /w/{workspace}/http_triggers/create_many:
    post:
      summary: create many HTTP triggers
      operationId: createHttpTriggers
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new http trigger
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/NewHttpTrigger"
      responses:
        "201":
          description: http trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/http_triggers/create:
    post:
      summary: create http trigger
      operationId: createHttpTrigger
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new http trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewHttpTrigger"
      responses:
        "201":
          description: http trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/http_triggers/update/{path}:
    post:
      summary: update http trigger
      operationId: updateHttpTrigger
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditHttpTrigger"
      responses:
        "200":
          description: http trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/http_triggers/delete/{path}:
    delete:
      summary: delete http trigger
      operationId: deleteHttpTrigger
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: http trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/http_triggers/get/{path}:
    get:
      summary: get http trigger
      operationId: getHttpTrigger
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: http trigger deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/HttpTrigger"

  /w/{workspace}/http_triggers/list:
    get:
      summary: list http triggers
      operationId: listHttpTriggers
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: http trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/HttpTrigger"

  /w/{workspace}/http_triggers/exists/{path}:
    get:
      summary: does http trigger exists
      operationId: existsHttpTrigger
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: http trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/http_triggers/route_exists:
    post:
      summary: does route exists
      operationId: existsRoute
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: route exists request
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                route_path:
                  type: string
                http_method:
                  $ref: "#/components/schemas/HttpMethod"
                trigger_path:
                  type: string
                workspaced_route:
                  type: boolean
              required:
                - route_path
                - http_method
      responses:
        "200":
          description: route exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/http_triggers/setmode/{path}:
    post:
      summary: enable/disable http trigger
      operationId: setHttpTriggerMode
      tags:
        - http_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: http trigger enable/disable
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/websocket_triggers/create:
    post:
      summary: create websocket trigger
      operationId: createWebsocketTrigger
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new websocket trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewWebsocketTrigger"
      responses:
        "201":
          description: websocket trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/websocket_triggers/update/{path}:
    post:
      summary: update websocket trigger
      operationId: updateWebsocketTrigger
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditWebsocketTrigger"
      responses:
        "200":
          description: websocket trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/websocket_triggers/delete/{path}:
    delete:
      summary: delete websocket trigger
      operationId: deleteWebsocketTrigger
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: websocket trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/websocket_triggers/get/{path}:
    get:
      summary: get websocket trigger
      operationId: getWebsocketTrigger
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: websocket trigger deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WebsocketTrigger"

  /w/{workspace}/websocket_triggers/list:
    get:
      summary: list websocket triggers
      operationId: listWebsocketTriggers
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: websocket trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WebsocketTrigger"

  /w/{workspace}/websocket_triggers/exists/{path}:
    get:
      summary: does websocket trigger exists
      operationId: existsWebsocketTrigger
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: websocket trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/websocket_triggers/setmode/{path}:
    post:
      summary: set enabled websocket trigger
      operationId: setWebsocketTriggerMode
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated websocket trigger enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: websocket trigger enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/websocket_triggers/test:
    post:
      summary: test websocket connection
      operationId: testWebsocketConnection
      tags:
        - websocket_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: test websocket connection
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                url:
                  type: string
                url_runnable_args:
                  $ref: "#/components/schemas/ScriptArgs"
                can_return_message:
                  type: boolean
              required:
                - url
                - can_return_message
      responses:
        "200":
          description: successfuly connected to websocket
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/kafka_triggers/create:
    post:
      summary: create kafka trigger
      operationId: createKafkaTrigger
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new kafka trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewKafkaTrigger"
      responses:
        "201":
          description: kafka trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/kafka_triggers/update/{path}:
    post:
      summary: update kafka trigger
      operationId: updateKafkaTrigger
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditKafkaTrigger"
      responses:
        "200":
          description: kafka trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/kafka_triggers/delete/{path}:
    delete:
      summary: delete kafka trigger
      operationId: deleteKafkaTrigger
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: kafka trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/kafka_triggers/get/{path}:
    get:
      summary: get kafka trigger
      operationId: getKafkaTrigger
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: kafka trigger deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/KafkaTrigger"

  /w/{workspace}/kafka_triggers/list:
    get:
      summary: list kafka triggers
      operationId: listKafkaTriggers
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: kafka trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/KafkaTrigger"

  /w/{workspace}/kafka_triggers/exists/{path}:
    get:
      summary: does kafka trigger exists
      operationId: existsKafkaTrigger
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: kafka trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/kafka_triggers/setmode/{path}:
    post:
      summary: set enabled kafka trigger
      operationId: setKafkaTriggerMode
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated kafka trigger enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: kafka trigger enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/kafka_triggers/test:
    post:
      summary: test kafka connection
      operationId: testKafkaConnection
      tags:
        - kafka_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: test kafka connection
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                connection:
                  type: object
              required:
                - connection
      responses:
        "200":
          description: successfuly connected to kafka brokers
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/nats_triggers/create:
    post:
      summary: create nats trigger
      operationId: createNatsTrigger
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new nats trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewNatsTrigger"
      responses:
        "201":
          description: nats trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/nats_triggers/update/{path}:
    post:
      summary: update nats trigger
      operationId: updateNatsTrigger
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditNatsTrigger"
      responses:
        "200":
          description: nats trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/nats_triggers/delete/{path}:
    delete:
      summary: delete nats trigger
      operationId: deleteNatsTrigger
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: nats trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/nats_triggers/get/{path}:
    get:
      summary: get nats trigger
      operationId: getNatsTrigger
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: nats trigger deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NatsTrigger"

  /w/{workspace}/nats_triggers/list:
    get:
      summary: list nats triggers
      operationId: listNatsTriggers
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: nats trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/NatsTrigger"

  /w/{workspace}/nats_triggers/exists/{path}:
    get:
      summary: does nats trigger exists
      operationId: existsNatsTrigger
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: nats trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/nats_triggers/setmode/{path}:
    post:
      summary: set enabled nats trigger
      operationId: setNatsTriggerMode
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated nats trigger enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: nats trigger enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/nats_triggers/test:
    post:
      summary: test NATS connection
      operationId: testNatsConnection
      tags:
        - nats_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: test nats connection
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                connection:
                  type: object
              required:
                - connection
      responses:
        "200":
          description: successfuly connected to NATS servers
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/sqs_triggers/create:
    post:
      summary: create sqs trigger
      operationId: createSqsTrigger
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new sqs trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewSqsTrigger"
      responses:
        "201":
          description: sqs trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/sqs_triggers/update/{path}:
    post:
      summary: update sqs trigger
      operationId: updateSqsTrigger
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditSqsTrigger"
      responses:
        "200":
          description: sqs trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/sqs_triggers/delete/{path}:
    delete:
      summary: delete sqs trigger
      operationId: deleteSqsTrigger
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: sqs trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/sqs_triggers/get/{path}:
    get:
      summary: get sqs trigger
      operationId: getSqsTrigger
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: sqs trigger deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SqsTrigger"

  /w/{workspace}/sqs_triggers/list:
    get:
      summary: list sqs triggers
      operationId: listSqsTriggers
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: sqs trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/SqsTrigger"

  /w/{workspace}/sqs_triggers/exists/{path}:
    get:
      summary: does sqs trigger exists
      operationId: existsSqsTrigger
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: sqs trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/sqs_triggers/setmode/{path}:
    post:
      summary: set enabled sqs trigger
      operationId: setSqsTriggerMode
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated sqs trigger enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: sqs trigger enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/sqs_triggers/test:
    post:
      summary: test sqs connection
      operationId: testSqsConnection
      tags:
        - sqs_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: test sqs connection
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                connection:
                  type: object
              required:
                - connection
      responses:
        "200":
          description: successfuly connected to sqs
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/native_triggers/integrations/list:
    get:
      summary: list available native trigger services
      operationId: listNativeTriggerServices
      tags:
        - workspace_integration
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: native trigger services list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkspaceIntegrations"

  /w/{workspace}/native_triggers/integrations/{service_name}/exists:
    get:
      summary: check if integrations for a particular service exists
      operationId: checkIfNativeTriggersServiceExists
      tags:
        - workspace_integration
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
      responses:
        "200":
          description: integration exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/native_triggers/integrations/{service_name}/create:
    post:
      summary: create native trigger service
      operationId: createNativeTriggerService
      tags:
        - workspace_integration
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
      requestBody:
        description: new native trigger service
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/WorkspaceOAuthConfig"
      responses:
        "201":
          description: native trigger service created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/native_triggers/integrations/{service_name}/generate_connect_url:
    post:
      summary: generate connect url for native trigger service
      operationId: generateNativeTriggerServiceConnectUrl
      tags:
        - workspace_integration
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
      requestBody:
        description: redirect_uri
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RedirectUri"
      responses:
        "200":
          description: native trigger service connect url
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/native_triggers/integrations/{service_name}/delete:
    delete:
      summary: delete native trigger service
      operationId: deleteNativeTriggerService
      tags:
        - workspace_integration
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
      responses:
        "200":
          description: native trigger service deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/native_triggers/integrations/{service_name}/callback/{code}/{state}:
    post:
      summary: native trigger service oauth callback
      operationId: nativeTriggerServiceCallback
      tags:
        - workspace_integration
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
        - name: code
          in: path
          required: true
          schema:
            type: string
        - name: state
          in: path
          required: true
          schema:
            type: string
      requestBody:
        description: redirect_uri
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/RedirectUri"
      responses:
        "200":
          description: native trigger service oauth completed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/native_triggers/{service_name}/create:
    post:
      summary: create native trigger
      description: |
        Creates a new native trigger for the specified service.
        Requires write access to the script or flow that the trigger will be associated with.
      operationId: createNativeTrigger
      tags:
        - native_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
      requestBody:
        description: new native trigger configuration
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NativeTriggerData"
      responses:
        "201":
          description: native trigger created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateTriggerResponse"

  /w/{workspace}/native_triggers/{service_name}/update/{external_id}:
    post:
      summary: update native trigger
      description: |
        Updates an existing native trigger.
        Requires write access to the script or flow that the trigger is associated with.
      operationId: updateNativeTrigger
      tags:
        - native_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
        - name: external_id
          in: path
          required: true
          description: The external ID of the trigger from the external service
          schema:
            type: string
      requestBody:
        description: updated native trigger configuration
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NativeTriggerData"
      responses:
        "200":
          description: native trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/native_triggers/{service_name}/get/{external_id}:
    get:
      summary: get native trigger
      description: |
        Retrieves a native trigger by its external ID.
        Requires write access to the script or flow that the trigger is associated with.
      operationId: getNativeTrigger
      tags:
        - native_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
        - name: external_id
          in: path
          required: true
          description: The external ID of the trigger from the external service
          schema:
            type: string
      responses:
        "200":
          description: native trigger with external configuration
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NativeTriggerWithExternal"

  /w/{workspace}/native_triggers/{service_name}/delete/{external_id}:
    delete:
      summary: delete native trigger
      description: |
        Deletes a native trigger by its external ID.
        Requires write access to the script or flow that the trigger is associated with.
      operationId: deleteNativeTrigger
      tags:
        - native_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
        - name: external_id
          in: path
          required: true
          description: The external ID of the trigger from the external service
          schema:
            type: string
      responses:
        "200":
          description: native trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/native_triggers/{service_name}/list:
    get:
      summary: list native triggers
      description: Lists all native triggers for the specified service in the workspace.
      operationId: listNativeTriggers
      tags:
        - native_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by script path
          in: query
          schema:
            type: string
        - name: is_flow
          description: filter by is_flow
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: native triggers list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/NativeTrigger"

  /w/{workspace}/native_triggers/{service_name}/exists/{external_id}:
    get:
      summary: check if native trigger exists
      description: Checks if a native trigger with the given external ID exists.
      operationId: existsNativeTrigger
      tags:
        - native_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
        - name: external_id
          in: path
          required: true
          description: The external ID of the trigger from the external service
          schema:
            type: string
      responses:
        "200":
          description: whether the native trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/native_triggers/{service_name}/sync:
    post:
      summary: sync native triggers with external service
      operationId: syncNativeTriggers
      tags:
        - native_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
      responses:
        "200":
          description: sync completed successfully

  /w/{workspace}/native_triggers/nextcloud/events:
    get:
      summary: list available NextCloud events
      operationId: listNextCloudEvents
      tags:
        - native_trigger
      parameters:
        - name: workspace
          in: path
          required: true
          schema:
            type: string
      responses:
        "200":
          description: list of available NextCloud events
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/NextCloudEventType"

  /native_triggers/{service_name}/w/{workspace_id}/webhook/{internal_id}:
    post:
      summary: receive webhook from external native trigger service
      operationId: nativeTriggerWebhook
      tags:
        - native_trigger
      parameters:
        - name: service_name
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/NativeServiceName"
        - name: workspace_id
          in: path
          required: true
          schema:
            type: string
        - name: internal_id
          in: path
          required: true
          schema:
            type: integer
            format: int64
          description: The internal database ID of the trigger
      requestBody:
        description: webhook payload from external service
        required: false
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
          text/plain:
            schema:
              type: string
      responses:
        "200":
          description: webhook received successfully
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/mqtt_triggers/create:
    post:
      summary: create mqtt trigger
      operationId: createMqttTrigger
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new mqtt trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewMqttTrigger"
      responses:
        "201":
          description: mqtt trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/mqtt_triggers/update/{path}:
    post:
      summary: update mqtt trigger
      operationId: updateMqttTrigger
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditMqttTrigger"
      responses:
        "200":
          description: mqtt trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/mqtt_triggers/delete/{path}:
    delete:
      summary: delete mqtt trigger
      operationId: deleteMqttTrigger
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: mqtt trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/mqtt_triggers/get/{path}:
    get:
      summary: get mqtt trigger
      operationId: getMqttTrigger
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: mqtt trigger deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MqttTrigger"

  /w/{workspace}/mqtt_triggers/list:
    get:
      summary: list mqtt triggers
      operationId: listMqttTriggers
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: mqtt trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/MqttTrigger"

  /w/{workspace}/mqtt_triggers/exists/{path}:
    get:
      summary: does mqtt trigger exists
      operationId: existsMqttTrigger
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: mqtt trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/mqtt_triggers/setmode/{path}:
    post:
      summary: set enabled mqtt trigger
      operationId: setMqttTriggerMode
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated mqtt trigger enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: mqtt trigger enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/mqtt_triggers/test:
    post:
      summary: test mqtt connection
      operationId: testMqttConnection
      tags:
        - mqtt_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: test mqtt connection
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                connection:
                  type: object
              required:
                - connection
      responses:
        "200":
          description: successfully connected to mqtt
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/gcp_triggers/create:
    post:
      summary: create gcp trigger
      operationId: createGcpTrigger
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new gcp trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GcpTriggerData"
      responses:
        "201":
          description: gcp trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/gcp_triggers/update/{path}:
    post:
      summary: update gcp trigger
      operationId: updateGcpTrigger
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GcpTriggerData"
      responses:
        "200":
          description: gcp trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/gcp_triggers/delete/{path}:
    delete:
      summary: delete gcp trigger
      operationId: deleteGcpTrigger
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: gcp trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/gcp_triggers/get/{path}:
    get:
      summary: get gcp trigger
      operationId: getGcpTrigger
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: gcp trigger deleted
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GcpTrigger"

  /w/{workspace}/gcp_triggers/list:
    get:
      summary: list gcp triggers
      operationId: listGcpTriggers
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: gcp trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/GcpTrigger"

  /w/{workspace}/gcp_triggers/exists/{path}:
    get:
      summary: does gcp trigger exists
      operationId: existsGcpTrigger
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: gcp trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/gcp_triggers/setmode/{path}:
    post:
      summary: set enabled gcp trigger
      operationId: setGcpTriggerMode
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated gcp trigger enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: gcp trigger enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/gcp_triggers/test:
    post:
      summary: test gcp connection
      operationId: testGcpConnection
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: test gcp connection
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                connection:
                  type: object
              required:
                - connection
      responses:
        "200":
          description: try to connect to a gcp broker
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/gcp_triggers/subscriptions/delete/{path}:
    delete:
      summary: delete gcp trigger
      operationId: deleteGcpSubscription
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: args to delete subscription from google cloud
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/DeleteGcpSubscription"
      responses:
        "200":
          description: gcp trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/gcp_triggers/topics/list/{path}:
    get:
      summary: list all topics of google cloud service
      operationId: listGoogleTopics
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: get all google topics
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/gcp_triggers/subscriptions/list/{path}:
    post:
      summary: list all subscription of a give topic from google cloud service
      operationId: listAllTGoogleTopicSubscriptions
      tags:
        - gcp_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: args to get subscription's topic from google cloud
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/GetAllTopicSubscription"
      responses:
        "200":
          description: get all google topic subscriptions name
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/postgres_triggers/postgres/version/{path}:
    get:
      summary: get postgres version
      operationId: getPostgresVersion
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: postgres version
          content:
            application/json:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/is_valid_postgres_configuration/{path}:
    get:
      summary: check if postgres configuration is set to logical
      operationId: isValidPostgresConfiguration
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: boolean that indicates if postgres is set to logical level or not
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/postgres_triggers/create_template_script:
    post:
      summary: create template script
      operationId: createTemplateScript
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: template script
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/TemplateScript"
      responses:
        "200":
          description: custom id to retrieve template script
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/get_template_script/{id}:
    get:
      summary: get template script
      operationId: getTemplateScript
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Id"
      responses:
        "200":
          description: template script
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/slot/list/{path}:
    get:
      summary: list postgres replication slot
      operationId: listPostgresReplicationSlot
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: list postgres slot
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/SlotList"

  /w/{workspace}/postgres_triggers/slot/create/{path}:
    post:
      summary: create replication slot for postgres
      operationId: createPostgresReplicationSlot
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: new slot for postgres
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Slot"
      responses:
        "201":
          description: slot created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/slot/delete/{path}:
    delete:
      summary: delete postgres replication slot
      operationId: deletePostgresReplicationSlot
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: replication slot of postgres
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Slot"
      responses:
        "200":
          description: postgres replication slot deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/publication/list/{path}:
    get:
      summary: list postgres publication
      operationId: listPostgresPublication
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: database publication list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/postgres_triggers/publication/get/{publication}/{path}:
    get:
      summary: get postgres publication
      operationId: getPostgresPublication
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - $ref: "#/components/parameters/PublicationName"
      responses:
        "200":
          description: postgres publication get
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PublicationData"

  /w/{workspace}/postgres_triggers/publication/create/{publication}/{path}:
    post:
      summary: create publication for postgres
      operationId: createPostgresPublication
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - $ref: "#/components/parameters/PublicationName"
      requestBody:
        description: new publication for postgres
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PublicationData"
      responses:
        "201":
          description: publication created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/publication/update/{publication}/{path}:
    post:
      summary: update publication for postgres
      operationId: updatePostgresPublication
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - $ref: "#/components/parameters/PublicationName"
      requestBody:
        description: update publication for postgres
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/PublicationData"
      responses:
        "201":
          description: publication updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/publication/delete/{publication}/{path}:
    delete:
      summary: delete postgres publication
      operationId: deletePostgresPublication
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - $ref: "#/components/parameters/PublicationName"
      responses:
        "200":
          description: postgres publication deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/create:
    post:
      summary: create postgres trigger
      operationId: createPostgresTrigger
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new postgres trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewPostgresTrigger"
      responses:
        "201":
          description: postgres trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/update/{path}:
    post:
      summary: update postgres trigger
      operationId: updatePostgresTrigger
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditPostgresTrigger"
      responses:
        "200":
          description: postgres trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/delete/{path}:
    delete:
      summary: delete postgres trigger
      operationId: deletePostgresTrigger
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: postgres trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/get/{path}:
    get:
      summary: get postgres trigger
      operationId: getPostgresTrigger
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: get postgres trigger
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PostgresTrigger"

  /w/{workspace}/postgres_triggers/list:
    get:
      summary: list postgres triggers
      operationId: listPostgresTriggers
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: postgres trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PostgresTrigger"

  /w/{workspace}/postgres_triggers/exists/{path}:
    get:
      summary: does postgres trigger exists
      operationId: existsPostgresTrigger
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: postgres trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/postgres_triggers/setmode/{path}:
    post:
      summary: set enabled postgres trigger
      operationId: setPostgresTriggerMode
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated postgres trigger enable
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: postgres trigger enabled set
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/postgres_triggers/test:
    post:
      summary: test postgres connection
      operationId: testPostgresConnection
      tags:
        - postgres_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: test postgres connection
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                database:
                  type: string
              required:
                - database
      responses:
        "200":
          description: successfuly connected to postgres
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/email_triggers/create:
    post:
      summary: create email trigger
      operationId: createEmailTrigger
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: new email trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/NewEmailTrigger"
      responses:
        "201":
          description: email trigger created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/email_triggers/update/{path}:
    post:
      summary: update email trigger
      operationId: updateEmailTrigger
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: updated trigger
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EditEmailTrigger"
      responses:
        "200":
          description: email trigger updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/email_triggers/delete/{path}:
    delete:
      summary: delete email trigger
      operationId: deleteEmailTrigger
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: email trigger deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/email_triggers/get/{path}:
    get:
      summary: get email trigger
      operationId: getEmailTrigger
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: email trigger retrieved
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EmailTrigger"

  /w/{workspace}/email_triggers/list:
    get:
      summary: list email triggers
      operationId: listEmailTriggers
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
          required: true
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: path
          description: filter by path
          in: query
          schema:
            type: string
        - name: is_flow
          in: query
          schema:
            type: boolean
        - name: path_start
          in: query
          schema:
            type: string
      responses:
        "200":
          description: email trigger list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/EmailTrigger"

  /w/{workspace}/email_triggers/exists/{path}:
    get:
      summary: does email trigger exists
      operationId: existsEmailTrigger
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: email trigger exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/email_triggers/local_part_exists:
    post:
      summary: does email local part exists
      operationId: existsEmailLocalPart
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: email local part exists request
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                local_part:
                  type: string
                workspaced_local_part:
                  type: boolean
                trigger_path:
                  type: string

              required:
                - local_part
      responses:
        "200":
          description: email local part exists
          content:
            application/json:
              schema:
                type: boolean
  /w/{workspace}/email_triggers/setmode/{path}:
    post:
      summary: enable/disable email trigger
      operationId: setEmailTriggerMode
      tags:
        - email_trigger
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mode:
                  $ref: "#/components/schemas/TriggerMode"
              required:
                - mode
      responses:
        "200":
          description: email trigger enable/disable
          content:
            text/plain:
              schema:
                type: string

  /groups/list:
    get:
      summary: list instance groups
      operationId: listInstanceGroups
      tags:
        - group
      responses:
        "200":
          description: instance group list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/InstanceGroup"
  /groups/list_with_workspaces:
    get:
      summary: list instance groups with workspace information
      operationId: listInstanceGroupsWithWorkspaces
      tags:
        - group
      responses:
        "200":
          description: instance group list with workspaces
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/InstanceGroupWithWorkspaces"

  /groups/get/{name}:
    get:
      summary: get instance group
      operationId: getInstanceGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: instance group
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/InstanceGroup"

  /groups/create:
    post:
      summary: create instance group
      operationId: createInstanceGroup
      tags:
        - group
      requestBody:
        description: create instance group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                summary:
                  type: string
              required:
                - name
      responses:
        "200":
          description: instance group created
          content:
            text/plain:
              schema:
                type: string

  /groups/update/{name}:
    post:
      summary: update instance group
      operationId: updateInstanceGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: update instance group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                new_summary:
                  type: string
              required:
                - new_summary
      responses:
        "200":
          description: instance group updated
          content:
            text/plain:
              schema:
                type: string

  /groups/delete/{name}:
    delete:
      summary: delete instance group
      operationId: deleteInstanceGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: instance group deleted
          content:
            text/plain:
              schema:
                type: string

  /groups/adduser/{name}:
    post:
      summary: add user to instance group
      operationId: addUserToInstanceGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: user to add to instance group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
              required:
                - email
      responses:
        "200":
          description: user added to instance group
          content:
            text/plain:
              schema:
                type: string

  /groups/removeuser/{name}:
    post:
      summary: remove user from instance group
      operationId: removeUserFromInstanceGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: user to remove from instance group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
              required:
                - email
      responses:
        "200":
          description: user removed from instance group
          content:
            text/plain:
              schema:
                type: string
  /groups/export:
    get:
      summary: export instance groups
      operationId: exportInstanceGroups
      tags:
        - group
      responses:
        "200":
          description: exported instance groups
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ExportedInstanceGroup"

  /groups/overwrite:
    post:
      summary: overwrite instance groups
      operationId: overwriteInstanceGroups
      tags:
        - group
      requestBody:
        description: overwrite instance groups
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: "#/components/schemas/ExportedInstanceGroup"
      responses:
        "200":
          description: success message
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/list:
    get:
      summary: list groups
      operationId: listGroups
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: group list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Group"

  /w/{workspace}/groups/listnames:
    get:
      summary: list group names
      operationId: listGroupNames
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: only_member_of
          in: query
          description: only list the groups the user is member of (default false)
          schema:
            type: boolean
      responses:
        "200":
          description: group list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/groups/create:
    post:
      summary: create group
      operationId: createGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: create group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                summary:
                  type: string
              required:
                - name
      responses:
        "200":
          description: group created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/update/{name}:
    post:
      summary: update group
      operationId: updateGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: updated group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                summary:
                  type: string
      responses:
        "200":
          description: group updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/delete/{name}:
    delete:
      summary: delete group
      operationId: deleteGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: group deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/get/{name}:
    get:
      summary: get group
      operationId: getGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: group
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Group"

  /w/{workspace}/groups/adduser/{name}:
    post:
      summary: add user to group
      operationId: addUserToGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: added user to group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
      responses:
        "200":
          description: user added to group
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups/removeuser/{name}:
    post:
      summary: remove user to group
      operationId: removeUserToGroup
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: added user to group
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                username:
                  type: string
      responses:
        "200":
          description: user removed from group
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/groups_history/get/{name}:
    get:
      summary: get group permission history
      operationId: getGroupPermissionHistory
      tags:
        - group
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: group permission history
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                    changed_by:
                      type: string
                    changed_at:
                      type: string
                      format: date-time
                    change_type:
                      type: string
                    member_affected:
                      type: string
                      nullable: true

  /w/{workspace}/folders/list:
    get:
      summary: list folders
      operationId: listFolders
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: folder list
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Folder"

  /w/{workspace}/folders/listnames:
    get:
      summary: list folder names
      operationId: listFolderNames
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: only_member_of
          in: query
          description: only list the folders the user is member of (default false)
          schema:
            type: boolean
      responses:
        "200":
          description: folder list
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /w/{workspace}/folders/create:
    post:
      summary: create folder
      operationId: createFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: create folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                summary:
                  type: string
                owners:
                  type: array
                  items:
                    type: string
                extra_perms:
                  additionalProperties:
                    type: boolean
              required:
                - name
      responses:
        "200":
          description: folder created
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/update/{name}:
    post:
      summary: update folder
      operationId: updateFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: update folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                summary:
                  type: string
                owners:
                  type: array
                  items:
                    type: string
                extra_perms:
                  additionalProperties:
                    type: boolean
      responses:
        "200":
          description: folder updated
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/delete/{name}:
    delete:
      summary: delete folder
      operationId: deleteFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: folder deleted
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/get/{name}:
    get:
      summary: get folder
      operationId: getFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: folder
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Folder"

  /w/{workspace}/folders/exists/{name}:
    get:
      summary: exists folder
      operationId: existsFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: folder exists
          content:
            application/json:
              schema:
                type: boolean

  /w/{workspace}/folders/getusage/{name}:
    get:
      summary: get folder usage
      operationId: getFolderUsage
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: folder
          content:
            application/json:
              schema:
                type: object
                properties:
                  scripts:
                    type: number
                  flows:
                    type: number
                  apps:
                    type: number
                  resources:
                    type: number
                  variables:
                    type: number
                  schedules:
                    type: number
                required:
                  - scripts
                  - flows
                  - apps
                  - resources
                  - variables
                  - schedules

  /w/{workspace}/folders/addowner/{name}:
    post:
      summary: add owner to folder
      operationId: addOwnerToFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: owner user to folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
              required:
                - owner

      responses:
        "200":
          description: owner added to folder
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders/removeowner/{name}:
    post:
      summary: remove owner to folder
      operationId: removeOwnerToFolder
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: added owner to folder
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
                write:
                  type: boolean
              required:
                - owner
      responses:
        "200":
          description: owner removed from folder
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/folders_history/get/{name}:
    get:
      summary: get folder permission history
      operationId: getFolderPermissionHistory
      tags:
        - folder
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Name"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: folder permission history
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                    changed_by:
                      type: string
                    changed_at:
                      type: string
                      format: date-time
                    change_type:
                      type: string
                    affected:
                      type: string
                      nullable: true

  /workers/list:
    get:
      summary: list workers
      operationId: listWorkers
      x-mcp-tool: true
      tags:
        - worker
      parameters:
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - name: ping_since
          in: query
          required: false
          description: number of seconds the worker must have had a last ping more recent of (default to 300)
          schema:
            type: integer
      responses:
        "200":
          description: a list of workers
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/WorkerPing"

  /workers/exists_workers_with_tags:
    get:
      summary: exists workers with tags
      operationId: existsWorkersWithTags
      tags:
        - worker
      parameters:
        - name: tags
          in: query
          required: true
          description: comma separated list of tags
          schema:
            type: string
        - name: workspace
          in: query
          required: false
          description: workspace to filter tags visibility (required when TAGS_ARE_SENSITIVE is enabled for non-superadmins)
          schema:
            type: string
      responses:
        "200":
          description: map of tags to whether at least one worker with the tag exists
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: boolean

  /workers/queue_metrics:
    get:
      summary: get queue metrics
      operationId: getQueueMetrics
      tags:
        - worker
      responses:
        "200":
          description: metrics
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: string
                    values:
                      type: array
                      items:
                        type: object
                        properties:
                          created_at:
                            type: string
                          value:
                            type: number
                        required:
                          - created_at
                          - value
                  required:
                    - id
                    - values

  /workers/queue_counts:
    get:
      summary: get counts of jobs waiting for an executor per tag
      operationId: getCountsOfJobsWaitingPerTag
      tags:
        - worker
      responses:
        "200":
          description: queue counts
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: integer

  /workers/queue_running_counts:
    get:
      summary: get counts of currently running jobs per tag
      operationId: getCountsOfRunningJobsPerTag
      tags:
        - worker
      responses:
        "200":
          description: queue running counts
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: integer

  /configs/list_worker_groups:
    get:
      summary: list worker groups
      operationId: listWorkerGroups
      tags:
        - config
      responses:
        "200":
          description: a list of worker group configs
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    name:
                      type: string
                    config: {}
                  required:
                    - name
                    - config

  /configs/get/{name}:
    get:
      summary: get config
      operationId: get config
      tags:
        - config
      parameters:
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: a config
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Configs"

  /configs/update/{name}:
    post:
      summary: Update config
      operationId: updateConfig
      tags:
        - config
      parameters:
        - $ref: "#/components/parameters/Name"
      requestBody:
        description: worker group
        required: true
        content:
          application/json:
            schema: {}
      responses:
        "200":
          description: Update a worker group
          content:
            text/plain:
              schema:
                type: string
    delete:
      summary: Delete Config
      operationId: deleteConfig
      tags:
        - config
      parameters:
        - $ref: "#/components/parameters/Name"
      responses:
        "200":
          description: Delete config
          content:
            text/plain:
              schema:
                type: string

  /configs/list:
    get:
      summary: list configs
      operationId: listConfigs
      tags:
        - config
      responses:
        "200":
          description: list of configs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Config"

  /configs/list_autoscaling_events/{worker_group}:
    get:
      summary: List autoscaling events
      operationId: listAutoscalingEvents
      tags:
        - config
      parameters:
        - name: worker_group
          in: path
          required: true
          schema:
            type: string
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: List of autoscaling events
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/AutoscalingEvent"

  /configs/native_kubernetes_autoscaling_healthcheck:
    get:
      summary: Check Kubernetes autoscaling health for a worker group
      operationId: nativeKubernetesAutoscalingHealthcheck
      tags:
        - config
      responses:
        "200":
          description: Kubernetes autoscaling is healthy
        "400":
          description: Error
          content:
            text/plain:
              schema:
                type: string

  /configs/list_available_python_versions:
    get:
      summary: Get currently available python versions provided by UV.
      operationId: listAvailablePythonVersions
      tags:
        - config
      # parameters:
      responses:
        "200":
          description: List of python versions
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string

  /agent_workers/create_agent_token:
    post:
      summary: create agent token
      operationId: createAgentToken
      tags:
        - agent_workers
      requestBody:
        description: agent token
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                worker_group:
                  type: string
                tags:
                  type: array
                  items:
                    type: string
                exp:
                  type: integer
              required:
                - worker_group
                - tags
                - exp
      responses:
        "200":
          description: agent token created
          content:
            application/json:
              schema:
                type: string

  /agent_workers/blacklist_token:
    post:
      summary: blacklist agent token (requires super admin)
      operationId: blacklistAgentToken
      tags:
        - agent_workers
      requestBody:
        description: token to blacklist
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: The agent token to blacklist
                expires_at:
                  type: string
                  format: date-time
                  description: Optional expiration date for the blacklist entry
              required:
                - token
      responses:
        "200":
          description: token blacklisted successfully

  /agent_workers/remove_blacklist_token:
    post:
      summary: remove agent token from blacklist (requires super admin)
      operationId: removeBlacklistAgentToken
      tags:
        - agent_workers
      requestBody:
        description: token to remove from blacklist
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: The agent token to remove from blacklist
              required:
                - token
      responses:
        "200":
          description: token removed from blacklist successfully

  /agent_workers/list_blacklisted_tokens:
    get:
      summary: list blacklisted agent tokens (requires super admin)
      operationId: listBlacklistedAgentTokens
      tags:
        - agent_workers
      parameters:
        - name: include_expired
          in: query
          description: Whether to include expired blacklisted tokens
          schema:
            type: boolean
            default: false
      responses:
        "200":
          description: list of blacklisted tokens
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    token:
                      type: string
                      description: The blacklisted token (without prefix)
                    expires_at:
                      type: string
                      format: date-time
                      description: When the blacklist entry expires
                    blacklisted_at:
                      type: string
                      format: date-time
                      description: When the token was blacklisted
                    blacklisted_by:
                      type: string
                      description: Email of the user who blacklisted the token
                  required:
                    - token
                    - expires_at
                    - blacklisted_at
                    - blacklisted_by

  /agent_workers/get_min_version:
    get:
      summary: get minimum worker version across all workers
      operationId: getMinVersion
      tags:
        - agent_workers
      responses:
        "200":
          description: minimum worker version
          content:
            application/json:
              schema:
                type: string
                description: Minimum semantic version across all workers (e.g. "1.583.0")

  /w/{workspace}/acls/get/{kind}/{path}:
    get:
      summary: get granular acls
      operationId: getGranularAcls
      tags:
        - granular_acl
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              [
                script,
                group_,
                resource,
                schedule,
                variable,
                flow,
                folder,
                app,
                raw_app,
                http_trigger,
                websocket_trigger,
                kafka_trigger,
                nats_trigger,
                postgres_trigger,
                mqtt_trigger,
                gcp_trigger,
                sqs_trigger,
                email_trigger,
              ]
      responses:
        "200":
          description: acls
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  type: boolean

  /w/{workspace}/acls/add/{kind}/{path}:
    post:
      summary: add granular acls
      operationId: addGranularAcls
      tags:
        - granular_acl
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              [
                script,
                group_,
                resource,
                schedule,
                variable,
                flow,
                folder,
                app,
                raw_app,
                http_trigger,
                websocket_trigger,
                kafka_trigger,
                nats_trigger,
                postgres_trigger,
                mqtt_trigger,
                gcp_trigger,
                sqs_trigger,
                email_trigger,
              ]
      requestBody:
        description: acl to add
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
                write:
                  type: boolean
              required: [owner]
      responses:
        "200":
          description: granular acl added
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/acls/remove/{kind}/{path}:
    post:
      summary: remove granular acls
      operationId: removeGranularAcls
      tags:
        - granular_acl
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: kind
          in: path
          required: true
          schema:
            type: string
            enum:
              [
                script,
                group_,
                resource,
                schedule,
                variable,
                flow,
                folder,
                app,
                raw_app,
                http_trigger,
                websocket_trigger,
                kafka_trigger,
                nats_trigger,
                postgres_trigger,
                mqtt_trigger,
                gcp_trigger,
                sqs_trigger,
                email_trigger,
              ]
      requestBody:
        description: acl to add
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
              required: [owner]
      responses:
        "200":
          description: granular acl removed
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/capture/set_config:
    post:
      summary: set capture config
      operationId: setCaptureConfig
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: capture config
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                trigger_kind:
                  $ref: "#/components/schemas/CaptureTriggerKind"
                path:
                  type: string
                is_flow:
                  type: boolean
                trigger_config:
                  type: object
              required:
                - trigger_kind
                - path
                - is_flow
      responses:
        "200":
          description: capture config set
          content:
            application/json:
              schema:
                type: object

  /w/{workspace}/capture/ping_config/{trigger_kind}/{runnable_kind}/{path}:
    post:
      summary: ping capture config
      operationId: pingCaptureConfig
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: trigger_kind
          in: path
          required: true
          schema:
            $ref: "#/components/schemas/CaptureTriggerKind"
        - $ref: "#/components/parameters/RunnableKind"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: capture config pinged

  /w/{workspace}/capture/get_configs/{runnable_kind}/{path}:
    get:
      summary: get capture configs for a script or flow
      operationId: getCaptureConfigs
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableKind"
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: capture configs for a script or flow
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CaptureConfig"

  /w/{workspace}/capture/list/{runnable_kind}/{path}:
    get:
      summary: list captures for a script or flow
      operationId: listCaptures
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableKind"
        - $ref: "#/components/parameters/Path"
        - name: trigger_kind
          in: query
          schema:
            $ref: "#/components/schemas/CaptureTriggerKind"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: list of captures for a script or flow
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Capture"

  /w/{workspace}/capture/move/{runnable_kind}/{path}:
    post:
      summary: move captures and configs for a script or flow
      operationId: moveCapturesAndConfigs
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableKind"
        - $ref: "#/components/parameters/Path"
      requestBody:
        description: move captures and configs to a new path
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                new_path:
                  type: string
      responses:
        "200":
          description: captures and configs moved
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/capture/{id}:
    get:
      summary: get a capture
      operationId: getCapture
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: id
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: capture
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Capture"
    delete:
      summary: delete a capture
      operationId: deleteCapture
      tags:
        - capture
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: id
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: capture deleted

  /w/{workspace}/favorites/star:
    post:
      summary: star item
      operationId: star
      tags:
        - favorite
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                favorite_kind:
                  type: string
                  enum: [flow, app, script, raw_app]
      responses:
        "200":
          description: star item

  /w/{workspace}/favorites/unstar:
    post:
      summary: unstar item
      operationId: unstar
      tags:
        - favorite
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                path:
                  type: string
                favorite_kind:
                  type: string
                  enum: [flow, app, script, raw_app]
      responses:
        "200":
          description: unstar item

  /w/{workspace}/inputs/history:
    get:
      summary: List Inputs used in previously completed jobs
      operationId: getInputHistory
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableId"
        - $ref: "#/components/parameters/RunnableTypeQuery"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/ArgsFilter"
        - name: include_preview
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: Input history for completed jobs
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Input"

  /w/{workspace}/inputs/{jobOrInputId}/args:
    get:
      summary: Get args from history or saved input
      operationId: getArgsFromHistoryOrSavedInput
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: jobOrInputId
          in: path
          required: true
          schema:
            type: string
        - name: input
          in: query
          schema:
            type: boolean
        - name: allow_large
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: args
          content:
            application/json:
              schema: {}

  /w/{workspace}/inputs/list:
    get:
      summary: List saved Inputs for a Runnable
      operationId: listInputs
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableId"
        - $ref: "#/components/parameters/RunnableTypeQuery"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
      responses:
        "200":
          description: Saved Inputs for a Runnable
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/Input"

  /w/{workspace}/inputs/create:
    post:
      summary: Create an Input for future use in a script or flow
      operationId: createInput
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/RunnableId"
        - $ref: "#/components/parameters/RunnableTypeQuery"
      requestBody:
        description: Input
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/CreateInput"
      responses:
        "201":
          description: Input created
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/inputs/update:
    post:
      summary: Update an Input
      operationId: updateInput
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: UpdateInput
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/UpdateInput"
      responses:
        "201":
          description: Input updated
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/inputs/delete/{input}:
    post:
      summary: Delete a Saved Input
      operationId: deleteInput
      tags:
        - input
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/InputId"
      responses:
        "200":
          description: Input deleted
          content:
            text/plain:
              schema:
                type: string
                format: uuid

  /w/{workspace}/job_helpers/duckdb_connection_settings:
    post:
      summary:
        Converts an S3 resource to the set of instructions necessary to connect
        DuckDB to an S3 bucket
      operationId: duckdbConnectionSettings
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: S3 resource to connect to
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                s3_resource:
                  $ref: "#/components/schemas/S3Resource"
      responses:
        "200":
          description: Connection settings
          content:
            application/json:
              schema:
                type: object
                properties:
                  connection_settings_str:
                    type: string
  /w/{workspace}/job_helpers/v2/duckdb_connection_settings:
    post:
      summary:
        Converts an S3 resource to the set of instructions necessary to connect
        DuckDB to an S3 bucket
      operationId: duckdbConnectionSettingsV2
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description:
          S3 resource path to use to generate the connection settings. If empty,
          the S3 resource defined in the workspace settings will be used
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                s3_resource_path:
                  type: string
      responses:
        "200":
          description: Connection settings
          content:
            application/json:
              schema:
                type: object
                properties:
                  connection_settings_str:
                    type: string
                  azure_container_path:
                    type: string
                required:
                  - connection_settings_str

  /w/{workspace}/job_helpers/polars_connection_settings:
    post:
      summary:
        Converts an S3 resource to the set of arguments necessary to connect
        Polars to an S3 bucket
      operationId: polarsConnectionSettings
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: S3 resource to connect to
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                s3_resource:
                  $ref: "#/components/schemas/S3Resource"
      responses:
        "200":
          description: Connection settings
          content:
            application/json:
              schema:
                type: object
                properties:
                  endpoint_url:
                    type: string
                  key:
                    type: string
                  secret:
                    type: string
                  use_ssl:
                    type: boolean
                  cache_regions:
                    type: boolean
                  client_kwargs:
                    $ref: "#/components/schemas/PolarsClientKwargs"
                required:
                  - endpoint_url
                  - use_ssl
                  - cache_regions
                  - client_kwargs
  /w/{workspace}/job_helpers/v2/polars_connection_settings:
    post:
      summary:
        Converts an S3 resource to the set of arguments necessary to connect
        Polars to an S3 bucket
      operationId: polarsConnectionSettingsV2
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description:
          S3 resource path to use to generate the connection settings. If empty,
          the S3 resource defined in the workspace settings will be used
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                s3_resource_path:
                  type: string
      responses:
        "200":
          description: Connection settings
          content:
            application/json:
              schema:
                type: object
                properties:
                  s3fs_args:
                    type: object
                    properties:
                      endpoint_url:
                        type: string
                      key:
                        type: string
                      secret:
                        type: string
                      use_ssl:
                        type: boolean
                      cache_regions:
                        type: boolean
                      client_kwargs:
                        $ref: "#/components/schemas/PolarsClientKwargs"
                    required:
                      - endpoint_url
                      - use_ssl
                      - cache_regions
                      - client_kwargs
                  storage_options:
                    type: object
                    properties:
                      aws_endpoint_url:
                        type: string
                      aws_access_key_id:
                        type: string
                      aws_secret_access_key:
                        type: string
                      aws_region:
                        type: string
                      aws_allow_http:
                        type: string
                    required:
                      - aws_endpoint_url
                      - aws_region
                      - aws_allow_http
                required:
                  - s3fs_args
                  - storage_options
  /w/{workspace}/job_helpers/v2/s3_resource_info:
    post:
      summary: Returns the s3 resource associated to the provided path, or the
        workspace default S3 resource
      operationId: s3ResourceInfo
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description:
          S3 resource path to use. If empty, the S3 resource defined in the
          workspace settings will be used
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                s3_resource_path:
                  type: string
      responses:
        "200":
          description: Connection settings
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/S3Resource"

  /w/{workspace}/job_helpers/test_connection:
    get:
      summary: Test connection to the workspace object storage
      operationId: datasetStorageTestConnection
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Connection settings
          content:
            application/json:
              schema: {}

  /w/{workspace}/job_helpers/list_stored_files:
    get:
      summary: List the file keys available in a workspace object storage
      operationId: listStoredFiles
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: max_keys
          in: query
          required: true
          schema:
            type: integer
        - name: marker
          in: query
          schema:
            type: string
        - name: prefix
          in: query
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: List of file keys
          content:
            application/json:
              schema:
                type: object
                properties:
                  next_marker:
                    type: string
                  windmill_large_files:
                    type: array
                    items:
                      $ref: "#/components/schemas/WindmillLargeFile"
                  restricted_access:
                    type: boolean
                required:
                  - windmill_large_files

  /w/{workspace}/job_helpers/load_file_metadata:
    get:
      summary: Load metadata of the file
      operationId: loadFileMetadata
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: true
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: FileMetadata
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WindmillFileMetadata"

  /w/{workspace}/job_helpers/load_file_preview:
    get:
      summary: Load a preview of the file
      operationId: loadFilePreview
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: true
          schema:
            type: string
        - name: file_size_in_bytes
          in: query
          schema:
            type: integer
        - name: file_mime_type
          in: query
          schema:
            type: string
        - name: csv_separator
          in: query
          schema:
            type: string
        - name: csv_has_header
          in: query
          schema:
            type: boolean
        - name: read_bytes_from
          in: query
          schema:
            type: integer
        - name: read_bytes_length
          in: query
          schema:
            type: integer
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: FilePreview
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WindmillFilePreview"

  /w/{workspace}/job_helpers/list_git_repo_files:
    get:
      summary: List the file keys available in instance object storage with resource-based access control
      operationId: listGitRepoFiles
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: max_keys
          in: query
          required: true
          schema:
            type: integer
        - name: marker
          in: query
          schema:
            type: string
        - name: prefix
          in: query
          required: false
          schema:
            type: string
            description: Must follow format gitrepos/{workspace_id}/{resource_path}/...
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: List of file keys
          content:
            application/json:
              schema:
                type: object
                properties:
                  next_marker:
                    type: string
                  windmill_large_files:
                    type: array
                    items:
                      $ref: "#/components/schemas/WindmillLargeFile"
                  restricted_access:
                    type: boolean
                required:
                  - windmill_large_files

  /w/{workspace}/job_helpers/load_git_repo_file_preview:
    get:
      summary: Load a preview of a file from instance storage with resource-based access control
      operationId: loadGitRepoFilePreview
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: true
          schema:
            type: string
            description: Must follow format gitrepos/{workspace_id}/{resource_path}/...
        - name: file_size_in_bytes
          in: query
          schema:
            type: integer
        - name: file_mime_type
          in: query
          schema:
            type: string
        - name: csv_separator
          in: query
          schema:
            type: string
        - name: csv_has_header
          in: query
          schema:
            type: boolean
        - name: read_bytes_from
          in: query
          schema:
            type: integer
        - name: read_bytes_length
          in: query
          schema:
            type: integer
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: FilePreview
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WindmillFilePreview"

  /w/{workspace}/job_helpers/load_git_repo_file_metadata:
    get:
      summary: Load file metadata from instance storage with resource-based access control
      operationId: loadGitRepoFileMetadata
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: true
          schema:
            type: string
            description: Must follow format gitrepos/{workspace_id}/{resource_path}/...
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: FileMetadata
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/WindmillFileMetadata"

  /w/{workspace}/job_helpers/check_s3_folder_exists:
    get:
      summary: Check if S3 path exists and is a folder
      operationId: checkS3FolderExists
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          description: S3 file key to check (e.g., gitrepos/{workspace_id}/u/user/resource/{commit_hash})
          in: query
          required: true
          schema:
            type: string
      responses:
        "200":
          description: S3 folder existence check result
          content:
            application/json:
              schema:
                type: object
                properties:
                  exists:
                    type: boolean
                    description: Whether the path exists
                  is_folder:
                    type: boolean
                    description: Whether the path is a folder (true) or file (false)
                required:
                  - exists
                  - is_folder

  /w/{workspace}/job_helpers/load_parquet_preview/{path}:
    get:
      summary: Load a preview of a parquet file
      operationId: loadParquetPreview
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: offset
          in: query
          schema:
            type: number
        - name: limit
          in: query
          schema:
            type: number
        - name: sort_col
          in: query
          schema:
            type: string
        - name: sort_desc
          in: query
          schema:
            type: boolean
        - name: search_col
          in: query
          schema:
            type: string
        - name: search_term
          in: query
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Parquet Preview
          content:
            application/json: {}

  /w/{workspace}/job_helpers/load_table_count/{path}:
    get:
      summary: Load the table row count
      operationId: loadTableRowCount
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: search_col
          in: query
          schema:
            type: string
        - name: search_term
          in: query
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Table count
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: number

  /w/{workspace}/job_helpers/load_csv_preview/{path}:
    get:
      summary: Load a preview of a csv file
      operationId: loadCsvPreview
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/Path"
        - name: offset
          in: query
          schema:
            type: number
        - name: limit
          in: query
          schema:
            type: number
        - name: sort_col
          in: query
          schema:
            type: string
        - name: sort_desc
          in: query
          schema:
            type: boolean
        - name: search_col
          in: query
          schema:
            type: string
        - name: search_term
          in: query
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
        - name: csv_separator
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Csv Preview
          content:
            application/json: {}

  /w/{workspace}/job_helpers/delete_s3_file:
    delete:
      summary: Permanently delete file from S3
      operationId: deleteS3File
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: true
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Confirmation
          content:
            application/json:
              schema: {}

  /w/{workspace}/job_helpers/move_s3_file:
    get:
      summary: Move a S3 file from one path to the other within the same bucket
      operationId: moveS3File
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: src_file_key
          in: query
          required: true
          schema:
            type: string
        - name: dest_file_key
          in: query
          required: true
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Confirmation
          content:
            application/json:
              schema: {}

  /w/{workspace}/job_helpers/upload_s3_file:
    post:
      summary: Upload file to S3 bucket
      operationId: fileUpload
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: false
          schema:
            type: string
        - name: file_extension
          in: query
          required: false
          schema:
            type: string
        - name: s3_resource_path
          in: query
          required: false
          schema:
            type: string
        - name: resource_type
          in: query
          required: false
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
        - name: content_type
          in: query
          schema:
            type: string
        - name: content_disposition
          in: query
          schema:
            type: string
      requestBody:
        description: File content
        required: true
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
      responses:
        "200":
          description: File upload status
          content:
            application/json:
              schema:
                type: object
                properties:
                  file_key:
                    type: string
                required:
                  - file_key

  /w/{workspace}/job_helpers/upload_git_repo_file_to_instance_storage:
    post:
      summary: Upload a file to the instance storage gitrepos section for viewing
      operationId: gitRepoViewerFileUpload
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: false
          schema:
            type: string
        - name: file_extension
          in: query
          required: false
          schema:
            type: string
        - name: s3_resource_path
          in: query
          required: false
          schema:
            type: string
        - name: resource_type
          in: query
          required: false
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
        - name: content_type
          in: query
          schema:
            type: string
        - name: content_disposition
          in: query
          schema:
            type: string
      requestBody:
        description: File content
        required: true
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
      responses:
        "200":
          description: File upload status
          content:
            application/json:
              schema:
                type: object
                properties:
                  file_key:
                    type: string
                required:
                  - file_key

  /w/{workspace}/job_helpers/download_s3_file:
    get:
      summary: Download file from S3 bucket
      operationId: fileDownload
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: true
          schema:
            type: string
        - name: s3_resource_path
          in: query
          required: false
          schema:
            type: string
        - name: resource_type
          in: query
          required: false
          schema:
            type: string
        - name: storage
          in: query
          schema:
            type: string
      responses:
        "200":
          description: Chunk of the downloaded file
          content:
            application/octet-stream:
              schema:
                type: string
                format: binary

  /w/{workspace}/job_helpers/download_s3_parquet_file_as_csv:
    get:
      summary: Download file to S3 bucket
      operationId: fileDownloadParquetAsCsv
      tags:
        - helpers
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: file_key
          in: query
          required: true
          schema:
            type: string
        - name: s3_resource_path
          in: query
          required: false
          schema:
            type: string
        - name: resource_type
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: The downloaded file
          content:
            text/csv:
              schema:
                type: string

  /w/{workspace}/job_metrics/get/{id}:
    post:
      summary: get job metrics
      operationId: getJobMetrics
      tags:
        - metrics
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        description: parameters for statistics retrieval
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                timeseries_max_datapoints:
                  type: integer
                from_timestamp:
                  type: string
                  format: date-time
                to_timestamp:
                  type: string
                  format: date-time

      responses:
        "200":
          description: job details
          content:
            application/json:
              schema:
                type: object
                properties:
                  metrics_metadata:
                    type: array
                    items:
                      $ref: "#/components/schemas/MetricMetadata"
                  scalar_metrics:
                    type: array
                    items:
                      $ref: "#/components/schemas/ScalarMetric"
                  timeseries_metrics:
                    type: array
                    items:
                      $ref: "#/components/schemas/TimeseriesMetric"

  /w/{workspace}/job_metrics/set_progress/{id}:
    post:
      summary: set job metrics
      operationId: setJobProgress
      tags:
        - metrics
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      requestBody:
        description: parameters for statistics retrieval
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                percent:
                  type: integer
                flow_job_id:
                  type: string
                  format: uuid

      responses:
        "200":
          description: Job progress updated
          content:
            application/json:
              schema: {}

  /w/{workspace}/job_metrics/get_progress/{id}:
    get:
      summary: get job progress
      operationId: getJobProgress
      tags:
        - metrics
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: job progress between 0 and 99
          content:
            application/json:
              schema:
                type: integer
  /service_logs/list_files:
    get:
      summary: list log files ordered by timestamp
      operationId: listLogFiles
      tags:
        - service_logs
      parameters:
        - $ref: "#/components/parameters/Before"
        - $ref: "#/components/parameters/After"
        - name: with_error
          in: query
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: time
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    hostname:
                      type: string
                    mode:
                      type: string
                    worker_group:
                      type: string
                    log_ts:
                      type: string
                      format: date-time
                    file_path:
                      type: string
                    ok_lines:
                      type: integer
                    err_lines:
                      type: integer
                    json_fmt:
                      type: boolean
                  required:
                    - hostname
                    - mode
                    - log_ts
                    - file_path
                    - json_fmt

  /service_logs/get_log_file/{path}:
    get:
      summary: get log file by path
      operationId: getLogFile
      tags:
        - service_logs
      parameters:
        - $ref: "#/components/parameters/Path"
      responses:
        "200":
          description: log stream
          content:
            text/plain:
              schema:
                type: string
  /concurrency_groups/list:
    get:
      summary: List all concurrency groups
      operationId: listConcurrencyGroups
      tags:
        - concurrencyGroups
      responses:
        "200":
          description: all concurrency groups
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ConcurrencyGroup"
  /concurrency_groups/prune/{concurrency_id}:
    delete:
      summary: Delete concurrency group
      operationId: deleteConcurrencyGroup
      tags:
        - concurrencyGroups
      parameters:
        - $ref: "#/components/parameters/ConcurrencyId"
      responses:
        "200":
          description: concurrency group removed
          content:
            application/json:
              schema:
                type: object
                properties: {}
  /concurrency_groups/{id}/key:
    get:
      summary: Get the concurrency key for a job that has concurrency limits enabled
      operationId: getConcurrencyKey
      tags:
        - concurrencyGroups
      parameters:
        - $ref: "#/components/parameters/JobId"
      responses:
        "200":
          description: concurrency key for given job
          content:
            application/json:
              schema:
                type: string
  /w/{workspace}/concurrency_groups/list_jobs:
    get:
      summary: Get intervals of job runtime concurrency
      operationId: listExtendedJobs
      tags:
        - concurrencyGroups
        - job
      parameters:
        - name: concurrency_key
          in: query
          required: false
          schema:
            type: string
        - name: row_limit
          in: query
          required: false
          schema:
            type: number
        - $ref: "#/components/parameters/WorkspaceId"
        - $ref: "#/components/parameters/CreatedBy"
        - $ref: "#/components/parameters/Label"
        - $ref: "#/components/parameters/ParentJob"
        - $ref: "#/components/parameters/ScriptExactPath"
        - $ref: "#/components/parameters/ScriptStartPath"
        - $ref: "#/components/parameters/SchedulePath"
        - $ref: "#/components/parameters/ScriptExactHash"
        - $ref: "#/components/parameters/StartedBefore"
        - $ref: "#/components/parameters/StartedAfter"
        - $ref: "#/components/parameters/Running"
        - $ref: "#/components/parameters/ScheduledForBeforeNow"
        - $ref: "#/components/parameters/CompletedBefore"
        - $ref: "#/components/parameters/CompletedAfter"
        - $ref: "#/components/parameters/CreatedBeforeQueue"
        - $ref: "#/components/parameters/CreatedAfterQueue"
        - $ref: "#/components/parameters/JobKinds"
        - $ref: "#/components/parameters/ArgsFilter"
        - $ref: "#/components/parameters/Tag"
        - $ref: "#/components/parameters/ResultFilter"
        - $ref: "#/components/parameters/AllowWildcards"
        - $ref: "#/components/parameters/Page"
        - $ref: "#/components/parameters/PerPage"
        - $ref: "#/components/parameters/JobTriggerKind"
        - name: is_skipped
          description: is the job skipped
          in: query
          schema:
            type: boolean
        - name: is_flow_step
          description: is the job a flow step
          in: query
          schema:
            type: boolean
        - name: has_null_parent
          description: has null parent
          in: query
          schema:
            type: boolean
        - name: success
          description: filter on successful jobs
          in: query
          schema:
            type: boolean
        - name: all_workspaces
          description: get jobs from all workspaces (only valid if request come from the `admins` workspace)
          in: query
          schema:
            type: boolean
        - name: is_not_schedule
          description: is not a scheduled job
          in: query
          schema:
            type: boolean
      responses:
        "200":
          description: time
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ExtendedJobs"

  /srch/w/{workspace}/index/search/job:
    get:
      summary: Search through jobs with a string query
      operationId: searchJobsIndex
      tags:
        - indexSearch
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
        - name: search_query
          in: query
          required: true
          schema:
            type: string
        - name: pagination_offset
          in: query
          required: false
          schema:
            type: integer
      responses:
        "200":
          description: search results
          content:
            application/json:
              schema:
                type: object
                properties:
                  query_parse_errors:
                    description: a list of the terms that couldn't be parsed (and thus ignored)
                    type: array
                    items:
                      type: string
                  hits:
                    description: the jobs that matched the query
                    type: array
                    items:
                      $ref: "#/components/schemas/JobSearchHit"
                  hit_count:
                    description: how many jobs matched in total
                    type: number
                  index_metadata:
                    description: Metadata about the index current state
                    type: object
                    properties:
                      indexed_until:
                        description: Datetime of the most recently indexed job
                        type: string
                        format: date-time
                      lost_lock_ownership:
                        description: Is the current indexer service being replaced
                        type: boolean

  /srch/index/search/service_logs:
    get:
      summary: Search through service logs with a string query
      operationId: searchLogsIndex
      tags:
        - indexSearch
      parameters:
        - name: search_query
          in: query
          required: true
          schema:
            type: string
        - name: mode
          in: query
          required: true
          schema:
            type: string
        - name: worker_group
          in: query
          required: false
          schema:
            type: string
        - name: hostname
          in: query
          required: true
          schema:
            type: string
        - name: min_ts
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: max_ts
          in: query
          required: false
          schema:
            type: string
            format: date-time
      responses:
        "200":
          description: search results
          content:
            application/json:
              schema:
                type: object
                properties:
                  query_parse_errors:
                    description: a list of the terms that couldn't be parsed (and thus ignored)
                    type: array
                    items:
                      type: string
                  hits:
                    description: log files that matched the query
                    type: array
                    items:
                      $ref: "#/components/schemas/LogSearchHit"

  /srch/index/search/count_service_logs:
    get:
      summary: Search and count the log line hits on every provided host
      operationId: countSearchLogsIndex
      tags:
        - indexSearch
      parameters:
        - name: search_query
          in: query
          required: true
          schema:
            type: string
        - name: min_ts
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: max_ts
          in: query
          required: false
          schema:
            type: string
            format: date-time
      responses:
        "200":
          description: search results
          content:
            application/json:
              schema:
                type: object
                properties:
                  query_parse_errors:
                    description: a list of the terms that couldn't be parsed (and thus ignored)
                    type: array
                    items:
                      type: string
                  count_per_host:
                    description: count of log lines that matched the query per hostname
                    type: object

  /srch/index/delete/{idx_name}:
    delete:
      summary: Restart container and delete the index to recreate it.
      operationId: clearIndex
      tags:
        - indexSearch
      parameters:
        - name: idx_name
          in: path
          required: true
          schema:
            type: string
            enum:
              - JobIndex
              - ServiceLogIndex
      responses:
        "200":
          description: idx to be deleted and container restarting
          content:
            text/plain:
              schema:
                type: string

  /w/{workspace}/assets/list:
    get:
      summary: List all assets in the workspace
      operationId: listAssets
      tags:
        - asset
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: all assets in the workspace
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  required: [path, kind, usages]
                  properties:
                    path:
                      type: string
                    kind:
                      $ref: "#/components/schemas/AssetKind"
                    usages:
                      type: array
                      items:
                        type: object
                        required: [path, kind]
                        properties:
                          path:
                            type: string
                          kind:
                            $ref: "#/components/schemas/AssetUsageKind"
                          access_type:
                            $ref: "#/components/schemas/AssetUsageAccessType"
                    metadata:
                      type: object
                      properties:
                        resource_type:
                          type: string

  /w/{workspace}/assets/list_by_usages:
    post:
      summary: List all assets used by given usages paths
      operationId: listAssetsByUsage
      tags:
        - asset
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      requestBody:
        description: list assets by usages
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [usages]
              properties:
                usages:
                  type: array
                  items:
                    type: object
                    required: [path, kind]
                    properties:
                      path:
                        type: string
                      kind:
                        $ref: "#/components/schemas/AssetUsageKind"
      responses:
        "200":
          description: all assets used by the given usage paths, in the same order
          content:
            application/json:
              schema:
                type: array
                items:
                  type: array
                  items:
                    type: object
                    required: [path, kind]
                    properties:
                      path:
                        type: string
                      kind:
                        $ref: "#/components/schemas/AssetKind"
                      access_type:
                        $ref: "#/components/schemas/AssetUsageAccessType"

  /mcp/w/{workspace}/list_tools:
    get:
      summary: list available MCP tools
      operationId: listMcpTools
      tags:
        - mcp
      parameters:
        - $ref: "#/components/parameters/WorkspaceId"
      responses:
        "200":
          description: list of MCP tools available for the workspace
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/EndpointTool"

  /mcp/oauth/discover:
    post:
      summary: discover MCP server OAuth metadata
      operationId: discoverMcpOAuth
      tags:
        - mcp_oauth
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - mcp_server_url
              properties:
                mcp_server_url:
                  type: string
                  description: URL of the MCP server to discover OAuth metadata from
      responses:
        "200":
          description: OAuth metadata from MCP server
          content:
            application/json:
              schema:
                type: object
                properties:
                  scopes_supported:
                    type: array
                    items:
                      type: string
                  authorization_endpoint:
                    type: string
                  token_endpoint:
                    type: string
                  registration_endpoint:
                    type: string
                  supports_dynamic_registration:
                    type: boolean

  /mcp/oauth/start:
    get:
      summary: start MCP OAuth popup flow
      description: Opens in a popup, discovers OAuth metadata, registers client, and redirects to OAuth provider
      operationId: startMcpOAuthPopup
      tags:
        - mcp_oauth
      parameters:
        - name: mcp_server_url
          in: query
          required: true
          schema:
            type: string
          description: URL of the MCP server to connect to
        - name: scopes
          in: query
          required: false
          schema:
            type: string
          description: Comma-separated list of OAuth scopes to request
      responses:
        "302":
          description: Redirect to OAuth provider authorization URL

  /mcp/oauth/callback:
    get:
      security: []
      summary: MCP OAuth callback
      description: Handles OAuth callback, exchanges code for tokens, returns HTML that posts message to opener
      operationId: mcpOAuthCallback
      tags:
        - mcp_oauth
      parameters:
        - name: code
          in: query
          required: true
          schema:
            type: string
          description: OAuth authorization code
        - name: state
          in: query
          required: true
          schema:
            type: string
          description: CSRF state token
      responses:
        "200":
          description: HTML page with JavaScript that posts tokens to opener window and closes
          content:
            text/html:
              schema:
                type: string

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
    cookieAuth:
      type: apiKey
      in: cookie
      name: token

  parameters:
    Id:
      name: id
      in: path
      required: true
      schema:
        type: string
    Key:
      name: key
      in: path
      required: true
      schema:
        type: string
    WorkspaceId:
      name: workspace
      in: path
      required: true
      schema:
        type: string
    PublicationName:
      name: publication
      in: path
      required: true
      description: The name of the publication
      schema:
        type: string
    VersionId:
      name: version
      in: path
      required: true
      schema:
        type: number
    Token:
      name: token
      in: path
      required: true
      schema:
        type: string
    AccountId:
      name: id
      in: path
      required: true
      schema:
        type: integer
    ClientName:
      name: client_name
      in: path
      required: true
      schema:
        type: string
    ScriptPath:
      name: path
      in: path
      required: true
      schema:
        type: string
    ScriptHash:
      name: hash
      in: path
      required: true
      schema:
        type: string
    JobId:
      name: id
      in: path
      required: true
      schema:
        type: string
        format: uuid
    Path:
      name: path
      in: path
      required: true
      schema:
        type: string
    CustomPath:
      name: custom_path
      in: path
      required: true
      schema:
        type: string
    PathId:
      name: id
      in: path
      required: true
      schema:
        type: integer
    PathVersion:
      name: version
      in: path
      required: true
      schema:
        type: integer
    Name:
      name: name
      in: path
      required: true
      schema:
        type: string
    Page:
      name: page
      description: which page to return (start at 1, default 1)
      in: query
      schema:
        type: integer
    PerPage:
      name: per_page
      description: number of items to return for a given page (default 30, max 100)
      in: query
      schema:
        type: integer
    JobTriggerKind:
      name: trigger_kind
      description: trigger kind (schedule, http, websocket...)
      in: query
      schema:
        $ref: "#/components/schemas/JobTriggerKind"
    OrderDesc:
      name: order_desc
      description: order by desc order (default true)
      in: query
      schema:
        type: boolean
    CreatedBy:
      name: created_by
      description: mask to filter exact matching user creator
      in: query
      schema:
        type: string
    Label:
      name: label
      description: mask to filter exact matching job's label (job labels are completed jobs with as a result an object containing a string in the array at key 'wm_labels')
      in: query
      schema:
        type: string
    Worker:
      name: worker
      description: worker this job was ran on
      in: query
      schema:
        type: string
    ParentJob:
      name: parent_job
      description:
        The parent job that is at the origin and responsible for the execution
        of this script if any
      in: query
      schema:
        type: string
        format: uuid
    WorkerTag:
      name: tag
      description: Override the tag to use
      in: query
      schema:
        type: string
    CacheTtl:
      name: cache_ttl
      description: Override the cache time to live (in seconds). Can not be used to disable caching, only override with a new cache ttl
      in: query
      schema:
        type: string
    NewJobId:
      name: job_id
      description:
        The job id to assign to the created job. if missing, job is chosen
        randomly using the ULID scheme. If a job id already exists in the queue
        or as a completed job, the request to create one will fail (Bad Request)
      in: query
      schema:
        type: string
        format: uuid
    IncludeHeader:
      name: include_header
      description: |
        List of headers's keys (separated with ',') whove value are added to the args
        Header's key lowercased and '-'' replaced to '_' such that 'Content-Type' becomes the 'content_type' arg key
      in: query
      schema:
        type: string
    QueueLimit:
      name: queue_limit
      description: |
        The maximum size of the queue for which the request would get rejected if that job would push it above that limit
      in: query
      schema:
        type: string
    SkipPreprocessor:
      name: skip_preprocessor
      description: skip the preprocessor
      in: query
      schema:
        type: boolean
    Payload:
      name: payload
      description: |
        The base64 encoded payload that has been encoded as a JSON. e.g how to encode such payload encodeURIComponent
        `encodeURIComponent(btoa(JSON.stringify({a: 2})))`
      in: query
      schema:
        type: string
    ScriptStartPath:
      name: script_path_start
      description: mask to filter matching starting path
      in: query
      schema:
        type: string
    SchedulePath:
      name: schedule_path
      description: mask to filter by schedule path
      in: query
      schema:
        type: string
    TriggerPath:
      name: trigger_path
      description: mask to filter by trigger path
      in: query
      schema:
        type: string
    ScriptExactPath:
      name: script_path_exact
      description: mask to filter exact matching path
      in: query
      schema:
        type: string
    ScriptExactHash:
      name: script_hash
      description: mask to filter exact matching path
      in: query
      schema:
        type: string
    CreatedBefore:
      name: created_before
      description: filter on created before (inclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    CreatedAfter:
      name: created_after
      description: filter on created after (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    StartedBefore:
      name: started_before
      description: filter on started before (inclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    StartedAfter:
      name: started_after
      description: filter on started after (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    Before:
      name: before
      description: filter on started before (inclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time

    CompletedBefore:
      name: completed_before
      description: filter on started before (inclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    CompletedAfter:
      name: completed_after
      description: filter on started after (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time

    CreatedAfterQueue:
      name: created_after_queue
      description: filter on jobs created after X for jobs in the queue only
      in: query
      schema:
        type: string
        format: date-time

    CreatedBeforeQueue:
      name: created_before_queue
      description: filter on jobs created before X for jobs in the queue only
      in: query
      schema:
        type: string
        format: date-time

    Success:
      name: success
      description: filter on successful jobs
      in: query
      schema:
        type: boolean
    ScheduledForBeforeNow:
      name: scheduled_for_before_now
      description: filter on jobs scheduled_for before now (hence waitinf for a worker)
      in: query
      schema:
        type: boolean
    Suspended:
      name: suspended
      description: filter on suspended jobs
      in: query
      schema:
        type: boolean
    Running:
      name: running
      description: filter on running jobs
      in: query
      schema:
        type: boolean
    AllowWildcards:
      name: allow_wildcards
      description: allow wildcards (*) in the filter of label, tag, worker
      in: query
      schema:
        type: boolean
    ArgsFilter:
      name: args
      description: filter on jobs containing those args as a json subset (@> in postgres)
      in: query
      schema:
        type: string
    Tag:
      name: tag
      description: filter on jobs with a given tag/worker group
      in: query
      schema:
        type: string
    ResultFilter:
      name: result
      description: filter on jobs containing those result as a json subset (@> in postgres)
      in: query
      schema:
        type: string
    After:
      name: after
      description: filter on created after (exclusive) timestamp
      in: query
      schema:
        type: string
        format: date-time
    Username:
      name: username
      description: filter on exact username of user
      in: query
      schema:
        type: string
    Operation:
      name: operation
      description: filter on exact or prefix name of operation
      in: query
      schema:
        type: string
    ResourceName:
      name: resource
      description: filter on exact or prefix name of resource
      in: query
      schema:
        type: string
    ActionKind:
      name: action_kind
      description: filter on type of operation
      in: query
      schema:
        type: string
        enum: [Create, Update, Delete, Execute]
    JobKinds:
      name: job_kinds
      description:
        filter on job kind (values 'preview', 'script', 'dependencies', 'flow')
        separated by,
      in: query
      schema:
        type: string
      # correct type is below but explode not supported by our codegen
      #   type: array
      #   items:
      #     type: string
      #     enum: ["preview", "script", "dependencies"]
      # explode: false
    RunnableId:
      name: runnable_id
      in: query
      schema:
        type: string
    RunnableTypeQuery:
      name: runnable_type
      in: query
      schema:
        $ref: "#/components/schemas/RunnableType"
    InputId:
      name: input
      in: path
      required: true
      schema:
        type: string
    GetStarted:
      name: get_started
      in: query
      schema:
        type: boolean
    ConcurrencyId:
      name: concurrency_id
      in: path
      required: true
      schema:
        type: string
    RunnableKind:
      name: runnable_kind
      in: path
      required: true
      schema:
        type: string
        enum: [script, flow]

  schemas:
    # NOTE: Not so many generators and validators support this format:
    # $ref: "../../openflow.openapi.yaml#/components/schemas"
    # This is why it is better to inline each of schemas for better compat
    # Do not change next line. It is used by python-client for pre-processing
    # -- INLINE START --
    OpenFlow:
      $ref: "../../openflow.openapi.yaml#/components/schemas/OpenFlow"
    FlowValue:
      $ref: "../../openflow.openapi.yaml#/components/schemas/FlowValue"
    Retry:
      $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
    StopAfterIf:
      $ref: "../../openflow.openapi.yaml#/components/schemas/StopAfterIf"
    FlowModule:
      $ref: "../../openflow.openapi.yaml#/components/schemas/FlowModule"
    InputTransform:
      $ref: "../../openflow.openapi.yaml#/components/schemas/InputTransform"
    StaticTransform:
      $ref: "../../openflow.openapi.yaml#/components/schemas/StaticTransform"
    JavascriptTransform:
      $ref: "../../openflow.openapi.yaml#/components/schemas/JavascriptTransform"
    FlowModuleValue:
      $ref: "../../openflow.openapi.yaml#/components/schemas/FlowModuleValue"
    RawScript:
      $ref: "../../openflow.openapi.yaml#/components/schemas/RawScript"
    PathScript:
      $ref: "../../openflow.openapi.yaml#/components/schemas/PathScript"
    PathFlow:
      $ref: "../../openflow.openapi.yaml#/components/schemas/PathFlow"
    ForloopFlow:
      $ref: "../../openflow.openapi.yaml#/components/schemas/ForloopFlow"
    WhileloopFlow:
      $ref: "../../openflow.openapi.yaml#/components/schemas/WhileloopFlow"
    BranchOne:
      $ref: "../../openflow.openapi.yaml#/components/schemas/BranchOne"
    BranchAll:
      $ref: "../../openflow.openapi.yaml#/components/schemas/BranchAll"
    AiAgent:
      $ref: "../../openflow.openapi.yaml#/components/schemas/AiAgent"
    Identity:
      $ref: "../../openflow.openapi.yaml#/components/schemas/Identity"
    FlowStatus:
      $ref: "../../openflow.openapi.yaml#/components/schemas/FlowStatus"
    FlowStatusModule:
      $ref: "../../openflow.openapi.yaml#/components/schemas/FlowStatusModule"
    FlowNote:
      $ref: "../../openflow.openapi.yaml#/components/schemas/FlowNote"
    # -- INLINE END --
    # Do not change line above

    AutoInviteConfig:
      type: object
      description: Configuration for auto-inviting users to the workspace
      properties:
        enabled:
          type: boolean
          default: false
        domain:
          type: string
        operator:
          type: boolean
          default: false
          description: If true, auto-invited users are added as operators. If false, they are added as developers.
        mode:
          type: string
          enum: ["invite", "add"]
          default: "invite"
        instance_groups:
          type: array
          items:
            type: string
        instance_groups_roles:
          type: object
          additionalProperties:
            type: string

    ErrorHandlerConfig:
      type: object
      description: Configuration for the workspace error handler
      properties:
        path:
          type: string
          description: Path to the error handler script or flow
        extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        muted_on_cancel:
          type: boolean
          default: false
        muted_on_user_path:
          type: boolean
          default: false

    SuccessHandlerConfig:
      type: object
      description: Configuration for the workspace success handler
      properties:
        path:
          type: string
          description: Path to the success handler script or flow
        extra_args:
          $ref: "#/components/schemas/ScriptArgs"

    EditErrorHandler:
      description: Request body for editing the workspace error handler. Accepts both new grouped format and legacy flat format for backward compatibility.
      oneOf:
        - $ref: "#/components/schemas/EditErrorHandlerNew"
        - $ref: "#/components/schemas/EditErrorHandlerLegacy"

    EditErrorHandlerNew:
      type: object
      description: New grouped format for editing error handler
      properties:
        path:
          type: string
          description: Path to the error handler script or flow
        extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        muted_on_cancel:
          type: boolean
          default: false
        muted_on_user_path:
          type: boolean
          default: false

    EditErrorHandlerLegacy:
      type: object
      description: Legacy flat format for editing error handler (deprecated, use new format)
      properties:
        error_handler:
          type: string
          description: Path to the error handler script or flow
        error_handler_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        error_handler_muted_on_cancel:
          type: boolean
          default: false

    EditSuccessHandler:
      description: Request body for editing the workspace success handler. Accepts both new grouped format and legacy flat format for backward compatibility.
      oneOf:
        - $ref: "#/components/schemas/EditSuccessHandlerNew"
        - $ref: "#/components/schemas/EditSuccessHandlerLegacy"

    EditSuccessHandlerNew:
      type: object
      description: New grouped format for editing success handler
      properties:
        path:
          type: string
          description: Path to the success handler script or flow
        extra_args:
          $ref: "#/components/schemas/ScriptArgs"

    EditSuccessHandlerLegacy:
      type: object
      description: Legacy flat format for editing success handler (deprecated, use new format)
      properties:
        success_handler:
          type: string
          description: Path to the success handler script or flow
        success_handler_extra_args:
          $ref: "#/components/schemas/ScriptArgs"

    VaultSettings:
      type: object
      required:
        - address
        - mount_path
      properties:
        address:
          type: string
          description: HashiCorp Vault server address (e.g., https://vault.company.com:8200)
        mount_path:
          type: string
          description: KV v2 secrets engine mount path (e.g., windmill)
        jwt_role:
          type: string
          description: Vault JWT auth role name for Windmill (optional, if not provided token auth is used)
        namespace:
          type: string
          description: Vault Enterprise namespace (optional)
        token:
          type: string
          description: Static Vault token for testing/development (optional, if provided this is used instead of JWT authentication)

    SecretMigrationFailure:
      type: object
      required:
        - workspace_id
        - path
        - error
      properties:
        workspace_id:
          type: string
          description: Workspace ID where the secret is located
        path:
          type: string
          description: Path of the secret that failed to migrate
        error:
          type: string
          description: Error message

    SecretMigrationReport:
      type: object
      required:
        - total_secrets
        - migrated_count
        - failed_count
        - failures
      properties:
        total_secrets:
          type: integer
          format: int64
          description: Total number of secrets found
        migrated_count:
          type: integer
          format: int64
          description: Number of secrets successfully migrated
        failed_count:
          type: integer
          format: int64
          description: Number of secrets that failed to migrate
        failures:
          type: array
          items:
            $ref: "#/components/schemas/SecretMigrationFailure"
          description: Details of any failures encountered during migration

    JwksResponse:
      type: object
      required:
        - keys
      properties:
        keys:
          type: array
          items:
            type: object
            additionalProperties: true
          description: Array of JSON Web Keys for JWT verification

    FlowConversation:
      type: object
      required:
        [id, workspace_id, flow_path, created_at, updated_at, created_by]
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the conversation
        workspace_id:
          type: string
          description: The workspace ID where the conversation belongs
        flow_path:
          type: string
          description: Path of the flow this conversation is for
        title:
          type: string
          description: Optional title for the conversation
          nullable: true
        created_at:
          type: string
          format: date-time
          description: When the conversation was created
        updated_at:
          type: string
          format: date-time
          description: When the conversation was last updated
        created_by:
          type: string
          description: Username who created the conversation

    FlowConversationMessage:
      type: object
      required: [id, conversation_id, message_type, content, created_at]
      properties:
        id:
          type: string
          format: uuid
          description: Unique identifier for the message
        conversation_id:
          type: string
          format: uuid
          description: The conversation this message belongs to
        message_type:
          type: string
          enum: [user, assistant, system, tool]
          description: Type of the message
        content:
          type: string
          description: The message content
        job_id:
          type: string
          format: uuid
          nullable: true
          description: Associated job ID if this message came from a flow run
        created_at:
          type: string
          format: date-time
          description: When the message was created
        step_name:
          type: string
          description: The step name that produced that message
        success:
          type: boolean
          description: Whether the message is a success

    EndpointTool:
      type: object
      required: [name, description, instructions, path, method]
      properties:
        name:
          type: string
          description: The tool name/operation ID
        description:
          type: string
          description: Short description of the tool
        instructions:
          type: string
          description: Detailed instructions for using the tool
        path:
          type: string
          description: API endpoint path
        method:
          type: string
          description: HTTP method (GET, POST, etc.)
        path_params_schema:
          type: object
          description: JSON schema for path parameters
          nullable: true
        query_params_schema:
          type: object
          description: JSON schema for query parameters
          nullable: true
        body_schema:
          type: object
          description: JSON schema for request body
          nullable: true

    AIProvider:
      type: string
      enum:
        [
          openai,
          azure_openai,
          anthropic,
          mistral,
          deepseek,
          googleai,
          groq,
          openrouter,
          togetherai,
          aws_bedrock,
          customai,
        ]

    GitSyncObjectType:
      type: string
      enum:
        - script
        - flow
        - app
        - folder
        - resource
        - variable
        - secret
        - resourcetype
        - schedule
        - user
        - group
        - trigger
        - settings
        - key

    AIProviderModel:
      type: object
      properties:
        model:
          type: string
        provider:
          $ref: "#/components/schemas/AIProvider"
      required:
        - model
        - provider

    AIProviderConfig:
      type: object
      properties:
        resource_path:
          type: string
        models:
          type: array
          items:
            type: string
      required:
        - resource_path
        - models

    AIConfig:
      type: object
      properties:
        providers:
          type: object
          additionalProperties:
            $ref: "#/components/schemas/AIProviderConfig"
        default_model:
          $ref: "#/components/schemas/AIProviderModel"
        code_completion_model:
          $ref: "#/components/schemas/AIProviderModel"
        custom_prompts:
          type: object
          additionalProperties:
            type: string
        max_tokens_per_model:
          type: object
          additionalProperties:
            type: integer
            minimum: 1
            maximum: 2000000

    Alert:
      type: object
      properties:
        name:
          type: string
        tags_to_monitor:
          type: array
          items:
            type: string
        jobs_num_threshold:
          type: integer
        alert_cooldown_seconds:
          type: integer
        alert_time_threshold_seconds:
          type: integer
      required:
        - name
        - tags_to_monitor
        - jobs_num_threshold
        - alert_cooldown_seconds
        - alert_time_threshold_seconds

    Configs:
      type: object
      nullable: true
      properties:
        alerts:
          type: array
          items:
            $ref: "#/components/schemas/Alert"

    WorkspaceDependencies:
      type: object
      properties:
        id:
          type: integer
        archived:
          type: boolean
        name:
          type: string
        description:
          type: string
        content:
          type: string
        language:
          $ref: "#/components/schemas/ScriptLang"
        workspace_id:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - workspace_id
        - language
        - created_at
        - content
        - id
        - archived

    NewWorkspaceDependencies:
      type: object
      properties:
        workspace_id:
          type: string
        language:
          $ref: "#/components/schemas/ScriptLang"
        name:
          type: string
        description:
          type: string
        content:
          type: string
      required:
        - workspace_id
        - language
        - content

    Script:
      type: object
      properties:
        workspace_id:
          type: string
        hash:
          type: string
        path:
          type: string
        parent_hashes:
          type: array
          description: |
            The first element is the direct parent of the script, the second is the parent of the first, etc
          items:
            type: string
        summary:
          type: string
        description:
          type: string
        content:
          type: string
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        archived:
          type: boolean
        schema:
          type: object
        deleted:
          type: boolean
        is_template:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        lock:
          type: string
        lock_error_logs:
          type: string
        language:
          $ref: "#/components/schemas/ScriptLang"
        kind:
          type: string
          enum: [script, failure, trigger, command, approval, preprocessor]
        starred:
          type: boolean
        tag:
          type: string
        has_draft:
          type: boolean
        draft_only:
          type: boolean
        envs:
          type: array
          items:
            type: string
        concurrent_limit:
          type: integer
        concurrency_time_window_s:
          type: integer
        concurrency_key:
          type: string
        debounce_key:
          type: string
        debounce_delay_s:
          type: integer
        debounce_args_to_accumulate:
          type: array
          items:
            type: string
        max_total_debouncing_time:
          type: integer
        max_total_debounces_amount:
          type: integer
        cache_ttl:
          type: number
        dedicated_worker:
          type: boolean
        ws_error_handler_muted:
          type: boolean
        priority:
          type: integer
        restart_unless_cancelled:
          type: boolean
        timeout:
          type: integer
        delete_after_use:
          type: boolean
        visible_to_runner_only:
          type: boolean
        no_main_func:
          type: boolean
        codebase:
          type: string
        has_preprocessor:
          type: boolean
        on_behalf_of_email:
          type: string

      required:
        - hash
        - path
        - summary
        - description
        - content
        - created_by
        - created_at
        - archived
        - deleted
        - is_template
        - extra_perms
        - language
        - kind
        - starred
        - no_main_func
        - has_preprocessor

    NewScript:
      type: object
      properties:
        path:
          type: string
        parent_hash:
          type: string
        summary:
          type: string
        description:
          type: string
        content:
          type: string
        schema:
          type: object
        is_template:
          type: boolean
        lock:
          type: string
        language:
          $ref: "#/components/schemas/ScriptLang"
        kind:
          type: string
          enum: [script, failure, trigger, command, approval, preprocessor]
        tag:
          type: string
        draft_only:
          type: boolean
        envs:
          type: array
          items:
            type: string
        concurrent_limit:
          type: integer
        concurrency_time_window_s:
          type: integer
        cache_ttl:
          type: number
        cache_ignore_s3_path:
          type: boolean
        dedicated_worker:
          type: boolean
        ws_error_handler_muted:
          type: boolean
        priority:
          type: integer
        restart_unless_cancelled:
          type: boolean
        timeout:
          type: integer
        delete_after_use:
          type: boolean
        deployment_message:
          type: string
        concurrency_key:
          type: string
        debounce_key:
          type: string
        debounce_delay_s:
          type: integer
        debounce_args_to_accumulate:
          type: array
          items:
            type: string
        max_total_debouncing_time:
          type: integer
        max_total_debounces_amount:
          type: integer
        visible_to_runner_only:
          type: boolean
        no_main_func:
          type: boolean
        codebase:
          type: string
        has_preprocessor:
          type: boolean
        on_behalf_of_email:
          type: string
        assets:
          type: array
          items:
            type: object
            required:
              - path
              - kind
            properties:
              path:
                type: string
              kind:
                $ref: "#/components/schemas/AssetKind"
              access_type:
                type: string
                enum: [r, w, rw]
              alt_access_type:
                type: string
                enum: [r, w, rw]

      required:
        - path
        - summary
        - description
        - content
        - language

    NewScriptWithDraft:
      allOf:
        - $ref: "#/components/schemas/NewScript"
        - type: object
          properties:
            draft:
              $ref: "#/components/schemas/NewScript"
            hash:
              type: string
          required:
            - hash

    ScriptHistory:
      type: object
      properties:
        script_hash:
          type: string
        deployment_msg:
          type: string
      required:
        - script_hash

    ScriptArgs:
      type: object
      description: The arguments to pass to the script or flow
      additionalProperties: {}

    Input:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        is_public:
          type: boolean
        success:
          type: boolean
      required:
        - id
        - name
        - args
        - created_by
        - created_at
        - is_public

    CreateInput:
      type: object
      properties:
        name:
          type: string
        args:
          type: object
      required:
        - name
        - args
        - created_by

    UpdateInput:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        is_public:
          type: boolean
      required:
        - id
        - name
        - is_public

    RunnableType:
      type: string
      enum: ["ScriptHash", "ScriptPath", "FlowPath"]

    QueuedJob:
      type: object
      properties:
        workspace_id:
          type: string
        id:
          type: string
          format: uuid
        parent_job:
          type: string
          format: uuid
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        scheduled_for:
          type: string
          format: date-time
        running:
          type: boolean
        script_path:
          type: string
        script_hash:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        logs:
          type: string
        raw_code:
          type: string
        canceled:
          type: boolean
        canceled_by:
          type: string
        canceled_reason:
          type: string
        last_ping:
          type: string
          format: date-time
        job_kind:
          type: string
          enum:
            [
              "script",
              "preview",
              "dependencies",
              "flowdependencies",
              "appdependencies",
              "flow",
              "flowpreview",
              "script_hub",
              "identity",
              "deploymentcallback",
              "singlestepflow",
              "flowscript",
              "flownode",
              "appscript",
              "aiagent",
              "unassigned_script",
              "unassigned_flow",
              "unassigned_singlestepflow",
            ]
        schedule_path:
          type: string
        permissioned_as:
          type: string
          description: |
            The user (u/userfoo) or group (g/groupfoo) whom
            the execution of this script will be permissioned_as and by extension its DT_TOKEN.
        flow_status:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowStatus"
        workflow_as_code_status:
          $ref: "#/components/schemas/WorkflowStatus"
        raw_flow:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowValue"
        is_flow_step:
          type: boolean
        language:
          $ref: "#/components/schemas/ScriptLang"
        email:
          type: string
        visible_to_owner:
          type: boolean
        mem_peak:
          type: integer
        tag:
          type: string
        priority:
          type: integer
        self_wait_time_ms:
          type: number
        aggregate_wait_time_ms:
          type: number
        suspend:
          type: number
        preprocessed:
          type: boolean
        worker:
          type: string
      required:
        - id
        - running
        - canceled
        - job_kind
        - permissioned_as
        - is_flow_step
        - email
        - visible_to_owner
        - tag

    CompletedJob:
      type: object
      properties:
        workspace_id:
          type: string
        id:
          type: string
          format: uuid
        parent_job:
          type: string
          format: uuid
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        completed_at:
          type: string
          format: date-time
        duration_ms:
          type: integer
        success:
          type: boolean
        script_path:
          type: string
        script_hash:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        result: {}
        logs:
          type: string
        deleted:
          type: boolean
        raw_code:
          type: string
        canceled:
          type: boolean
        canceled_by:
          type: string
        canceled_reason:
          type: string
        job_kind:
          type: string
          enum:
            [
              "script",
              "preview",
              "dependencies",
              "flow",
              "flowdependencies",
              "appdependencies",
              "flowpreview",
              "script_hub",
              "identity",
              "deploymentcallback",
              "singlestepflow",
              "flowscript",
              "flownode",
              "appscript",
              "aiagent",
              "unassigned_script",
              "unassigned_flow",
              "unassigned_singlestepflow",
            ]
        schedule_path:
          type: string
        permissioned_as:
          type: string
          description: |
            The user (u/userfoo) or group (g/groupfoo) whom
            the execution of this script will be permissioned_as and by extension its DT_TOKEN.
        flow_status:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowStatus"
        workflow_as_code_status:
          $ref: "#/components/schemas/WorkflowStatus"
        raw_flow:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowValue"
        is_flow_step:
          type: boolean
        language:
          $ref: "#/components/schemas/ScriptLang"
        is_skipped:
          type: boolean
        email:
          type: string
        visible_to_owner:
          type: boolean
        mem_peak:
          type: integer
        tag:
          type: string
        priority:
          type: integer
        labels:
          type: array
          items:
            type: string
        self_wait_time_ms:
          type: number
        aggregate_wait_time_ms:
          type: number
        preprocessed:
          type: boolean
        worker:
          type: string
      required:
        - id
        - created_by
        - duration_ms
        - created_at
        - started_at
        - success
        - canceled
        - job_kind
        - permissioned_as
        - is_flow_step
        - is_skipped
        - email
        - visible_to_owner
        - tag


    ExportableCompletedJob:
      type: object
      description: Completed job with full data for export/import operations
      properties:
        id:
          type: string
          format: uuid
        parent_job:
          type: string
          format: uuid
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        completed_at:
          type: string
          format: date-time
        duration_ms:
          type: integer
        script_path:
          type: string
        script_hash:
          type: string
        args:
          type: object
          description: Full job arguments without size restrictions
        result:
          type: object
          description: Full job result without size restrictions
        logs:
          type: string
          description: Complete job logs from v2_job table
        raw_code:
          type: string
        raw_lock:
          type: string
        canceled_by:
          type: string
        canceled_reason:
          type: string
        job_kind:
          type: string
          enum:
            [
              "script",
              "preview",
              "dependencies",
              "flow",
              "flowdependencies",
              "appdependencies",
              "flowpreview",
              "script_hub",
              "identity",
              "deploymentcallback",
              "singlestepflow",
              "flowscript",
              "flownode",
              "appscript",
              "aiagent",
              "unassigned_script",
              "unassigned_flow",
              "unassigned_singlestepflow",
            ]
        trigger:
          type: string
          description: Trigger path for the job (replaces schedule_path)
        trigger_kind:
          type: string
          enum:
            [
              "webhook",
              "http",
              "websocket",
              "kafka",
              "email",
              "nats",
              "schedule",
              "app",
              "ui",
              "postgres",
              "sqs",
              "gcp",
            ]
        permissioned_as:
          type: string
        permissioned_as_email:
          type: string
        flow_status:
          type: object
          description: Flow status from v2_job_status table
        workflow_as_code_status:
          type: object
        raw_flow:
          type: object
        is_flow_step:
          type: boolean
        language:
          $ref: "#/components/schemas/ScriptLang"
        is_skipped:
          type: boolean
        email:
          type: string
        visible_to_owner:
          type: boolean
        mem_peak:
          type: integer
        tag:
          type: string
        priority:
          type: integer
        labels:
          type: array
          items:
            type: string
        same_worker:
          type: boolean
        flow_step_id:
          type: string
        flow_innermost_root_job:
          type: string
          format: uuid
        concurrent_limit:
          type: integer
        concurrency_time_window_s:
          type: integer
        timeout:
          type: integer
        cache_ttl:
          type: integer
        self_wait_time_ms:
          type: integer
        aggregate_wait_time_ms:
          type: integer
        preprocessed:
          type: boolean
        worker:
          type: string
        status:
          type: string
          description: Actual job status from database
      required:
        - id
        - created_by
        - created_at
        - job_kind
        - permissioned_as
        - email
        - visible_to_owner

    ExportableQueuedJob:
      type: object
      description: Queued job with full data for export/import operations
      properties:
        id:
          type: string
          format: uuid
        parent_job:
          type: string
          format: uuid
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        scheduled_for:
          type: string
          format: date-time
        script_path:
          type: string
        script_hash:
          type: string
        args:
          type: object
          description: Full job arguments without size restrictions
        logs:
          type: string
          description: Complete job logs from v2_job table
        raw_code:
          type: string
        raw_lock:
          type: string
        canceled_by:
          type: string
        canceled_reason:
          type: string
        job_kind:
          type: string
          enum:
            [
              "script",
              "preview",
              "dependencies",
              "flowdependencies",
              "appdependencies",
              "flow",
              "flowpreview",
              "script_hub",
              "identity",
              "deploymentcallback",
              "singlestepflow",
              "flowscript",
              "flownode",
              "appscript",
              "aiagent",
              "unassigned_script",
              "unassigned_flow",
              "unassigned_singlestepflow",
            ]
        trigger:
          type: string
          description: Trigger path for the job (replaces schedule_path)
        trigger_kind:
          type: string
          enum:
            [
              "webhook",
              "http",
              "websocket",
              "kafka",
              "email",
              "nats",
              "schedule",
              "app",
              "ui",
              "postgres",
              "sqs",
              "gcp",
            ]
        permissioned_as:
          type: string
        permissioned_as_email:
          type: string
        flow_status:
          type: object
          description: Flow status from v2_job_status table
        workflow_as_code_status:
          type: object
        raw_flow:
          type: object
        is_flow_step:
          type: boolean
        language:
          $ref: "#/components/schemas/ScriptLang"
        email:
          type: string
        visible_to_owner:
          type: boolean
        mem_peak:
          type: integer
        tag:
          type: string
        priority:
          type: integer
        labels:
          type: array
          items:
            type: string
        same_worker:
          type: boolean
        flow_step_id:
          type: string
        flow_innermost_root_job:
          type: string
          format: uuid
        concurrent_limit:
          type: integer
        concurrency_time_window_s:
          type: integer
        timeout:
          type: integer
        cache_ttl:
          type: integer
        self_wait_time_ms:
          type: integer
        aggregate_wait_time_ms:
          type: integer
        preprocessed:
          type: boolean
        suspend:
          type: integer
        suspend_until:
          type: string
          format: date-time
      required:
        - id
        - created_by
        - created_at
        - job_kind
        - permissioned_as
        - email
        - visible_to_owner

    ObscuredJob:
      type: object
      properties:
        typ:
          type: string
        started_at:
          type: string
          format: date-time
        duration_ms:
          type: number
    Job:
      oneOf:
        - allOf:
            - $ref: "#/components/schemas/CompletedJob"
            - type: object
              properties:
                type:
                  type: string
                  enum: [CompletedJob]
        - allOf:
            - $ref: "#/components/schemas/QueuedJob"
            - type: object
              properties:
                type:
                  type: string
                  enum: [QueuedJob]
      discriminator:
        propertyName: type

    User:
      type: object
      properties:
        email:
          type: string
        username:
          type: string
        is_admin:
          type: boolean
        name:
          type: string
        is_super_admin:
          type: boolean
        created_at:
          type: string
          format: date-time
        operator:
          type: boolean
        disabled:
          type: boolean
        groups:
          type: array
          items:
            type: string
        folders:
          type: array
          items:
            type: string
        folders_owners:
          type: array
          items:
            type: string
        added_via:
          nullable: true
          allOf:
            - $ref: "#/components/schemas/UserSource"
      required:
        - email
        - username
        - is_admin
        - is_super_admin
        - created_at
        - operator
        - disabled
        - folders
        - folders_owners

    UserSource:
      type: object
      properties:
        source:
          type: string
          enum: [domain, instance_group, manual]
          description: "How the user was added to the workspace"
        domain:
          type: string
          description: "The domain used for auto-invite (when source is 'domain')"
        group:
          type: string
          description: "The instance group name (when source is 'instance_group')"
      required:
        - source

    UserUsage:
      type: object
      properties:
        email:
          type: string
        executions:
          type: number

    Login:
      type: object
      properties:
        email:
          type: string
        password:
          type: string
      required:
        - email
        - password

    PasswordResetResponse:
      type: object
      properties:
        message:
          type: string
      required:
        - message

    EditWorkspaceUser:
      type: object
      properties:
        is_admin:
          type: boolean
        operator:
          type: boolean
        disabled:
          type: boolean

    TruncatedToken:
      type: object
      properties:
        label:
          type: string
        expiration:
          type: string
          format: date-time
        token_prefix:
          type: string
        created_at:
          type: string
          format: date-time
        last_used_at:
          type: string
          format: date-time
        scopes:
          type: array
          items:
            type: string
        email:
          type: string
      required:
        - token_prefix
        - created_at
        - last_used_at

    NewToken:
      type: object
      properties:
        label:
          type: string
        expiration:
          type: string
          format: date-time
        scopes:
          type: array
          items:
            type: string
        workspace_id:
          type: string

    NewTokenImpersonate:
      type: object
      properties:
        label:
          type: string
        expiration:
          type: string
          format: date-time
        impersonate_email:
          type: string
        workspace_id:
          type: string
      required:
        - impersonate_email

    ListableVariable:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        value:
          type: string
        is_secret:
          type: boolean
        description:
          type: string
        account:
          type: integer
        is_oauth:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        is_expired:
          type: boolean
        refresh_error:
          type: string
        is_linked:
          type: boolean
        is_refreshed:
          type: boolean
        expires_at:
          type: string
          format: date-time
      required:
        - workspace_id
        - path
        - is_secret
        - extra_perms

    ContextualVariable:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
        description:
          type: string
        is_custom:
          type: boolean
      required:
        - name
        - value
        - description
        - is_custom

    CreateVariable:
      type: object
      properties:
        path:
          type: string
          description: The path to the variable
        value:
          type: string
          description: The value of the variable
        is_secret:
          type: boolean
          description: Whether the variable is a secret
        description:
          type: string
          description: The description of the variable
        account:
          type: integer
          description: The account identifier
        is_oauth:
          type: boolean
          description: Whether the variable is an OAuth variable
        expires_at:
          type: string
          description: The expiration date of the variable
          format: date-time
      required:
        - path
        - value
        - is_secret
        - description

    EditVariable:
      type: object
      properties:
        path:
          type: string
          description: The path to the variable
        value:
          type: string
          description: The new value of the variable
        is_secret:
          type: boolean
          description: Whether the variable is a secret
        description:
          type: string
          description: The new description of the variable

    AuditLog:
      type: object
      properties:
        workspace_id:
          type: string
        id:
          type: integer
        timestamp:
          type: string
          format: date-time
        username:
          type: string
        operation:
          type: string
          enum:
            - "jobs.run"
            - "jobs.run.script"
            - "jobs.run.preview"
            - "jobs.run.flow"
            - "jobs.run.flow_preview"
            - "jobs.run.script_hub"
            - "jobs.run.dependencies"
            - "jobs.run.identity"
            - "jobs.run.noop"
            - "jobs.flow_dependencies"
            - "jobs"
            - "jobs.cancel"
            - "jobs.force_cancel"
            - "jobs.disapproval"
            - "jobs.delete"
            - "account.delete"
            - "ai.request"
            - "resources.create"
            - "resources.update"
            - "resources.delete"
            - "resource_types.create"
            - "resource_types.update"
            - "resource_types.delete"
            - "schedule.create"
            - "schedule.setenabled"
            - "schedule.edit"
            - "schedule.delete"
            - "scripts.create"
            - "scripts.update"
            - "scripts.archive"
            - "scripts.delete"
            - "users.create"
            - "users.delete"
            - "users.update"
            - "users.login"
            - "users.login_failure"
            - "users.logout"
            - "users.accept_invite"
            - "users.decline_invite"
            - "users.token.create"
            - "users.token.delete"
            - "users.add_to_workspace"
            - "users.add_global"
            - "users.setpassword"
            - "users.impersonate"
            - "users.leave_workspace"
            - "oauth.login"
            - "oauth.login_failure"
            - "oauth.signup"
            - "variables.create"
            - "variables.delete"
            - "variables.update"
            - "flows.create"
            - "flows.update"
            - "flows.delete"
            - "flows.archive"
            - "apps.create"
            - "apps.update"
            - "apps.delete"
            - "folder.create"
            - "folder.update"
            - "folder.delete"
            - "folder.add_owner"
            - "folder.remove_owner"
            - "group.create"
            - "group.delete"
            - "group.edit"
            - "group.adduser"
            - "group.removeuser"
            - "igroup.create"
            - "igroup.delete"
            - "igroup.adduser"
            - "igroup.removeuser"
            - "variables.decrypt_secret"
            - "workspaces.edit_command_script"
            - "workspaces.edit_deploy_to"
            - "workspaces.edit_auto_invite_domain"
            - "workspaces.edit_webhook"
            - "workspaces.edit_copilot_config"
            - "workspaces.edit_error_handler"
            - "workspaces.create"
            - "workspaces.update"
            - "workspaces.archive"
            - "workspaces.unarchive"
            - "workspaces.delete"
        action_kind:
          type: string
          enum: ["Created", "Updated", "Delete", "Execute"]
        resource:
          type: string
        parameters:
          type: object
        span:
          type: string
      required:
        - workspace_id
        - id
        - timestamp
        - username
        - operation
        - action_kind

    MainArgSignature:
      type: object
      properties:
        type:
          type: string
          enum: ["Valid", "Invalid"]
        error:
          type: string
        star_args:
          type: boolean
        star_kwargs:
          type: boolean
        args:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              typ:
                oneOf:
                  - type: string
                    enum:
                      [
                        "float",
                        "int",
                        "bool",
                        "email",
                        "unknown",
                        "bytes",
                        "dict",
                        "datetime",
                        "sql",
                      ]
                  - type: object
                    properties:
                      resource:
                        type: string
                        nullable: true
                    required:
                      - resource
                  - type: object
                    properties:
                      str:
                        type: array
                        items:
                          type: string
                        nullable: true
                    required:
                      - str
                  - type: object
                    properties:
                      object:
                        type: object
                        properties:
                          name:
                            type: string
                          props:
                            type: array
                            items:
                              type: object
                              properties:
                                key:
                                  type: string
                                typ:
                                  oneOf:
                                    - type: string
                                      enum:
                                        [
                                          "float",
                                          "int",
                                          "bool",
                                          "email",
                                          "unknown",
                                          "bytes",
                                          "dict",
                                          "datetime",
                                          "sql",
                                        ]
                                    - type: object
                                      properties:
                                        str: {}
                                      required: [str]
                              required:
                                - key
                                - typ
                    required:
                      - object
                  - type: object
                    properties:
                      list:
                        oneOf:
                          - type: string
                            enum:
                              [
                                "float",
                                "int",
                                "bool",
                                "email",
                                "unknown",
                                "bytes",
                                "dict",
                                "datetime",
                                "sql",
                              ]
                          - type: object
                            properties:
                              str: {}
                            required: [str]
                        nullable: true
                    required:
                      - list
              has_default:
                type: boolean
              default: {}
            required:
              - name
              - typ
        no_main_func:
          type: boolean
          nullable: true
        has_preprocessor:
          type: boolean
          nullable: true
      required:
        - star_args
        - start_kwargs
        - args
        - type
        - error
        - no_main_func
        - has_preprocessor

    ScriptLang:
      type: string
      enum: [
          python3,
          deno,
          go,
          bash,
          powershell,
          postgresql,
          mysql,
          bigquery,
          snowflake,
          mssql,
          oracledb,
          graphql,
          nativets,
          bun,
          php,
          rust,
          ansible,
          csharp,
          nu,
          java,
          ruby,
          duckdb,
          # for related places search: ADD_NEW_LANG
        ]

    Preview:
      type: object
      properties:
        content:
          type: string
          description: The code to run
        path:
          type: string
          description: The path to the script
        script_hash:
          type: string
          description: The hash of the script
        args:
          $ref: "#/components/schemas/ScriptArgs"
        language:
          $ref: "#/components/schemas/ScriptLang"
        tag:
          type: string
        kind:
          type: string
          enum: [code, identity, http]
        dedicated_worker:
          type: boolean
        lock:
          type: string
      required:
        - args

    PreviewInline:
      type: object
      properties:
        content:
          type: string
          description: The code to run
        args:
          $ref: "#/components/schemas/ScriptArgs"
        language:
          $ref: "#/components/schemas/ScriptLang"
      required: [content, args, language]

    WorkflowTask:
      type: object
      properties:
        args:
          $ref: "#/components/schemas/ScriptArgs"
      required:
        - args

    WorkflowStatusRecord:
      type: object
      additionalProperties:
        $ref: "#/components/schemas/WorkflowStatus"

    WorkflowStatus:
      type: object
      properties:
        scheduled_for:
          type: string
          format: date-time
        started_at:
          type: string
          format: date-time
        duration_ms:
          type: number
        name:
          type: string

    CreateResource:
      type: object
      properties:
        path:
          type: string
          description: The path to the resource
        value: {}
        description:
          type: string
          description: The description of the resource
        resource_type:
          type: string
          description: The resource_type associated with the resource
      required:
        - path
        - value
        - resource_type

    EditResource:
      type: object
      properties:
        path:
          type: string
          description: The path to the resource
        description:
          type: string
          description: The new description of the resource
        value: {}
        resource_type:
          type: string
          description: The new resource_type to be associated with the resource

    Resource:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        description:
          type: string
        resource_type:
          type: string
        value: {}
        is_oauth:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        created_by:
          type: string
        edited_at:
          type: string
          format: date-time
      required:
        - path
        - resource_type
        - is_oauth

    ListableResource:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        description:
          type: string
        resource_type:
          type: string
        value: {}
        is_oauth:
          type: boolean
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        is_expired:
          type: boolean
        refresh_error:
          type: string
        is_linked:
          type: boolean
        is_refreshed:
          type: boolean
        account:
          type: number
        created_by:
          type: string
        edited_at:
          type: string
          format: date-time
      required:
        - path
        - resource_type
        - is_oauth
        - is_linked
        - is_refreshed

    ResourceType:
      type: object
      properties:
        workspace_id:
          type: string
        name:
          type: string
        schema: {}
        description:
          type: string
        created_by:
          type: string
        edited_at:
          type: string
          format: date-time
        format_extension:
          type: string
      required:
        - name

    EditResourceType:
      type: object
      properties:
        schema: {}
        description:
          type: string

    Schedule:
      type: object
      properties:
        path:
          type: string
        edited_by:
          type: string
        edited_at:
          type: string
          format: date-time
        schedule:
          type: string
        timezone:
          type: string
        enabled:
          type: boolean
        script_path:
          type: string
        is_flow:
          type: boolean
        args:
          $ref: "#/components/schemas/ScriptArgs"
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        email:
          type: string
        error:
          type: string
        on_failure:
          # a reference to a script path, flow path, or webhook (script/<path>, flow/<path>)
          type: string
        on_failure_times:
          type: number
        on_failure_exact:
          type: boolean
        on_failure_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        on_recovery:
          type: string
        on_recovery_times:
          type: number
        on_recovery_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        on_success:
          type: string
        on_success_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
        ws_error_handler_muted:
          type: boolean
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
        summary:
          type: string
        description:
          type: string
        no_flow_overlap:
          type: boolean
        tag:
          type: string
        paused_until:
          type: string
          format: date-time
        cron_version:
          type: string
        dynamic_skip:
          type: string
          description: Path to a script that validates scheduled datetimes. Receives scheduled_for datetime and returns boolean.
      required:
        - path
        - edited_by
        - edited_at
        - schedule
        - script_path
        - timezone
        - extra_perms
        - is_flow
        - enabled
        - email

    ScheduleWJobs:
      allOf:
        - $ref: "#/components/schemas/Schedule"
        - type: object
          properties:
            jobs:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                  success:
                    type: boolean
                  duration_ms:
                    type: number
                required:
                  - id
                  - success
                  - duration_ms

    ErrorHandler:
      type: string
      enum:
        - custom
        - slack
        - teams
        - email

    NewSchedule:
      type: object
      properties:
        path:
          type: string
          description: The path where the schedule will be created
        schedule:
          type: string
          description: The cron schedule to trigger the script or flow. Should include seconds.
        timezone:
          type: string
          description: The timezone to use for the cron schedule
        script_path:
          type: string
          description: The path to the script or flow to trigger
        is_flow:
          type: boolean
          description: Whether the schedule is for a flow
        args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow
        enabled:
          type: boolean
          description: Whether the schedule is enabled
        on_failure:
          # a reference to a script path, flow path, or webhook (script/<path>, flow/<path>)
          type: string
          description: The path to the script or flow to trigger on failure
        on_failure_times:
          type: number
          description: The number of times to retry on failure
        on_failure_exact:
          type: boolean
          description: Whether the schedule should only run on the exact time
        on_failure_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow on failure
        on_recovery:
          type: string
          description: The path to the script or flow to trigger on recovery
        on_recovery_times:
          type: number
          description: The number of times to retry on recovery
        on_recovery_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow on recovery
        on_success:
          type: string
          description: The path to the script or flow to trigger on success
        on_success_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow on success
        ws_error_handler_muted:
          type: boolean
          description: Whether the WebSocket error handler is muted
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
          description: The retry configuration for the schedule
        no_flow_overlap:
          type: boolean
          description: Whether the schedule should not run if a flow is already running
        summary:
          type: string
          description: The summary of the schedule
        description:
          type: string
          description: The description of the schedule
        tag:
          type: string
          description: The tag of the schedule
        paused_until:
          type: string
          description: The date and time the schedule will be paused until
          format: date-time
        cron_version:
          type: string
          description: The version of the cron schedule to use (last is v2)
        dynamic_skip:
          type: string
          description: Path to a script that validates scheduled datetimes. Receives scheduled_for datetime and returns boolean.
      required:
        - path
        - schedule
        - timezone
        - script_path
        - is_flow
        - args

    EditSchedule:
      type: object
      properties:
        schedule:
          type: string
          description: The cron schedule to trigger the script or flow. Should include seconds.
        timezone:
          type: string
          description: The timezone to use for the cron schedule
        args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow
        on_failure:
          # a reference to a script path, flow path, or webhook (script/<path>, flow/<path>)
          type: string
          description: The path to the script or flow to trigger on failure
        on_failure_times:
          type: number
          description: The number of times to retry on failure
        on_failure_exact:
          type: boolean
          description: Whether the schedule should only run on the exact time
        on_failure_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow on failure
        on_recovery:
          type: string
          description: The path to the script or flow to trigger on recovery
        on_recovery_times:
          type: number
          description: The number of times to retry on recovery
        on_recovery_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow on recovery
        on_success:
          type: string
          description: The path to the script or flow to trigger on success
        on_success_extra_args:
          $ref: "#/components/schemas/ScriptArgs"
          description: The arguments to pass to the script or flow on success
        ws_error_handler_muted:
          type: boolean
          description: Whether the WebSocket error handler is muted
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
          description: The retry configuration for the schedule
        no_flow_overlap:
          type: boolean
          description: Whether the schedule should not run if a flow is already running
        summary:
          type: string
          description: The summary of the schedule
        description:
          type: string
          description: The description of the schedule
        tag:
          type: string
          description: The tag of the schedule
        paused_until:
          type: string
          description: The date and time the schedule will be paused until
          format: date-time
        cron_version:
          type: string
          description: The version of the cron schedule to use (last is v2)
        dynamic_skip:
          type: string
          description: Path to a script that validates scheduled datetimes. Receives scheduled_for datetime and returns boolean.
      required:
        - schedule
        - timezone
        - args

    JobTriggerKind:
      description: job trigger kind (schedule, http, websocket...)
      type: string
      enum:
        - webhook
        - default_email
        - email
        - schedule
        - http
        - websocket
        - postgres
        - kafka
        - nats
        - mqtt
        - sqs
        - gcp

    TriggerMode:
      description: job trigger mode
      type: string
      enum:
        - enabled
        - disabled
        - suspended

    TriggerExtraProperty:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        email:
          type: string
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        workspace_id:
          type: string
        edited_by:
          type: string
        edited_at:
          type: string
          format: date-time
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
      required:
        - path
        - script_path
        - email
        - extra_perms
        - workspace_id
        - edited_by
        - edited_at
        - is_flow
        - mode

    AuthenticationMethod:
      type: string
      enum:
        - none
        - windmill
        - api_key
        - basic_http
        - custom_script
        - signature

    RunnableKind:
      type: string
      enum:
        - script
        - flow

    OpenapiSpecFormat:
      type: string
      enum:
        - yaml
        - json

    OpenapiHttpRouteFilters:
      type: object
      properties:
        folder_regex:
          type: string
        path_regex:
          type: string
        route_path_regex:
          type: string
      required:
        - folder_regex
        - path_regex
        - route_path_regex

    WebhookFilters:
      type: object
      properties:
        user_or_folder_regex:
          type: string
          enum:
            - "*"
            - u
            - f
        user_or_folder_regex_value:
          type: string
        path:
          type: string
        runnable_kind:
          $ref: "#/components/schemas/RunnableKind"
      required:
        - user_or_folder_regex
        - user_or_folder_regex_value
        - path
        - runnable_kind

    OpenapiV3Info:
      type: object
      properties:
        title:
          type: string
        version:
          type: string
        description:
          type: string
        terms_of_service:
          type: string
        contact:
          type: object
          properties:
            name:
              type: string
            url:
              type: string
            email:
              type: string
        license:
          type: object
          properties:
            name:
              type: string
            identifier:
              type: string
            url:
              type: string
          required:
            - name
      required:
        - title
        - version

    GenerateOpenapiSpec:
      type: object
      properties:
        info:
          $ref: "#/components/schemas/OpenapiV3Info"
        url:
          type: string
        openapi_spec_format:
          $ref: "#/components/schemas/OpenapiSpecFormat"
        http_route_filters:
          type: array
          items:
            $ref: "#/components/schemas/OpenapiHttpRouteFilters"
        webhook_filters:
          type: array
          items:
            $ref: "#/components/schemas/WebhookFilters"

    HttpMethod:
      type: string
      enum:
        - get
        - post
        - put
        - delete
        - patch

    HttpRequestType:
      type: string
      enum:
        - sync
        - async
        - sync_sse

    HttpTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        route_path:
          type: string
        static_asset_config:
          type: object
          properties:
            s3:
              type: string
            storage:
              type: string
            filename:
              type: string
          required:
            - s3
        http_method:
          $ref: "#/components/schemas/HttpMethod"
        authentication_resource_path:
          type: string
        summary:
          type: string
        description:
          type: string
        request_type:
          $ref: "#/components/schemas/HttpRequestType"
        authentication_method:
          $ref: "#/components/schemas/AuthenticationMethod"
        is_static_website:
          type: boolean
        workspaced_route:
          type: boolean
        wrap_body:
          type: boolean
        raw_string:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - route_path
        - request_type
        - authentication_method
        - http_method
        - is_static_website
        - workspaced_route
        - wrap_body
        - raw_string

    NewHttpTrigger:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        route_path:
          type: string
        workspaced_route:
          type: boolean
        summary:
          type: string
        description:
          type: string
        static_asset_config:
          type: object
          properties:
            s3:
              type: string
            storage:
              type: string
            filename:
              type: string
          required:
            - s3
        is_flow:
          type: boolean
        http_method:
          $ref: "#/components/schemas/HttpMethod"
        authentication_resource_path:
          type: string
        is_async:
          type: boolean
          description: Deprecated, use request_type instead
        request_type:
          $ref: "#/components/schemas/HttpRequestType"
        authentication_method:
          $ref: "#/components/schemas/AuthenticationMethod"
        is_static_website:
          type: boolean
        wrap_body:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        raw_string:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - path
        - script_path
        - route_path
        - is_flow
        - authentication_method
        - http_method
        - is_static_website

    EditHttpTrigger:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        route_path:
          type: string
        summary:
          type: string
        description:
          type: string
        workspaced_route:
          type: boolean
        static_asset_config:
          type: object
          properties:
            s3:
              type: string
            storage:
              type: string
            filename:
              type: string
          required:
            - s3
        authentication_resource_path:
          type: string
        is_flow:
          type: boolean
        http_method:
          $ref: "#/components/schemas/HttpMethod"
        is_async:
          type: boolean
          description: Deprecated, use request_type instead
        request_type:
          $ref: "#/components/schemas/HttpRequestType"
        authentication_method:
          $ref: "#/components/schemas/AuthenticationMethod"
        is_static_website:
          type: boolean
        wrap_body:
          type: boolean
        raw_string:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - is_flow
        - kind
        - authentication_method
        - http_method
        - is_static_website

    TriggersCount:
      type: object
      properties:
        primary_schedule:
          type: object
          properties:
            schedule:
              type: string
        schedule_count:
          type: number
        http_routes_count:
          type: number
        webhook_count:
          type: number
        email_count:
          type: number
        default_email_count:
          type: number
        websocket_count:
          type: number
        postgres_count:
          type: number
        kafka_count:
          type: number
        nats_count:
          type: number
        mqtt_count:
          type: number
        gcp_count:
          type: number
        sqs_count:
          type: number
        nextcloud_count:
          type: number

    WebsocketTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        url:
          type: string
        server_id:
          type: string
        last_server_ping:
          type: string
          format: date-time
        error:
          type: string
        filters:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              value: {}
            required:
              - key
              - value
        initial_messages:
          type: array
          items:
            $ref: "#/components/schemas/WebsocketTriggerInitialMessage"
        url_runnable_args:
          $ref: "#/components/schemas/ScriptArgs"
        can_return_message:
          type: boolean
        can_return_error_result:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - url
        - filters
        - can_return_message
        - can_return_error_result

    NewWebsocketTrigger:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        url:
          type: string
        mode:
          $ref: "#/components/schemas/TriggerMode"
        filters:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              value: {}
            required:
              - key
              - value
        initial_messages:
          type: array
          items:
            $ref: "#/components/schemas/WebsocketTriggerInitialMessage"
        url_runnable_args:
          $ref: "#/components/schemas/ScriptArgs"
        can_return_message:
          type: boolean
        can_return_error_result:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - path
        - script_path
        - url
        - is_flow
        - filters
        - can_return_message
        - can_return_error_result

    EditWebsocketTrigger:
      type: object
      properties:
        url:
          type: string
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        filters:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
              value: {}
            required:
              - key
              - value
        initial_messages:
          type: array
          items:
            $ref: "#/components/schemas/WebsocketTriggerInitialMessage"
        url_runnable_args:
          $ref: "#/components/schemas/ScriptArgs"
        can_return_message:
          type: boolean
        can_return_error_result:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - path
        - script_path
        - url
        - is_flow
        - filters
        - can_return_message
        - can_return_error_result
    WebsocketTriggerInitialMessage:
      anyOf:
        - type: object
          properties:
            raw_message:
              type: string
          required:
            - raw_message
        - type: object
          properties:
            runnable_result:
              type: object
              properties:
                path:
                  type: string
                args:
                  $ref: "#/components/schemas/ScriptArgs"
                is_flow:
                  type: boolean
              required:
                - path
                - args
                - is_flow
          required:
            - runnable_result

    MqttQoS:
      type: string
      enum: ["qos0", "qos1", "qos2"]

    MqttV3Config:
      type: object
      properties:
        clean_session:
          type: boolean

    MqttV5Config:
      type: object
      properties:
        clean_start:
          type: boolean
        topic_alias_maximum:
          type: number
        session_expiry_interval:
          type: number

    MqttSubscribeTopic:
      type: object
      properties:
        qos:
          $ref: "#/components/schemas/MqttQoS"
        topic:
          type: string
      required:
        - qos
        - topic

    MqttClientVersion:
      type: string
      enum: ["v3", "v5"]

    MqttTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        mqtt_resource_path:
          type: string
        subscribe_topics:
          type: array
          items:
            $ref: "#/components/schemas/MqttSubscribeTopic"
        v3_config:
          $ref: "#/components/schemas/MqttV3Config"
        v5_config:
          $ref: "#/components/schemas/MqttV5Config"
        client_id:
          type: string
        client_version:
          $ref: "#/components/schemas/MqttClientVersion"
        server_id:
          type: string
        last_server_ping:
          type: string
          format: date-time
        error:
          type: string
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - subscribe_topics
        - mqtt_resource_path

    NewMqttTrigger:
      type: object
      properties:
        mqtt_resource_path:
          type: string
        subscribe_topics:
          type: array
          items:
            $ref: "#/components/schemas/MqttSubscribeTopic"
        client_id:
          type: string
        v3_config:
          $ref: "#/components/schemas/MqttV3Config"
        v5_config:
          $ref: "#/components/schemas/MqttV5Config"
        client_version:
          $ref: "#/components/schemas/MqttClientVersion"
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - is_flow
        - subscribe_topics
        - mqtt_resource_path

    EditMqttTrigger:
      type: object
      properties:
        mqtt_resource_path:
          type: string
        subscribe_topics:
          type: array
          items:
            $ref: "#/components/schemas/MqttSubscribeTopic"
        client_id:
          type: string
        v3_config:
          $ref: "#/components/schemas/MqttV3Config"
        v5_config:
          $ref: "#/components/schemas/MqttV5Config"
        client_version:
          $ref: "#/components/schemas/MqttClientVersion"
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - is_flow
        - enabled
        - subscribe_topics
        - mqtt_resource_path

    DeliveryType:
      type: string
      enum:
        - push
        - pull

    PushConfig:
      type: object
      properties:
        audience:
          type: string
        authenticate:
          type: boolean
      required:
        - authenticate
        - base_endpoint

    GcpTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        gcp_resource_path:
          type: string
        topic_id:
          type: string
        subscription_id:
          type: string
        server_id:
          type: string
        delivery_type:
          $ref: "#/components/schemas/DeliveryType"
        delivery_config:
          $ref: "#/components/schemas/PushConfig"
        subscription_mode:
          $ref: "#/components/schemas/SubscriptionMode"
        last_server_ping:
          type: string
          format: date-time
        error:
          type: string
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - gcp_resource_path
        - topic_id
        - subscription_id
        - delivery_type
        - subscription_mode

    SubscriptionMode:
      type: string
      enum:
        - existing
        - create_update
      description: "The mode of subscription. 'existing' means using an existing GCP subscription, while 'create_update' involves creating or updating a new subscription."

    GcpTriggerData:
      type: object
      properties:
        gcp_resource_path:
          type: string
        subscription_mode:
          $ref: "#/components/schemas/SubscriptionMode"
        topic_id:
          type: string
        subscription_id:
          type: string
        base_endpoint:
          type: string
        delivery_type:
          $ref: "#/components/schemas/DeliveryType"
        delivery_config:
          $ref: "#/components/schemas/PushConfig"
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        auto_acknowledge_msg:
          type: boolean
        ack_deadline:
          type: integer
          format: int32
          minimum: 10
          maximum: 600
          description: "Time in seconds within which the message must be acknowledged. If not provided, defaults to the subscription's acknowledgment deadline (600 seconds)."
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - is_flow
        - gcp_resource_path
        - topic_id
        - subscription_mode

    GetAllTopicSubscription:
      type: object
      properties:
        topic_id:
          type: string
      required:
        - topic_id

    DeleteGcpSubscription:
      type: object
      properties:
        subscription_id:
          type: string
      required:
        - subscription_id

    AwsAuthResourceType:
      type: string
      enum:
        - oidc
        - credentials

    SqsTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        queue_url:
          type: string
        aws_auth_resource_type:
          $ref: "#/components/schemas/AwsAuthResourceType"
        aws_resource_path:
          type: string
        message_attributes:
          type: array
          items:
            type: string
        server_id:
          type: string
        last_server_ping:
          type: string
          format: date-time
        error:
          type: string
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - queue_url
        - aws_resource_path
        - aws_auth_resource_type

    LoggedWizardStatus:
      type: string
      enum:
        - OK
        - SKIP
        - FAIL

    CustomInstanceDbLogs:
      type: object
      properties:
        super_admin:
          $ref: "#/components/schemas/LoggedWizardStatus"
        database_credentials:
          $ref: "#/components/schemas/LoggedWizardStatus"
        valid_dbname:
          $ref: "#/components/schemas/LoggedWizardStatus"
        created_database:
          $ref: "#/components/schemas/LoggedWizardStatus"
        db_connect:
          $ref: "#/components/schemas/LoggedWizardStatus"
        grant_permissions:
          $ref: "#/components/schemas/LoggedWizardStatus"

    CustomInstanceDbTag:
      type: string
      enum:
        - ducklake
        - datatable

    CustomInstanceDb:
      type: object
      required:
        - logs
        - success
      properties:
        logs:
          $ref: "#/components/schemas/CustomInstanceDbLogs"
        success:
          type: boolean
          description: Whether the operation completed successfully
          example: true
        error:
          type: string
          nullable: true
          description: Error message if the operation failed
          example: "Connection timeout"
        tag:
          $ref: "#/components/schemas/CustomInstanceDbTag"

    NewSqsTrigger:
      type: object
      properties:
        queue_url:
          type: string
        aws_auth_resource_type:
          $ref: "#/components/schemas/AwsAuthResourceType"
        aws_resource_path:
          type: string
        message_attributes:
          type: array
          items:
            type: string
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - queue_url
        - aws_resource_path
        - path
        - script_path
        - is_flow
        - aws_auth_resource_type

    EditSqsTrigger:
      type: object
      properties:
        queue_url:
          type: string
        aws_auth_resource_type:
          $ref: "#/components/schemas/AwsAuthResourceType"
        aws_resource_path:
          type: string
        message_attributes:
          type: array
          items:
            type: string
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - queue_url
        - aws_resource_path
        - path
        - script_path
        - is_flow
        - enabled
        - aws_auth_resource_type

    Slot:
      type: object
      properties:
        name:
          type: string

    SlotList:
      type: object
      properties:
        slot_name:
          type: string
        active:
          type: boolean

    PublicationData:
      type: object
      properties:
        table_to_track:
          type: array
          items:
            $ref: "#/components/schemas/Relations"
        transaction_to_track:
          type: array
          items:
            type: string
      required:
        - transaction_to_track

    TableToTrack:
      type: array
      items:
        type: object
        properties:
          table_name:
            type: string
          columns_name:
            type: array
            items:
              type: string
          where_clause:
            type: string
        required:
          - table_name

    Relations:
      type: object
      properties:
        schema_name:
          type: string
        table_to_track:
          $ref: "#/components/schemas/TableToTrack"
      required:
        - schema_name
        - table_to_track

    Language:
      type: string
      enum:
        - Typescript

    TemplateScript:
      type: object
      properties:
        postgres_resource_path:
          type: string
        relations:
          type: array
          items:
            $ref: "#/components/schemas/Relations"
        language:
          $ref: "#/components/schemas/Language"
      required:
        - postgres_resource_path
        - relations
        - language

    PostgresTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        postgres_resource_path:
          type: string
        publication_name:
          type: string
        server_id:
          type: string
        replication_slot_name:
          type: string
        error:
          type: string
        last_server_ping:
          type: string
          format: date-time
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - postgres_resource_path
        - replication_slot_name
        - publication_name

    NewPostgresTrigger:
      type: object
      properties:
        replication_slot_name:
          type: string
        publication_name:
          type: string
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        postgres_resource_path:
          type: string
        publication:
          $ref: "#/components/schemas/PublicationData"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - is_flow
        - enabled
        - postgres_resource_path

    EditPostgresTrigger:
      type: object
      properties:
        replication_slot_name:
          type: string
        publication_name:
          type: string
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        mode:
          $ref: "#/components/schemas/TriggerMode"
        postgres_resource_path:
          type: string
        publication:
          $ref: "#/components/schemas/PublicationData"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - is_flow
        - enabled
        - postgres_resource_path
        - publication_name
        - replication_slot_name

    KafkaTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        kafka_resource_path:
          type: string
        group_id:
          type: string
        topics:
          type: array
          items:
            type: string
        server_id:
          type: string
        last_server_ping:
          type: string
          format: date-time
        error:
          type: string
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - kafka_resource_path
        - group_id
        - topics

    NewKafkaTrigger:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        kafka_resource_path:
          type: string
        group_id:
          type: string
        topics:
          type: array
          items:
            type: string
        mode:
          $ref: "#/components/schemas/TriggerMode"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - path
        - script_path
        - is_flow
        - kafka_resource_path
        - group_id
        - topics

    EditKafkaTrigger:
      type: object
      properties:
        kafka_resource_path:
          type: string
        group_id:
          type: string
        topics:
          type: array
          items:
            type: string
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - path
        - script_path
        - kafka_resource_path
        - group_id
        - topics
        - is_flow

    NatsTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        nats_resource_path:
          type: string
        use_jetstream:
          type: boolean
        stream_name:
          type: string
        consumer_name:
          type: string
        subjects:
          type: array
          items:
            type: string
        server_id:
          type: string
        last_server_ping:
          type: string
          format: date-time
        error:
          type: string
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - nats_resource_path
        - use_jetstream
        - subjects

    NewNatsTrigger:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        nats_resource_path:
          type: string
        use_jetstream:
          type: boolean
        stream_name:
          type: string
        consumer_name:
          type: string
        subjects:
          type: array
          items:
            type: string
        mode:
          $ref: "#/components/schemas/TriggerMode"
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - path
        - script_path
        - is_flow
        - nats_resource_path
        - use_jetstream
        - subjects

    EditNatsTrigger:
      type: object
      properties:
        nats_resource_path:
          type: string
        use_jetstream:
          type: boolean
        stream_name:
          type: string
        consumer_name:
          type: string
        subjects:
          type: array
          items:
            type: string
        path:
          type: string
        script_path:
          type: string
        is_flow:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - nats_resource_path
        - use_jetstream
        - subjects
        - is_flow

    EmailTrigger:
      allOf:
        - $ref: "#/components/schemas/TriggerExtraProperty"
      type: object
      properties:
        local_part:
          type: string
        workspaced_local_part:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"

      required:
        - local_part

    NewEmailTrigger:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        local_part:
          type: string
        workspaced_local_part:
          type: boolean
        is_flow:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
        mode:
          $ref: "#/components/schemas/TriggerMode"

      required:
        - path
        - script_path
        - local_part
        - is_flow

    EditEmailTrigger:
      type: object
      properties:
        path:
          type: string
        script_path:
          type: string
        local_part:
          type: string
        workspaced_local_part:
          type: boolean
        is_flow:
          type: boolean
        error_handler_path:
          type: string
        error_handler_args:
          $ref: "#/components/schemas/ScriptArgs"
        retry:
          $ref: "../../openflow.openapi.yaml#/components/schemas/Retry"
      required:
        - path
        - script_path
        - is_flow

    Group:
      type: object
      properties:
        name:
          type: string
        summary:
          type: string
        members:
          type: array
          items:
            type: string
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
      required:
        - name

    InstanceGroup:
      type: object
      required:
        - name
      properties:
        name:
          type: string
        summary:
          type: string
        emails:
          type: array
          items:
            type: string

    InstanceGroupWithWorkspaces:
      type: object
      required:
        - name
      properties:
        name:
          type: string
        summary:
          type: string
        emails:
          type: array
          items:
            type: string
        workspaces:
          type: array
          items:
            $ref: "#/components/schemas/WorkspaceInfo"

    WorkspaceInfo:
      type: object
      properties:
        workspace_id:
          type: string
        workspace_name:
          type: string
        role:
          type: string
      required:
        - name

    Folder:
      type: object
      properties:
        name:
          type: string
        owners:
          type: array
          items:
            type: string
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        summary:
          type: string
        created_by:
          type: string
        edited_at:
          type: string
          format: date-time
      required:
        - name
        - owners
        - extra_perms

    WorkerPing:
      type: object
      properties:
        worker:
          type: string
        worker_instance:
          type: string
        last_ping:
          type: number
        started_at:
          type: string
          format: date-time
        ip:
          type: string
        jobs_executed:
          type: integer
        custom_tags:
          type: array
          items:
            type: string
        worker_group:
          type: string
        wm_version:
          type: string
        last_job_id:
          type: string
        last_job_workspace_id:
          type: string
        occupancy_rate:
          type: number
        occupancy_rate_15s:
          type: number
        occupancy_rate_5m:
          type: number
        occupancy_rate_30m:
          type: number
        memory:
          type: number
        vcpus:
          type: number
        memory_usage:
          type: number
        wm_memory_usage:
          type: number
        job_isolation:
          type: string
      required:
        - worker
        - worker_instance
        - ping_at
        - started_at
        - ip
        - jobs_executed
        - worker_group
        - wm_version
    UserWorkspaceList:
      type: object
      properties:
        email:
          type: string
        workspaces:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              name:
                type: string
              username:
                type: string
              color:
                type: string
              operator_settings:
                $ref: "#/components/schemas/OperatorSettings"
              parent_workspace_id:
                type: string
                nullable: true
              created_by:
                type: string
                nullable: true
              disabled:
                type: boolean
            required:
              - id
              - name
              - username
              - color
              - disabled
      required:
        - email
        - workspaces

    CreateWorkspace:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        username:
          type: string
        color:
          type: string
      required:
        - id
        - name

    CreateWorkspaceFork:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        color:
          type: string
      required:
        - id
        - name
        - parent_workspace_id

    Workspace:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        owner:
          type: string
        domain:
          type: string
        color:
          type: string
        parent_workspace_id:
          type: string
          nullable: true
      required:
        - id
        - name
        - owner
        - created_at

    DependencyMap:
      type: object
      properties:
        workspace_id:
          type: string
          nullable: true
        importer_path:
          type: string
          nullable: true
        importer_kind:
          type: string
          nullable: true
        imported_path:
          type: string
          nullable: true
        importer_node_id:
          type: string
          nullable: true

    DependencyDependent:
      type: object
      properties:
        importer_path:
          type: string
        importer_kind:
          type: string
          enum:
            - script
            - flow
            - app
        importer_node_ids:
          type: array
          items:
            type: string
          nullable: true
      required:
        - importer_path
        - importer_kind

    DependentsAmount:
      type: object
      properties:
        imported_path:
          type: string
        count:
          type: integer
          format: int64
      required:
        - imported_path
        - count

    WorkspaceInvite:
      type: object
      properties:
        workspace_id:
          type: string
        email:
          type: string
        is_admin:
          type: boolean
        operator:
          type: boolean
        parent_workspace_id:
          type: string
          nullable: true
      required:
        - workspace_id
        - email
        - is_admin
        - operator

    GlobalUserInfo:
      type: object
      properties:
        email:
          type: string
        login_type:
          type: string
          enum: ["password", "github"]
        super_admin:
          type: boolean
        devops:
          type: boolean
        verified:
          type: boolean
        name:
          type: string
        company:
          type: string
        username:
          type: string
        operator_only:
          type: boolean
        first_time_user:
          type: boolean

      required:
        - email
        - login_type
        - super_admin
        - verified
        - first_time_user

    Flow:
      allOf:
        - $ref: "../../openflow.openapi.yaml#/components/schemas/OpenFlow"
        - $ref: "#/components/schemas/FlowMetadata"
        - type: object
          properties:
            lock_error_logs:
              type: string
            version_id:
              type: number

    ExtraPerms:
      type: object
      additionalProperties:
        type: boolean

    FlowMetadata:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        edited_by:
          type: string
        edited_at:
          type: string
          format: date-time
        archived:
          type: boolean
        extra_perms:
          $ref: "#/components/schemas/ExtraPerms"
        starred:
          type: boolean
        draft_only:
          type: boolean
        tag:
          type: string
        ws_error_handler_muted:
          type: boolean
        priority:
          type: integer
        dedicated_worker:
          type: boolean
        timeout:
          type: number
        visible_to_runner_only:
          type: boolean
        on_behalf_of_email:
          type: string
      required:
        - path
        - edited_by
        - edited_at
        - archived
        - extra_perms

    OpenFlowWPath:
      allOf:
        - $ref: "../../openflow.openapi.yaml#/components/schemas/OpenFlow"
        - type: object
          properties:
            path:
              type: string
            tag:
              type: string
            ws_error_handler_muted:
              type: boolean
            priority:
              type: integer
            dedicated_worker:
              type: boolean
            timeout:
              type: number
            visible_to_runner_only:
              type: boolean
            on_behalf_of_email:
              type: string
          required:
            - path

    FlowPreview:
      type: object
      properties:
        value:
          $ref: "../../openflow.openapi.yaml#/components/schemas/FlowValue"
        path:
          type: string
        args:
          $ref: "#/components/schemas/ScriptArgs"
        tag:
          type: string
        restarted_from:
          $ref: "#/components/schemas/RestartedFrom"

      required:
        - value
        - content
        - args

    RestartedFrom:
      type: object
      properties:
        flow_job_id:
          type: string
          format: uuid
        step_id:
          type: string
        branch_or_iteration_n:
          type: integer
        flow_version:
          type: integer

    Policy:
      type: object
      properties:
        triggerables:
          type: object
          additionalProperties:
            type: object
        triggerables_v2:
          type: object
          additionalProperties:
            type: object
        s3_inputs:
          type: array
          items:
            type: object
        allowed_s3_keys:
          type: array
          items:
            type: object
            properties:
              s3_path:
                type: string
              resource:
                type: string
        execution_mode:
          type: string
          enum: [viewer, publisher, anonymous]
        on_behalf_of:
          type: string
        on_behalf_of_email:
          type: string

    ListableApp:
      type: object
      properties:
        id:
          type: integer
        workspace_id:
          type: string
        path:
          type: string
        summary:
          type: string
        version:
          type: integer
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        starred:
          type: boolean
        edited_at:
          type: string
          format: date-time
        execution_mode:
          type: string
          enum: [viewer, publisher, anonymous]
        raw_app:
          type: boolean
      required:
        - id
        - workspace_id
        - path
        - summary
        - version
        - extra_perms
        - edited_at
        - execution_mode

    ScopeDefinition:
      type: object
      properties:
        value:
          type: string
        label:
          type: string
        description:
          type: string
          nullable: true
        requires_resource_path:
          type: boolean
      required:
        - value
        - label
        - requires_resource_path

    ScopeDomain:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
          nullable: true
        scopes:
          type: array
          items:
            $ref: "#/components/schemas/ScopeDefinition"
      required:
        - name
        - scopes

    ListableRawApp:
      type: object
      properties:
        workspace_id:
          type: string
        path:
          type: string
        summary:
          type: string
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        starred:
          type: boolean
        version:
          type: number
        edited_at:
          type: string
          format: date-time
      required:
        - workspace_id
        - path
        - summary
        - extra_perms
        - version
        - edited_at

    AppWithLastVersion:
      type: object
      properties:
        id:
          type: integer
        workspace_id:
          type: string
        path:
          type: string
        summary:
          type: string
        versions:
          type: array
          items:
            type: integer
        created_by:
          type: string
        created_at:
          type: string
          format: date-time
        value:
          type: object
        policy:
          $ref: "#/components/schemas/Policy"
        execution_mode:
          type: string
          enum: [viewer, publisher, anonymous]
        extra_perms:
          type: object
          additionalProperties:
            type: boolean
        custom_path:
          type: string
        raw_app:
          type: boolean
        bundle_secret:
          type: string
      required:
        - id
        - workspace_id
        - path
        - summary
        - versions
        - created_by
        - created_at
        - value
        - policy
        - execution_mode
        - extra_perms
        - raw_app

    AppWithLastVersionWDraft:
      allOf:
        - $ref: "#/components/schemas/AppWithLastVersion"
        - type: object
          properties:
            draft_only:
              type: boolean
            draft: {}

    AppHistory:
      type: object
      properties:
        version:
          type: integer
        deployment_msg:
          type: string
      required:
        - version

    FlowVersion:
      type: object
      properties:
        id:
          type: integer
        created_at:
          type: string
          format: date-time
        deployment_msg:
          type: string
      required:
        - id
        - created_at

    SlackToken:
      type: object
      properties:
        access_token:
          type: string
        team_id:
          type: string
        team_name:
          type: string
        bot:
          type: object
          properties:
            bot_access_token:
              type: string
      required:
        - access_token
        - team_id
        - team_name
        - bot

    TokenResponse:
      type: object
      properties:
        access_token:
          type: string
        expires_in:
          type: integer
        refresh_token:
          type: string
        scope:
          type: array
          items:
            type: string
        grant_type:
          type: string

      required:
        - access_token

    HubScriptKind:
      type: string
      enum: [script, failure, trigger, approval]

    PolarsClientKwargs:
      type: object
      properties:
        region_name:
          type: string
      required:
        - region_name

    LargeFileStorage:
      type: object
      properties:
        type:
          type: string
          enum:
            [
              "S3Storage",
              "AzureBlobStorage",
              "AzureWorkloadIdentity",
              "S3AwsOidc",
              "GoogleCloudStorage",
            ]
        s3_resource_path:
          type: string
        azure_blob_resource_path:
          type: string
        gcs_resource_path:
          type: string
        public_resource:
          type: boolean
        advanced_permissions:
          type: array
          items:
            $ref: "#/components/schemas/S3PermissionRule"
        secondary_storage:
          type: object
          additionalProperties:
            type: object
            properties:
              type:
                type: string
                enum:
                  [
                    "S3Storage",
                    "AzureBlobStorage",
                    "AzureWorkloadIdentity",
                    "S3AwsOidc",
                    "GoogleCloudStorage",
                  ]
              s3_resource_path:
                type: string
              azure_blob_resource_path:
                type: string
              gcs_resource_path:
                type: string
              public_resource:
                type: boolean

    DucklakeSettings:
      type: object
      required: [ducklakes]
      properties:
        ducklakes:
          type: object
          additionalProperties:
            type: object
            required: [catalog, storage]
            properties:
              catalog:
                type: object
                properties:
                  resource_type:
                    type: string
                    enum:
                      - postgresql
                      - mysql
                      - instance
                  resource_path:
                    type: string
                required:
                  - resource_type
              storage:
                type: object
                properties:
                  storage:
                    type: string
                  path:
                    type: string
                required:
                  - path
              extra_args:
                type: string

    DataTableSettings:
      type: object
      required: [datatables]
      properties:
        datatables:
          type: object
          additionalProperties:
            type: object
            required: [database]
            properties:
              database:
                type: object
                properties:
                  resource_type:
                    type: string
                    enum:
                      - postgresql
                      - instance
                  resource_path:
                    type: string
                required:
                  - resource_type

    DataTableSchema:
      type: object
      required: [datatable_name, schemas]
      properties:
        datatable_name:
          type: string
        schemas:
          type: object
          description: "Hierarchical schema: schema_name -> table_name -> column_name -> compact_type (e.g. 'int4', 'text?', 'int4?=0')"
          additionalProperties:
            type: object
            description: "Tables in this schema"
            additionalProperties:
              type: object
              description: "Columns in this table"
              additionalProperties:
                type: string
                description: "Compact type: 'type[?][=default]' where ? means nullable"
        error:
          type: string

    DynamicInputData:
      type: object
      properties:
        entrypoint_function:
          type: string
          description: Name of the function to execute for dynamic select
        args:
          type: object
          description: Arguments to pass to the function
        runnable_ref:
          type: object
          oneOf:
            - type: object
              properties:
                source:
                  type: string
                  enum: [deployed]
                path:
                  type: string
                  description: Path to the deployed script or flow
                runnable_kind:
                  $ref: "#/components/schemas/RunnableKind"
              required:
                - source
                - path
                - runnable_kind
            - type: object
              properties:
                source:
                  type: string
                  enum: [inline]
                code:
                  type: string
                  description: Code content for inline execution
                language:
                  $ref: "#/components/schemas/ScriptLang"
              required:
                - source
                - code
      required:
        - entrypoint_function
        - runnable_ref

    WindmillLargeFile:
      type: object
      properties:
        s3:
          type: string
      required:
        - s3

    WindmillFileMetadata:
      type: object
      properties:
        mime_type:
          type: string
        size_in_bytes:
          type: integer
        last_modified:
          type: string
          format: date-time
        expires:
          type: string
          format: date-time
        version_id:
          type: string

    WindmillFilePreview:
      type: object
      properties:
        msg:
          type: string
        content:
          type: string
        content_type:
          type: string
          enum: ["RawText", "Csv", "Parquet", "Unknown"]
      required:
        - content_type

    S3Resource:
      type: object
      properties:
        bucket:
          type: string
        region:
          type: string
        endPoint:
          type: string
        useSSL:
          type: boolean
        accessKey:
          type: string
        secretKey:
          type: string
        pathStyle:
          type: boolean
      required:
        - bucket
        - region
        - endPoint
        - useSSL
        - pathStyle

    WorkspaceGitSyncSettings:
      type: object
      properties:
        repositories:
          type: array
          items:
            $ref: "#/components/schemas/GitRepositorySettings"

    WorkspaceDeployUISettings:
      type: object
      properties:
        include_path:
          type: array
          items:
            type: string
        include_type:
          type: array
          items:
            $ref: "#/components/schemas/GitSyncObjectType"

    WorkspaceDefaultScripts:
      type: object
      properties:
        order:
          type: array
          items:
            type: string
        hidden:
          type: array
          items:
            type: string
        default_script_content:
          additionalProperties:
            type: string

    S3PermissionRule:
      type: object
      properties:
        pattern:
          type: string
        allow:
          type: string # comma separated permissions : "read,write,delete,list"
      required: ["pattern", "allow"]

    GitRepositorySettings:
      type: object
      properties:
        script_path:
          type: string
        git_repo_resource_path:
          type: string
        use_individual_branch:
          type: boolean
        group_by_folder:
          type: boolean
        collapsed:
          type: boolean
        settings:
          type: object
          properties:
            include_path:
              type: array
              items:
                type: string
            include_type:
              type: array
              items:
                $ref: "#/components/schemas/GitSyncObjectType"
            exclude_path:
              type: array
              items:
                type: string
            extra_include_path:
              type: array
              items:
                type: string
        exclude_types_override:
          type: array
          items:
            $ref: "#/components/schemas/GitSyncObjectType"
      required:
        - script_path
        - git_repo_resource_path

    MetricMetadata:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id

    ScalarMetric:
      type: object
      properties:
        metric_id:
          type: string
        value:
          type: number
      required:
        - id
        - value

    TimeseriesMetric:
      type: object
      properties:
        metric_id:
          type: string
        values:
          type: array
          items:
            $ref: "#/components/schemas/MetricDataPoint"
      required:
        - id
        - values

    MetricDataPoint:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
        value:
          type: number
      required:
        - timestamp
        - value

    RawScriptForDependencies:
      type: object
      properties:
        raw_code:
          type: string
        path:
          type: string
        language:
          $ref: "#/components/schemas/ScriptLang"
      required:
        - raw_code
        - path
        - language

    ConcurrencyGroup:
      type: object
      properties:
        concurrency_key:
          type: string
        total_running:
          type: number
      required:
        - concurrency_key
        - total_running

    ExtendedJobs:
      type: object
      properties:
        jobs:
          type: array
          items:
            $ref: "#/components/schemas/Job"
        obscured_jobs:
          type: array
          items:
            $ref: "#/components/schemas/ObscuredJob"
        omitted_obscured_jobs:
          description: "Obscured jobs omitted for security because of too specific filtering"
          type: boolean
      required:
        - jobs
        - obscured_jobs

    ExportedUser:
      type: object
      properties:
        email:
          type: string
        password_hash:
          type: string
        super_admin:
          type: boolean
        verified:
          type: boolean
        name:
          type: string
        company:
          type: string
        first_time_user:
          type: boolean
        username:
          type: string
      required:
        - email
        - super_admin
        - verified
        - first_time_user

    GlobalSetting:
      type: object
      properties:
        name:
          type: string
        value:
          type: object
      required:
        - name
        - value

    Config:
      type: object
      properties:
        name:
          type: string
        config:
          type: object
      required:
        - name

    ExportedInstanceGroup:
      type: object
      properties:
        name:
          type: string
        summary:
          type: string
        emails:
          type: array
          items:
            type: string
        id:
          type: string
        scim_display_name:
          type: string
        external_id:
          type: string
      required:
        - name

    JobSearchHit:
      type: object
      properties:
        dancer:
          type: string

    LogSearchHit:
      type: object
      properties:
        dancer:
          type: string

    AutoscalingEvent:
      type: object
      properties:
        id:
          type: integer
          format: int64
        worker_group:
          type: string
        event_type:
          type: string
        desired_workers:
          type: integer
        reason:
          type: string
        applied_at:
          type: string
          format: date-time

    CriticalAlert:
      type: object
      properties:
        id:
          type: integer
          description: Unique identifier for the alert
        alert_type:
          type: string
          description: Type of alert (e.g., critical_error)
        message:
          type: string
          description: The message content of the alert
        created_at:
          type: string
          format: date-time
          description: Time when the alert was created
        acknowledged:
          type: boolean
          nullable: true
          description: Acknowledgment status of the alert, can be true, false, or null if not set
        workspace_id:
          type: string
          nullable: true
          description: Workspace id if the alert is in the scope of a workspace

    CaptureTriggerKind:
      type: string
      enum:
        [
          webhook,
          http,
          websocket,
          kafka,
          default_email,
          nats,
          postgres,
          sqs,
          mqtt,
          gcp,
          email,
        ]

    Capture:
      type: object
      properties:
        trigger_kind:
          $ref: "#/components/schemas/CaptureTriggerKind"
        main_args: {}
        preprocessor_args: {}
        id:
          type: integer
        created_at:
          type: string
          format: date-time
      required:
        - trigger_kind
        - main_args
        - preprocessor_args
        - id
        - created_at
    CaptureConfig:
      type: object
      properties:
        trigger_config: {}
        trigger_kind:
          $ref: "#/components/schemas/CaptureTriggerKind"
        error:
          type: string
        last_server_ping:
          type: string
          format: date-time
      required:
        - trigger_kind

    OperatorSettings:
      nullable: true
      type: object
      required:
        - runs
        - schedules
        - resources
        - assets
        - variables
        - triggers
        - audit_logs
        - groups
        - folders
        - workers
      properties:
        runs:
          type: boolean
          description: Whether operators can view runs
        schedules:
          type: boolean
          description: Whether operators can view schedules
        resources:
          type: boolean
          description: Whether operators can view resources
        variables:
          type: boolean
          description: Whether operators can view variables
        assets:
          type: boolean
          description: Whether operators can view assets
        audit_logs:
          type: boolean
          description: Whether operators can view audit logs
        triggers:
          type: boolean
          description: Whether operators can view triggers
        groups:
          type: boolean
          description: Whether operators can view groups page
        folders:
          type: boolean
          description: Whether operators can view folders page
        workers:
          type: boolean
          description: Whether operators can view workers page

    WorkspaceComparison:
      type: object
      required:
        - all_ahead_items_visible
        - all_behind_items_visible
        - skipped_comparison
        - diffs
        - summary
      properties:
        all_ahead_items_visible:
          type: boolean
          description: All items with changes ahead are visible by the user of the request.
        all_behind_items_visible:
          type: boolean
          description: All items with changes behind are visible by the user of the request.
        skipped_comparison:
          type: boolean
          description: Whether the comparison was skipped. This happens with old forks that where not being kept track of
        diffs:
          type: array
          description: List of differences found between workspaces
          items:
            $ref: "#/components/schemas/WorkspaceItemDiff"
        summary:
          $ref: "#/components/schemas/CompareSummary"
          description: Summary statistics of the comparison

    WorkspaceItemDiff:
      type: object
      required:
        - kind
        - path
        - ahead
        - behind
        - has_changes
        - exists_in_source
        - exists_in_fork
      properties:
        kind:
          type: string
          enum: ["script", "flow", "app", "resource", "variable"]
          description: Type of the item
        path:
          type: string
          description: Path of the item in the workspace
        ahead:
          type: integer
          description: Number of versions source is ahead of target
        behind:
          type: integer
          description: Number of versions source is behind target
        has_changes:
          type: boolean
          description: Whether the item has any differences
        exists_in_source:
          type: boolean
          description: If the item exists in the source workspace
        exists_in_fork:
          type: boolean
          description: If the item exists in the fork workspace

    CompareSummary:
      type: object
      required:
        - total_diffs
        - total_ahead
        - total_behind
        - scripts_changed
        - flows_changed
        - apps_changed
        - resources_changed
        - variables_changed
        - conflicts
      properties:
        total_diffs:
          type: integer
          description: Total number of items with differences
        total_ahead:
          type: integer
          description: Total number of ahead changes
        total_behind:
          type: integer
          description: Total number of behind changes
        scripts_changed:
          type: integer
          description: Number of scripts with differences
        flows_changed:
          type: integer
          description: Number of flows with differences
        apps_changed:
          type: integer
          description: Number of apps with differences
        resources_changed:
          type: integer
          description: Number of resources with differences
        variables_changed:
          type: integer
          description: Number of variables with differences
        conflicts:
          type: integer
          description: Number of items that are both ahead and behind (conflicts)

    TeamInfo:
      type: object
      required:
        - team_id
        - team_name
        - channels
      properties:
        team_id:
          type: string
          description: The unique identifier of the Microsoft Teams team
          example: "19:abc123def456@thread.tacv2"
        team_name:
          type: string
          description: The display name of the Microsoft Teams team
          example: "Engineering Team"
        channels:
          type: array
          description: List of channels within the team
          items:
            $ref: "#/components/schemas/ChannelInfo"

    ChannelInfo:
      type: object
      required:
        - channel_id
        - channel_name
        - tenant_id
        - service_url
      properties:
        channel_id:
          type: string
          description: The unique identifier of the channel
          example: "19:channel123@thread.tacv2"
        channel_name:
          type: string
          description: The display name of the channel
          example: "General"
        tenant_id:
          type: string
          description: The Microsoft Teams tenant identifier
          example: "12345678-1234-1234-1234-123456789012"
        service_url:
          type: string
          description: The service URL for the channel
          example: "https://smba.trafficmanager.net/amer/12345678-1234-1234-1234-123456789012/"

    GithubInstallations:
      type: array
      items:
        type: object
        properties:
          workspace_id:
            type: string
          installation_id:
            type: number
          account_id:
            type: string
          repositories:
            type: array
            items:
              type: object
              properties:
                name:
                  type: string
                url:
                  type: string
              required:
                - name
                - url
          total_count:
            type: number
            description: Total number of repositories available for this installation
          per_page:
            type: number
            description: Number of repositories loaded per page
          error:
            type: string
            description: Error message if token retrieval failed
        required:
          - installation_id
          - account_id
          - repositories
          - total_count
          - per_page

    WorkspaceGithubInstallation:
      type: object
      properties:
        account_id:
          type: string
        installation_id:
          type: number
      required:
        - account_id
        - installation_id

    S3Object:
      type: object
      properties:
        s3:
          type: string
        filename:
          type: string
        storage:
          type: string
        presigned:
          type: string
      required:
        - s3
    TeamsChannel:
      type: object
      required:
        - team_id
        - team_name
        - channel_id
        - channel_name
      properties:
        team_id:
          type: string
          description: Microsoft Teams team ID
          minLength: 1
        team_name:
          type: string
          description: Microsoft Teams team name
          minLength: 1
        channel_id:
          type: string
          description: Microsoft Teams channel ID
          minLength: 1
        channel_name:
          type: string
          description: Microsoft Teams channel name
          minLength: 1
    AssetUsageKind:
      type: string
      enum:
        - script
        - flow
    AssetUsageAccessType:
      type: string
      enum:
        - r
        - w
        - rw
    AssetKind:
      type: string
      enum:
        - s3object
        - resource
        - ducklake
        - datatable
    Asset:
      type: object
      properties:
        path:
          type: string
        kind:
          $ref: "#/components/schemas/AssetKind"
      required: [path, kind]

    NativeServiceName:
      type: string
      enum:
        - nextcloud

    NativeTrigger:
      type: object
      description: A native trigger stored in Windmill
      properties:
        external_id:
          type: string
          description: The unique identifier from the external service
        workspace_id:
          type: string
          description: The workspace this trigger belongs to
        service_name:
          $ref: "#/components/schemas/NativeServiceName"
        script_path:
          type: string
          description: The path to the script or flow that will be triggered
        is_flow:
          type: boolean
          description: Whether the trigger targets a flow (true) or a script (false)
        service_config:
          type: object
          description: Configuration for the trigger including event_type and service_config
          additionalProperties: true
        error:
          type: string
          nullable: true
          description: Error message if the trigger is in an error state
      required:
        - external_id
        - workspace_id
        - service_name
        - script_path
        - is_flow
        - service_config

    NativeTriggerWithExternal:
      type: object
      description: Full trigger response containing both Windmill data and external service data
      properties:
        external_id:
          type: string
          description: The unique identifier from the external service
        workspace_id:
          type: string
          description: The workspace this trigger belongs to
        service_name:
          $ref: "#/components/schemas/NativeServiceName"
        script_path:
          type: string
          description: The path to the script or flow that will be triggered
        is_flow:
          type: boolean
          description: Whether the trigger targets a flow (true) or a script (false)
        service_config:
          type: object
          description: Configuration for the trigger including event_type and service_config
          additionalProperties: true
        error:
          type: string
          nullable: true
          description: Error message if the trigger is in an error state
        external_data:
          type: object
          description: Configuration data from the external service
          additionalProperties: true
      required:
        - external_id
        - workspace_id
        - service_name
        - script_path
        - is_flow
        - service_config
        - external_data

    WorkspaceIntegrations:
      type: object
      properties:
        service_name:
          $ref: '#/components/schemas/NativeServiceName'
        oauth_data:
          nullable: true
          $ref: '#/components/schemas/WorkspaceOAuthConfig'
      required:
        - service_name


    WorkspaceOAuthConfig:
      type: object
      properties:
        client_id:
          type: string
          description: The OAuth client ID for the workspace
        client_secret:
          type: string
          description: The OAuth client secret for the workspace
        base_url:
          type: string
          format: uri
          description: The base URL of the workspace
        redirect_uri:
          type: string
          format: uri
          description: The OAuth redirect URI
      required:
        - client_id
        - client_secret
        - base_url
        - redirect_uri

    WebhookEvent:
      type: object
      properties:
        type:
          type: string
          enum: [webhook]
        request_type:
          $ref: '#/components/schemas/WebhookRequestType'
      required:
        - type
        - request_type

    WebhookRequestType:
      type: string
      description: The type of webhook request (define possible values here)
      enum:
        - async
        - sync

    RedirectUri:
      type: object
      properties:
        redirect_uri:
          type:
            string
      required:
        - redirect_uri


    NativeTriggerData:
      type: object
      description: Data for creating or updating a native trigger
      properties:
        script_path:
          type: string
          description: The path to the script or flow that will be triggered
        is_flow:
          type: boolean
          description: Whether the trigger targets a flow (true) or a script (false)
        service_config:
          type: object
          description: Service-specific configuration (e.g., event types, filters)
          additionalProperties: true
      required:
        - script_path
        - is_flow
        - service_config

    CreateTriggerResponse:
      type: object
      description: Response returned when a native trigger is created
      properties:
        external_id:
          type: string
          description: The external ID of the created trigger from the external service
      required:
        - external_id

    SyncResult:
      type: object
      properties:
        already_in_sync:
          type: boolean
        added_count:
          type: integer
        added_triggers:
          type: array
          items:
            type: string
        total_external:
          type: integer
        total_windmill:
          type: integer
      required:
        - already_in_sync
        - added_count
        - added_triggers
        - total_external
        - total_windmill

    NextCloudEventType:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        category:
          type: string
        path:
          type: string
      required:
        - id
        - name
        - path