---
openapi: 3.0.3
info:
  title: Data Quality Collibra API
  version: 1.3.0
  x-audience: public
  description: |
    Public REST API for Data Quality
servers:
- description: Data Quality API
  url: /rest/dq/1.0
security:
- basicAuth: []
- jwtAuth: []
tags:
- name: Jobs
- name: Job Runs
- name: Data Egress
  description: "Bulk extraction of DQ data — jobs, monitors, and rules joined across\
    \ topics and streamed (NDJSON or CSV) in a single pass for BI tools, data pipelines,\
    \ and integrations."
- name: Monitor Results
- name: Settings
  description: Global DQ settings
paths:
  /jobs:
    get:
      tags:
      - Jobs
      summary: Search jobs
      description: |-
        Returns only jobs that user has permission to view. Results are sorted by last updated timestamp in descending order.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_VIEW`
        - **Global bypass:**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: searchJobs
      parameters:
      - in: query
        name: jobName
        required: false
        description: |
          Fuzzy, case-insensitive name filter. Uses SQL `LIKE` semantics: `%jobName%` Blank or omitted returns all jobs
        schema:
          type: string
          maxLength: 255
          default: ""
        example: public.nyse
      - in: query
        name: edgeSiteName
        required: false
        description: Edge Site Name
        schema:
          type: string
          maxLength: 255
        example: k8s-edge-site-1
      - in: query
        name: edgeConnectionName
        required: false
        description: Edge connection name
        schema:
          type: string
          maxLength: 255
        example: Finance-Postgres-GCP
      - in: query
        name: dataSourceName
        required: false
        description: Data source (database/catalog) name
        schema:
          type: string
          maxLength: 255
        example: postgres
      - in: query
        name: schemaName
        required: false
        description: Filter by schema name
        schema:
          type: string
          maxLength: 255
        example: public
      - in: query
        name: tableName
        required: false
        description: Filter by table or view name
        schema:
          type: string
          maxLength: 255
        example: nyse
      - in: query
        name: jobType
        required: false
        description: |
          Filter by a job type. If omitted, both job types are returned
        schema:
          $ref: "#/components/schemas/JobType"
        example: PUSHDOWN
      - in: query
        name: limit
        required: false
        description: Number of results per page
        schema:
          type: integer
          minimum: 0
          maximum: 500
          default: 100
        example: 100
      - in: query
        name: offset
        required: false
        description: Result offset
        schema:
          type: integer
          minimum: 0
          default: 0
        example: 0
      responses:
        "200":
          description: Successfully retrieved jobs
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobDefinitionPaginated"
              examples:
                page 1:
                  value:
                    results:
                    - jobName: public.nyse
                      jobType: PUSHDOWN
                      sourceQuery: "SELECT * FROM PUBLIC.NYSE WHERE \"TRADE_DATE\"\
                        \ >= '${rd}' AND \"TRADE_DATE\" < '${rdEnd}'"
                      runDate:
                        kind: TIMESTAMP
                        value: 2025-10-22T13:00:00Z
                      runDateEnd:
                        kind: TIMESTAMP
                        value: 2025-10-23T13:00:00Z
                      dataLocation:
                        edgeSiteName: US-East-1-Prod-Edge
                        edgeConnectionName: Finance-Snowflake-US
                        dataSourceName: PRODSALESDB
                        schemaName: PUBLIC
                        tableName: NYSE
                      jobSettings:
                        dateFormat: TIMESTAMP
                        pushdownSettings:
                          connections: 10
                          threads: 2
                      monitoringSettings:
                        adaptiveMonitors:
                          descriptiveStatistics: true
                          emptyFields: true
                          executionTime: true
                          max: true
                          mean: true
                          min: true
                          nullValues: true
                          rowCount: false
                          uniqueness: true
                          settings:
                            dataLookBack: 10
                            learningPhase: 4
                        customMonitors:
                        - monitorName: NAME_IS_NOT_NULL
                          customQuery: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE
                            NAME IS NULL
                          filterQuery: WHERE STATUS = 'ACTIVE'
                          primaryColumn: NAME
                          description: Checks that the NAME column contains no null
                            values
                          dimensions:
                          - COMPLETENESS
                          notifications:
                          - notificationType: BREAKING
                            enabled: true
                            message: NAME column contains null values
                            channels:
                            - channel: EMAIL
                              recipients:
                              - user1
                              - user2
                            name: BREAKING_0cc3ed7f-a34f-4bb6-a75e-a17187302999
                          tolerance: 5
                          isActive: true
                          isSuppressed: false
                      notifications:
                        globalMessage: ""
                        useIndividualMessages: false
                        channels:
                        - channel: EMAIL
                          recipients:
                          - jsmith
                          - adoe
                        notificationOptions:
                        - notificationType: JOB_FAILED
                          enabled: true
                          message: ""
                        - notificationType: RUNS_WITHOUT_DATA
                          enabled: true
                          message: ""
                          quantity: 1
                      schedulingSettings:
                        isActive: true
                        scheduledRunTime: 04:00:00
                        schedulerMode: DAILY
                        daily:
                          dailyOffset: SCHEDULED
                          daysOfWeek:
                          - MONDAY
                          - TUESDAY
                          - WEDNESDAY
                          - THURSDAY
                          - FRIDAY
                    - jobName: sales.daily_orders
                      jobType: PUSHDOWN
                      sourceQuery: "SELECT * FROM SALES.DAILY_ORDERS WHERE order_date\
                        \ >= '${rd}' AND order_date < '${rdEnd}'"
                      runDate:
                        kind: TIMESTAMP
                        value: 2025-10-22T13:00:00Z
                      runDateEnd:
                        kind: TIMESTAMP
                        value: 2025-10-23T13:00:00Z
                      dataLocation:
                        edgeSiteName: EU-West-1-Edge
                        edgeConnectionName: Finance-Postgres-EU
                        dataSourceName: SALESDB
                        schemaName: SALES
                        tableName: DAILY_ORDERS
                      jobSettings:
                        dateFormat: DATE
                        pushdownSettings:
                          connections: 5
                          threads: 1
                      monitoringSettings:
                        adaptiveMonitors:
                          descriptiveStatistics: true
                          emptyFields: true
                          executionTime: false
                          max: true
                          mean: false
                          min: true
                          nullValues: true
                          rowCount: true
                          uniqueness: true
                          settings:
                            dataLookBack: 7
                            learningPhase: 3
                      notifications:
                        globalMessage: Notify on failure or empty results
                        useIndividualMessages: false
                        channels:
                        - channel: EMAIL
                          recipients:
                          - dba-team
                        notificationOptions:
                        - notificationType: JOB_FAILED
                          enabled: true
                          message: "Job failed for ${jobName}"
                        - notificationType: RUNS_WITHOUT_DATA
                          enabled: true
                          message: "No data for ${jobName}"
                          quantity: 3
                      schedulingSettings:
                        isActive: true
                        scheduledRunTime: 01:00:00
                        schedulerMode: DAILY
                        daily:
                          dailyOffset: SCHEDULED
                          daysOfWeek:
                          - MONDAY
                          - TUESDAY
                          - WEDNESDAY
                          - THURSDAY
                          - FRIDAY
                          - SATURDAY
                    total: 2
                    offset: 0
                    limit: 100
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
    post:
      tags:
      - Jobs
      summary: Create and optionally run a job
      description: |-
        Creates a job and immediately queues a run.
        This endpoint is asynchronous: it returns a run receipt with identifiers

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_CREATE`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: createJob
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/JobDefinitionCreateRequest"
            examples:
              Minimal - System fills sensible defaults:
                value:
                  jobType: PUSHDOWN
                  dataLocation:
                    edgeSiteName: US-East-1-Prod-Edge
                    edgeConnectionName: Finance-Snowflake-US
                    dataSourceName: PRODSALESDB
                    schemaName: PUBLIC
                    tableName: NYSE
              Create Pushdown Job:
                value:
                  queueRun: true
                  jobName: PUBLIC.NYSE
                  jobType: PUSHDOWN
                  sourceQuery: SELECT * FROM PUBLIC.NYSE
                  runDate:
                    kind: TIMESTAMP
                    value: 2025-10-22T13:00:00Z
                  dataLocation:
                    edgeSiteName: US-East-1-Prod-Edge
                    edgeConnectionName: Finance-Snowflake-US
                    dataSourceName: PRODSALESDB
                    schemaName: PUBLIC
                    tableName: NYSE
                  jobSettings:
                    dateFormat: TIMESTAMP
                    pushdownSettings:
                      connections: 10
                      threads: 2
                  monitoringSettings:
                    adaptiveMonitors:
                      descriptiveStatistics: true
                      emptyFields: true
                      executionTime: true
                      max: true
                      mean: true
                      min: true
                      nullValues: true
                      rowCount: false
                      uniqueness: true
                      settings:
                        dataLookBack: 10
                        learningPhase: 4
                    customMonitors:
                    - monitorName: NAME_IS_NOT_NULL
                      customQuery: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE NAME
                        IS NULL
                      filterQuery: WHERE STATUS = 'ACTIVE'
                      primaryColumn: NAME
                      description: Checks that the NAME column contains no null values
                      dimensions:
                      - COMPLETENESS
                      notifications:
                      - notificationType: BREAKING
                        enabled: true
                        message: NAME column contains null values
                        channels:
                        - channel: EMAIL
                          recipients:
                          - user1
                          - user2
                        name: BREAKING_0cc3ed7f-a34f-4bb6-a75e-a17187302999
                      tolerance: 5
                      isActive: true
                      isSuppressed: false
                  notifications:
                    globalMessage: Job alert
                    useIndividualMessages: false
                    channels:
                    - channel: EMAIL
                      recipients:
                      - jsmith
                      - adoe
                    notificationOptions:
                    - notificationType: JOB_FAILED
                      enabled: true
                      message: ""
                    - notificationType: ROWS_LESS_THAN_LIMIT
                      enabled: true
                      message: ""
                      quantity: 0
                    - notificationType: SCORE_LESS_THAN_LIMIT
                      enabled: true
                      message: ""
                      quantity: 75
                  schedulingSettings:
                    isActive: true
                    scheduledRunTime: 23:00:00
                    schedulerMode: DAILY
                    daily:
                      dailyOffset: SCHEDULED
                      daysOfWeek:
                      - MONDAY
                      - TUESDAY
                      - WEDNESDAY
                      - THURSDAY
                      - FRIDAY
              Create Pullup Job (if pullup preview enabled):
                value:
                  queueRun: true
                  jobName: public.nyse
                  jobType: PULLUP
                  sourceQuery: "SELECT * FROM \"public\".\"nyse\" WHERE \"trade_date\"\
                    \ >= '${rd}' AND \"trade_date\" < '${rdEnd}'"
                  runDate:
                    kind: TIMESTAMP
                    value: 2025-10-22T13:00:00Z
                  runDateEnd:
                    kind: TIMESTAMP
                    value: 2025-10-23T13:00:00Z
                  dataLocation:
                    edgeSiteName: US-East-1-Prod-Edge
                    edgeConnectionName: Finance-Postgres-GCP
                    dataSourceName: postgres
                    schemaName: public
                    tableName: nyse
                  backrun:
                    timeBin: DAY
                    binValue: 10
                  jobSettings:
                    dateFormat: TIMESTAMP
                    pullupSettings:
                      loadOptions:
                        numPartitions: 10
                        parallelJdbcOptions:
                          mode: MANUAL
                          partitionColumn: quantity
                          partitionNumber: 4
                      sparkJobSizing:
                        numExecutors: 3
                        driverCores: 1
                        numExecutorCores: 2
                        executorMemoryGb: 2
                        driverMemoryGb: 4
                        memoryOverheadGb: 2
                      sparkSqlProperties:
                        spark.sql.shuffle.partitions: 120
                        spark.sql.ui.retainedExecutions: 900
                  monitoringSettings:
                    adaptiveMonitors:
                      descriptiveStatistics: true
                      emptyFields: true
                      executionTime: true
                      max: true
                      mean: true
                      min: true
                      nullValues: true
                      rowCount: false
                      uniqueness: true
                      settings:
                        dataLookBack: 10
                        learningPhase: 4
                    customMonitors:
                    - monitorName: NAME_IS_NOT_NULL
                      customQuery: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE NAME
                        IS NULL
                      filterQuery: WHERE STATUS = 'ACTIVE'
                      primaryColumn: NAME
                      description: Checks that the NAME column contains no null values
                      dimensions:
                      - COMPLETENESS
                      notifications:
                      - notificationType: BREAKING
                        enabled: true
                        message: NAME column contains null values
                        channels:
                        - channel: EMAIL
                          recipients:
                          - user1
                          - user2
                        name: BREAKING_0cc3ed7f-a34f-4bb6-a75e-a17187302999
                      tolerance: 5
                      isActive: true
                      isSuppressed: false
                  notifications:
                    globalMessage: Job update status
                    useIndividualMessages: false
                    channels:
                    - channel: EMAIL
                      recipients:
                      - jsmith
                    notificationOptions:
                    - notificationType: JOB_FAILED
                      enabled: true
                      message: Job failed
                    - notificationType: SCORE_LESS_THAN_LIMIT
                      enabled: true
                      message: ""
                      quantity: 75
                  schedulingSettings:
                    isActive: true
                    scheduledRunTime: 14:10:00
                    schedulerMode: MONTHLY
                    monthly:
                      monthlyRepeat: FIRST
                      monthlyOffset: SCHEDULED
      responses:
        "201":
          description: Job created and run queued.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobDefinitionCreateResponse"
              examples:
                createdAndQueued:
                  value:
                    jobRunId: 9c1d1e3a-2b4f-4a6c-8d90-111213141516
                    jobName: public.nyse
                    jobType: PUSHDOWN
                    sourceQuery: "SELECT * FROM PUBLIC.NYSE WHERE \"TRADE_DATE\" >=\
                      \ '${rd}' AND \"TRADE_DATE\" < '${rdEnd}'"
                    runDate:
                      kind: TIMESTAMP
                      value: 2025-10-22T13:00:00Z
                    runDateEnd:
                      kind: TIMESTAMP
                      value: 2025-10-23T13:00:00Z
                    dataLocation:
                      edgeSiteName: US-East-1-Prod-Edge
                      edgeConnectionName: Finance-Snowflake-US
                      dataSourceName: PRODSALESDB
                      schemaName: PUBLIC
                      tableName: NYSE
                    jobSettings:
                      dateFormat: TIMESTAMP
                      pushdownSettings:
                        connections: 10
                        threads: 2
                    monitoringSettings:
                      adaptiveMonitors:
                        descriptiveStatistics: true
                        emptyFields: true
                        executionTime: true
                        max: true
                        mean: true
                        min: true
                        nullValues: true
                        rowCount: false
                        uniqueness: true
                        settings:
                          dataLookBack: 10
                          learningPhase: 4
                      customMonitors:
                      - monitorName: NAME_IS_NOT_NULL
                        customQuery: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE NAME
                          IS NULL
                        filterQuery: WHERE STATUS = 'ACTIVE'
                        primaryColumn: NAME
                        description: Checks that the NAME column contains no null
                          values
                        dimensions:
                        - COMPLETENESS
                        notifications:
                        - notificationType: BREAKING
                          enabled: true
                          message: NAME column contains null values
                          channels:
                          - channel: EMAIL
                            recipients:
                            - user1
                            - user2
                          name: BREAKING_0cc3ed7f-a34f-4bb6-a75e-a17187302999
                        tolerance: 5
                        isActive: true
                        isSuppressed: false
                    notifications:
                      globalMessage: ""
                      useIndividualMessages: false
                      channels:
                      - channel: EMAIL
                        recipients:
                        - jsmith
                        - adoe
                      notificationOptions:
                      - notificationType: JOB_FAILED
                        enabled: true
                        message: ""
                      - notificationType: RUNS_WITHOUT_DATA
                        enabled: true
                        message: ""
                        quantity: 1
                    schedulingSettings:
                      isActive: true
                      scheduledRunTime: 04:00:00
                      schedulerMode: DAILY
                      daily:
                        dailyOffset: SCHEDULED
                        daysOfWeek:
                        - MONDAY
                        - TUESDAY
                        - WEDNESDAY
                        - THURSDAY
                        - FRIDAY
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /jobs/{jobName}:
    patch:
      tags:
      - Jobs
      summary: Update job
      description: |-
        Update existing job definition.
        Include only the fields you wish to update, omitted fields will remain unchanged.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_EDIT`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: updateJob
      parameters:
      - $ref: "#/components/parameters/JobNamePath"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/JobDefinitionUpdateRequest"
            examples:
              Update pushdown job:
                summary: "Adjust pushdown settings, tweak monitoring settings & daily\
                  \ schedule"
                value:
                  jobName: public.nyse_monthly
                  sourceQuery: SELECT * FROM PUBLIC.NYSE
                  runDate:
                    kind: TIMESTAMP
                    value: 2025-10-22T13:00:00Z
                  dataLocation:
                    edgeSiteName: US-East-1-Prod-Edge
                    edgeConnectionName: Finance-Snowflake-US
                    dataSourceName: PRODSALESDB
                    schemaName: PUBLIC
                    tableName: NYSE
                  jobSettings:
                    dateFormat: TIMESTAMP
                    pushdownSettings:
                      connections: 12
                      threads: 3
                  monitoringSettings:
                    adaptiveMonitors:
                      rowCount: true
                      nullValues: true
                      uniqueness: true
                      descriptiveStatistics: false
                      settings:
                        dataLookBack: 14
                        learningPhase: 4
                    customMonitors:
                    - monitorName: NAME_IS_NOT_NULL
                      customQuery: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE NAME
                        IS NULL
                      filterQuery: WHERE STATUS = 'ACTIVE'
                      primaryColumn: NAME
                      description: Checks that the NAME column contains no null values
                      dimensions:
                      - COMPLETENESS
                      notifications:
                      - notificationType: BREAKING
                        enabled: true
                        message: NAME column contains null values
                        channels:
                        - channel: EMAIL
                          recipients:
                          - user1
                          - user2
                        name: BREAKING_0cc3ed7f-a34f-4bb6-a75e-a17187302999
                      tolerance: 5
                      isActive: true
                      isSuppressed: false
                      opIndicator: UPDATE
                  notifications:
                    globalMessage: DQ job alert
                    useIndividualMessages: false
                    channels:
                    - channel: EMAIL
                      recipients:
                      - jsmith
                      - adoe
                    notificationOptions:
                    - notificationType: JOB_FAILED
                      enabled: true
                      message: ""
                    - notificationType: SCORE_LESS_THAN_LIMIT
                      enabled: true
                      message: ""
                      quantity: 75
                  schedulingSettings:
                    isActive: true
                    scheduledRunTime: 04:00:00
                    schedulerMode: DAILY
                    daily:
                      dailyOffset: SCHEDULED
                      daysOfWeek:
                      - MONDAY
                      - TUESDAY
                      - WEDNESDAY
                      - THURSDAY
                      - FRIDAY
              Update partitions & alerts for pullup job (pullup is available in preview):
                summary: "Adjust pullup JDBC partitioning, Spark sizing, source window,\
                  \ and notifications (if pullup preview enabled)"
                value:
                  jobName: public.nyse
                  sourceQuery: "SELECT * FROM \"public\".\"nyse\" WHERE \"trade_date\"\
                    \ >= '${rd}' AND \"trade_date\" < '${rdEnd}'"
                  runDate:
                    kind: TIMESTAMP
                    value: 2025-10-22T13:00:00Z
                  runDateEnd:
                    kind: TIMESTAMP
                    value: 2025-10-23T13:00:00Z
                  jobSettings:
                    dateFormat: TIMESTAMP
                    pullupSettings:
                      loadOptions:
                        numPartitions: 12
                        parallelJdbcOptions:
                          mode: AUTO_COLUMN
                          partitionNumber: 6
                      sparkJobSizing:
                        numExecutorCores: 2
                        driverMemoryGb: 4
                        memoryOverheadGb: 2
                      sparkSqlProperties:
                        spark.sql.shuffle.partitions: 240
                  monitoringSettings:
                    adaptiveMonitors:
                      rowCount: true
                      nullValues: true
                      executionTime: true
                      descriptiveStatistics: false
                      settings:
                        dataLookBack: 10
                        learningPhase: 4
                    customMonitors:
                    - monitorName: NAME_IS_NOT_NULL
                      customQuery: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE NAME
                        IS NULL
                      filterQuery: WHERE STATUS = 'ACTIVE'
                      primaryColumn: NAME
                      description: Checks that the NAME column contains no null values
                      dimensions:
                      - COMPLETENESS
                      notifications:
                      - notificationType: BREAKING
                        enabled: true
                        message: NAME column contains null values
                        channels:
                        - channel: EMAIL
                          recipients:
                          - user1
                          - user2
                        name: BREAKING_0cc3ed7f-a34f-4bb6-a75e-a17187302999
                      tolerance: 5
                      isActive: true
                      isSuppressed: false
                      opIndicator: UPDATE
                  notifications:
                    globalMessage: DQ job update
                    useIndividualMessages: true
                    channels:
                    - channel: EMAIL
                      recipients:
                      - opsuser
                      - dq-oncall
                    notificationOptions:
                    - notificationType: RUNS_WITHOUT_DATA
                      enabled: true
                      message: No rows produced for two consecutive runs
                      quantity: 2
                    - notificationType: RUN_TIME_MORE_THEN_LIMIT
                      enabled: true
                      message: Runtime exceeded 30 minutes
                      quantity: 30
      responses:
        "200":
          description: OK. Job updated successfully. No response body.
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
    get:
      tags:
      - Jobs
      summary: Get job
      description: |-
        Returns the job definition for the specified job name

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_VIEW`
        - **Global bypass:**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: getJob
      parameters:
      - $ref: "#/components/parameters/JobNamePath"
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobDefinition"
              examples:
                example:
                  summary: Pushdown job with daily schedule and basic monitoring settings
                  value:
                    jobName: public.nyse
                    jobType: PUSHDOWN
                    sourceQuery: "SELECT * FROM PUBLIC.NYSE WHERE \"TRADE_DATE\" >=\
                      \ '${rd}' AND \"TRADE_DATE\" < '${rdEnd}'"
                    runDate:
                      kind: TIMESTAMP
                      value: 2025-10-22T13:00:00Z
                    runDateEnd:
                      kind: TIMESTAMP
                      value: 2025-10-23T13:00:00Z
                    dataLocation:
                      edgeSiteName: US-East-1-Prod-Edge
                      edgeConnectionName: Finance-Snowflake-US
                      dataSourceName: PRODSALESDB
                      schemaName: PUBLIC
                      tableName: NYSE
                    jobSettings:
                      dateFormat: TIMESTAMP
                      pushdownSettings:
                        connections: 10
                        threads: 2
                    monitoringSettings:
                      adaptiveMonitors:
                        descriptiveStatistics: true
                        emptyFields: true
                        executionTime: true
                        max: true
                        mean: true
                        min: true
                        nullValues: true
                        rowCount: false
                        uniqueness: true
                        settings:
                          dataLookBack: 10
                          learningPhase: 4
                    notifications:
                      globalMessage: ""
                      useIndividualMessages: false
                      channels:
                      - channel: EMAIL
                        recipients:
                        - jsmith
                        - adoe
                      notificationOptions:
                      - notificationType: JOB_FAILED
                        enabled: true
                        message: ""
                      - notificationType: RUNS_WITHOUT_DATA
                        enabled: true
                        message: ""
                        quantity: 1
                    schedulingSettings:
                      isActive: true
                      scheduledRunTime: 04:00:00
                      schedulerMode: DAILY
                      daily:
                        dailyOffset: SCHEDULED
                        daysOfWeek:
                        - MONDAY
                        - TUESDAY
                        - WEDNESDAY
                        - THURSDAY
                        - FRIDAY
        "404":
          $ref: "#/components/responses/NotFound"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
    delete:
      tags:
      - Jobs
      summary: Delete job
      description: |-
        Deletes job identified by the given job name.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_DELETE`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: deleteJob
      parameters:
      - $ref: "#/components/parameters/JobNamePath"
      responses:
        "204":
          description: Job successfully deleted
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /jobs/{jobName}/run:
    post:
      tags:
      - Job Runs
      summary: Trigger a job run
      description: |-
        Starts a run of the specified job. Supports an optional
        `backrun` to backfill prior periods. Returns a receipt with the generated run ID.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_RUN`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: runJob
      parameters:
      - $ref: "#/components/parameters/JobNamePath"
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/JobRunRequest"
            examples:
              minimal:
                summary: Current runDate
                value: {}
              explicitRange:
                summary: Specific date range
                value:
                  runDate:
                    kind: TIMESTAMP
                    value: 2025-10-22T13:00:00Z
                  runDateEnd:
                    kind: TIMESTAMP
                    value: 2025-10-23T13:00:00Z
              withBackrun:
                summary: Backfill prior 10 days
                value:
                  runDate:
                    kind: TIMESTAMP
                    value: 2025-10-22T13:00:00Z
                  backrun:
                    timeBin: DAY
                    binValue: 10
      responses:
        "202":
          description: Accepted. Run created and queued.
          headers:
            Location:
              description: URL of the run resource
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobSubmission"
              examples:
                receipt:
                  value:
                    jobRunId: 9c1d1e3a-2b4f-4a6c-8d90-111213141516
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /jobRuns:
    get:
      tags:
      - Job Runs
      summary: Search job runs
      description: |-
        Returns job runs that user has permission to view with pagination and filters. Results are sorted by the last updated timestamp in descending order.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_VIEW`
        - **Global bypass:**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: searchJobRuns
      parameters:
      - in: query
        name: jobName
        required: false
        description: |-
          Name filter. Behavior depends on `nameMatchMode`.
          Blank or omitted returns all runs.
        schema:
          type: string
          maxLength: 255
          default: ""
        example: nyse
      - in: query
        name: nameMatchMode
        required: false
        description: "How to compare `jobName`:\n  - EXACT - case-sensitive exact\
          \ match  \n  - CONTAINS - case-insensitive substring match (default)"
        schema:
          type: string
          enum:
          - EXACT
          - CONTAINS
          default: CONTAINS
        example: EXACT
      - in: query
        name: jobType
        required: false
        description: |
          Filter by a job type. If omitted, all types are returned.
        schema:
          $ref: "#/components/schemas/JobType"
        example: PUSHDOWN
      - in: query
        name: status
        required: false
        description: |
          Filter by job run status. Pass multiple values using repeated params. If omitted, all statuses are returned.
        schema:
          type: array
          maxItems: 20
          items:
            $ref: "#/components/schemas/JobRunStatus"
        style: form
        explode: true
        examples:
          active:
            value:
            - INIT
            - RUNNING
      - in: query
        name: limit
        required: false
        description: Number of results per page.
        schema:
          type: integer
          minimum: 0
          maximum: 1000
          default: 100
        example: 100
      - in: query
        name: offset
        required: false
        description: Result offset.
        schema:
          type: integer
          minimum: 0
          default: 0
        example: 0
      responses:
        "200":
          description: Successfully retrieved job runs
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobRunPaginated"
              examples:
                page1:
                  value:
                    results:
                    - jobRunId: 9c1d1e3a-2b4f-4a6c-8d90-111213141516
                      jobName: PUBLIC_NYSE_1
                      runDate:
                        kind: TIMESTAMP
                        value: 2025-10-22T13:00:00Z
                      status: RUNNING
                      activity: PROFILE
                      exception: ""
                      username: jsmith
                      startTime: 2025-10-23T13:50:05Z
                      updatedAt: 2025-10-23T13:52:10Z
                    - jobRunId: fb113ab6-8184-4b46-a852-182cd7ca9a97
                      jobName: PUBLIC_NYSE_2
                      runDate:
                        kind: TIMESTAMP
                        value: 2025-10-22T13:00:00Z
                      status: FINISHED
                      activity: ""
                      exception: ""
                      username: jsmith
                      startTime: 2025-10-22T04:00:00Z
                      updatedAt: 2025-10-22T04:12:35Z
                    total: 728
                    offset: 0
                    limit: 100
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /jobRuns/{jobRunId}:
    get:
      tags:
      - Job Runs
      summary: Get job run
      description: |-
        Returns the job run identified by the given run id.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_VIEW`
        - **Global bypass:**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: getJobRunByRunId
      parameters:
      - name: jobRunId
        in: path
        required: true
        description: Job run id
        schema:
          type: string
          format: uuid
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobRun"
              examples:
                example:
                  value:
                    jobRunId: 9c1d1e3a-2b4f-4a6c-8d90-111213141516
                    jobType: PUSHDOWN
                    jobName: PUBLIC_NYSE_1
                    runDate:
                      kind: TIMESTAMP
                      value: 2025-10-22T13:00:00Z
                    runDateEnd:
                      kind: TIMESTAMP
                      value: 2025-10-23T13:00:00Z
                    status: RUNNING
                    activity: PROFILE
                    exception: ""
                    startedBy: 6c1d1e3a-2b4f-4a6c-8d90-111213141517
                    startTime: 2025-10-23T13:50:05Z
                    updatedAt: 2025-10-23T13:52:10Z
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
    delete:
      tags:
      - Job Runs
      summary: Delete job run
      description: |-
        Deletes the job run identified by the given run id along with all
        of its per-run results (profile, scan, monitor, rule, and alert
        outputs). Idempotent — returns 204 when the run does not exist.
        Refuses with 409 when the run is in progress; cancel it first.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_DELETE`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: deleteJobRun
      parameters:
      - name: jobRunId
        in: path
        required: true
        description: Job run id
        schema:
          type: string
          format: uuid
      responses:
        "204":
          description: Run deleted (or already absent)
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "409":
          $ref: "#/components/responses/Conflict"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /jobRuns/{jobRunId}/cancel:
    post:
      tags:
      - Job Runs
      summary: Cancel job run
      description: |-
        Cancels the job identified by job run id.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_RUN`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: cancelJob
      parameters:
      - name: jobRunId
        in: path
        required: true
        description: Job run identifier
        schema:
          type: string
          format: uuid
      responses:
        "200":
          description: Job cancelled successfully. No response body.
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /jobRuns/{jobRunId}/profile:
    get:
      tags:
      - Job Runs
      operationId: getJobRunProfile
      summary: Get job-run profile results
      description: |-
        Returns detailed column-level profiling statistics produced by a
        single job run. Use this to understand the data distribution, type
        inconsistencies, and format anomalies observed during the run.

        **Permissions**
        - **Required:**
          - `DATA_QUALITY` (global)
          - `DATA_QUALITY_JOB_VIEW` (resource on the job)
        - **Global bypass (either of the following):**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      parameters:
      - name: jobRunId
        in: path
        required: true
        description: Job run identifier
        schema:
          type: string
          format: uuid
      - in: query
        name: limit
        required: false
        description: Maximum number of column profiles per page.
        schema:
          type: integer
          minimum: 0
          maximum: 500
          default: 100
        example: 100
      - in: query
        name: offset
        required: false
        description: Index of the first column profile to return.
        schema:
          type: integer
          minimum: 0
          default: 0
        example: 0
      - in: query
        name: includeTotal
        required: false
        description: |-
          When `true`, the response includes `total` (the count of columns
          available across all pages). Omitted by default to avoid the
          additional count query.
        schema:
          type: boolean
          default: false
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobRunProfileResults"
              examples:
                profile:
                  summary: Profile results for a finished run
                  value:
                    jobRunId: a1b2c3d4-e5f6-7890-abcd-ef1234567890
                    jobName: customer_orders
                    runDate:
                      kind: TIMESTAMP
                      value: 2024-10-22T00:00:00Z
                    offset: 0
                    limit: 100
                    total: 2
                    results:
                    - columnName: order_id
                      definedType: BIGINT
                      valueCount: 150000
                      nullCount: 0
                      emptyCount: 0
                      uniqueCount: 150000
                      min: 1000
                      max: 999999
                      topShapes:
                      - pattern: "######"
                        count: 148500
                        percentage: 99.0
                    - columnName: amount
                      definedType: DECIMAL
                      valueCount: 149880
                      nullCount: 120
                      emptyCount: 0
                      uniqueCount: 4320
                      min: 0.99
                      max: 9999.99
                      median: 47.5
                      q1: 12.99
                      q3: 199.0
                      topShapes: null
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /jobRuns/{jobRunId}/monitors:
    get:
      tags:
      - Job Runs
      - Monitor Results
      operationId: getJobRunMonitors
      summary: Get job-run monitor results
      description: |-
        Returns the results of the monitors for a job run.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_VIEW`
        - **Global bypass:**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      parameters:
      - $ref: "#/components/parameters/JobRunId"
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/JobRunMonitorsResult"
              examples:
                monitors:
                  value:
                    adaptiveMonitors:
                    - monitorName: NAME
                      monitorType: MIN
                      primaryColumn: NAME
                      state: PASSING
                      observedValue: John
                      expectedMin: Alqn
                      expectedMax: Zed
                      tolerance: NEUTRAL
                      isSuppressed: false
                      dimensions:
                      - COMPLETENESS
                    customMonitors:
                    - monitorName: NAME_NOT_NULL_MONITOR
                      state: BREAKING
                      score: 40
                      breakingPercentage: 20
                      rowsPassing: 80
                      rowsBreaking: 20
                      rowsTotal: 100
                      exception: ""
                      dimensions:
                      - COMPLETENESS
                      tolerance: 10
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
    put:
      tags:
      - Job Runs
      - Monitor Results
      operationId: updateJobRunMonitors
      summary: Bulk update job-run monitor states
      description: |-
        Applies `pass` or `suppress` operations to multiple monitor results in a single job run.
        `PASS` is valid only for adaptive monitors and retrains them.
        `SUPPRESS` is valid for adaptive and custom monitors, and retrains adaptive monitors.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_EDIT`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      parameters:
      - $ref: "#/components/parameters/JobRunId"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/JobRunMonitorOperationsRequest"
            examples:
              passAndSuppress:
                summary: Pass one adaptive monitor and suppress a custom monitor
                value:
                  operations:
                  - monitorName: ROW_COUNT
                    operation: PASS
                  - monitorName: NAME_NOT_NULL_MONITOR
                    operation: SUPPRESS
      responses:
        "204":
          description: No Content
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "404":
          $ref: "#/components/responses/NotFound"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /egress/export:
    post:
      tags:
      - Data Egress
      summary: Export joined data across multiple DQ topics
      description: |-
        Streams the full result set of rows joined across an arbitrary
        connected subset of the DQ topics (`jobs`, `monitors`, `rules`)
        in a single pass for bulk extraction into BI tools, data pipelines,
        and integrations.

        The request body is **optional**: POST with no body (or a body that
        omits `topics`) to export all three topics — `jobs`, `monitors`,
        `rules` — with every other default applied.

        **Response format (content negotiation).** The format is selected by
        the `Accept` request header:
        - `Accept: application/x-ndjson` → newline-delimited JSON
          ([JSON Lines](https://jsonlines.org)): one JSON object per line.
          Preferred for programmatic consumers — types are
          preserved (numbers stay numbers, `null` stays `null`) and rows can
          be parsed incrementally.
        - `Accept: text/csv` → CSV download. The header row is the qualified
          field names (e.g. `rules.ruleName`). List-typed fields
          (`jobs.daysOfWeek`, `monitors.dimensionNames`, `rules.dimensionNames`)
          render as pipe-delimited cells (`Completeness|Accuracy`) so
          consumers don't have to handle quoted-comma CSV.

        When `Accept` is absent or `*/*`, the server returns
        `application/x-ndjson`; any other media type is rejected with
        HTTP 406. Both formats stream the same rows in the same order; only
        the encoding differs.

        **Topics.** `JOBS`, `MONITORS`, and `RULES` are mutually
        joinable — any non-empty combination of them is valid. Quality
        dimensions are not a topic: the names of the quality dimensions
        assigned to a monitor (and to a rule — a rule is a `RULE`-type
        monitor) are surfaced inline on the row as the
        `monitors.dimensionNames` / `rules.dimensionNames` list field
        (active assignments only; empty when none are assigned).

        To discover what topics can be joined call GET `/egress/manifest` first. Each topic's
        `joinsTo` lists the other topics it can be joined to; your selected
        `topics` are valid if they form a connected subgraph over those edges.
        The manifest also lists each field's `filterable` flag and
        `allowedOperators`, so a client can fully validate a request locally
        before POSTing.

        **Filters.** Optional predicates in the body's `filters` array, **ANDed**
        together (omit for no filtering beyond RBAC and the default window). Each
        `EgressFilter` is a `field`, an `op`, and a value whose shape depends on
        the operator:
        - `value` (a single scalar) for `EQ`, `NE`, `LIKE`, `GT`, `GTE`, `LT`, `LTE`
        - `values` (an array) for `IN`, `NOT_IN`
        - neither for `IS_NULL`, `IS_NOT_NULL`

        `field` is the qualified name `<topic>.<apiName>` (e.g. `rules.ruleName`)
        and must belong to a **selected** topic; each field permits only a subset
        of operators. Call `GET /egress/manifest` to discover the filterable
        fields and their `allowedOperators`. A request fails with HTTP 400 if a
        filter names an unknown field, uses an operator the field doesn't allow,
        or references a field whose topic isn't in `topics`. Filtering on any
        `*.updatedAt` field also overrides the default time window (see below).

        **Ordering.** Custom sort keys are not currently a request parameter.
        Rows are always returned ordered by `<granularity>.updatedAt`
        descending — the same field the default time window keys on (rules >
        monitors > jobs) — followed by a unique tiebreaker for deterministic
        streaming.

        **Projection.** is not currently a request parameter. Each row is a
        key/value map containing all projectable fields of the selected
        topics, in manifest order (fields marked `optIn: true` are excluded
        unless explicitly enabled — see catalog assets below). Use
        `GET /egress/manifest` to discover the supported topics, fields,
        operators, and opt-in flags.

        **Catalog assets (opt-in).** Set `includeCatalogAssets` (query parameter
        or request-body property — enrichment applies when either is `true`;
        default `false`) to add, to each row, the DGC Catalog assets it maps to.
        Three field groups are populated, all omitted when the flag is off:

        - **Table** — `jobs.tableCatalogAssetId` / `...DisplayName` / `...Type`:
          the Catalog `Table` asset for the row's table. One per row.
        - **Column** — `monitors.columnCatalogAsset*` and
          `rules.columnCatalogAsset*`: the `Column` asset for the row's column
          (`monitors.columnName` / `rules.ruleColumnName`). One per row, or
          `null` when the row has no column scope (e.g. a dataset-level monitor).
        - **Business Rule** — `monitors.businessRuleLinks`: the `Business Rule`
          assets linked to the monitor, matched by identity (a rule surfaces here
          as its `RULE`-type monitor). Collapsed into one list of
          `"<assetId>::<signifier>"` entries, so a monitor linked to several rules
          stays one row (no row multiplication).

        Two query parameters trim the enrichment (both default `false`):
        `excludeColumnAssets` omits the Column group; `excludeRuleAssets` omits
        the Business Rule group. Both are no-ops unless `includeCatalogAssets`
        is in effect.

        **Default time window.** When the request omits any `*.updatedAt`
        filter, the server injects a rolling window on the `updatedAt` of a
        selected topic, anchored in the order monitors > rules > jobs.
        Its length is the `window` query parameter in days, defaulting to 90.
        To set an exact range instead, filter explicitly on any `*.updatedAt`
        field — the server suppresses the injected window (and ignores `window`)
        once any such filter is present. The default-window contract is also
        surfaced in `defaultWindow` on the manifest response.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_JOB_VIEW`. Results are
          scoped to the jobs the caller can see.
        - **Global bypass:**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      operationId: exportEgressData
      parameters:
      - name: window
        in: query
        required: false
        description: |-
          Rolling look-back window, in days, for the auto-injected time
          filter. The server bounds a selected topic's `updatedAt` to
          `>= now - window` days, anchoring on the topic in the order
          monitors > rules > jobs (`monitors.updatedAt` whenever monitors are
          selected, else `rules.updatedAt`, else `jobs.updatedAt`). Defaults
          to 90, capped at 365. Ignored when the request body already carries
          an explicit `*.updatedAt` filter — that filter wins.
        schema:
          type: integer
          format: int32
          minimum: 1
          maximum: 365
          default: 90
        example: 30
      - name: includeCatalogAssets
        in: query
        required: false
        description: |-
          Opt in to catalog-asset enrichment — the query-parameter equivalent
          of the request body's `includeCatalogAssets`, usable on a body-less
          request. Enrichment is applied when this **or** the body flag is
          `true`. Default `false`. See **Catalog assets** in the operation
          description for the fields populated, the row-multiplication caveat,
          and the cost.
        schema:
          type: boolean
          default: false
      - name: excludeRuleAssets
        in: query
        required: false
        description: |-
          When catalog-asset enrichment is in effect (`includeCatalogAssets`
          `true`), skip the `monitors` `Business Rule` asset enrichment
          (`monitors.businessRuleLinks`). Default `false` (business-rule links
          included). Use this to avoid the linked-rule asset lookup when only
          table and/or column assets are needed. No effect when
          `includeCatalogAssets` is not in effect.
        schema:
          type: boolean
          default: false
      - name: excludeColumnAssets
        in: query
        required: false
        description: |-
          When catalog-asset enrichment is in effect (`includeCatalogAssets`
          `true`), skip the DGC `Column` asset enrichment of the `monitors`
          and `rules` topics (`monitors.columnCatalogAsset*`,
          `rules.columnCatalogAsset*`). Default `false` (column assets
          included). No effect when `includeCatalogAssets` is not in effect.
        schema:
          type: boolean
          default: false
      - name: completionMarker
        in: query
        required: false
        description: |-
          Append a trailing completion marker so a consumer can distinguish a
          complete extract from one truncated by a mid-stream failure (or a
          proxy stream timeout). NDJSON ends with a final
          `{"_complete":true,"rowCount":N}` line; CSV ends with a
          `# complete rowCount=N` comment line. Default `true`. Set `false`
          for a byte-clean body (e.g. naive CSV readers that don't skip
          `#`-prefixed comment lines), at the cost of losing truncation
          detection.
        schema:
          type: boolean
          default: true
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/EgressRequest"
            examples:
              ruleResultsWithDimensionNames:
                summary: "Recent SQL rule results, each carrying its assigned dimension\
                  \ names inline"
                value:
                  topics:
                  - RULES
                  filters:
                  - field: rules.ruleType
                    op: EQ
                    value: SQLF
                  - field: rules.updatedAt
                    op: GTE
                    value: 2026-05-01T00:00:00Z
              jobsMonitorsRules:
                summary: "All three topics joined in one extract, enriched with catalog\
                  \ assets"
                value:
                  topics:
                  - JOBS
                  - MONITORS
                  - RULES
                  includeCatalogAssets: true
      responses:
        "200":
          description: |-
            The egress export, streamed in the format selected by the
            `Accept` header (`application/x-ndjson` by default, or `text/csv`).
            The response carries `Content-Disposition: attachment` so browsers
            download to disk; the filename extension reflects the negotiated
            format (`.jsonl` / `.csv`).

            **Streaming semantics.** Both response schemas are declared with
            `format: binary` even though the bodies are text — this hints to
            SDK codegen to produce a streaming `Resource` / `InputStream`
            return type instead of buffering the entire payload in memory as
            a `String`. Without that hint, regenerated SDKs default to
            string-buffered responses, which defeats the streaming-export
            design (and would OOM on large result sets). Treat the body as
            text at the wire level; treat the SDK return type as a stream.

            **Stream completeness.** Because the body streams, a failure after
            the first byte cannot change the HTTP status — it surfaces only as a
            short stream (plus a server-side error log) and can look like a
            successful, fully-read extract. To let consumers detect this, the
            stream always ends with an explicit completion marker once every row
            has been written:
            - NDJSON: a final line `{"_complete":true,"rowCount":N}` (data rows
              never carry a `_complete` key).
            - CSV: a trailing comment line `# complete rowCount=N`.

            A consumer that reaches end-of-stream **without** seeing the marker
            must treat the extract as truncated/failed, not complete. `rowCount`
            is the number of data rows emitted (excludes the header and marker).
          headers:
            Content-Disposition:
              description: "Attachment with filename hint, e.g. `attachment; filename=\"\
                egress-export-2026-04-28.jsonl\"` (`.csv` for the CSV format)."
              required: true
              schema:
                type: string
          content:
            application/x-ndjson:
              schema:
                type: string
                format: binary
                description: |-
                  Newline-delimited JSON ([JSON Lines](https://jsonlines.org)):
                  one JSON object per line, in stream order. Each object is
                  keyed by the qualified field names of the selected topics
                  (see the `ruleResultsStream` example below and
                  `GET /egress/manifest` for the full field set). The body
                  streams as text at the wire level — parse it line by line,
                  not as a single JSON document. The final line is a completion
                  marker `{"_complete":true,"rowCount":N}` (see **Stream
                  completeness** on the 200 response) — distinguish it from data
                  rows by the reserved `_complete` key.
              examples:
                ruleResultsStream:
                  summary: "Two rule results with inline dimension names (a list per\
                    \ row), then the completion marker"
                  value: |-
                    {"rules.jobName":"nyse_backrun_may_lastweek","rules.ruleName":"HIGH_NOT_NULL","rules.ruleType":"SQLF","rules.status":"PASSING","rules.rowsBreaking":0,"rules.dimensionNames":["Accuracy"]}
                    {"rules.jobName":"nyse_backrun_may_lastweek","rules.ruleName":"VOLUME_RANGE","rules.ruleType":"SQLG","rules.status":"BREAKING","rules.rowsBreaking":7,"rules.dimensionNames":["Completeness","Integrity"]}
                    {"_complete":true,"rowCount":2}
            text/csv:
              schema:
                type: string
                format: binary
                description: |-
                  CSV (UTF-8). The header row is the qualified field names;
                  one data row per result row, in stream order. The stream ends
                  with a trailing comment line `# complete rowCount=N` (see
                  **Stream completeness** on the 200 response).
              examples:
                jobsCsv:
                  summary: "Two job rows showing a list-typed field (daysOfWeek) as\
                    \ a pipe-delimited cell, then the completion marker"
                  description: |-
                    `jobs.daysOfWeek` is list-typed: its values render as a
                    single pipe-delimited cell (`MON|WED|FRI`) rather than
                    separate columns, so naive comma-splitting CSV readers parse
                    the row correctly. An empty list renders as an empty cell.
                  value: |-
                    jobs.jobName,jobs.jobType,jobs.scheduleFreq,jobs.daysOfWeek
                    nyse_backrun_may_lastweek,PULLUP,WEEKLY,MON|WED|FRI
                    orders_daily,PULLUP,DAILY,
                    # complete rowCount=2
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "406":
          $ref: "#/components/responses/NotAcceptable"
        "429":
          $ref: "#/components/responses/TooManyRequests"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /egress/manifest:
    get:
      tags:
      - Data Egress
      summary: "Discover data-egress topics, fields, and join graph"
      description: |-
        Returns the canonical metadata describing which topics can be combined,
        which fields each topic exposes, and which operators are valid per
        field. Use this endpoint to drive client-side validation.

        `joinsTo` (per topic) is the authoritative join graph: the list of
        topics each one can be joined to. Use it to determine which `topics`
        combinations are valid for
        `POST /egress/export` (a selection must form a connected subgraph)
        and to drive client-side validation of fields and operators.

        **Permissions**
        - **Required:** `DATA_QUALITY`. (No resource scoping — this is
          metadata about the API itself.)
      operationId: getEgressManifest
      responses:
        "200":
          description: Data egress manifest.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EgressManifest"
              examples:
                manifest:
                  summary: Abridged manifest (monitors topic + default window)
                  value:
                    defaultWindow:
                      durationDays: 90
                      anchorField: updatedAt
                      appliesWhen: "No `*.updatedAt` filter present. Anchor topic\
                        \ for the window: monitors > rules > jobs."
                    topics:
                    - name: MONITORS
                      joinsTo:
                      - JOBS
                      - RULES
                      fields:
                      - apiName: monitorName
                        type: STRING
                        filterable: true
                        projectable: true
                        allowedOperators:
                        - EQ
                        - NE
                        - IN
                        - NOT_IN
                        - LIKE
                        - IS_NULL
                        - IS_NOT_NULL
                        optIn: false
                      - apiName: monitorType
                        type: STRING
                        filterable: true
                        projectable: true
                        allowedOperators:
                        - EQ
                        - NE
                        - IN
                        - NOT_IN
                        - IS_NULL
                        - IS_NOT_NULL
                        optIn: false
                      - apiName: dimensionNames
                        type: STRING_LIST
                        filterable: true
                        projectable: true
                        allowedOperators:
                        - EQ
                        - NE
                        - IN
                        - NOT_IN
                        - LIKE
                        - IS_NULL
                        - IS_NOT_NULL
                        optIn: false
                      - apiName: businessRuleLinks
                        type: STRING_LIST
                        filterable: false
                        projectable: true
                        allowedOperators: []
                        optIn: true
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
  /settings:
    get:
      tags:
      - Settings
      operationId: getSettings
      summary: Get global DQ settings
      description: |-
        Returns the current value of all global DQ settings exposed on the public API.

        **Permissions**
        - **Required:** `DATA_QUALITY`
        - **Global bypass:**
          - `DATA_QUALITY` and `VIEW_PERMISSIONS_VIEW_ALL`
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      responses:
        "200":
          description: Settings retrieved successfully.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Settings"
              examples:
                defaults:
                  summary: Default values (out-of-the-box state)
                  value:
                    passingThreshold: 90
                    failingThreshold: 75
                    lookbackLimit: 3
                    observationLimit: 500
                    previewLimit: 100
                    breakRecordsLimit: 25
                    ruleRunTimeLimit: 30
                    jobLogRetentionHours: 72
                    platformLogRetentionHours: 24
                    mapToPrimaryColumn: false
                    mandatoryPrimaryRuleColumn: false
                    mandatoryRuleDimension: false
                    showDetailedException: false
                governanceEnabled:
                  summary: Governance enforcement fully enabled
                  value:
                    passingThreshold: 90
                    failingThreshold: 75
                    lookbackLimit: 3
                    observationLimit: 500
                    previewLimit: 100
                    breakRecordsLimit: 25
                    ruleRunTimeLimit: 30
                    jobLogRetentionHours: 72
                    platformLogRetentionHours: 24
                    mapToPrimaryColumn: true
                    mandatoryPrimaryRuleColumn: true
                    mandatoryRuleDimension: true
                    showDetailedException: false
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
    patch:
      tags:
      - Settings
      operationId: changeSettings
      summary: Update global DQ settings
      description: |-
        Partially update one or more global DQ settings. Only fields present in the
        request body are updated. Validation runs over all present fields before
        any update is persisted; if any field is invalid, the entire request is
        rejected with HTTP 400 and no settings are changed.

        `passingThreshold` must be greater than `failingThreshold`. If both are
        sent in the same request and this constraint is violated, the request is
        rejected.

        An empty request body (`{}`) is accepted and treated as a no-op: the
        current settings are returned unchanged.

        **Permissions**
        - **Required:** `DATA_QUALITY` and `DATA_QUALITY_MANAGE_SETTINGS`
        - **Global bypass:**
          - `DATA_QUALITY` and `RESOURCE_MANAGE_ALL`
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/SettingsPatch"
            examples:
              adjustThresholds:
                summary: Tighten passing and failing thresholds
                value:
                  passingThreshold: 95
                  failingThreshold: 80
              setRetention:
                summary: Set log retention to 7 days for both logs
                value:
                  jobLogRetentionHours: 168
                  platformLogRetentionHours: 168
              enableGovernance:
                summary: Enable all governance enforcement settings
                value:
                  mapToPrimaryColumn: true
                  mandatoryPrimaryRuleColumn: true
                  mandatoryRuleDimension: true
              enableDebugMode:
                summary: Turn on detailed exceptions for troubleshooting
                value:
                  showDetailedException: true
              emptyNoOp:
                summary: No-op — returns current settings unchanged
                value: {}
      responses:
        "200":
          description: Settings updated successfully. Returns the full current settings.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Settings"
              examples:
                afterAdjustThresholds:
                  summary: Response after tightening thresholds
                  value:
                    passingThreshold: 95
                    failingThreshold: 80
                    lookbackLimit: 3
                    observationLimit: 500
                    previewLimit: 100
                    breakRecordsLimit: 25
                    ruleRunTimeLimit: 30
                    jobLogRetentionHours: 72
                    platformLogRetentionHours: 24
                    mapToPrimaryColumn: false
                    mandatoryPrimaryRuleColumn: false
                    mandatoryRuleDimension: false
                    showDetailedException: false
        "400":
          $ref: "#/components/responses/BadRequest"
        "401":
          $ref: "#/components/responses/Unauthorized"
        "403":
          $ref: "#/components/responses/Forbidden"
        "500":
          $ref: "#/components/responses/InternalServerError"
      security:
      - basicAuth: []
      - jwtAuth: []
components:
  securitySchemes:
    basicAuth:
      description: Collibra REST API authentication using Basic Authentication.
      type: http
      scheme: basic
    jwtAuth:
      description: Collibra REST API authentication using JSON Web Token.
      type: http
      scheme: bearer
      bearerFormat: JWT
  responses:
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            invalidParameter:
              value:
                statusCode: 400
                errorCode: dqInvalidParameter
                titleMessage: Invalid Input Parameter
                userMessage: "Parameter '{X}' cannot be null or blank."
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            unauthorized:
              value:
                statusCode: 401
                errorCode: dqUnauthorized
                titleMessage: Unauthorized
                userMessage: Authentication token is missing or invalid.
    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            accessDenied:
              value:
                statusCode: 403
                errorCode: accessDenied
                titleMessage: Access Denied
                userMessage: You do not have permission to perform this action.
    NotFound:
      description: Not Found
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            resourceNotFound:
              value:
                statusCode: 404
                errorCode: resourceNotFound
                titleMessage: Not Found
                userMessage: "Resource '{Y}' was not found."
    NotAcceptable:
      description: Not Acceptable
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            notAcceptable:
              value:
                statusCode: 406
                errorCode: notAcceptable
                titleMessage: Not Acceptable
                userMessage: "The requested response format is not supported. Use\
                  \ `Accept: application/x-ndjson` or `Accept: text/csv`."
    Conflict:
      description: Conflict
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            runInProgress:
              value:
                statusCode: 409
                errorCode: dqJobRunInProgress
                titleMessage: Conflict
                userMessage: Run is in progress; cancel it before deleting.
    TooManyRequests:
      description: Too Many Requests
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            dataEgressConcurrencyLimit:
              value:
                statusCode: 429
                errorCode: dataEgressConcurrencyLimit
                titleMessage: Too Many Requests
                userMessage: Data egress concurrency limit reached (3 simultaneous
                  requests allowed). A permit is released as soon as each in-flight
                  request finishes streaming. Retry once an existing request completes.
    InternalServerError:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/StandardErrorResponse"
          examples:
            unexpected:
              value:
                statusCode: 500
                errorCode: internalServerError
                titleMessage: Unexpected Server Error
                userMessage: An unexpected error occurred. Please try again later.
  parameters:
    JobRunId:
      name: jobRunId
      in: path
      required: true
      description: Job run identifier (UUID)
      schema:
        type: string
        format: uuid
      example: 9c1d1e3a-2b4f-4a6c-8d90-111213141516
    JobNamePath:
      name: jobName
      in: path
      required: true
      description: Job name
      schema:
        $ref: "#/components/schemas/JobName"
  schemas:
    Settings:
      type: object
      additionalProperties: false
      description: Current values of all global DQ settings exposed on the public
        API.
      required:
      - passingThreshold
      - failingThreshold
      - lookbackLimit
      - observationLimit
      - previewLimit
      - breakRecordsLimit
      - ruleRunTimeLimit
      - jobLogRetentionHours
      - platformLogRetentionHours
      - mapToPrimaryColumn
      - mandatoryPrimaryRuleColumn
      - mandatoryRuleDimension
      - showDetailedException
      properties:
        passingThreshold:
          type: integer
          minimum: 1
          maximum: 100
          description: |
            Global passing score threshold. Scores at or above this value are considered passing (green). Must be greater than failingThreshold.
          example: 90
        failingThreshold:
          type: integer
          minimum: 1
          maximum: 100
          description: |
            Global failing score threshold. Scores below this value are considered failing (red). Must be less than passingThreshold.
          example: 75
        lookbackLimit:
          type: integer
          minimum: 1
          maximum: 30
          description: |
            Maximum number of historical rule runs used when computing DQ scores.
          example: 3
        observationLimit:
          type: integer
          minimum: 1
          maximum: 500
          description: Maximum number of rows processed per rule execution.
          example: 500
        previewLimit:
          type: integer
          minimum: 1
          maximum: 500
          description: |
            Maximum number of results shown in the dataset overview and rule workbench. UI-only — does not affect what is stored. Recommended values are 25, 50, 100, 250, or 500. If a different value is provided, it is rounded to the closest recommended value.
          example: 100
        breakRecordsLimit:
          type: integer
          minimum: 1
          maximum: 500
          description: |
            Maximum number of records returned when fetching break records for a rule. UI-only — does not affect what is stored. Recommended values are 25, 50, 100, 250, or 500. If a different value is provided, it is rounded to the closest recommended value.
          example: 25
        ruleRunTimeLimit:
          type: integer
          minimum: 1
          maximum: 90
          description: |
            Maximum time in minutes a rule is allowed to run before it is automatically timed out.
          example: 30
        jobLogRetentionHours:
          type: integer
          minimum: 24
          maximum: 720
          multipleOf: 24
          description: |
            Job log retention period in hours. Must be a multiple of 24 (minimum 1 day, maximum 30 days).
          example: 72
        platformLogRetentionHours:
          type: integer
          minimum: 24
          maximum: 720
          multipleOf: 24
          description: |
            Platform log retention period in hours. Must be a multiple of 24 (minimum 1 day, maximum 30 days).
          example: 24
        mapToPrimaryColumn:
          type: boolean
          description: |
            When enabled, rules are automatically mapped to the primary column of the dataset.
          example: false
        mandatoryPrimaryRuleColumn:
          type: boolean
          description: |
            When enabled, a primary column must be set on every rule before it can be saved.
          example: false
        mandatoryRuleDimension:
          type: boolean
          description: |
            When enabled, a dimension must be assigned to every rule before it can be saved.
          example: false
        showDetailedException:
          type: boolean
          description: |
            When enabled, detailed exception stack traces are included in error responses. Recommended for non-production environments only.
          example: false
    SettingsPatch:
      type: object
      additionalProperties: false
      description: |
        Partial update for global DQ settings. Only fields present in the request
        body are updated; absent fields are left unchanged.
      properties:
        passingThreshold:
          type: integer
          minimum: 1
          maximum: 100
          description: New value for the passingThreshold setting. Must be greater
            than failingThreshold.
        failingThreshold:
          type: integer
          minimum: 1
          maximum: 100
          description: New value for the failingThreshold setting. Must be less than
            passingThreshold.
        lookbackLimit:
          type: integer
          minimum: 1
          maximum: 30
          description: New value for the lookbackLimit setting.
        observationLimit:
          type: integer
          minimum: 1
          maximum: 500
          description: New value for the observationLimit setting.
        previewLimit:
          type: integer
          minimum: 1
          maximum: 500
          description: |
            New value for the previewLimit setting. Recommended values are 25, 50, 100, 250, or 500. Other values are rounded to the closest recommended value.
        breakRecordsLimit:
          type: integer
          minimum: 1
          maximum: 500
          description: |
            New value for the breakRecordsLimit setting. Recommended values are 25, 50, 100, 250, or 500. Other values are rounded to the closest recommended value.
        ruleRunTimeLimit:
          type: integer
          minimum: 1
          maximum: 90
          description: New value for the ruleRunTimeLimit setting.
        jobLogRetentionHours:
          type: integer
          minimum: 24
          maximum: 720
          multipleOf: 24
          description: New value for the jobLogRetentionHours setting.
        platformLogRetentionHours:
          type: integer
          minimum: 24
          maximum: 720
          multipleOf: 24
          description: New value for the platformLogRetentionHours setting.
        mapToPrimaryColumn:
          type: boolean
          description: New value for the mapToPrimaryColumn setting.
        mandatoryPrimaryRuleColumn:
          type: boolean
          description: New value for the mandatoryPrimaryRuleColumn setting.
        mandatoryRuleDimension:
          type: boolean
          description: New value for the mandatoryRuleDimension setting.
        showDetailedException:
          type: boolean
          description: New value for the showDetailedException setting.
    StandardErrorResponse:
      type: object
      description: Error response returned by the Data Quality API.
      required:
      - statusCode
      - errorCode
      - titleMessage
      - userMessage
      properties:
        statusCode:
          type: integer
          description: HTTP status code corresponding to the error.
          example: 400
        errorCode:
          type: string
          description: Internal error code representing the specific error type.
          example: dqInvalidParameter
        titleMessage:
          type: string
          description: A brief title summarizing the error.
          example: Invalid Input Parameter
        userMessage:
          type: string
          description: "Detailed, user-friendly message explaining the error and possible\
            \ remediation steps."
          example: Parameter 'jobName' cannot be null or blank.
    JobDefinition:
      type: object
      properties:
        jobName:
          $ref: "#/components/schemas/JobName"
        jobType:
          $ref: "#/components/schemas/JobType"
        sourceQuery:
          $ref: "#/components/schemas/SourceQuery"
        runDate:
          $ref: "#/components/schemas/RunDateValue"
        runDateEnd:
          $ref: "#/components/schemas/RunDateEndValue"
        dataLocation:
          $ref: "#/components/schemas/DataLocation"
        jobSettings:
          $ref: "#/components/schemas/JobSettings"
        monitoringSettings:
          $ref: "#/components/schemas/JobMonitoringSettings"
        notifications:
          $ref: "#/components/schemas/JobNotifications"
        schedulingSettings:
          $ref: "#/components/schemas/SchedulingSettings"
    JobDefinitionUpdateRequest:
      type: object
      properties:
        jobName:
          type: string
          description: The name of an existing job definition to update
        sourceQuery:
          $ref: "#/components/schemas/SourceQuery"
        runDate:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/RunDateValue"
          - description: "Start of the time slice used only when the `sourceQuery`\
              \ contains the `${rd}` placeholder.\nThe engine substitutes `${rd}`\
              \ using `jobSettings.dateFormat`:\n  - DATE → `yyyy-MM-dd`\n  - TIMESTAMP\
              \ → RFC 3339 `yyyy-MM-dd'T'HH:mm:ss'Z'` \n\nIf `sourceQuery` omits `${rd}`,\
              \ this value does **not** restrict the data scan and\nonly affects the\
              \ **run’s date** (e.g., run metadata/labeling, scheduling context).\n\
              \ \n**Optional**. May be omitted or set to null.\nIf not provided, no\
              \ updates will be made to existing run date."
        runDateEnd:
          $ref: "#/components/schemas/RunDateEndValue"
        dataLocation:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/DataLocation"
          - description: |-
              Data location details for the job, including edge site, connection, data source, schema, and table.
              If table was moved/renamed, provide the new details here.

              **Optional**. May be omitted or set to null.
              If not provided, no updates will be made to existing data location.
        jobSettings:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/JobSettingsPatch"
          - description: "Job-level execution settings. \n\n**Optional**. May be omitted\
              \ or set to null.\nIf not provided, no updates will be made to existing\
              \ job settings."
        monitoringSettings:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/JobMonitoringSettingsPatch"
          - description: "Monitoring configuration for the job, excluding custom rules.\
              \ Currently, only adaptive rules are supported. \nThis structure is\
              \ designed for future extensibility to include additional monitor types.\
              \  \n\n**Optional**. May be omitted or set to null.\nIf not provided,\
              \ no updates will be made to existing monitoring settings."
        notifications:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/JobNotifications"
          - description: "Notification configuration for a job. Controls which events\
              \ trigger a notification, who receives it, \nand which message is sent.\n\
              \n**Optional**. May be omitted or set to null.\nIf not provided, no\
              \ updates will be made to existing notifications."
        schedulingSettings:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/SchedulingSettings"
          - description: "Controls when a scheduled job runs and how the runDate is\
              \ adjusted by schedule-specific offsets. \nThe scheduler runs at the\
              \ given UTC time and applies the selected mode (HOURLY/DAILY/MONTHLY).\n\
              \n**Optional**. May be omitted or set to null.\nIf not provided, no\
              \ updates will be made to existing scheduling settings."
    JobDefinitionCreateRequest:
      type: object
      required:
      - jobType
      - dataLocation
      properties:
        queueRun:
          type: boolean
          default: true
          description: |-
            Indicates whether the created job should be queued to run immediately after creation.

            Currently **queueRun** will always treated as true, whether the client provides a value or omits the field. Create-only behavior is not supported yet.
            In future versions, this field will become fully optional and will default to false.
        jobName:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/JobName"
          description: |-
            Unique name of the job to create/run.

            **Optional**. If omitted or null, the system generates a default unique name
            using the pattern `<schema>.<table>`. If that name already exists, an
            underscore plus a counter is appended, e.g. `<schema>.<table>_1`, `<schema>.<table>_2`, etc.
        jobType:
          $ref: "#/components/schemas/JobType"
        sourceQuery:
          $ref: "#/components/schemas/SourceQuery"
        runDate:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/RunDateValue"
          - description: "Start of the time slice used only when the `sourceQuery`\
              \ contains the `${rd}` placeholder.\nThe engine substitutes `${rd}`\
              \ using `jobSettings.dateFormat`:\n  - DATE → `yyyy-MM-dd`\n   - TIMESTAMP\
              \ → RFC 3339 `yyyy-MM-dd'T'HH:mm:ss'Z'` \n\nIf `sourceQuery` omits `${rd}`,\
              \ this value does **not** restrict the data scan and\nonly affects the\
              \ **run’s date** (e.g., run metadata/labeling, scheduling context).\n\
              \n**Optional**. May be omitted or set to null.\nIf not provided, the\
              \ system will use the current date/time as the run date."
        runDateEnd:
          $ref: "#/components/schemas/RunDateEndValue"
        dataLocation:
          $ref: "#/components/schemas/DataLocation"
        backrun:
          $ref: "#/components/schemas/Backrun"
        jobSettings:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/JobSettings"
          - description: |-
              Job-level execution settings.

              **Optional**. May be omitted or set to null.
              If not provided, default settings will be applied based on `jobType`.
              Provide only the fields you want to override, any unspecified fields fall back to defaults.
        monitoringSettings:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/JobMonitoringSettings"
          - description: "Monitoring configuration for the job, excluding custom rules.\
              \ Currently, only adaptive rules are supported. \nThis structure is\
              \ designed for future extensibility to include additional monitor types.\
              \  \n\n**Optional**. May be omitted or set to null.\nIf not provided,\
              \ default monitoring settings will be applied. Provide only the fields\n\
              you want to override, any unspecified fields fall back to defaults."
        notifications:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/JobNotifications"
          - description: "Notification configuration for a job. Controls which events\
              \ trigger a notification, who receives it, \nand which message is sent.\n\
              \n**Optional**. May be omitted or set to null.\nIf not provided, no\
              \ notifications will be configured."
        schedulingSettings:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/SchedulingSettings"
          - description: "Controls when a scheduled job runs and how the runDate is\
              \ adjusted by schedule-specific offsets. \nThe scheduler runs at the\
              \ given UTC time and applies the selected mode (HOURLY/DAILY/MONTHLY).\n\
              \n**Optional**. May be omitted or set to null.\nIf not provided, no\
              \ scheduling settings will be applied."
    JobDefinitionCreateResponse:
      allOf:
      - $ref: "#/components/schemas/JobDefinition"
      - type: object
        description: |-
          Response for job creation. Contains all fields of `JobDefinition`
          plus an optional identifier of the queued run when `queueRun = true`.
        properties:
          jobRunId:
            type: string
            format: uuid
            nullable: true
            description: |-
              Identifier of the queued job run, if the job was scheduled
              to run immediately after creation.

              - Present when `queueRun = true` and the run was successfully queued.
              - `false` when the job was created without an immediate run (future state).
    JobName:
      type: string
      description: |
        Job name. Allowed characters by default: letters, digits, `_`, `.`, `-`. **Configurable** via the server env variable `VALIDATION_PATTERN_JOB_NAME`. Default pattern: `^[a-zA-Z0-9_.-]+$`.
      minLength: 1
      maxLength: 255
      pattern: "^[a-zA-Z0-9_.-]+$"
      example: crm_raw.DimAccount
    JobRunStatus:
      type: string
      maxLength: 255
      description: |-
        Status of an individual job run.

        Current possible values include:
          * `WAITING`
          * `DISPATCHED`
          * `SETUP`
          * `RUNNING`
          * `SENDING`
          * `FINISHED`
          * `CANCELLED`
          * `FAILED`
          * `UNKNOWN`

        Additional statuses may be introduced in the future.
      example: RUNNING
    JobActivity:
      type: string
      description: |-
        Current activity within the job run.

        Current possible values include:
          * `INIT`
          * `SCHEMA`
          * `LOAD`
          * `DISCOVERY`
          * `PROFILE`
          * `RULES`
          * `HISTOGRAMS`
          * `CORRELATION`
          * `LAYERS`
          * `RESULTS`
          * `ALERTS`
          * `""` – no activity / idle (legacy representation).

        Additional activities may be introduced in the future. Clients SHOULD treat
        unknown values as “implementation detail” and not fail on them.
      example: PROFILE
    JobRunRequest:
      type: object
      description: |
        Parameters for a single job run. If omitted, defaults apply (now as a runDate, no backrun).
      properties:
        runDate:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/RunDateValue"
          - description: |-
              Start of the time slice used only when the `sourceQuery` contains the `${rd}` placeholder.
              The engine substitutes `${rd}` using `jobSettings.dateFormat`:
                - DATE → `yyyy-MM-dd`
                - TIMESTAMP → RFC 3339 `yyyy-MM-dd'T'HH:mm:ss'Z'`

              If `sourceQuery` omits `${rd}`, this value does **not** restrict the data scan and
              only affects the **run’s date** (e.g., run metadata/labeling, scheduling context).

              **Optional**. If omitted, the service uses the current date/time
        runDateEnd:
          $ref: "#/components/schemas/RunDateEndValue"
        backrun:
          nullable: true
          allOf:
          - $ref: "#/components/schemas/Backrun"
          - description: |
              Optional historical backfill: trigger additional runs for prior periods based on `timeBin` and `binValue`.
      additionalProperties: false
    JobRun:
      type: object
      description: |-
        Individual job run.

        Fields fall into three populated-when buckets:
          - **Always populated** (run lifecycle): `jobRunId`, `jobName`,
            `status`, `runDate`, `activity`, `startedBy`, `startTime`,
            `updatedAt`.
          - **Populated for terminal states** (`FINISHED`, `CANCELLED`,
            `FAILED`) where data is available, otherwise `null`: `endTime`,
            `executionTimeSeconds`, `score`, `activeMonitors`,
            `breakingMonitors`, `rowCount`, `executedQuery`.
          - **Populated when configured / on failure**: `sourceQuery`
            (only if the job defines one), `exception` (only on `FAILED`).
      properties:
        jobRunId:
          type: string
          format: uuid
          description: Id of the individual job run
          example: 9c1d1e3a-2b4f-4a6c-8d90-111213141516
        jobName:
          $ref: "#/components/schemas/JobName"
        runDate:
          $ref: "#/components/schemas/RunDateValue"
        status:
          $ref: "#/components/schemas/JobRunStatus"
          example: RUNNING
        activity:
          $ref: "#/components/schemas/JobActivity"
          example: PROFILE
        exception:
          type: string
          nullable: true
          description: Job exception message if the run failed
          example: Connection timeout to source
        startedBy:
          type: string
          format: uuid
          description: User id who run the job
          example: d6973b7c-383a-4bf3-b29e-1b664bb2162e
        updatedAt:
          type: string
          format: date-time
          description: Last updated timestamp (UTC)
          example: 2025-10-23T13:52:10Z
        startTime:
          type: string
          format: date-time
          description: Job start timestamp (UTC)
          example: 2025-10-23T13:50:05Z
        endTime:
          type: string
          format: date-time
          nullable: true
          description: "Timestamp (UTC, ISO 8601) when the run reached a terminal\
            \ state. Null while in progress."
          example: 2025-10-23T13:54:42Z
        executionTimeSeconds:
          type: integer
          format: int64
          minimum: 0
          nullable: true
          description: Wall-clock duration in seconds (`endTime - startTime`). Null
            while in progress.
          example: 277
        score:
          type: number
          format: double
          minimum: 0
          maximum: 100
          nullable: true
          description: "Overall data quality score for the run, as a percentage in\
            \ `[0, 100]`. Null if scoring did not complete."
          example: 95.0
        activeMonitors:
          type: integer
          format: int32
          minimum: 0
          nullable: true
          description: Count of monitors evaluated during the run. Null if evaluation
            did not complete.
          example: 20
        breakingMonitors:
          type: integer
          format: int32
          minimum: 0
          nullable: true
          description: Count of monitors that reported a breaking status. Null if
            evaluation did not complete.
          example: 1
        rowCount:
          type: integer
          format: int64
          minimum: 0
          nullable: true
          description: Number of rows scanned or processed by the run. Null if the
            data scan did not complete.
          example: 150000
        sourceQuery:
          $ref: "#/components/schemas/SourceQuery"
        executedQuery:
          type: string
          nullable: true
          description: |-
            The query actually executed for this run, with `${rd}` /
            `${rdEnd}` substituted using the job's configured `dateFormat`.
            This is the post-substitution form of `sourceQuery` — the
            schema/table names, predicates, and any literal values it
            contains are the same surface already exposed via
            `sourceQuery` on `JobDefinition`.

            Null if the run failed before substitution.
          example: SELECT * FROM "public"."nyse" WHERE "trade_date" >= '2025-10-22T13:00:00Z'
            AND "trade_date" < '2025-10-23T13:00:00Z'
    JobRunPaginated:
      type: object
      description: Paged list of job runs
      properties:
        results:
          type: array
          items:
            $ref: "#/components/schemas/JobRun"
        total:
          type: integer
          format: int64
          minimum: 0
          description: Total number of matching items
          example: 728
        offset:
          type: integer
          format: int64
          minimum: 0
          description: Current offset
          example: 0
        limit:
          type: integer
          format: int64
          minimum: 0
          description: Page size
          example: 100
      required:
      - results
      - total
      - offset
      - limit
    JobRunProfileResults:
      type: object
      description: |-
        Paginated per-column profiling results captured during a single job
        run. The header fields (`jobRunId`, `jobName`, `runDate`) identify the
        run; `results` carries one entry per profiled column for the requested
        page. Results are returned in deterministic order, ascending by column
        name.
      required:
      - results
      properties:
        jobRunId:
          type: string
          format: uuid
          description: Unique identifier of the job run that produced these results.
          example: a1b2c3d4-e5f6-7890-abcd-ef1234567890
        jobName:
          $ref: "#/components/schemas/JobName"
        runDate:
          allOf:
          - $ref: "#/components/schemas/RunDateValue"
          - description: |-
              The run window of the run that produced these results. Shape
              follows the job's configured `dateFormat`:
                * `DATE`      – `{ "kind": "DATE", "value": "yyyy-MM-dd" }`
                * `TIMESTAMP` – `{ "kind": "TIMESTAMP", "value": "<RFC 3339 in UTC>" }`
        offset:
          type: integer
          format: int64
          minimum: 0
          description: Index of the first column profile in this page.
          example: 0
        limit:
          type: integer
          format: int64
          minimum: 0
          description: Maximum number of column profiles in this page.
          example: 100
        total:
          type: integer
          format: int64
          minimum: 0
          description: |-
            Total number of column profiles available for this run, across all
            pages. Only present when the request included `includeTotal=true`.
          example: 35
        results:
          type: array
          description: One entry per profiled column for the requested page.
          items:
            $ref: "#/components/schemas/ColumnProfile"
    ColumnProfile:
      type: object
      description: Profiling statistics for a single column from one job run.
      required:
      - columnName
      - valueCount
      - nullCount
      - emptyCount
      - uniqueCount
      properties:
        columnName:
          type: string
          maxLength: 255
          description: Source column name.
          example: order_id
        definedType:
          type: string
          nullable: true
          description: "Type declared by the source schema (e.g. `BIGINT`, `VARCHAR(255)`,\
            \ `DECIMAL`)."
          example: BIGINT
        inferredType:
          type: string
          nullable: true
          description: |-
            Type inferred from the observed values during profiling (e.g. `Int`,
            `String`, `Decimal`, `Long`, `Double`, `Timestamp`). When a column
            holds a mix of types, the value is a comma-separated list ordered
            by detection (e.g. `String, Int`). May differ from `definedType`
            when the source schema is wider than the actual data.
          example: Int
        valueCount:
          type: integer
          format: int64
          minimum: 0
          description: "Number of non-null, non-empty values observed."
          example: 150000
        nullCount:
          type: integer
          format: int64
          minimum: 0
          description: Number of `NULL` values observed.
          example: 0
        emptyCount:
          type: integer
          format: int64
          minimum: 0
          description: Number of empty values (e.g. empty strings) observed.
          example: 0
        uniqueCount:
          type: integer
          format: int64
          minimum: 0
          description: Number of distinct values observed (exact or approximate depending
            on engine).
          example: 150000
        min:
          type: string
          nullable: true
          description: "Minimum value observed, serialized as a string. Null if no\
            \ values were observed."
          example: 1000
        max:
          type: string
          nullable: true
          description: "Maximum value observed, serialized as a string. Null if no\
            \ values were observed."
          example: 999999
        mean:
          type: string
          nullable: true
          description: "Arithmetic mean (average), serialized as a string. Populated\
            \ only for numeric columns."
          example: 47.3
        median:
          type: string
          nullable: true
          description: "Median (50th percentile), serialized as a string. Populated\
            \ only for numeric columns."
          example: 47.5
        q1:
          type: string
          nullable: true
          description: "First quartile (25th percentile), serialized as a string.\
            \ Populated only for numeric columns."
          example: 12.99
        q3:
          type: string
          nullable: true
          description: "Third quartile (75th percentile), serialized as a string.\
            \ Populated only for numeric columns."
          example: 199.0
        topShapes:
          type: array
          nullable: true
          description: |-
            Top observed shape patterns ordered by descending frequency.
            Null if shape analysis did not run.

            Shapes use a character-class encoding (`#` for digits, `A` for
            letters, etc.).
          items:
            $ref: "#/components/schemas/ColumnShape"
    ColumnShape:
      type: object
      description: A single observed value shape for a column.
      required:
      - pattern
      - count
      - percentage
      properties:
        pattern:
          type: string
          maxLength: 255
          description: The shape pattern (e.g. `######` for six digits).
          example: "######"
        count:
          type: integer
          format: int64
          minimum: 0
          description: Number of values matching this shape.
          example: 148500
        percentage:
          type: number
          format: double
          minimum: 0
          maximum: 100
          description: Percentage of non-null values matching this shape.
          example: 99.0
    JobRunMonitorsResult:
      type: object
      description: Combined list of all monitor results for a job run.
      required:
      - adaptiveMonitors
      - customMonitors
      properties:
        adaptiveMonitors:
          type: array
          maxItems: 500
          items:
            $ref: "#/components/schemas/AdaptiveMonitorResult"
        customMonitors:
          type: array
          maxItems: 500
          items:
            $ref: "#/components/schemas/CustomMonitorResult"
    JobRunMonitorOperationsRequest:
      type: object
      description: Bulk request to apply pass/suppress operations to monitor results
        of a job run.
      required:
      - operations
      properties:
        operations:
          type: array
          minItems: 1
          maxItems: 500
          description: List of monitor operations to apply.
          items:
            $ref: "#/components/schemas/JobRunMonitorOperation"
    JobRunMonitorOperation:
      type: object
      description: A single operation to apply to a monitor result for a job run.
      required:
      - monitorName
      - operation
      properties:
        monitorName:
          type: string
          minLength: 1
          maxLength: 255
          pattern: "^[a-zA-Z0-9_-]+$"
          description: Unique monitor name.
          example: MIN_CLOSE
        operation:
          type: string
          enum:
          - PASS
          - SUPPRESS
          description: |-
            Operation to apply to the monitor result:
            * `PASS`     — Set state to passing and retrain (adaptive monitors only).
            * `SUPPRESS` — Set state to suppressed and retrain adaptive monitors.
          example: PASS
    AdaptiveMonitorResult:
      type: object
      description: The outcome of an adaptive monitor for a specific job run.
      required:
      - monitorName
      - monitorType
      - state
      properties:
        monitorName:
          type: string
          description: Name of the monitor.
          example: ROW_COUNT
        monitorType:
          $ref: "#/components/schemas/AdaptiveMonitorType"
        primaryColumn:
          type: string
          description: Column the monitor applies to. "ALL" for dataset-level monitors.
          example: ALL
        state:
          $ref: "#/components/schemas/MonitorState"
        observedValue:
          type: string
          description: The measured metric value for this run.
          example: 1000
        expectedMin:
          type: string
          description: Lower bound of the adaptive expected range.
          example: 900
        expectedMax:
          type: string
          description: Upper bound of the adaptive expected range.
          example: 1100
        tolerance:
          $ref: "#/components/schemas/AdaptiveMonitorTolerance"
        isSuppressed:
          type: boolean
          description: Whether findings for this result are suppressed.
          example: false
        dimensions:
          type: array
          maxItems: 50
          description: DQ dimensions associated with this monitor type.
          items:
            type: string
          example:
          - COMPLETENESS
    AdaptiveMonitorType:
      type: string
      description: |
        Identifies the adaptive monitor type. Dataset-level monitors apply to the whole dataset; column-level monitors apply per column.
        * 'ROW_COUNT'       - Dataset level count of rows * 'NULL_VALUES'     - Row level count of null values * 'EMPTY_FIELDS'    - Row level count of string empty values * 'UNIQUENESS'      - Row level count of unique values * 'MIN'             - Row level minimum value * 'MAX'             - Row level maximum value * 'MEAN'            - Row level mean value (numerics only) * 'EXECUTION_TIME'  - Dataset level execution time of job * 'SHIFT'           - Column level type ratio * 'SCHEMA_CHANGE'   - Dataset level change in the source schema
      example: ROW_COUNT
    AdaptiveMonitorTolerance:
      type: string
      description: |
        Controls how aggressively the adaptive boundary model updates its expected range.
        The current available values: * 'NARROW' - most strict (slowest to update) * 'NEUTRAL' - default tolerance * 'WIDE' - most lenient (fastest to update).
      default: NEUTRAL
      example: NEUTRAL
    CustomMonitorResult:
      type: object
      description: The outcome of a custom monitor for a specific job run.
      required:
      - monitorName
      - state
      - score
      properties:
        monitorName:
          type: string
          description: Monitor name.
          example: Name_Not_Null_Monitor
        state:
          $ref: "#/components/schemas/MonitorState"
        score:
          type: number
          format: double
          minimum: 0
          maximum: 100
          description: Score based on sum of points per breaking row (0 - 100).
          example: 40
        breakingPercentage:
          type: number
          format: double
          minimum: 0
          maximum: 100
          description: Percentage of records breaking.
          example: 20
        rowsPassing:
          type: integer
          description: Number of rows that passed.
          example: 80
        rowsBreaking:
          type: integer
          description: Number of rows that failed.
          example: 20
        rowsTotal:
          type: integer
          description: Number of total rows.
          example: 100
        exception:
          type: string
          description: Error message captured when the monitor query failed to execute.
            Empty when the monitor ran successfully.
          example: "Query failed: column NAME does not exist on PUBLIC.SAMPLE_DATASET"
        dimensions:
          type: array
          maxItems: 50
          description: DQ dimensions associated with this monitor.
          items:
            type: string
          example:
          - COMPLETENESS
        tolerance:
          type: integer
          minimum: 0
          maximum: 100
          description: Percentage of tolerated failures before this monitor is flagged
            as BREAKING (mirrors the value supplied at monitor configuration time).
          example: 10
    MonitorState:
      type: string
      description: |
        The current state of a monitor for a given job run.
        The current available values: * 'PASSING'    — observed value is within expected bounds * 'BREAKING'   — observed value is outside expected bounds * 'SUPPRESSED' — findings are suppressed and excluded from scoring * 'SKIPPED'    — execution of monitor skipped * 'EXCEPTION'  — an exception was encountered executing the monitor
      example: PASSING
    SourceQuery:
      nullable: true
      type: string
      description: "Source SQL for the job. \n\n- If you want to limit the data slice\
        \ by date/time, **do not hard-code literal\n  dates** in the SQL. Always use\
        \ the placeholders `${rd}` (start) and `${rdEnd}`\n  (exclusive end), and\
        \ pass the actual values via the `runDate` / `runDateEnd`\n  fields of the\
        \ request.  \n  Example pattern: `WHERE \"trade_date\" >= '${rd}' AND \"trade_date\"\
        \ < '${rdEnd}'` \n- The engine will substitute `${rd}` / `${rdEnd}` based\
        \ on your chosen\n  `dateFormat` (DATE or TIMESTAMP). \n- Keep the placeholders\
        \ inside single quotes in SQL (e.g. `'${rd}'`). \n- If you do not include\
        \ a date predicate, the job will scan the full table (or\n  whatever the query\
        \ returns). \n- If omitted, the platform will generate a default(vendor compatible)\
        \ `SELECT * FROM \"<schema>\".\"<table>\"`"
      example: "SELECT * FROM \"public\".\"nyse\" WHERE \"trade_date\" >= '${rd}'\
        \ AND \"trade_date\" < '${rdEnd}'"
    DatabaseProduct:
      type: string
      readOnly: true
      description: |-
        The database vendor associated with the connection.

        Current possible values include:
            * `ATHENA`
            * `BIGQUERY`
            * `DATABRICKS`
            * `DB2`
            * `MYSQL`
            * `POSTGRES`
            * `REDSHIFT`
            * `SAP`
            * `SNOWFLAKE`
            * `SQLSERVER`
            * `TRINO`

          Additional values will be introduced in the future.
      example: POSTGRES
    JobType:
      type: string
      description: |
        Execution mode for Data Quality job. Pullup jobs are available only when the Pullup preview feature is enabled. Allowed values: "PUSHDOWN", "PULLUP".
      example: PUSHDOWN
    JobDefinitionPaginated:
      type: object
      description: Paged list of jobs
      properties:
        results:
          type: array
          items:
            $ref: "#/components/schemas/JobDefinition"
        total:
          type: integer
          format: int64
          minimum: 0
          description: Total number of matching items.
          example: 237
        offset:
          type: integer
          format: int64
          minimum: 0
          description: Current offset.
          example: 0
        limit:
          type: integer
          format: int64
          minimum: 0
          description: Page size.
          example: 100
    JobSubmission:
      type: object
      properties:
        jobRunId:
          type: string
          format: uuid
    DataLocation:
      description: |
        Identifies where the job reads data from. Combines the platform connection and the specific catalog/schema/table location inside that connection.
      required:
      - edgeSiteName
      - edgeConnectionName
      - dataSourceName
      - schemaName
      - tableName
      type: object
      properties:
        edgeSiteName:
          description: Edge site name
          type: string
          example: US-East-1-Prod-Edge
        edgeConnectionName:
          type: string
          description: Edge connection name
          example: Finance-Postgres-GCP
        dataSourceName:
          type: string
          description: Data source (database/catalog) name
          example: public
        databaseProductName:
          $ref: "#/components/schemas/DatabaseProduct"
        schemaName:
          description: Schema name
          type: string
          example: public
        tableName:
          description: Table name
          type: string
          example: nyse
    BackrunTimeBin:
      type: string
      description: |-
        Time bin used when defining backruns.

        Current possible values include:
          * `DAY`   – backrun by day.
          * `MONTH` – backrun by month.
          * `YEAR`  – backrun by year.

        Additional values may be introduced in the future
      example: DAY
    Backrun:
      type: object
      nullable: true
      description: |
        Enables historical backfill runs relative to the scheduled runDate. If included, additional runs will be triggered for the previous `binValue` time bins using the selected `timeBin`. Example: DAY + 10 -> run the previous 10 days.
      properties:
        timeBin:
          $ref: "#/components/schemas/BackrunTimeBin"
        binValue:
          type: integer
          minimum: 1
          description: Number of past bins to backfill
          example: 10
      required:
      - timeBin
      - binValue
    JobSettings:
      type: object
      description: |
        Job-level execution settings, including date format and pushdown/pullup tuning. Pullup jobs are available only when the Pullup preview feature is enabled.
      properties:
        dateFormat:
          $ref: "#/components/schemas/DateFormat"
        pushdownSettings:
          $ref: "#/components/schemas/PushdownSettings"
        pullupSettings:
          $ref: "#/components/schemas/PullupSettings"
    JobSettingsPatch:
      type: object
      nullable: true
      properties:
        dateFormat:
          $ref: "#/components/schemas/DateFormatPatch"
        pushdownSettings:
          $ref: "#/components/schemas/PushdownSettingsPatch"
        pullupSettings:
          $ref: "#/components/schemas/PullupSettingsPatch"
    PushdownSettings:
      type: object
      nullable: true
      description: |-
        Settings for pushdown execution. Controls concurrency used by the source system connection.
        Provide this object only when the job's jobType is PUSHDOWN. Omit or set to null for non-pushdown jobs.
      properties:
        connections:
          type: integer
          minimum: 1
          default: 10
          description: |
            Number of concurrent source connections
        threads:
          type: integer
          minimum: 1
          default: 5
          description: |
            Worker threads per connection for pushdown queries
    PushdownSettingsPatch:
      type: object
      nullable: true
      description: |-
        Settings for pushdown execution. Controls concurrency used by the source system connection.
        Provide this object only when the job's jobType is PUSHDOWN. Omit or set to null for non-pushdown jobs.
      properties:
        connections:
          type: integer
          description: |
            Number of concurrent source connections
          minimum: 1
          nullable: true
        threads:
          type: integer
          description: |
            Worker threads per connection for pushdown queries
          minimum: 1
          nullable: true
    PullupSettings:
      type: object
      nullable: true
      description: |-
        Settings for pullup execution. Controls partitioning and Spark sizing.
        Provide this object only when the job's jobType is PULLUP. Omit or set to null for non-pullup jobs.

        Pullup functionality is available only when the Pullup preview feature is enabled.
      properties:
        loadOptions:
          $ref: "#/components/schemas/LoadOptions"
        sparkJobSizing:
          $ref: "#/components/schemas/SparkJobSizing"
        sparkSqlProperties:
          type: object
          nullable: true
          description: |
            Arbitrary Spark SQL session properties as key/value pairs
          additionalProperties:
            type: string
          example:
            spark.sql.shuffle.partitions: 200
            spark.dynamicAllocation.enabled: "true"
    PullupSettingsPatch:
      type: object
      nullable: true
      description: |-
        Settings for pullup execution. Controls partitioning and Spark sizing.
        Provide this object only when the job's jobType is PULLUP. Omit or set to null for non-pullup jobs.

        Pullup functionality is available only when the Pullup preview feature is enabled.
      properties:
        loadOptions:
          $ref: "#/components/schemas/LoadOptionsPatch"
        sparkJobSizing:
          $ref: "#/components/schemas/SparkJobSizingPatch"
        sparkSqlProperties:
          type: object
          nullable: true
          description: |
            Arbitrary Spark SQL session properties as key/value pairs
          additionalProperties:
            type: string
          example:
            spark.sql.shuffle.partitions: 200
            spark.dynamicAllocation.enabled: "true"
    LoadOptions:
      type: object
      nullable: true
      description: |
        Data loading options applied when reading from the source
      properties:
        numPartitions:
          type: integer
          minimum: 0
          default: 0
          description: |
            Number of Spark input partitions
        parallelJdbcOptions:
          $ref: "#/components/schemas/ParallelJdbcOptions"
    LoadOptionsPatch:
      type: object
      nullable: true
      description: |
        Data loading options applied when reading from the source
      properties:
        numPartitions:
          type: integer
          nullable: true
          minimum: 0
          description: |
            Number of Spark input partitions
        parallelJdbcOptions:
          $ref: "#/components/schemas/ParallelJdbcOptions"
    ParallelJdbcOptions:
      nullable: true
      description: "Options for parallel JDBC partitioning. Choose a `mode`, which\
        \ determines which\nfields are required: \n - `AUTO` – system selects column\
        \ & partitions \n - `AUTO_COLUMN` – system selects column; you provide `partitionNumber`\n\
        \ - `MANUAL` – you provide `partitionColumn` and `partitionNumber`"
      oneOf:
      - $ref: "#/components/schemas/ParallelJdbcOptionsAuto"
      - $ref: "#/components/schemas/ParallelJdbcOptionsAutoColumn"
      - $ref: "#/components/schemas/ParallelJdbcOptionsManual"
      discriminator:
        propertyName: mode
        mapping:
          AUTO: "#/components/schemas/ParallelJdbcOptionsAuto"
          AUTO_COLUMN: "#/components/schemas/ParallelJdbcOptionsAutoColumn"
          MANUAL: "#/components/schemas/ParallelJdbcOptionsManual"
      default: null
    SparkJobSizing:
      type: object
      nullable: true
      description: |-
        Optional manual sizing for Spark resources.

        If this object is **omitted or null**, the platform automatically selects
        Spark resources based on the source query.
      properties:
        numExecutors:
          type: integer
          minimum: 1
          description: Number of executors to use (upper bound).
          default: 1
          example: 50
        driverCores:
          type: integer
          minimum: 1
          description: Number of driver CPU cores.
          default: 1
          example: 1
        numExecutorCores:
          type: integer
          minimum: 1
          description: Number of CPU cores per executor.
          default: 1
          example: 2
        executorMemoryGb:
          allOf:
          - $ref: "#/components/schemas/SparkMemoryGB"
          - description: Maximum memory per executor in GB.
            default: 1
            example: 2
        driverMemoryGb:
          allOf:
          - $ref: "#/components/schemas/SparkMemoryGB"
          - description: Driver memory in GB.
            default: 1
            example: 4
        memoryOverheadGb:
          allOf:
          - $ref: "#/components/schemas/SparkMemoryGB"
          - description: Additional off-heap memory per executor in GB.
            nullable: true
            default: null
            example: 2
      additionalProperties: false
      example:
        numExecutors: 3
        driverCores: 1
        numExecutorCores: 2
        executorMemoryGb: 2
        driverMemoryGb: 4
        memoryOverheadGb: 2
    SparkJobSizingPatch:
      type: object
      nullable: true
      description: |-
        Optional manual sizing for Spark resources.

        If this object is **omitted or null**, the platform automatically selects
        Spark resources based on the source query.
      properties:
        numExecutors:
          type: integer
          minimum: 1
          description: Number of executors to use (upper bound).
          example: 50
        driverCores:
          type: integer
          minimum: 1
          description: Number of driver CPU cores.
          example: 1
        numExecutorCores:
          type: integer
          minimum: 1
          description: Number of CPU cores per executor.
          example: 2
        executorMemoryGb:
          allOf:
          - $ref: "#/components/schemas/SparkMemoryGB"
          - description: Maximum memory per executor in GB.
            example: 2
        driverMemoryGb:
          allOf:
          - $ref: "#/components/schemas/SparkMemoryGB"
          - description: Driver memory in GB.
            example: 4
        memoryOverheadGb:
          allOf:
          - $ref: "#/components/schemas/SparkMemoryGB"
          - description: Additional off-heap memory per executor in GB.
            nullable: true
            example: 2
      additionalProperties: false
      example:
        numExecutors: 3
        driverCores: 1
        numExecutorCores: 2
        executorMemoryGb: 2
        driverMemoryGb: 4
        memoryOverheadGb: 2
    SparkMemoryGB:
      type: integer
      description: |
        Memory amount in gigabytes. The unit is in **GB**, fractional values are not supported
      example: 4
    ParallelJdbcOptionsAuto:
      type: object
      description: Automatic column & partition selection.
      properties:
        mode:
          type: string
          description: |-
            Partitioning mode.

            For this schema, the value MUST be `AUTO`.
          example: AUTO
      required:
      - mode
      additionalProperties: false
    ParallelJdbcOptionsAutoColumn:
      type: object
      description: Automatic column selection; you specify the number of partitions.
      properties:
        mode:
          type: string
          description: |-
            Partitioning mode.

            For this schema, the value MUST be `AUTO_COLUMN`.
          example: AUTO_COLUMN
        partitionNumber:
          type: integer
          minimum: 0
          description: Number of partitions to use.
          example: 4
      required:
      - mode
      - partitionNumber
      additionalProperties: false
    ParallelJdbcOptionsManual:
      type: object
      description: You specify both the partition column and number of partitions.
      properties:
        mode:
          type: string
          description: |-
            Partitioning mode.

            For this schema, the value MUST be `MANUAL`.
          example: MANUAL
        partitionColumn:
          type: string
          description: Numeric/integer column to partition on.
          example: quantity
        partitionNumber:
          type: integer
          minimum: 1
          description: Number of partitions to use.
          example: 4
      required:
      - mode
      - partitionColumn
      - partitionNumber
      additionalProperties: false
    JobMonitoringSettings:
      type: object
      description: Monitoring configuration for the job.  This structure is designed
        for future extensibility to include additional monitor types.
      properties:
        adaptiveMonitors:
          $ref: "#/components/schemas/AdaptiveMonitors"
        customMonitors:
          type: array
          maxItems: 65535
          items:
            $ref: "#/components/schemas/CustomMonitors"
    JobMonitoringSettingsPatch:
      type: object
      description: Monitoring configuration for the job.  This structure is designed
        for future extensibility to include additional monitor types.
      properties:
        adaptiveMonitors:
          $ref: "#/components/schemas/AdaptiveMonitorsPatch"
        customMonitors:
          type: array
          maxItems: 65535
          items:
            $ref: "#/components/schemas/CustomMonitorsPatch"
    AdaptiveMonitors:
      type: object
      description: |
        Feature toggles for adaptive monitors computed during profiling. All data quality jobs always run profiling with data type detection and schema-change checks enabled.
      properties:
        descriptiveStatistics:
          type: boolean
          default: false
          description: |
            Show descriptive statistics in profiling results (e.g., count, min, mean, max). Note: may expose sensitive values such as minimum/maximum. If disabled, all column values are masked in the profiling results.
        emptyFields:
          type: boolean
          default: true
          description: |
            Detect changes in the number of empty values in numeric columns.
        executionTime:
          type: boolean
          default: false
          description: |
            Track changes in total execution time of the data job.
        max:
          type: boolean
          default: false
          description: |
            Detect changes in the highest value across numeric columns.
        mean:
          type: boolean
          default: false
          description: |
            Detect changes in the average (mean) value across numeric columns.
        min:
          type: boolean
          default: false
          description: |
            Detect changes in the lowest value across numeric columns.
        nullValues:
          type: boolean
          default: true
          description: |
            Detect changes in the number of NULL values across all columns.
        rowCount:
          type: boolean
          default: true
          description: |
            Track changes in the total number of rows.
        uniqueness:
          type: boolean
          default: true
          description: |
            Track changes in the number of distinct values across all columns.
        settings:
          $ref: "#/components/schemas/AdaptiveMonitorSettings"
    AdaptiveMonitorsPatch:
      type: object
      description: |
        Feature toggles for adaptive monitors computed during profiling. All data quality jobs always run profiling with data type detection and schema-change checks enabled.
      properties:
        descriptiveStatistics:
          type: boolean
          nullable: true
          description: |
            Show descriptive statistics in profiling results (e.g., count, min, mean, max). Note: may expose sensitive values such as minimum/maximum. If disabled, all column values are masked in the profiling results.
        emptyFields:
          type: boolean
          nullable: true
          description: |
            Detect changes in the number of empty values in numeric columns.
        executionTime:
          type: boolean
          nullable: true
          description: |
            Track changes in total execution time of the data job.
        max:
          type: boolean
          nullable: true
          description: |
            Detect changes in the highest value across numeric columns.
        mean:
          type: boolean
          nullable: true
          description: |
            Detect changes in the average (mean) value across numeric columns.
        min:
          type: boolean
          nullable: true
          description: |
            Detect changes in the lowest value across numeric columns.
        nullValues:
          type: boolean
          nullable: true
          description: |
            Detect changes in the number of NULL values across all columns.
        rowCount:
          type: boolean
          nullable: true
          description: |
            Track changes in the total number of rows.
        uniqueness:
          type: boolean
          nullable: true
          description: |
            Track changes in the number of distinct values across all columns.
        settings:
          $ref: "#/components/schemas/AdaptiveMonitorSettingsPatch"
    AdaptiveMonitorSettings:
      type: object
      description: |
        Optional learning/tuning parameters applied to the above monitors.
      properties:
        dataLookBack:
          type: integer
          minimum: 0
          default: 10
          description: |
            Number of historical runs to consider when detecting changes (0 = no look back).
        learningPhase:
          type: integer
          minimum: 0
          default: 4
          description: "Number of initial runs used to learn a baseline before signaling\
            \ changes (0 = no learning phase).    \n"
    AdaptiveMonitorSettingsPatch:
      type: object
      description: |
        Optional learning/tuning parameters applied to the above monitors.
      properties:
        dataLookBack:
          type: integer
          nullable: true
          minimum: 0
          description: |
            Number of historical runs to consider when detecting changes (0 = no look back).
        learningPhase:
          type: integer
          minimum: 0
          nullable: true
          description: |
            Number of initial runs used to learn a baseline before signaling changes (0 = no learning phase).
    CustomMonitorNotificationType:
      type: string
      description: |
        Determines when a notification is triggered.
        The current available values: * 'PASSING'   — monitor transitions to a passing state * 'BREAKING'  — monitor fails * 'EXCEPTION' — monitor encounters an execution error
      example: BREAKING
    CustomMonitorNotification:
      type: object
      description: Alert notification configuration attached to a custom monitor.
      required:
      - notificationType
      - enabled
      - message
      - name
      properties:
        notificationType:
          $ref: "#/components/schemas/CustomMonitorNotificationType"
        enabled:
          type: boolean
          description: Whether this notification is active.
          example: true
        message:
          type: string
          description: Custom notification message.
          maxLength: 256
          example: NAME column contains null values
        channels:
          type: array
          maxItems: 500
          description: Channels to send out notifications.
          items:
            $ref: "#/components/schemas/NotificationChannel"
        name:
          type: string
          description: Unique identifier for this notification entry.
          example: BREAKING_0cc3ed7f-a34f-4bb6-a75e-a17187302999
    CustomMonitors:
      type: object
      description: A user-defined custom data quality monitor.
      required:
      - monitorName
      - customQuery
      properties:
        monitorName:
          type: string
          description: Unique monitor name.
          pattern: "^[a-zA-Z0-9_-]+$"
          minLength: 1
          maxLength: 255
          example: Name_Not_Null_Monitor
        customQuery:
          type: string
          description: The SQL query.
          example: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE NAME IS NULL
        filterQuery:
          type: string
          description: Optional SQL filter clause applied to the monitor.
          example: WHERE STATUS = 'ACTIVE'
        primaryColumn:
          type: string
          description: Column the monitor is scoped to.
          example: NAME
        description:
          type: string
          description: Human-readable description of the monitor.
          maxLength: 256
          example: Checks that the NAME column contains no null values
        dimensions:
          type: array
          maxItems: 50
          description: DQ dimensions this monitor measures.
          items:
            type: string
          example:
          - COMPLETENESS
        notifications:
          type: array
          maxItems: 500
          description: Alert notification configurations.
          items:
            $ref: "#/components/schemas/CustomMonitorNotification"
        tolerance:
          type: integer
          description: Number as a percentage of tolerated failures before flagging
            the monitor as breaking.
          minimum: 0
          maximum: 100
          example: 5
        isActive:
          type: boolean
          description: Whether the monitor is active.
          example: true
        isSuppressed:
          type: boolean
          description: Whether the monitor is suppressed.
          example: false
    CustomMonitorsPatch:
      type: object
      description: An update to a user-defined custom data quality monitor.
      properties:
        monitorName:
          type: string
          description: Unique monitor name.
          pattern: "^[a-zA-Z0-9_-]+$"
          minLength: 1
          maxLength: 255
          example: Name_Not_Null_Monitor
        customQuery:
          type: string
          description: The SQL query.
          example: SELECT * FROM @PUBLIC.SAMPLE_DATASET WHERE NAME IS NULL
        filterQuery:
          type: string
          description: Optional SQL filter clause applied to the monitor.
          example: WHERE STATUS = 'ACTIVE'
        primaryColumn:
          type: string
          description: Column the monitor is scoped to.
          example: NAME
        description:
          type: string
          description: Description of the monitor.
          maxLength: 256
          example: Checks that the NAME column contains no null values
        dimensions:
          type: array
          maxItems: 50
          description: DQ dimensions this monitor measures.
          items:
            type: string
          example:
          - COMPLETENESS
        notifications:
          type: array
          maxItems: 500
          description: Alert notification configurations.
          items:
            $ref: "#/components/schemas/CustomMonitorNotification"
        tolerance:
          type: integer
          description: Number as a percentage of tolerated failures before flagging
            the monitor as breaking.
          minimum: 0
          maximum: 100
          example: 5
        isActive:
          type: boolean
          description: Whether the monitor is active.
          example: true
        isSuppressed:
          type: boolean
          description: Whether the monitor is suppressed.
          example: false
        opIndicator:
          type: string
          enum:
          - CREATE
          - UPDATE
          - DELETE
          - NOOP
          description: Operation to be performed for this monitor
          example: CREATE
    JobNotifications:
      type: object
      description: |
        Controls which events trigger a notification, which channels deliver them, and what message is sent. This schema is **channel-extensible**: it starts with EMAIL and will be updated in future versions to support additional channels (e.g., Slack) without breaking existing clients.
      properties:
        notificationOptions:
          type: array
          description: Per-event settings. Add one item per event to monitor.
          items:
            $ref: "#/components/schemas/NotificationOption"
        globalMessage:
          type: string
          description: Default message template when `useIndividualMessages` is false.
        useIndividualMessages:
          type: boolean
          description: "If true, use each option's `message`; otherwise use `globalMessage`."
        channels:
          type: array
          minItems: 1
          description: Delivery channels and their destinations
          items:
            $ref: "#/components/schemas/NotificationChannel"
      required:
      - notificationOptions
      - channels
      example:
        globalMessage: DQ job alert
        useIndividualMessages: false
        channels:
        - channel: EMAIL
          recipients:
          - jsmith
          - adoe
        notificationOptions:
        - notificationType: JOB_FAILED
          enabled: true
        - notificationType: SCORE_LESS_THAN_LIMIT
          enabled: true
          quantity: 75
    NotificationChannel:
      type: object
      description: |-
        Notification delivery channel and its destination/parameters.

        Current supported channel type:
          * `EMAIL` – send notifications via email to the given recipients.

        Additional channel types (e.g., `SLACK`) may be introduced in the future.
      properties:
        channel:
          type: string
          description: |-
            Delivery channel type.

            Current value:
              * `EMAIL`

            Additional values MAY be added in future versions.
          example: EMAIL
        recipients:
          type: array
          minItems: 1
          description: |-
            Platform usernames to receive email notifications when `channel = EMAIL`
            (e.g., `jsmith`, `adoe`).
          items:
            type: string
      additionalProperties: true
    NotificationOption:
      type: object
      description: |
        Configuration for a single notification event.
      required:
      - notificationType
      - enabled
      properties:
        notificationType:
          $ref: "#/components/schemas/NotificationType"
        enabled:
          type: boolean
          description: Whether this notification is active.
        message:
          type: string
          description: |
            Custom message for this notification. Used when `useIndividualMessages` is `true`. If omitted or blank, the service falls back to `globalMessage`, if that is also blank, a system default template is used.
        quantity:
          type: integer
          minimum: 0
          nullable: true
          description: "Threshold used **only** for specific types:  \n  - `ROWS_LESS_THAN_LIMIT`\
            \ – minimum expected row count.  \n  - `RUNS_WITHOUT_DATA` – number of\
            \ consecutive empty runs (N).  \n  - `DAYS_WITHOUT_DATA` – number of days\
            \ with no data (N).  \n  - `SCORE_LESS_THAN_LIMIT` – minimum acceptable\
            \ score.  \n  - `RUN_TIME_MORE_THEN_LIMIT` – maximum allowed runtime in\
            \ minutes.  \nIgnored for other types."
      example:
        jobFailed:
          summary: Job failed alert
          value:
            notificationType: JOB_FAILED
            enabled: true
            message: Job PUBLIC.NYSE Failed
    NotificationType:
      type: string
      description: |-
        The event that triggers this notification.

        Current possible values include:
          * `JOB_FAILED`            – sent when a job run fails.
          * `JOB_COMPLETED`         – sent when a job run finishes successfully.
          * `ROWS_LESS_THAN_LIMIT`  – sent when produced row count is below a limit.
          * `RUNS_WITHOUT_DATA`     – sent after N consecutive runs produced no data.
          * `DAYS_WITHOUT_DATA`     – sent when no data was produced for N days.
          * `SCORE_LESS_THAN_LIMIT` – sent when quality score is below a limit.
          * `RUN_TIME_MORE_THEN_LIMIT` – sent when runtime exceeds a limit (in minutes).

        Additional notification types may be introduced in the future.
      example: JOB_FAILED
    SchedulingSettings:
      nullable: true
      description: |
        Controls when a scheduled job runs and how `runDate` is adjusted. Exactly **one** schedule mode is allowed. **Optional** If omitted or null, the job will not be scheduled.
      oneOf:
      - $ref: "#/components/schemas/SchedulingHourly"
      - $ref: "#/components/schemas/SchedulingDaily"
      - $ref: "#/components/schemas/SchedulingMonthly"
      discriminator:
        propertyName: schedulerMode
        mapping:
          HOURLY: "#/components/schemas/SchedulingHourly"
          DAILY: "#/components/schemas/SchedulingDaily"
          MONTHLY: "#/components/schemas/SchedulingMonthly"
      example:
        daily:
          summary: "Weekdays at 04:00 am UTC, no offset"
          value:
            isActive: true
            scheduledRunTime: 04:00:00
            schedulerMode: DAILY
            daily:
              dailyOffset: SCHEDULED
              daysOfWeek:
              - MONDAY
              - TUESDAY
              - WEDNESDAY
              - THURSDAY
              - FRIDAY
    SchedulingBase:
      type: object
      required:
      - isActive
      - scheduledRunTime
      - schedulerMode
      properties:
        isActive:
          type: boolean
          description: Enable/disable the schedule (disabled schedules do not trigger
            runs).
        scheduledRunTime:
          type: string
          description: |
            Time of day in **UTC**, format `HH:mm:ss`.  (24 hours) Example: `14:10:00` means the job starts at 14:10:00 UTC.
          example: 14:10:00
        schedulerMode:
          type: string
          description: |-
            Schedule type.

            Current possible values:
              * `HOURLY`
              * `DAILY`
              * `MONTHLY`

            Additional modes MAY be added in future versions.
          example: DAILY
    SchedulingHourly:
      allOf:
      - $ref: "#/components/schemas/SchedulingBase"
      - type: object
        required:
        - hourly
        - schedulerMode
        description: "Hourly schedule configuration. If scheduleRunTime is set \"\
          14:30:00\", the job runs at 14:30, 15:30, 16:30, etc."
        properties:
          schedulerMode:
            type: string
            description: |-
              Schedule type.

              For this schema, the value MUST be `HOURLY`.
            example: HOURLY
          hourly:
            type: object
            description: Hourly schedule rules.
            required:
            - hourlyOffset
            properties:
              hourlyOffset:
                type: string
                description: |-
                  Run-date offset in hours relative to the scheduled time.

                  Current possible values include:
                    * `SCHEDULED` – use the scheduled date/time.
                    * `ONE_HOUR` – run date is 1 hour before the scheduled time.
                    * `TWO_HOURS` – run date is 2 hours before the scheduled time.

                  Additional values MAY be added in future versions.
                example: SCHEDULED
    SchedulingDaily:
      allOf:
      - $ref: "#/components/schemas/SchedulingBase"
      - type: object
        required:
        - daily
        - schedulerMode
        properties:
          schedulerMode:
            type: string
            description: |-
              Schedule type.

              For this schema, the value MUST be `DAILY`.
            example: DAILY
          daily:
            type: object
            description: Daily schedule rules.
            required:
            - dailyOffset
            - daysOfWeek
            properties:
              dailyOffset:
                type: string
                description: |-
                  Run-date offset in days relative to the scheduled day.

                  Current possible values include:
                    * `SCHEDULED`
                    * `ONE_DAY`
                    * `TWO_DAYS`
                    * `THREE_DAYS`
                    * `FOUR_DAYS`
                    * `FIVE_DAYS`
                    * `SIX_DAYS`
                    * `SEVEN_DAYS`

                  Additional values MAY be added in future versions.
                example: SCHEDULED
              daysOfWeek:
                type: array
                minItems: 1
                items:
                  type: string
                  enum:
                  - MONDAY
                  - TUESDAY
                  - WEDNESDAY
                  - THURSDAY
                  - FRIDAY
                  - SATURDAY
                  - SUNDAY
                description: Days of week to run.
    SchedulingMonthly:
      allOf:
      - $ref: "#/components/schemas/SchedulingBase"
      - type: object
        required:
        - monthly
        - schedulerMode
        properties:
          schedulerMode:
            type: string
            description: |-
              Schedule type.

              For this schema, the value MUST be `MONTHLY`.
            example: MONTHLY
          monthly:
            type: object
            description: Monthly schedule rules.
            required:
            - monthlyRepeat
            - monthlyOffset
            properties:
              monthlyRepeat:
                type: string
                description: |-
                  Which day of the month to run the job on.

                  Current possible values:
                    * `FIRST` – first day of the month
                    * `LAST`  – last day of the month
                    * `DAY`   – specific calendar day (requires `dayNumber` in 1–31 range)

                  Additional values MAY be added in future versions.
                example: FIRST
              monthlyOffset:
                type: string
                description: |-
                  Run-date offset applied to the scheduled monthly day.

                  Current possible values include:
                    * `SCHEDULED`              - use the scheduled date
                    * `FIRST_OF_CURRENT_MONTH` - first day of the current month
                    * `LAST_OF_CURRENT_MONTH`  - last day of the current month
                    * `FIRST_OF_PRIOR_MONTH`   - first day of the prior month
                    * `LAST_OF_PRIOR_MONTH`    - last day of the prior month

                  Additional values may be added in future versions.
                example: SCHEDULED
              dayNumber:
                type: integer
                minimum: 1
                maximum: 31
                nullable: true
                description: Required when `monthlyRepeat = DAY`.
    DateOnly:
      type: object
      required:
      - kind
      - value
      description: "Calendar date, format yyyy-MM-dd."
      properties:
        kind:
          type: string
          pattern: ^DATE$
        value:
          type: string
          format: date
      example:
        kind: DATE
        value: 2025-10-23
    DateFormat:
      type: string
      default: DATE
      description: "Date format used for `runDate` / `runDateEnd`.\nSupported values:\n\
        \  - DATE -> yyyy-MM-dd \n  - TIMESTAMP -> RFC 3339 timestamp, example - 2025-10-23T13:50:02Z"
      enum:
      - DATE
      - TIMESTAMP
      example: DATE
    DateFormatPatch:
      type: string
      nullable: true
      description: "Date format used for `runDate` / `runDateEnd`.\nSupported values:\n\
        \  - DATE -> yyyy-MM-dd \n  - TIMESTAMP -> RFC 3339 timestamp, example - 2025-10-23T13:50:02Z"
      enum:
      - DATE
      - TIMESTAMP
      example: DATE
    Rfc3339DateTime:
      type: object
      required:
      - kind
      - value
      format: date-time
      description: "RFC 3339 timestamp with timezone offset. The server normalizes\
        \ all inputs to UTC and responses are returned in UTC (trailing 'Z'), seconds\
        \ precision."
      properties:
        kind:
          type: string
          pattern: ^TIMESTAMP$
        value:
          type: string
          format: date-time
      example:
        kind: TIMESTAMP
        value: 2025-10-23T13:50:02Z
    RunDateValue:
      description: "Start of the time slice used only when the `sourceQuery` contains\
        \ the `${rd}` placeholder.\nThe engine substitutes `${rd}` using `jobSettings.dateFormat`:\n\
        \  - DATE → `yyyy-MM-dd`\n  - TIMESTAMP → RFC 3339 `yyyy-MM-dd'T'HH:mm:ss'Z'`\
        \ \n\nIf `sourceQuery` omits `${rd}`, this value does **not** restrict the\
        \ data scan and\nonly affects the **run’s date** (e.g., run metadata/labeling,\
        \ scheduling context)."
      oneOf:
      - $ref: "#/components/schemas/DateOnly"
      - $ref: "#/components/schemas/Rfc3339DateTime"
      discriminator:
        propertyName: kind
        mapping:
          DATE: "#/components/schemas/DateOnly"
          TIMESTAMP: "#/components/schemas/Rfc3339DateTime"
    RunDateEndValue:
      nullable: true
      oneOf:
      - $ref: "#/components/schemas/DateOnly"
      - $ref: "#/components/schemas/Rfc3339DateTime"
      discriminator:
        propertyName: kind
        mapping:
          DATE: "#/components/schemas/DateOnly"
          TIMESTAMP: "#/components/schemas/Rfc3339DateTime"
      description: |-
        **Exclusive end** of the time slice, used only when the `sourceQuery` contains the `${rdEnd}` placeholder.
        Must be **greater than** `runDate` when both are provided. Formatted per `jobSettings.dateFormat`:
          - DATE → `yyyy-MM-dd`
          - TIMESTAMP → RFC 3339 `yyyy-MM-dd'T'HH:mm:ss'Z'`

        If `sourceQuery` omits `${rdEnd}`, this value does **not** restrict the data scan and is ignored for run timing.
    EgressTopic:
      type: string
      description: |-
        Selectable topic for the data-egress export endpoint. Values follow
        the platform-wide UPPER_SNAKE_CASE enum convention. Note that
        qualified field names in filters use the lowercase form
        (e.g. `rules.ruleName`); the qualified-name syntax is its own grammar
        and is intentionally distinct from the enum.
      enum:
      - JOBS
      - MONITORS
      - RULES
    EgressOperator:
      type: string
      description: |-
        Filter operator. Each field declares its allowed operators in the
        manifest; requesting an unsupported operator yields HTTP 400.

        `LIKE` exposes SQL `%` (zero-or-more chars) and `_` (single char)
        wildcards verbatim and is case-sensitive — the operator is a thin
        wrapper over the SQL `LIKE` predicate. Callers that want
        case-insensitive matching or anchored prefix/suffix can express that
        with the wildcards (`%foo%` for contains, `foo%` for prefix). The
        intentional SQL-flavoured shape mirrors the rest of the egress
        query surface; consumers that need a higher-level abstraction can
        layer it on the client.
      enum:
      - EQ
      - NE
      - IN
      - NOT_IN
      - LIKE
      - GTE
      - LTE
      - GT
      - LT
      - IS_NULL
      - IS_NOT_NULL
    EgressFilter:
      type: object
      description: |-
        Single filter predicate. Use `value` for `EQ`/`NE`/`LIKE`/`GTE`/`LTE`/`GT`/`LT`,
        `values` for `IN`/`NOT_IN`, and neither for `IS_NULL`/`IS_NOT_NULL`.
      required:
      - field
      - op
      properties:
        field:
          type: string
          description: "Qualified field name `<topic>.<apiName>`, e.g. `rules.ruleName`."
          maxLength: 128
          example: rules.ruleName
        op:
          $ref: "#/components/schemas/EgressOperator"
        value:
          description: |-
            Single value for unary operators. Send as a JSON scalar (string,
            number, integer, or boolean), or `null`. The server coerces the
            value to the field's declared type (string / integer / long /
            double / boolean / RFC 3339 timestamp / UUID) at validation time
            before binding into the SQL parameter. The schema is kept type-less
            rather than
            using `oneOf` because OAS codegen wraps `oneOf` in a sealed
            wrapper that breaks the server's dynamic-coercion flow; the
            scalar-or-null constraint is enforced server-side.
          example: tpch.sf1.orders
        values:
          type: array
          description: |-
            List of values for `IN` / `NOT_IN`. Each item follows the same
            scalar-or-null contract as `value` above and is coerced to the
            field's declared type at validation time. Capped at 1000 items
            per request as a DoS guard; pageable surfaces should split
            larger lists across multiple requests.
          maxItems: 1000
          items:
            description: |-
              JSON scalar (string / number / integer / boolean) or `null`.
              Schema kept type-less for the same dynamic-coercion reason
              as the sibling `value` property.
    EgressRequest:
      type: object
      description: |-
        Request body for `POST /egress/export`. Optional — omit the body (or
        omit `topics`) to export all three topics with defaults. Any `topics`
        you do select must form a connected subgraph in the manifest's join graph.
      properties:
        topics:
          type: array
          maxItems: 16
          uniqueItems: true
          description: |-
            Topics to include in the export. Omitted or empty → all three
            (`JOBS`, `MONITORS`, `RULES`). Today's surface exposes those three;
            the upper bound has headroom so adding a new topic doesn't break clients.
          items:
            $ref: "#/components/schemas/EgressTopic"
        filters:
          type: array
          maxItems: 100
          description: Filter predicates ANDed together. Empty or omitted means no
            filtering.
          items:
            $ref: "#/components/schemas/EgressFilter"
        includeCatalogAssets:
          type: boolean
          default: false
          description: |-
            Opt in to catalog-asset enrichment. May also be set via the
            `includeCatalogAssets` query parameter (useful on a body-less
            request); enrichment applies when either is `true`. When `true`, each
            row is enriched with the DGC Catalog assets it maps to: the `Table`
            asset on `jobs`, the `Column` asset on `monitors`/`rules`, and the
            governing `Data Quality Rule` asset on `monitors`. See **Catalog
            assets** in the `POST /egress/export` description for the exact
            fields and the `excludeColumnAssets` / `excludeRuleAssets` switches.

            When `false` (default) no enrichment is performed and those fields
            are omitted — off by default because enrichment makes external
            round-trips to DGC. Note a monitor linked to several `Data Quality
            Rule` assets emits one row per linked asset; `excludeRuleAssets`
            opts out of that group (and its row multiplication).
    EgressManifestField:
      type: object
      required:
      - apiName
      - type
      - filterable
      - projectable
      - allowedOperators
      properties:
        apiName:
          type: string
          description: Field name within its topic. Combined with the topic as `<topic>.<apiName>`.
        type:
          type: string
          description: |-
            Logical type of the field for filter-value coercion. Free-form
            string (not an enum) so the server can introduce new types
            without breaking SDK switch-on-known-values code. Currently one
            of: `STRING`, `INTEGER`, `LONG`, `DOUBLE`, `BOOLEAN`,
            `TIMESTAMP`, `UUID`, `STRING_LIST`. Clients should treat unknown
            values as opaque and fall back to string handling.
        filterable:
          type: boolean
          description: |-
            When `true`, this field can appear in `EgressFilter.field`. When
            `false`, the server rejects any filter referencing it with HTTP 400.
        projectable:
          type: boolean
          description: |-
            When `true`, this field is included in the response projection
            (unless `optIn: true`). When `false`, the field is never returned —
            it exists only as a filter target.
        allowedOperators:
          type: array
          uniqueItems: true
          description: |-
            Operators the server accepts when filtering this field. Items
            mirror the request-side `EgressOperator` enum (currently
            `EQ`, `NE`, `IN`, `NOT_IN`, `LIKE`, `GTE`, `LTE`, `GT`, `LT`,
            `IS_NULL`, `IS_NOT_NULL`) but the response shape is free-form
            string so new operators can be added without breaking SDK
            switch-on-known-values code.
          items:
            type: string
        optIn:
          type: boolean
          default: false
          description: |-
            When `true`, the field is excluded from the default response
            projection. The catalog-asset fields are opt-in and become
            projectable when the request sets `includeCatalogAssets`. Projection
            is not otherwise a request parameter, so any other opt-in field
            (e.g. `rules.ruleColumnName`) is reachable only as a filter target.
    EgressManifestTopic:
      type: object
      required:
      - name
      - fields
      properties:
        name:
          type: string
          description: |-
            Topic identifier in UPPER_SNAKE_CASE. Mirrors the request-side
            `EgressTopic` enum (currently `JOBS`, `MONITORS`, `RULES`) but the
            response is free-form string so new topics can be added without
            breaking SDK switch-on-known-values code.
            Note: qualified field names (e.g. `rules.ruleName`) use the
            lowercase form — that grammar is intentionally distinct from this
            enum.
        joinsTo:
          type: array
          uniqueItems: true
          description: |-
            The topics this one can be joined to (UPPER_SNAKE_CASE, matching
            `name`). Reachability is symmetric — if A lists B, then B lists A.
            Use it to validate that a `topics` selection forms a connected
            subgraph. Join-key columns are not exposed; clients need only
            reachability.
          items:
            type: string
        fields:
          type: array
          items:
            $ref: "#/components/schemas/EgressManifestField"
    EgressManifestDefaultWindow:
      type: object
      description: |-
        Describes the implicit time-window filter the server injects when the
        caller does not supply one. Clients that want a different window range
        must filter explicitly on any `*.updatedAt` field — the server detects
        the explicit filter and suppresses the default.
      required:
      - durationDays
      - anchorField
      - appliesWhen
      properties:
        durationDays:
          type: integer
          description: |-
            Default number of days back from `now` (UTC) used as the lower
            bound. Overridable per request via the `window` query parameter on
            `POST /egress/export`.
          example: 90
        anchorField:
          type: string
          description: |-
            Suffix the server appends to the anchor topic to compute the
            window field. The anchor topic is chosen in the order
            monitors > rules > jobs — e.g. `updatedAt` resolves to
            `monitors.updatedAt` whenever monitors are selected, otherwise
            `rules.updatedAt`, otherwise `jobs.updatedAt`.
          example: updatedAt
        appliesWhen:
          type: string
          description: Plain-text rule describing when the window is injected.
    EgressManifest:
      type: object
      required:
      - topics
      properties:
        topics:
          type: array
          items:
            $ref: "#/components/schemas/EgressManifestTopic"
        defaultWindow:
          $ref: "#/components/schemas/EgressManifestDefaultWindow"
