openapi: 3.1.0
info:
 title: Gable API
 description: >
 API to interact with the Gable platform

## Authorization

All API requests require an API key to be passed in the \`X-API-KEY\` header.
 For instructions on finding your API key and api endpoint check out the \[API\
 Key documentation\](../docs/api-keys.md).

Example: \`curl -H "X-API-KEY: "
 https://api-{organization}.gable.ai/v0/ping\`
 contact:
 name: Gable Engineering
 url: https://gable.ai
 email: engineers@gable.ai
 version: 1.28.0
servers:
 \- url: https://{hostname}.gable.ai
 description: Gable API
 variables:
 hostname:
 default: demo-api
 description: Customer environment assigned by Gable
security:
 \- ApiKeyAuth: \[\]
tags:
 \- name: action
 \- name: api-keys
 \- name: auth
 \- name: changelog
 \- name: config
 \- name: contract
 \- name: data-asset
 \- name: debug
 \- name: s3
 \- name: settings
 \- name: slack
 \- name: sso
 \- name: webhook
 \- name: notifications
 \- name: constraints
 \- name: telemetry
 \- name: component
 \- name: components
 \- name: sca
 \- name: cross-service-components
 \- name: lineage
 \- name: events
 \- name: measurements
 \- name: defect-report
 \- name: experimental
paths:
 /v0/ping:
 get:
 operationId: ping
 description: Ping Gable
 summary: Ping Gable
 tags:
 \- debug
 responses:
 '200':
 description: Successful ping response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PingResponse'
 /v0/\_version:
 get:
 operationId: version
 description: Gable version endpoint
 summary: Gable version endpoint
 tags:
 \- debug
 responses:
 '200':
 description: Successful version response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/VersionResponse'
 /v0/action:
 post:
 description: Create a new action
 summary: Create a new action
 tags:
 \- action
 operationId: postAction
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostActionRequest'
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostActionResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Delete an existing action
 summary: Delete an existing action
 tags:
 \- action
 operationId: deleteAction
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DeleteActionRequest'
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DeleteActionResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 put:
 description: Update an existing action
 summary: Update an existing action
 tags:
 \- action
 operationId: putAction
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PutActionRequest'
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PutActionResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/actions:
 get:
 description: Get all actions
 summary: Get all actions
 tags:
 \- action
 operationId: getActions
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetActionsResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/auth/npm:
 post:
 tags:
 \- auth
 operationId: getNpmCredentials
 description: Gets temporary npm credentials
 summary: Gets temporary npm credentials
 responses:
 '200':
 description: Npm credentials
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetNpmCredentialsResponse'
 /v0/auth/pip:
 post:
 tags:
 \- auth
 operationId: getPipCredentials
 description: Gets temporary aws code artfact creditial for pip
 summary: Gets temporary aws code artfact creditial for pip
 responses:
 '200':
 description: Pip credentials
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetPipCredentialsResponse'
 /v0/auth/sca-prime-artifact-bucket:
 get:
 tags:
 \- auth
 operationId: getScaPrimeS3Url
 description: >-
 Get presigned S3 URL to SCA Prime artifact bucket containing the symbol
 artifact for the given library and scaPrimeHash
 summary: Get SCA Prime S3 URL
 parameters:
 \- name: library
 in: query
 required: true
 schema:
 type: string
 \- name: scaPrimeHash
 in: query
 required: true
 schema:
 type: string
 responses:
 '200':
 description: The SCA Prime artifact bucket
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetScaPrimeArtifactBucketResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/delete/{id}:
 delete:
 tags:
 \- contract
 operationId: deleteContract
 description: Delete a contract by ID
 summary: Delete a contract by ID
 parameters:
 \- name: id
 in: path
 required: true
 description: Contract ID
 schema:
 type: string
 format: uuid
 responses:
 '200':
 description: Contract successfully deleted
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DeleteContractResponse'
 '400':
 description: Invalid contract ID format
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Contract not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/validate:
 post:
 description: Validate a contract
 summary: Validate a contract
 tags:
 \- contract
 operationId: validateContract
 requestBody:
 description: Contract
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostContractRequest'
 responses:
 '200':
 description: Response when validation could be completed
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CheckResponse'
 /v0/contract/{id}:
 get:
 description: Get a contract by id
 summary: Get a contract by id
 tags:
 \- contract
 operationId: getContract
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the contract
 responses:
 '200':
 description: Contract
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractOutput'
 /v0/contract/{id}/stage:
 put:
 tags:
 \- contract
 operationId: putContractStage
 description: Update a contract's stage
 summary: Update a contract's stage
 parameters:
 \- name: id
 in: path
 description: Contract ID
 required: true
 schema:
 type: string
 format: uuid
 requestBody:
 description: Contract stage update
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PutContractStageRequest'
 responses:
 '200':
 description: Contract stage updated
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PutContractStageResponse'
 '400':
 description: Invalid request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Contract not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/{id}/violation-status:
 get:
 description: Get the violation status of a contract by id
 summary: Get the violation status of a contract by id
 tags:
 \- contract
 operationId: getContractViolationStatus
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the contract
 responses:
 '200':
 description: Contract
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetContractViolationStatusResponse'
 '404':
 description: Contract not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contracts:
 get:
 description: Get all contracts
 summary: Get all contracts
 tags:
 \- contract
 operationId: getContracts
 parameters:
 \- name: resourcesLocation
 in: query
 description: >-
 Location of the data assets resources (e.g.
 '{host}:{port}.{database}.{schema}' for database resources)
 required: false
 schema:
 type: string
 \- name: sourceType
 in: query
 description: >-
 Source type of the data assets (e.g. 'postgres', 'mysql', 'avro',
 'protobuf', 'json\_schema', etc.)
 required: false
 schema:
 $ref: '#/components/schemas/SourceType'
 \- in: query
 name: limit
 schema:
 type: integer
 description: The limit used for offset-based pagination
 \- in: query
 name: offset
 schema:
 type: integer
 description: The offset used for offset-based pagination
 \- in: query
 name: status
 schema:
 type: string
 description: The status of the contract
 responses:
 '200':
 description: All data contracts (filtered by query parameters if provided)
 content:
 application/json:
 schema:
 oneOf:
 \- type: array
 items:
 $ref: '#/components/schemas/ContractOutput'
 \- $ref: '#/components/schemas/ContractOutputPaginated'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contracts/count:
 get:
 description: Get contracts count
 summary: Get contracts count
 tags:
 \- contract
 operationId: getContractsCount
 responses:
 '200':
 description: Contracts count
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DataCount'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract:
 post:
 tags:
 \- contract
 operationId: postContract
 description: Create a contract
 summary: Create a contract
 requestBody:
 description: Contract
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostContractRequest'
 responses:
 '200':
 description: Contracts
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostContractResponse'
 /v0/contract/{id}/activity:
 get:
 description: Get the activity events for a contract
 summary: Get the activity events for a contract
 tags:
 \- contract
 operationId: getContractActivity
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the contract
 responses:
 '200':
 description: Successful response containing the activity events for the contract
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractActivityResponse'
 '400':
 description: Invalid request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract-subscription/{id}:
 get:
 description: Get a contract subscription by id
 summary: Get a contract subscription by id
 tags:
 \- contract
 operationId: getContractSubscription
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: The UUID of the contract
 responses:
 '200':
 description: Details of a contract subscription
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractSubscription'
 '404':
 description: Contract subscription not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 put:
 description: Update a contract subscription
 summary: Update a contract subscription
 tags:
 \- contract
 operationId: updateContractSubscription
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: The UUID of the contract
 requestBody:
 description: Contract subscription to update
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/UpdateContractSubscriptionRequest'
 responses:
 '200':
 description: Contract subscription was successfully updated
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractSubscription'
 '404':
 description: Contract subscription, contract, or user not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Delete a subscription for a contract
 summary: Delete a subscription for a contract
 tags:
 \- contract
 operationId: deleteContractSubscription
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: The UUID of the contract
 responses:
 '204':
 description: Contract subscription was successfully deleted
 '404':
 description: Contract subscription not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract-subscription:
 post:
 description: Create a new subscription for a contract
 summary: Create a new subscription for a contract
 tags:
 \- contract
 operationId: createContractSubscription
 requestBody:
 description: Subscription to create
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateContractSubscriptionRequest'
 responses:
 '200':
 description: Contract subscription was successfully created
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractSubscription'
 '404':
 description: Contract or user not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract-subscriptions:
 get:
 description: Get all contract subscriptions
 summary: Get all contract subscriptions
 tags:
 \- contract
 operationId: getContractSubscriptions
 parameters:
 \- name: dataContractId
 in: query
 description: Filter subscriptions by contract
 required: false
 schema:
 type: string
 format: uuid
 responses:
 '200':
 description: List of subscriptions for the contract
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetContractSubscriptionsResponse'
 '404':
 description: Contract ID specified in query string param does not exist
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/check-compliance:
 post:
 description: Check if the asset associated with the contract is compliant
 summary: Check if the asset associated with the contract is compliant
 tags:
 \- data-asset
 \- contract
 operationId: ContractCheckCompliance
 requestBody:
 description: Contract to check
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractCheckComplianceRequest'
 responses:
 '200':
 description: Data Asset ID
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractCheckComplianceResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/bulk-check-compliance:
 post:
 description: Check if multiple assets associated with a contract are compliant
 summary: Check multiple assets for contract compliance
 tags:
 \- data-asset
 \- contract
 operationId: BulkContractCheckCompliance
 requestBody:
 description: Contract with multiple data assets to check
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/BulkContractCheckComplianceRequest'
 responses:
 '200':
 description: Compliance results for each data asset
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/BulkContractCheckComplianceResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/enforcement-level/{id}:
 get:
 description: Get a contract enforcement level by id
 summary: Get a contract enforcement level by id
 tags:
 \- contract
 operationId: getContractEnforcementLevel
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the data contract
 responses:
 '200':
 description: Get EnforcementLevel
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractEnforcementLevel'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 put:
 description: Update a contract enforcement level by id
 summary: Update a contract enforcement level by id
 tags:
 \- contract
 operationId: putContractEnforcementLevel
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the data contract
 requestBody:
 description: Contract enforcement level
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/UpdateContractEnforcementLevelRequest'
 responses:
 '200':
 description: Update EnforcementLevel
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractEnforcementLevel'
 '400':
 description: Contract Dependency Deletion Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Enforcement Level Not Found Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/enforcement-level:
 post:
 description: create a contract enforcement level
 summary: Create a contract enforcement level
 tags:
 \- contract
 operationId: postContractEnforcementLevel
 requestBody:
 description: Create Contract enforcement level
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateContractEnforcementLevelRequest'
 responses:
 '200':
 description: EnforcementLevel
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractEnforcementLevel'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-assets:
 get:
 description: Get all data assets
 summary: Get all data assets
 tags:
 \- data-asset
 operationId: getDataAssets
 parameters:
 \- in: query
 name: limit
 schema:
 type: integer
 description: The limit used for offset-based pagination
 \- in: query
 name: offset
 schema:
 type: integer
 description: The offset used for offset-based pagination
 \- in: query
 name: search
 schema:
 type: string
 description: A query string to search data assets with
 responses:
 '200':
 description: Data assets
 content:
 application/json:
 schema:
 oneOf:
 \- type: array
 items:
 $ref: '#/components/schemas/DataAssetSearchResult'
 \- $ref: '#/components/schemas/DataAssetSearchResultPaginated'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 post:
 description: Creates or updates data assets
 summary: Creates or updates data assets
 tags:
 \- data-asset
 operationId: createOrUpdateDataAssets
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateOrUpdateDataAssetsRequest'
 responses:
 '200':
 description: Assets created or updated successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateOrUpdateDataAssetsResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Deletes data assets
 summary: Deletes data assets
 tags:
 \- data-asset
 operationId: deleteDataAssets
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DeleteDataAssetsRequest'
 responses:
 '200':
 description: Assets deleted successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DeleteDataAssetsResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-assets/bulk:
 get:
 description: Get data assets by a list of DARNs
 summary: Get data assets by a list of DARNs
 tags:
 \- data-asset
 operationId: getDataAssetsByDarns
 parameters:
 \- name: darns
 in: query
 description: List of Data Asset Resource Names to fetch
 required: true
 style: form
 explode: true
 schema:
 type: array
 items:
 type: string
 minItems: 1
 \- name: limit
 in: query
 schema:
 type: integer
 minimum: 1
 maximum: 1000
 default: 1000
 description: Maximum number of results to return (default is 1000)
 \- name: offset
 in: query
 schema:
 type: integer
 minimum: 0
 default: 0
 description: Number of results to skip (default is 0)
 responses:
 '200':
 description: Data assets with status information for each DARN
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetDataAssetsByDarnsResponsePaginated'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-assets/count:
 get:
 description: Get data assets count
 summary: Get data assets count
 tags:
 \- data-asset
 operationId: getDataAssetsCount
 responses:
 '200':
 description: Data assets count
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DataCount'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-asset:
 post:
 description: Create a data asset
 summary: Create a data asset
 tags:
 \- data-asset
 operationId: createDataAsset
 requestBody:
 description: Data Asset
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateOrUpdateDataAssetRequest'
 responses:
 '200':
 description: Data Asset ID
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateOrUpdateDataAssetResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-assets/check:
 post:
 description: Check list of data assets for contract violations
 summary: Check list of data assets for contract violations
 tags:
 \- data-asset
 operationId: checkDataAssets
 requestBody:
 description: List of data assets to check
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CheckDataAssetsRequest'
 responses:
 '200':
 description: Data Asset ID
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CheckDataAssetsResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-assets/check-compliance:
 post:
 description: Check list of data assets for contract violations
 summary: Check list of data assets for contract violations
 tags:
 \- data-asset
 operationId: dataAssetsCheckCompliance
 requestBody:
 description: List of data assets to check
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DataAssetsCheckComplianceRequest'
 responses:
 '200':
 description: Data Asset ID
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CheckDataAssetsResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-assets/check-compliance/s3:
 post:
 description: Check list of S3 data assets for contract violations
 summary: Check list of S3 data assets for contract violations
 tags:
 \- data-asset
 operationId: checkComplianceDataAssetsS3
 requestBody:
 description: List of S3 data assets to check for compliance
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CheckComplianceDataAssetsS3Request'
 responses:
 '200':
 description: Data Asset ID
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CheckDataAssetsResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-asset/ingest:
 post:
 description: Ingest a data asset from a schema
 summary: Ingest a data asset from a schema
 operationId: ingestDataAsset
 tags:
 \- data-asset
 requestBody:
 description: Data Asset Schema
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/IngestDataAssetRequest'
 responses:
 '200':
 description: Data Asset ID
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/IngestDataAssetResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponseDeprecated'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponseDeprecated'
 /v0/data-assets/register:
 post:
 description: Register data assets
 summary: Register data assets
 operationId: registerDataAssets
 tags:
 \- data-asset
 requestBody:
 description: Data Assets Registration Request
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/RegisterDataAssetsRequest'
 responses:
 '200':
 description: Data Assets Registration Response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/RegisterDataAssetsResponse'
 '400':
 description: User Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Server Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-asset/register/s3:
 post:
 description: Register an S3 data asset
 summary: Register an S3 data asset
 operationId: registerDataAssetS3
 tags:
 \- data-asset
 \- s3
 requestBody:
 description: S3 Data Asset Registration Request
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/RegisterDataAssetS3Request'
 responses:
 '200':
 description: Data Asset ID
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/IngestDataAssetResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponseDeprecated'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponseDeprecated'
 /v0/data-asset/{id}:
 get:
 description: Get a data asset by id
 summary: Get a data asset by id
 tags:
 \- data-asset
 operationId: getDataAsset
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the data asset
 responses:
 '200':
 description: Data asset
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DataAsset'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Delete a data asset by id
 summary: Delete a data asset by id
 tags:
 \- data-asset
 operationId: deleteDataAsset
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the data asset
 responses:
 '204':
 description: Data asset deleted
 '400':
 description: Contract Dependency Deletion Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Data Asset Not Found Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-asset/{id}/infer-contract:
 get:
 description: Infer a contract from a data asset
 summary: Infer a contract from a data asset
 tags:
 \- data-asset
 \- contract
 operationId: inferContractFromDataAsset
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the data asset
 responses:
 '200':
 description: Contract was successfully inferred from the given data asset
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/InferContractFromDataAssetResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/data-asset/{id}/profile:
 post:
 description: Create profile for a data asset
 summary: Create profile for a data asset
 tags:
 \- data-asset
 operationId: createDataAssetProfile
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the data asset
 requestBody:
 description: Data Asset Profiles
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateDataAssetProfileRequest'
 responses:
 '200':
 description: Data asset profile was successfully created
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateDataAssetProfileResponse'
 '404':
 description: Data asset not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract/data-asset/{id}:
 get:
 description: Get the contract by data asset name
 summary: Get the contract by data asset name
 tags:
 \- contract
 operationId: getContractByAssetId
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 required: true
 description: asset name of data contract
 \- in: query
 name: status
 schema:
 type: string
 description: The status of the contract
 responses:
 '200':
 description: Successful response containing the contract by asset name
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractOutput'
 '400':
 description: Invalid request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contracts/data-asset/{id}:
 get:
 description: Get the contract by darn
 summary: Get the contract by darn
 tags:
 \- contract
 operationId: getContractsByAssetId
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 required: true
 description: asset name of data contract
 \- in: query
 name: status
 schema:
 type: string
 description: The status of the contract
 responses:
 '200':
 description: Successful response containing the contract by asset name
 content:
 application/json:
 schema:
 type: array
 items:
 $ref: '#/components/schemas/ContractOutput'
 '400':
 description: Invalid request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/api-keys:
 get:
 tags:
 \- api-keys
 operationId: getApiKeys
 description: Get all api keys
 summary: Get all api keys
 responses:
 '200':
 description: Api keys
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetApiKeysResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/settings/sso-saml-setup-details:
 get:
 description: >-
 Get the details required to create a SAML integration for Gable in an
 IdP
 summary: Get the SAML integration details
 tags:
 \- settings
 \- sso
 operationId: getSsoSamlSetupDetails
 responses:
 '200':
 description: Details required to create a SAML integration for Gable in an IdP
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetSsoSamlSetupDetailsResponse'
 /v0/settings/sso:
 get:
 description: >-
 Gets the configuration of the existing SSO integration, returns 404 if
 SSO is not currently configured
 summary: Gets the configuration of the existing SSO integration
 tags:
 \- settings
 \- sso
 operationId: getSsoConfiguration
 responses:
 '200':
 description: Configuration of current SSO integration
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/SsoConfig'
 '404':
 description: SSO is not currently configured
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 put:
 description: Configure (create or update) an SSO integration in Gable
 summary: Configure (create or update) an SSO integration in Gable
 tags:
 \- settings
 \- sso
 operationId: configureSso
 requestBody:
 description: Configuration for setting up SSO
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/SsoConfig'
 responses:
 '200':
 description: SSO was successfully configured
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/SsoConfig'
 '400':
 description: Bad request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Remove the existing SSO integration in Gable
 summary: Remove the existing SSO integration in Gable
 tags:
 \- settings
 \- sso
 operationId: removeSso
 responses:
 '204':
 description: SSO was successfully deleted
 '404':
 description: No existing SSO was found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/settings/user:
 post:
 description: >-
 Gets the details of a Gable user by their email address. Users are
 automatically created in Gable the first time they log in. Use PATCH
 /v0/settings/user to update a user's details.
 summary: Gets the details of a Gable user
 tags:
 \- settings
 operationId: getUser
 requestBody:
 description: Get user by email address
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetUserRequest'
 responses:
 '200':
 description: User was found with the given email address
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/User'
 '400':
 description: Bad request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: User not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal server error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 patch:
 description: Update a user
 summary: Update a user
 tags:
 \- settings
 operationId: updateUser
 requestBody:
 description: User
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/UpdateUserRequest'
 responses:
 '200':
 description: User was updated successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/UpdateUserResponse'
 '400':
 description: Bad request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: User not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal server error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/settings/users:
 get:
 description: Gets the list of Gable users
 summary: Gets the list of Gable users
 tags:
 \- settings
 operationId: getUsers
 responses:
 '200':
 description: Details required to create a SAML integration for Gable in an IdP
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetUsersResponse'
 post:
 description: Invites a user to Gable
 summary: Invites a user
 tags:
 \- settings
 operationId: inviteUser
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/InviteUserRequest'
 responses:
 '200':
 description: User was invited to Gable
 '400':
 description: Bad request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error inviting user
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Deletes a user from Gable
 summary: Deletes a user
 tags:
 \- settings
 operationId: deleteUser
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DeleteUserRequest'
 responses:
 '200':
 description: User was deleted successfully
 '404':
 description: User not found
 '500':
 description: Error deleting user
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/changelog:
 get:
 tags:
 \- changelog
 operationId: getChangelog
 description: Get the changelog
 summary: Get the changelog
 parameters:
 \- in: query
 name: limit
 schema:
 type: integer
 description: The limit used for offset-based pagination
 \- in: query
 name: offset
 schema:
 type: integer
 description: The offset used for offset-based pagination
 \- in: query
 name: source
 schema:
 type: array
 items:
 type: string
 description: Comma-separated list of the sources to filter by
 \- in: query
 name: source\_type
 schema:
 type: array
 items:
 type: string
 description: Comma-separated list of the source types to filter by
 \- in: query
 name: event
 schema:
 type: array
 items:
 type: string
 description: Comma-separated list of the changelog events to filter by
 responses:
 '200':
 description: Changelog
 content:
 application/json:
 schema:
 oneOf:
 \- $ref: '#/components/schemas/GetChangelogResponse'
 \- $ref: '#/components/schemas/ChangelogResponsePaginated'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 post:
 description: Create a new changelog event
 summary: Create a new changelog event
 tags:
 \- changelog
 operationId: createChangelogEvent
 requestBody:
 description: Changelog event to create
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateChangelogEventRequest'
 responses:
 '200':
 description: Changelog event(s) was successfully created
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateChangelogEventResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/changelog/count:
 get:
 description: Get changelog count
 summary: Get changelog count
 tags:
 \- changelog
 operationId: getChangelogCount
 responses:
 '200':
 description: Changelog count
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DataCount'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/changelog/filters:
 get:
 description: Get changelog filters available
 summary: Get changelog filters available
 tags:
 \- changelog
 operationId: getChangelogFilters
 responses:
 '200':
 description: Changelog filters
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetChangelogFiltersResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/config:
 get:
 description: >-
 Get config by type, language, repo and optional version. Returns the
 latest config if version is not specified.
 tags:
 \- config
 operationId: getConfig
 parameters:
 \- name: config\_type
 in: query
 required: true
 schema:
 type: string
 \- name: repo
 in: query
 required: true
 schema:
 type: string
 \- name: language
 in: query
 required: false
 schema:
 type: string
 \- name: version
 in: query
 required: false
 schema:
 type: string
 \- name: namespace
 in: query
 required: false
 schema:
 type: string
 responses:
 '200':
 description: Config found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetConfigResponse'
 '404':
 description: Config not found
 post:
 description: Create a config - config
 operationId: postConfig
 requestBody:
 description: Config
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostConfigRequest'
 responses:
 '200':
 description: Config
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostConfigResponse'
 /v0/slack/channels:
 get:
 tags:
 \- slack
 operationId: getSlackChannels
 description: Get Slack channels for workspace
 summary: Get Slack channels for workspace
 responses:
 '200':
 description: Slack channels
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetSlackChannelsResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/slack/delete:
 delete:
 tags:
 \- slack
 operationId: deleteSlack
 description: Delete Slack integration
 summary: Delete Slack integration
 responses:
 '204':
 description: Slack integration deleted
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/slack/install:
 get:
 tags:
 \- slack
 operationId: getSlackInstall
 description: Get the generated Slack install URL
 summary: Get the generated Slack install URL
 responses:
 '200':
 description: Slack install
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetSlackInstallResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/slack/test:
 post:
 description: Post a test message to the slack channel
 summary: Post a test message to the slack channel
 tags:
 \- slack
 operationId: postTestSlackMessage
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostTestSlackMessageRequest'
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostTestSlackMessageResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/webhooks:
 post:
 description: Create a webhook endpoint
 summary: Create a webhook endpoint
 tags:
 \- webhook
 operationId: createWebhook
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateWebhookRequest'
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateWebhookResponse'
 '422':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 get:
 description: Get webhooks endpoints
 summary: Get webhooks endpoints
 tags:
 \- webhook
 operationId: getWebhooks
 responses:
 '200':
 description: Get all webhooks endpoints
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetWebhooksResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/webhooks/test:
 post:
 description: Post a test message to the webhook
 summary: Post a test message to the webhook
 tags:
 \- webhook
 operationId: postTestWebhookMessage
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostTestWebhookMessageRequest'
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostTestWebhookMessageResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/webhooks/{id}:
 put:
 description: Update a webhook
 summary: Update a webhook
 tags:
 \- webhook
 operationId: updateWebhook
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: The UUID of the webhook
 requestBody:
 description: Webhook to update
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateWebhookRequest'
 responses:
 '200':
 description: Webhook was successfully updated
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateWebhookResponse'
 '404':
 description: Webhook not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Delete the existing webhook
 summary: Delete the existing webhook
 tags:
 \- webhook
 operationId: deleteWebhook
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: The UUID of the webhook
 responses:
 '204':
 description: Webhook was successfully deleted
 '404':
 description: No existing webhook was found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/notifications:
 get:
 description: Get notifications
 summary: Get notifications
 tags:
 \- notifications
 operationId: getNotifications
 parameters:
 \- in: query
 name: limit
 schema:
 type: integer
 description: The limit used for offset-based pagination
 \- in: query
 name: offset
 schema:
 type: integer
 description: The offset used for offset-based pagination
 \- in: query
 name: orderBy
 schema:
 type: string
 description: A field to order by
 \- in: query
 name: orderDir
 schema:
 type: string
 description: Ordering direction ('asc' or 'desc')
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetNotificationsResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/notifications/count:
 get:
 description: Get notifications count
 summary: Get notifications count
 tags:
 \- notifications
 operationId: getNotificationsCount
 responses:
 '200':
 description: Notifications count
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/DataCount'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract\_constraints:
 get:
 tags:
 \- constraints
 operationId: getContractConstraints
 description: Get contract Constraints
 summary: Get contract Constraints
 responses:
 '200':
 description: constraints
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ContractConstraintMapping'
 /v0/sca-metadata/ingest:
 post:
 description: Register sca metadata for a data asset version
 summary: Register sca metadata for a data asset version
 operationId: ingestScaMetadata
 tags:
 \- data-asset
 requestBody:
 description: Upload metadata tied to data asset
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/IngestScaMetadataRequest'
 responses:
 '200':
 description: Sca Metadata Registration Response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/IngestScaMetadataResponse'
 '400':
 description: User Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Server Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/telemetry/ingest:
 post:
 description: >-
 Create a telemetry data point for long term storage in the telemetry
 table
 summary: Create a telemetry data point
 tags:
 \- telemetry
 operationId: createTelemetry
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateTelemetryRequest'
 responses:
 '201':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CreateTelemetryResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/contract-namespaces:
 get:
 tags:
 \- contract
 operationId: getContractNamespaces
 description: Get all available contract namespaces
 summary: Get all available contract namespaces
 responses:
 '200':
 description: Contract namespaces
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetContractNamespacesResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/components:
 get:
 description: Get all components
 summary: Get all components
 tags:
 \- component
 operationId: getComponents
 parameters:
 \- in: query
 name: search
 schema:
 type: string
 description: A query string to search components with
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 type: object
 properties:
 components:
 type: array
 items:
 $ref: '#/components/schemas/Component'
 required:
 \- components
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/components/history:
 get:
 description: >-
 Get components run history entries, optionally filtered by trigger,
 branch, commit, namespace, and time range.
 summary: Get components history
 tags:
 \- components
 operationId: getComponentsHistory
 parameters:
 \- name: componentName
 in: query
 description: Human-readable name of the component.
 required: false
 schema:
 type: string
 \- name: branchName
 in: query
 description: Filter by git branch name.
 required: false
 schema:
 type: string
 default: main
 \- name: commitSha
 in: query
 description: Filter by git commit SHA.
 required: false
 schema:
 type: string
 \- name: namespace
 in: query
 description: Filter by namespace (e.g. prod, staging, dev).
 required: false
 schema:
 type: string
 \- name: timeRangeStart
 in: query
 description: Inclusive start timestamp for filtering runs.
 required: false
 schema:
 type: string
 format: date-time
 \- name: timeRangeEnd
 in: query
 description: Inclusive end timestamp for filtering runs.
 required: false
 schema:
 type: string
 format: date-time
 \- name: runId
 in: query
 description: Filter by specific run ID.
 required: false
 schema:
 type: string
 \- name: limit
 in: query
 description: Maximum number of history entries to return.
 required: false
 schema:
 type: integer
 default: 20
 \- name: cursor
 in: query
 description: Token for paginating through large result sets.
 required: false
 schema:
 type: string
 \- name: sortBy
 in: query
 description: Field to sort results by.
 required: false
 schema:
 type: string
 enum:
 \- commitTimestamp
 \- analysisTimestamp
 default: commitTimestamp
 \- name: sortOrder
 in: query
 description: Sort direction.
 required: false
 schema:
 type: string
 enum:
 \- asc
 \- desc
 default: desc
 responses:
 '200':
 description: Component history retrieved successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetComponentsHistoryResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/components/history/filters:
 get:
 description: Get components history filters
 summary: Get components history filters
 tags:
 \- components
 operationId: getComponentsHistoryFilters
 parameters:
 \- in: query
 name: search
 schema:
 type: string
 description: A query string to search commit shas
 responses:
 '200':
 description: Component history filters retrieved successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetComponentsHistoryFiltersResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/components/{componentId}/filter-sets:
 get:
 description: List measurement-report filter sets for a ground-truth component.
 summary: List filter sets
 tags:
 \- measurements
 operationId: listFilterSets
 parameters:
 \- in: path
 name: componentId
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the ground-truth component.
 responses:
 '200':
 description: Filter sets for the component
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetFilterSetsResponse'
 post:
 description: Create a measurement-report filter set for a ground-truth component.
 summary: Create a filter set
 tags:
 \- measurements
 operationId: postFilterSet
 parameters:
 \- in: path
 name: componentId
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the ground-truth component.
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostFilterSetRequest'
 responses:
 '200':
 description: The created filter set
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/FilterSet'
 /v0/components/{componentId}/filter-sets/{filterSetId}:
 put:
 description: Update a measurement-report filter set.
 summary: Update a filter set
 tags:
 \- measurements
 operationId: putFilterSet
 parameters:
 \- in: path
 name: componentId
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the ground-truth component.
 \- in: path
 name: filterSetId
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the filter set.
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PutFilterSetRequest'
 responses:
 '200':
 description: The updated filter set
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/FilterSet'
 delete:
 description: Delete a measurement-report filter set.
 summary: Delete a filter set
 tags:
 \- measurements
 operationId: deleteFilterSet
 parameters:
 \- in: path
 name: componentId
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the ground-truth component.
 \- in: path
 name: filterSetId
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the filter set.
 responses:
 '200':
 description: Success response
 content:
 application/json:
 schema:
 type: object
 properties:
 success:
 type: boolean
 /v0/component/{id}:
 get:
 description: Get a component by id
 summary: Get a component by id
 tags:
 \- component
 operationId: getComponent
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the component
 responses:
 '200':
 description: Full component
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CodeComponent'
 patch:
 description: Update a component's metadata
 summary: Update component metadata
 tags:
 \- component
 operationId: patchComponent
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the component
 requestBody:
 required: true
 content:
 application/json:
 schema:
 type: object
 properties:
 friendly\_name:
 type: string
 description: >-
 User-defined friendly name for the component. Pass empty
 string to remove.
 xgress\_friendly\_names:
 type: object
 description: >-
 Map of boundary ID to friendly name. Pass null value to
 remove a friendly name.
 additionalProperties:
 type: string
 nullable: true
 nullable: true
 responses:
 '200':
 description: Component updated successfully
 content:
 application/json:
 schema:
 type: object
 properties:
 success:
 type: boolean
 delete:
 description: Delete a component by id
 summary: Delete a component by id
 tags:
 \- component
 operationId: deleteComponent
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the component
 responses:
 '200':
 description: Success response
 content:
 application/json:
 schema:
 type: object
 properties:
 success:
 type: boolean
 /v0/component/versions/{id}:
 get:
 description: Get all versions of a component
 summary: Get all versions of a component
 tags:
 \- component
 operationId: getComponentVersions
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the component
 \- in: query
 name: versionId
 schema:
 type: string
 required: false
 description: Optional version ID to filter or focus on a specific version
 responses:
 '200':
 description: Component versions retrieved successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetComponentVersionsResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/component/diff/{id}:
 get:
 description: >-
 Compare two versions of a component's lineage. Returns a high-level
 summary of all path-level changes.
 summary: Get component diff between two versions
 tags:
 \- component
 operationId: getComponentDiff
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the component
 \- in: query
 name: base
 schema:
 type: string
 required: true
 description: Base event ID for comparison
 \- in: query
 name: compare
 schema:
 type: string
 required: true
 description: Compare event ID for comparison
 \- in: query
 name: scanOnly
 schema:
 type: boolean
 default: false
 required: false
 description: >-
 When true, load lineage from raw scan snapshots and return summary
 counts only (no field details).
 responses:
 '200':
 description: Component diff retrieved successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ComponentDiffResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/component/path-diff/{id}:
 get:
 description: >-
 Compare a single path between two versions of a component. Returns
 field-level and code-flow detail.
 summary: Get path diff between two versions
 tags:
 \- component
 operationId: getPathDiff
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the component
 \- in: query
 name: base
 schema:
 type: string
 required: true
 description: Base event ID for comparison
 \- in: query
 name: compare
 schema:
 type: string
 required: true
 description: Compare event ID for comparison
 \- in: query
 name: ingress
 schema:
 type: string
 required: true
 description: Payload name of the ingress boundary
 \- in: query
 name: egress
 schema:
 type: string
 required: true
 description: Payload name of the egress boundary
 \- in: query
 name: basePathId
 schema:
 type: string
 required: false
 description: >-
 Path ID from the base version. When provided, filters to a specific
 path instead of merging all matching paths.
 \- in: query
 name: comparePathId
 schema:
 type: string
 required: false
 description: >-
 Path ID from the compare version. When provided, filters to a
 specific path instead of merging all matching paths.
 \- in: query
 name: scanOnly
 schema:
 type: boolean
 default: false
 required: false
 description: >-
 When true, load lineage from raw scan snapshots instead of projected
 results.
 responses:
 '200':
 description: Path diff retrieved successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PathDiffResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Path or component not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/component/merge-history/{id}:
 get:
 description: >-
 Get a component's MERGE\_TO\_MAIN version history with per-version diff
 metrics and downstream breakage indicators, ordered newest-first.
 summary: Get component merge history
 tags:
 \- component
 operationId: getComponentMergeHistory
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the component
 \- in: query
 name: limit
 schema:
 type: integer
 default: 20
 minimum: 1
 maximum: 100
 required: false
 description: Maximum number of merged versions to return, newest-first.
 responses:
 '200':
 description: Component merge history retrieved successfully
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ComponentMergeHistoryResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Component not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/sca/start-run:
 post:
 tags:
 \- sca
 operationId: postScaStartRun
 description: Resolve SCA config and a canonical run ID for a future upload
 summary: Resolve SCA config and run ID
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostScaStartRunRequest'
 responses:
 '200':
 description: The SCA config and canonical run ID for this upload
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostScaStartRunResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/sca/status/{id}:
 get:
 tags:
 \- sca
 operationId: getScaRunStatus
 description: Get status of a sca run
 summary: Get status of a sca run
 parameters:
 \- in: path
 name: id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the sca job
 responses:
 '200':
 description: the status and information about the sca run job
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetScaRunStatusResponse'
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/sca/results:
 post:
 tags:
 \- sca
 operationId: postScaResults
 description: Post SCA results
 summary: Post SCA results
 parameters:
 \- in: header
 name: X-Gable-Payload-Encoding
 required: false
 schema:
 type: string
 enum:
 \- gzip
 description: >-
 Required when uploading gzip-compressed SCA results with
 Content-Type application/octet-stream. Do not use HTTP
 Content-Encoding for compressed SCA uploads.
 \- in: header
 name: X-Gable-Chunk-Session
 required: false
 schema:
 type: string
 description: >-
 Stable upload session id shared by every chunk. When this header is
 present, X-Gable-Chunk-Index and X-Gable-Chunk-Count are also
 required, and the request body must contain a base64-encoded slice
 of the full SCA results request body.
 \- in: header
 name: X-Gable-Chunk-Index
 required: false
 schema:
 type: integer
 minimum: 1
 description: 1-based chunk position for a header-based chunked upload.
 \- in: header
 name: X-Gable-Chunk-Count
 required: false
 schema:
 type: integer
 minimum: 1
 description: Total chunk count for a header-based chunked upload.
 requestBody:
 required: true
 description: >-
 Send a complete SCA results payload, or send base64-encoded chunks of
 that payload with the X-Gable-Chunk-\* headers.
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ScaResultsUploadRequest'
 application/gzip:
 schema:
 type: string
 format: binary
 description: >-
 Gzip-compressed JSON matching ScaResultsUploadRequest. Do not
 set HTTP Content-Encoding gzip for this application payload.
 application/octet-stream:
 schema:
 type: string
 format: binary
 description: >-
 Gzip-compressed JSON matching ScaResultsUploadRequest. Send
 X-Gable-Payload-Encoding gzip with this media type and do not
 set HTTP Content-Encoding gzip.
 responses:
 '200':
 description: SCA results
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostScaResultsResponse'
 '400':
 description: Bad request body
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal server error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/defect-report:
 post:
 description: Submit a defect report from the product UI
 summary: Submit a defect report
 tags:
 \- defect-report
 operationId: postDefectReport
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostDefectReportRequest'
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostDefectReportResponse'
 '400':
 description: Invalid request body
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '401':
 description: Unauthorized
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '502':
 description: Failed to send defect report email
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/cross-service-components:
 get:
 description: Get all components
 summary: Get all components
 tags:
 \- cross-service-components
 operationId: getCrossServiceComponents
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/CrossServiceComponentsResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/lineage/export:
 get:
 description: Export lineage
 summary: Export lineage
 tags:
 \- lineage
 operationId: getLineageExport
 parameters:
 \- in: query
 name: run\_id
 schema:
 type: string
 format: uuid
 required: true
 description: UUID of the run
 responses:
 '200':
 description: Lineage export
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/LineageExportResponse'
 '400':
 description: Client error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '403':
 description: Forbidden - namespace filtering denied access
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Run not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error exporting lineage
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/events:
 post:
 description: Create Lineage Events
 summary: Create Lineage Events
 tags:
 \- events
 operationId: postEvents
 requestBody:
 description: event to create
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/PostEventsRequest'
 responses:
 '200':
 description: Lineage Event was created
 '400':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Error response
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/measurements/generate:
 get:
 operationId: compareMeasurement
 summary: Compute a measurement report on the fly
 description: >-
 Fetches lineage data for the specified component versions, runs the
 measurement comparison, and returns the result without persisting.
 tags:
 \- measurements
 parameters:
 \- name: componentId
 in: query
 required: true
 schema:
 type: string
 description: Component to measure.
 \- name: compareVersionId
 in: query
 required: true
 schema:
 type: string
 description: Version to evaluate against the base.
 \- name: baseVersionId
 in: query
 schema:
 type: string
 description: Base (ground-truth) version ID. Defaults to latest if omitted.
 \- name: compareComponentId
 in: query
 schema:
 type: string
 description: >-
 Component ID for the compare version. Defaults to componentId if
 omitted. Use when comparing across namespaces.
 \- name: scanOnly
 in: query
 schema:
 type: string
 enum:
 \- 'true'
 \- 'false'
 default: 'false'
 description: When true, use raw scan data. When false, use projected data.
 \- name: applyIEInclusionFilter
 in: query
 schema:
 type: string
 enum:
 \- 'true'
 \- 'false'
 default: 'true'
 description: >-
 When true, apply IE inclusion filtering to lineage data before
 generating the measurement report.
 \- name: filterSetId
 in: query
 schema:
 type: string
 description: >-
 Optional ID of a payload filter set to apply. Only honored when the
 base namespace is ground truth; restricts the report to the filter
 set's payloads.
 responses:
 '200':
 description: Computed measurement report
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ComparisonResult'
 '400':
 description: Bad request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '401':
 description: Unauthorized
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Component or version not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/edges:
 get:
 description: List cross-service edges.
 summary: List cross-service edges.
 tags:
 \- experimental
 operationId: getExperimentalEdges
 parameters:
 \- in: query
 name: namespace
 required: false
 schema:
 type: string
 description: Optional namespace to scope returned edges.
 \- in: query
 name: source
 required: false
 schema:
 type: string
 description: >-
 Filter edges by source component name (case-insensitive substring
 match).
 \- in: query
 name: sink
 required: false
 schema:
 type: string
 description: >-
 Filter edges by destination component name (case-insensitive
 substring match).
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/LineageEdgeListResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 post:
 description: Create a new cross-service edge.
 summary: Create a new cross-service edge.
 tags:
 \- experimental
 operationId: postExperimentalEdge
 parameters:
 \- in: query
 name: namespace
 required: false
 schema:
 type: string
 description: Optional namespace to scope the new edge.
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/LineageEdge'
 responses:
 '201':
 description: Edge created successfully
 content:
 application/json:
 schema:
 type: object
 properties:
 edge:
 $ref: '#/components/schemas/LineageEdge'
 required:
 \- edge
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/edges/{id}:
 get:
 description: Get a cross-service edge by ID.
 summary: Get a cross-service edge by ID.
 tags:
 \- experimental
 operationId: getExperimentalEdge
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 description: The edge ID.
 \- in: query
 name: namespace
 required: false
 schema:
 type: string
 description: Optional namespace guard for the requested edge.
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 type: object
 properties:
 edge:
 $ref: '#/components/schemas/LineageEdge'
 required:
 \- edge
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 put:
 description: Update a cross-service edge by ID. Replaces the entire edge definition.
 summary: Update a cross-service edge.
 tags:
 \- experimental
 operationId: putExperimentalEdge
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 description: The edge ID to update.
 \- in: query
 name: namespace
 required: false
 schema:
 type: string
 description: Optional namespace guard.
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/LineageEdge'
 responses:
 '200':
 description: Edge updated successfully
 content:
 application/json:
 schema:
 type: object
 properties:
 edge:
 $ref: '#/components/schemas/LineageEdge'
 required:
 \- edge
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Delete a cross-service edge by ID.
 summary: Delete a cross-service edge.
 tags:
 \- experimental
 operationId: deleteExperimentalEdge
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 description: The edge ID to delete.
 \- in: query
 name: namespace
 required: false
 schema:
 type: string
 description: Optional namespace guard.
 responses:
 '200':
 description: Edge deleted successfully
 content:
 application/json:
 schema:
 type: object
 properties:
 success:
 type: boolean
 required:
 \- success
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/components:
 get:
 description: List components with optional search and type filtering.
 summary: List components.
 tags:
 \- experimental
 operationId: getExperimentalComponents
 parameters:
 \- in: query
 name: search
 required: false
 schema:
 type: string
 description: Search components by name (case-insensitive prefix match).
 \- in: query
 name: type
 required: false
 schema:
 type: string
 description: Filter by component type (e.g. "repo", "data\_store").
 \- in: query
 name: namespace
 required: false
 schema:
 type: string
 description: Filter by namespace.
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ComponentListResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/components/{id}:
 get:
 description: >
 Get full component detail. For CODE components, paths include inline
 ingress/egress boundary data for round-trip editing. For DATA\_STORE
 components, the schema field list is returned.
 summary: Get component detail.
 tags:
 \- experimental
 operationId: getExperimentalComponent
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 description: The component ID.
 \- in: query
 name: mode
 required: false
 schema:
 type: string
 enum:
 \- collapsed
 \- all
 description: >
 Path projection mode. "collapsed" (default) shows effective state
 (BYO overrides scan). "all" shows both scan and BYO variants.
 \- in: query
 name: namespace
 required: false
 schema:
 type: string
 description: Optional namespace guard.
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 type: object
 properties:
 component:
 $ref: '#/components/schemas/ComponentDetailResource'
 required:
 \- component
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/components/{id}/versions:
 get:
 description: Get version history for a component.
 summary: Get component versions.
 tags:
 \- experimental
 operationId: getExperimentalComponentVersions
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 format: uuid
 description: The component ID.
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 type: object
 properties:
 versions:
 type: array
 items:
 type: object
 required:
 \- versions
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/components/{id}/paths:
 post:
 description: Add a new path to a CODE component.
 summary: Add path to component.
 tags:
 \- experimental
 operationId: postExperimentalPath
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 description: The component ID.
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/LineagePath'
 responses:
 '201':
 description: Path created successfully
 content:
 application/json:
 schema:
 type: object
 properties:
 path:
 $ref: '#/components/schemas/LineagePath'
 required:
 \- path
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/components/{id}/paths/{pathId}:
 put:
 description: >
 Update a path on a CODE component. Internally creates a BYO\_PATH\_DELETED
 event for the old path and a BYO\_PATH\_ADDED event for the new path,
 preserving the projection engine's overlay model.
 summary: Update a path on a component.
 tags:
 \- experimental
 operationId: putExperimentalPath
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 description: The component ID.
 \- in: path
 name: pathId
 required: true
 schema:
 type: string
 description: The path ID to update.
 requestBody:
 required: true
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/LineagePath'
 responses:
 '200':
 description: Path updated successfully
 content:
 application/json:
 schema:
 type: object
 properties:
 path:
 $ref: '#/components/schemas/LineagePath'
 required:
 \- path
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 delete:
 description: Delete a path from a CODE component.
 summary: Delete a path from a component.
 tags:
 \- experimental
 operationId: deleteExperimentalPath
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 description: The component ID.
 \- in: path
 name: pathId
 required: true
 schema:
 type: string
 description: The path ID to delete.
 requestBody:
 required: false
 content:
 application/json:
 schema:
 type: object
 properties:
 effective\_since\_commit\_sha:
 type: string
 description: >
 Commit SHA this deletion is effective from. When omitted,
 defaults to the latest scanned commit for the component.
 responses:
 '200':
 description: Path deleted successfully
 content:
 application/json:
 schema:
 type: object
 properties:
 success:
 type: boolean
 required:
 \- success
 '404':
 description: Not Found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /v0/experimental/component/{id}/field-pairs:
 get:
 description: List field pairs on a component for the field-level focused views.
 summary: List field pairs for a component.
 tags:
 \- experimental
 operationId: getExperimentalComponentFieldPairs
 parameters:
 \- in: path
 name: id
 required: true
 schema:
 type: string
 format: uuid
 description: UUID of the component.
 \- in: query
 name: payloadGroupId
 required: false
 schema:
 type: string
 description: Optional payload to scope the returned field pairs to.
 \- in: query
 name: origin
 required: false
 schema:
 $ref: '#/components/schemas/FieldPairOrigin'
 description: Optional filter by row provenance.
 \- in: query
 name: isSuppressed
 required: false
 schema:
 type: boolean
 description: Optional filter by suppression state.
 responses:
 '200':
 description: List of field pairs.
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/GetFieldPairsResponse'
 '400':
 description: Bad Request
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '404':
 description: Component not found
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 '500':
 description: Internal Server Error
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/ErrorResponse'
 /fake-path-for-type-generation:
 get:
 description: >-
 This is a fake path added just so the schemas are generated into code.
 It will be removed from the OAS after type generation, before
 documentation generation.
 summary: >-
 This is a fake path added just so the schemas are generated into code.
 It will be removed from the OAS after type generation, before
 documentation generation.
 tags:
 \- action
 operationId: fakeOperationId
 responses:
 '200':
 description: Successful operation
 content:
 application/json:
 schema:
 $ref: '#/components/schemas/FakeResponseForTypeGeneration'
components:
 securitySchemes:
 ApiKeyAuth:
 type: apiKey
 in: header
 name: X-API-KEY
 schemas:
 PingResponse:
 type: object
 required:
 \- success
 \- message
 properties:
 message:
 type: string
 success:
 type: boolean
 VersionResponse:
 type: object
 required:
 \- hash
 properties:
 hash:
 type: string
 ActionTriggerSource:
 type: object
 required:
 \- triggerType
 \- triggerValues
 properties:
 triggerType:
 type: string
 description: The type of trigger
 enum:
 \- source
 triggerValues:
 description: >-
 List of data asset sources, any of which need to match an event to
 trigger an action
 type: array
 items:
 type: string
 SourceType:
 type: string
 description: >-
 The type of the source data asset, indicating its source or format
 (e.g., postgres, protobuf).
 enum:
 \- postgres
 \- mysql
 \- mssql
 \- json\_schema
 \- avro
 \- protobuf
 \- python
 \- pyspark
 \- typescript
 \- java
 \- s3
 \- dataframe
 \- kotlin
 \- swift
 \- php
 \- golang
 ActionTriggerSourceType:
 type: object
 required:
 \- triggerType
 \- triggerValues
 properties:
 triggerType:
 type: string
 description: The type of trigger
 enum:
 \- sourceType
 triggerValues:
 description: >-
 List of data asset sourceTypes, any of which need to match an event
 to trigger an action
 type: array
 items:
 $ref: '#/components/schemas/SourceType'
 ActionTriggerEventName:
 type: object
 required:
 \- triggerType
 \- triggerValues
 properties:
 triggerType:
 type: string
 description: The type of trigger
 enum:
 \- eventName
 triggerValues:
 description: >-
 List of data asset event names, any of which need to match an event
 to trigger an action
 type: array
 items:
 type: string
 enum:
 \- data\_asset\_created
 \- data\_asset\_modified\_field\_added
 \- data\_asset\_modified\_field\_changed
 \- data\_asset\_modified\_field\_removed
 \- data\_asset\_deleted
 \- data\_contract\_created
 \- data\_contract\_modified
 \- data\_contract\_violation
 \- data\_contract\_deleted
 \- data\_action\_created
 \- data\_action\_deleted
 \- data\_action\_enabled
 \- data\_action\_disabled
 \- data\_action\_modified
 \- data\_asset\_pii\_detected
 ActionTriggerNamespace:
 type: object
 required:
 \- triggerType
 \- triggerValues
 properties:
 triggerType:
 type: string
 description: The type of trigger
 enum:
 \- namespace
 triggerValues:
 description: >-
 List of contract namespaces, any of which need to match an event to
 trigger an action
 type: array
 items:
 type: string
 ActionDestinationSlack:
 type: object
 required:
 \- destinationType
 \- slackChannelIds
 properties:
 destinationType:
 type: string
 description: The type of destination
 enum:
 \- slack
 slackChannelIds:
 description: List of slack channels IDs to notify when the action is triggered
 type: array
 items:
 type: string
 ActionDestinationEmail:
 type: object
 required:
 \- destinationType
 \- emailAddresses
 properties:
 destinationType:
 type: string
 description: The type of destination
 enum:
 \- email
 emailAddresses:
 description: List of email addresses to notify when the action is triggered
 type: array
 items:
 type: string
 format: email
 ActionDestinationWebhook:
 type: object
 required:
 \- destinationType
 \- webhookIds
 properties:
 destinationType:
 type: string
 description: The type of destination
 enum:
 \- webhook
 webhookIds:
 description: List of webhook identifiers to notify when the action is triggered
 type: array
 items:
 type: string
 PutActionRequest:
 type: object
 required:
 \- actionId
 \- name
 \- triggers
 \- destinations
 \- isActive
 properties:
 actionId:
 type: string
 description: The unique identifier of the action
 name:
 type: string
 description: The name of the action
 example: email on pricing asset change
 triggers:
 type: array
 minItems: 1
 items:
 oneOf:
 \- $ref: '#/components/schemas/ActionTriggerSource'
 \- $ref: '#/components/schemas/ActionTriggerSourceType'
 \- $ref: '#/components/schemas/ActionTriggerEventName'
 \- $ref: '#/components/schemas/ActionTriggerNamespace'
 discriminator:
 propertyName: triggerType
 mapping:
 source: ./ActionTriggerSource.yaml
 sourceType: ./ActionTriggerSourceType.yaml
 eventName: ./ActionTriggerEventName.yaml
 namespace: ./ActionTriggerNamespace.yaml
 destinations:
 type: array
 items:
 oneOf:
 \- $ref: '#/components/schemas/ActionDestinationSlack'
 \- $ref: '#/components/schemas/ActionDestinationEmail'
 \- $ref: '#/components/schemas/ActionDestinationWebhook'
 discriminator:
 propertyName: destinationType
 mapping:
 slack: ./ActionDestinationSlack.yaml
 email: ./ActionDestinationEmail.yaml
 webhook: ./ActionDestinationWebhook.yaml
 isActive:
 type: boolean
 description: Whether the action is active or not
 example: true
 PutActionResponse:
 type: object
 required:
 \- actionId
 properties:
 actionId:
 type: string
 description: The unique identifier of the updated action
 ErrorResponse:
 type: object
 required:
 \- message
 properties:
 id:
 type: number
 title:
 type: string
 message:
 type: string
 PostActionRequest:
 type: object
 required:
 \- name
 \- triggers
 \- destinations
 properties:
 name:
 type: string
 description: The name of the action
 example: email on pricing asset change
 triggers:
 type: array
 minItems: 1
 items:
 oneOf:
 \- $ref: '#/components/schemas/ActionTriggerSource'
 \- $ref: '#/components/schemas/ActionTriggerSourceType'
 \- $ref: '#/components/schemas/ActionTriggerEventName'
 \- $ref: '#/components/schemas/ActionTriggerNamespace'
 discriminator:
 propertyName: triggerType
 mapping:
 source: ./ActionTriggerSource.yaml
 sourceType: ./ActionTriggerSourceType.yaml
 eventName: ./ActionTriggerEventName.yaml
 namespace: ./ActionTriggerNamespace.yaml
 destinations:
 type: array
 minItems: 1
 items:
 oneOf:
 \- $ref: '#/components/schemas/ActionDestinationSlack'
 \- $ref: '#/components/schemas/ActionDestinationEmail'
 \- $ref: '#/components/schemas/ActionDestinationWebhook'
 discriminator:
 propertyName: destinationType
 mapping:
 slack: ./ActionDestinationSlack.yaml
 email: ./ActionDestinationEmail.yaml
 webhook: ./ActionDestinationWebhook.yaml
 PostActionResponse:
 type: object
 required:
 \- actionId
 properties:
 actionId:
 type: string
 description: The unique identifier of the created action
 DeleteActionRequest:
 type: object
 required:
 \- actionId
 properties:
 actionId:
 type: string
 description: The action id to delete
 DeleteActionResponse:
 type: object
 required:
 \- actionId
 properties:
 actionId:
 type: string
 description: The id of the action which was deleted
 GetActionsResponse:
 type: object
 required:
 \- actions
 properties:
 actions:
 type: array
 items:
 type: object
 required:
 \- actionId
 \- name
 \- isActive
 \- triggers
 \- destinations
 properties:
 actionId:
 type: string
 description: The unique identifier of the created action
 name:
 type: string
 description: The name of the action
 example: email on pricing asset change
 isActive:
 type: boolean
 description: Whether the action is active
 example: true
 ownerName:
 type: string
 description: The name of the user who created the action
 triggers:
 type: array
 minItems: 1
 items:
 oneOf:
 \- $ref: '#/components/schemas/ActionTriggerSource'
 \- $ref: '#/components/schemas/ActionTriggerSourceType'
 \- $ref: '#/components/schemas/ActionTriggerEventName'
 \- $ref: '#/components/schemas/ActionTriggerNamespace'
 discriminator:
 propertyName: triggerType
 mapping:
 source: ./ActionTriggerSource.yaml
 sourceType: ./ActionTriggerSourceType.yaml
 eventName: ./ActionTriggerEventName.yaml
 namespace: ./ActionTriggerNamespace.yaml
 destinations:
 type: array
 minItems: 1
 items:
 oneOf:
 \- $ref: '#/components/schemas/ActionDestinationSlack'
 \- $ref: '#/components/schemas/ActionDestinationEmail'
 \- $ref: '#/components/schemas/ActionDestinationWebhook'
 discriminator:
 propertyName: destinationType
 mapping:
 slack: ./ActionDestinationSlack.yaml
 email: ./ActionDestinationEmail.yaml
 webhook: ./ActionDestinationWebhook.yaml
 GetNpmCredentialsResponse:
 type: object
 required:
 \- authToken
 \- repositoryEndpoint
 properties:
 authToken:
 description: Temporary auth token
 type: string
 repositoryEndpoint:
 description: The npm repository endpoint
 type: string
 GetPipCredentialsResponse:
 type: object
 required:
 \- authToken
 \- repositoryEndpoint
 properties:
 authToken:
 description: Temporary auth token
 type: string
 repositoryEndpoint:
 description: The pip repository endpoint
 type: string
 GetScaPrimeArtifactBucketResponse:
 type: object
 description: The response from the getScaPrimeArtifactBucket function
 required:
 \- signedS3Url
 properties:
 signedS3Url:
 description: The signed S3 URL
 type: string
 DeleteContractResponse:
 type: object
 properties:
 message:
 type: string
 description: Success message
 ContractStatus:
 type: string
 description: status of the contract
 enum:
 \- ACTIVE
 \- DEPRECATED
 \- DRAFT
 \- ARCHIVED
 DataAssetResourceName:
 type: string
 pattern: >-
 ^(protobuf\|avro\|json\_schema\|java\|postgres\|mysql\|mssql\|snowflake\|bigquery\|python\|pyspark\|typescript\|s3\|dataframe\|kotlin\|swift\|php)://(?=.\*\[a-zA-Z0-9\])\[a-zA-Z0-9\_@\\.:/-\]+\[:/\](?=.\*\[a-zA-Z0-9\])\[a-zA-Z0-9\
 \_\\./-\\{\\}\\-\]+$
 description: >-
 The unique identifier of the data asset. It follows the pattern
 '{data\_asset\_type}://{data\_asset\_source}:{data\_asset\_name}'
 GableSchemaField:
 oneOf:
 \- $ref: '#/components/schemas/GableSchemaFieldStruct'
 \- $ref: '#/components/schemas/GableSchemaFieldNull'
 \- $ref: '#/components/schemas/GableSchemaFieldBool'
 \- $ref: '#/components/schemas/GableSchemaFieldInt'
 \- $ref: '#/components/schemas/GableSchemaFieldFloat'
 \- $ref: '#/components/schemas/GableSchemaFieldString'
 \- $ref: '#/components/schemas/GableSchemaFieldBytes'
 \- $ref: '#/components/schemas/GableSchemaFieldList'
 \- $ref: '#/components/schemas/GableSchemaFieldMap'
 \- $ref: '#/components/schemas/GableSchemaFieldEnum'
 \- $ref: '#/components/schemas/GableSchemaFieldUnion'
 \- $ref: '#/components/schemas/GableSchemaFieldAliasReference'
 \- $ref: '#/components/schemas/GableSchemaFieldUnknown'
 discriminator:
 propertyName: type
 mapping:
 struct: '#/components/schemas/GableSchemaFieldStruct'
 'null': '#/components/schemas/GableSchemaFieldNull'
 bool: '#/components/schemas/GableSchemaFieldBool'
 int: '#/components/schemas/GableSchemaFieldInt'
 float: '#/components/schemas/GableSchemaFieldFloat'
 string: '#/components/schemas/GableSchemaFieldString'
 bytes: '#/components/schemas/GableSchemaFieldBytes'
 list: '#/components/schemas/GableSchemaFieldList'
 map: '#/components/schemas/GableSchemaFieldMap'
 enum: '#/components/schemas/GableSchemaFieldEnum'
 union: '#/components/schemas/GableSchemaFieldUnion'
 aliasReference: '#/components/schemas/GableSchemaFieldAliasReference'
 unknown: '#/components/schemas/GableSchemaFieldUnknown'
 GableSchemaFieldStruct:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- struct
 name:
 type: string
 fields:
 type: array
 items:
 $ref: '#/components/schemas/GableSchemaField'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 optional:
 type: boolean
 GableSchemaFieldNull:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- 'null'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 GableSchemaFieldBool:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- bool
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 LogicalEnumTemporal:
 type: string
 enum:
 \- Date
 \- Time
 \- Duration
 \- Timestamp
 GableSchemaFieldInt:
 type: object
 required:
 \- type
 \- bits
 properties:
 type:
 type: string
 enum:
 \- int
 bits:
 type: integer
 minimum: 1
 maximum: 2147483647
 signed:
 type: boolean
 default: true
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 $ref: '#/components/schemas/LogicalEnumTemporal'
 unit:
 type: string
 enum:
 \- year
 \- month
 \- day
 \- hour
 \- minute
 \- second
 \- millisecond
 \- microsecond
 \- nanosecond
 \- picosecond
 timezone:
 type: string
 name:
 type: string
 optional:
 type: boolean
 GableSchemaFieldFloat:
 type: object
 required:
 \- type
 \- bits
 properties:
 type:
 type: string
 enum:
 \- float
 bits:
 type: integer
 minimum: 1
 maximum: 2147483647
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 LogicalEnumText:
 type: string
 enum:
 \- UUID
 \- org.iso.8601.Date
 \- org.iso.8601.DateTime
 \- org.iso.8601.Time
 GableSchemaFieldString:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- string
 bytes:
 type: integer
 minimum: 1
 maximum: 9223372036854776000
 variable:
 type: boolean
 default: true
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 $ref: '#/components/schemas/LogicalEnumText'
 name:
 type: string
 optional:
 type: boolean
 LogicalEnumNumeric:
 type: string
 enum:
 \- Decimal
 \- Interval
 GableSchemaFieldBytes:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- bytes
 bytes:
 type: integer
 minimum: 1
 maximum: 9223372036854776000
 variable:
 type: boolean
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 $ref: '#/components/schemas/LogicalEnumNumeric'
 precision:
 type: integer
 minimum: 1
 maximum: 2147483647
 scale:
 type: integer
 minimum: 0
 maximum: 2147483647
 unit:
 type: string
 enum:
 \- year
 \- month
 \- day
 \- hour
 \- minute
 \- second
 \- millisecond
 \- microsecond
 \- nanosecond
 \- picosecond
 name:
 type: string
 optional:
 type: boolean
 if:
 properties:
 variable:
 const: false
 required:
 \- variable
 then:
 required:
 \- bytes
 GableSchemaTypeName:
 type: string
 enum:
 \- 'null'
 \- bool
 \- int
 \- float
 \- string
 \- bytes
 \- list
 \- map
 \- struct
 \- enum
 \- union
 GableSchemaStruct:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- struct
 name:
 type: string
 fields:
 type: array
 items:
 $ref: '#/components/schemas/GableSchemaField'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaNull:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- 'null'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaBool:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- bool
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaInt:
 type: object
 required:
 \- type
 \- bits
 properties:
 type:
 type: string
 enum:
 \- int
 bits:
 type: integer
 minimum: 1
 maximum: 2147483647
 signed:
 type: boolean
 default: true
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 $ref: '#/components/schemas/LogicalEnumTemporal'
 unit:
 type: string
 enum:
 \- year
 \- month
 \- day
 \- hour
 \- minute
 \- second
 \- millisecond
 \- microsecond
 \- nanosecond
 \- picosecond
 timezone:
 type: string
 GableSchemaFloat:
 type: object
 required:
 \- type
 \- bits
 properties:
 type:
 type: string
 enum:
 \- float
 bits:
 type: integer
 minimum: 1
 maximum: 2147483647
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaString:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- string
 bytes:
 type: integer
 minimum: 1
 maximum: 9223372036854776000
 variable:
 type: boolean
 default: true
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 $ref: '#/components/schemas/LogicalEnumText'
 GableSchemaBytes:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- bytes
 bytes:
 type: integer
 minimum: 1
 maximum: 9223372036854776000
 variable:
 type: boolean
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 $ref: '#/components/schemas/LogicalEnumNumeric'
 precision:
 type: integer
 minimum: 1
 maximum: 2147483647
 scale:
 type: integer
 minimum: 0
 maximum: 2147483647
 unit:
 type: string
 enum:
 \- year
 \- month
 \- day
 \- hour
 \- minute
 \- second
 \- millisecond
 \- microsecond
 \- nanosecond
 \- picosecond
 if:
 properties:
 variable:
 const: false
 required:
 \- variable
 then:
 required:
 \- bytes
 GableSchemaType:
 oneOf:
 \- $ref: '#/components/schemas/GableSchemaTypeName'
 \- oneOf:
 \- $ref: '#/components/schemas/GableSchemaStruct'
 \- $ref: '#/components/schemas/GableSchemaNull'
 \- $ref: '#/components/schemas/GableSchemaBool'
 \- $ref: '#/components/schemas/GableSchemaInt'
 \- $ref: '#/components/schemas/GableSchemaFloat'
 \- $ref: '#/components/schemas/GableSchemaString'
 \- $ref: '#/components/schemas/GableSchemaBytes'
 \- $ref: '#/components/schemas/GableSchemaList'
 \- $ref: '#/components/schemas/GableSchemaMap'
 \- $ref: '#/components/schemas/GableSchemaEnum'
 \- $ref: '#/components/schemas/GableSchemaUnion'
 \- $ref: '#/components/schemas/GableSchemaAliasReference'
 \- $ref: '#/components/schemas/GableSchemaUnknown'
 discriminator:
 propertyName: type
 mapping:
 struct: '#/components/schemas/GableSchemaStruct'
 'null': '#/components/schemas/GableSchemaNull'
 bool: '#/components/schemas/GableSchemaBool'
 int: '#/components/schemas/GableSchemaInt'
 float: '#/components/schemas/GableSchemaFloat'
 string: '#/components/schemas/GableSchemaString'
 bytes: '#/components/schemas/GableSchemaBytes'
 list: '#/components/schemas/GableSchemaList'
 map: '#/components/schemas/GableSchemaMap'
 enum: '#/components/schemas/GableSchemaEnum'
 union: '#/components/schemas/GableSchemaUnion'
 aliasReference: '#/components/schemas/GableSchemaAliasReference'
 unknown: '#/components/schemas/GableSchemaUnknown'
 GableSchemaList:
 type: object
 required:
 \- type
 \- values
 properties:
 type:
 type: string
 enum:
 \- list
 values:
 $ref: '#/components/schemas/GableSchemaType'
 length:
 type: integer
 minimum: 1
 maximum: 9223372036854776000
 variable:
 type: boolean
 default: true
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 GableSchemaMap:
 type: object
 required:
 \- type
 \- keys
 \- values
 properties:
 type:
 type: string
 enum:
 \- map
 keys:
 $ref: '#/components/schemas/GableSchemaType'
 values:
 $ref: '#/components/schemas/GableSchemaType'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaEnum:
 type: object
 required:
 \- type
 \- symbols
 properties:
 type:
 type: string
 enum:
 \- enum
 symbols:
 type: array
 items:
 type: string
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaUnion:
 type: object
 required:
 \- type
 \- types
 properties:
 type:
 type: string
 enum:
 \- union
 types:
 type: array
 items:
 $ref: '#/components/schemas/GableSchemaType'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaAliasReference:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 not:
 $ref: '#/components/schemas/GableSchemaTypeName'
 doc:
 type: string
 logical:
 type: string
 additionalProperties: true
 not:
 required:
 \- alias
 GableSchemaUnknown:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- unknown
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 GableSchemaFieldList:
 type: object
 required:
 \- type
 \- values
 properties:
 type:
 type: string
 enum:
 \- list
 values:
 $ref: '#/components/schemas/GableSchemaType'
 length:
 type: integer
 minimum: 1
 maximum: 9223372036854776000
 variable:
 type: boolean
 default: true
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 name:
 type: string
 optional:
 type: boolean
 GableSchemaFieldMap:
 type: object
 required:
 \- type
 \- keys
 \- values
 properties:
 type:
 type: string
 enum:
 \- map
 keys:
 $ref: '#/components/schemas/GableSchemaType'
 values:
 $ref: '#/components/schemas/GableSchemaType'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 GableSchemaFieldEnum:
 type: object
 required:
 \- type
 \- symbols
 properties:
 type:
 type: string
 enum:
 \- enum
 symbols:
 type: array
 items:
 type: string
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 GableSchemaFieldUnion:
 type: object
 required:
 \- type
 \- types
 properties:
 type:
 type: string
 enum:
 \- union
 types:
 type: array
 items:
 $ref: '#/components/schemas/GableSchemaType'
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 GableSchemaFieldAliasReference:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 not:
 $ref: '#/components/schemas/GableSchemaTypeName'
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 additionalProperties: true
 not:
 required:
 \- alias
 GableSchemaFieldUnknown:
 type: object
 required:
 \- type
 properties:
 type:
 type: string
 enum:
 \- unknown
 alias:
 type: string
 pattern: ^\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*(?:\\.\[a-zA-Z\_\]\[a-zA-Z0-9\_\]\*)+$
 doc:
 type: string
 logical:
 type: string
 name:
 type: string
 optional:
 type: boolean
 GableSchemaContractField:
 allOf:
 \- oneOf:
 \- $ref: '#/components/schemas/GableSchemaStruct'
 \- $ref: '#/components/schemas/GableSchemaNull'
 \- $ref: '#/components/schemas/GableSchemaBool'
 \- $ref: '#/components/schemas/GableSchemaInt'
 \- $ref: '#/components/schemas/GableSchemaFloat'
 \- $ref: '#/components/schemas/GableSchemaString'
 \- $ref: '#/components/schemas/GableSchemaBytes'
 \- $ref: '#/components/schemas/GableSchemaList'
 \- $ref: '#/components/schemas/GableSchemaMap'
 \- $ref: '#/components/schemas/GableSchemaEnum'
 \- $ref: '#/components/schemas/GableSchemaUnion'
 \- $ref: '#/components/schemas/GableSchemaAliasReference'
 \- $ref: '#/components/schemas/GableSchemaUnknown'
 \- type: object
 properties:
 name:
 type: string
 optional:
 type: boolean
 \- type: object
 properties:
 constraints:
 type: object
 additionalProperties: true
 ContractSpec:
 type: object
 required:
 \- id
 \- doc
 \- name
 \- namespace
 \- owner
 \- schema
 properties:
 id:
 description: Unique identifier for the contract in UUID format
 type: string
 format: uuid
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 dataAssetResourceNameList:
 type: array
 items:
 $ref: '#/components/schemas/DataAssetResourceName'
 description: >-
 Optional array of data asset resource names for contracts that apply
 to multiple specific assets. When present, this takes precedence
 over dataAssetResourceName.
 doc:
 description: Description of the contract
 type: string
 name:
 description: >-
 The name of the contract. When combined with the contract namespace,
 it represents a unique name in the Gable platform. Only
 alphanumeric characters (upper and lowercase) and underscores are
 allowed
 type: string
 namespace:
 description: >-
 The namespace of the contract. When combined with the contract name,
 it represents a unique name in the Gable platform. Only
 alphanumeric characters (upper and lowercase) and underscores are
 allowed
 type: string
 owner:
 description: The owner of the contract
 type: string
 format: email
 restrictPii:
 description: If true, fields that look like PII will cause contract violations.
 type: boolean
 schema:
 type: array
 items:
 $ref: '#/components/schemas/GableSchemaContractField'
 ContractInput:
 type: object
 description: >-
 The metadata and schema for the Contract that is sent to Gable to be
 validated and uploaded. It may or may not contain a valid contract.
 required:
 \- id
 \- status
 \- contractSpec
 properties:
 id:
 description: Unique identifier for the contract in UUID format
 type: string
 format: uuid
 parentRowId:
 description: Unique identifier for a contract's parent row id in UUID format
 type: string
 format: uuid
 version:
 description: Version of the contract (semantic versioning)
 type: string
 status:
 $ref: '#/components/schemas/ContractStatus'
 gitHash:
 description: >-
 full length git hash corresponding to the commit this contract was
 added/updated
 type: string
 minLength: 40
 maxLength: 40
 gitRepo:
 description: full link to the git repo this contract lives in
 type: string
 format: uri
 gitUser:
 description: git user who added this contract
 type: string
 reviewers:
 description: >-
 optional list of users who reviewed the merged PR that this contract
 added/updated in
 type: array
 items:
 type: string
 filePath:
 description: path to the contract file from the root of the git repository
 type: string
 pattern: ^(\[^/\]+\\/)\*\[^/\]+$
 mergedAt:
 description: >-
 date time at which the PR that added/updated this contract was
 merged
 type: string
 format: date-time
 enforcementLevel:
 description: alert level for contract
 type: string
 enum:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 nullable: true
 contractSpec:
 description: >-
 This is the possible contract specification. If it is valid, it
 will match the contract specification schema. However, we have to
 allow for invalid contracts to be passed to Gable even if we reject
 them.
 $ref: '#/components/schemas/ContractSpec'
 additionalProperties: true
 lastEditorUserId:
 description: >-
 Unique identifier for the user who last edited the contract through
 the UI
 type: string
 format: uuid
 nullable: true
 lastEditorEmail:
 description: Email of the user who last edited the contract through the UI
 type: string
 nullable: true
 lastEditorFirstName:
 description: First name of the user who last edited the contract through the UI
 type: string
 nullable: true
 lastEditorLastName:
 description: Last name of the user who last edited the contract through the UI
 type: string
 nullable: true
 lastEditorGithubHandle:
 description: >-
 GitHub handle of the user who last edited the contract through the
 UI
 type: string
 nullable: true
 PostContractRequest:
 oneOf:
 \- $ref: '#/components/schemas/ContractInput'
 \- type: array
 items:
 $ref: '#/components/schemas/ContractInput'
 CheckResponse:
 type: object
 required:
 \- success
 \- message
 properties:
 message:
 type: string
 success:
 type: boolean
 ChangelogEventBase:
 type: object
 properties:
 id:
 description: The unique identifier for the changelog event.
 type: string
 format: uuid
 eventTitle:
 description: The LLM-generated text of the changelog event.
 type: string
 timestamp:
 description: The timestamp of the changelog event.
 type: string
 format: date-time
 userId:
 description: The unique identifier for the User who made a changelog event.
 type: string
 format: uuid
 required:
 \- id
 \- entityName
 \- timestamp
 ContractViolationType:
 type: string
 enum:
 \- MISSING\_REQUIRED\_PROPERTY
 \- INCOMPATIBLE\_TYPE
 \- GREATER\_THAN
 \- GREATER\_THAN\_OR\_EQUAL\_TO
 \- LESS\_THAN
 \- LESS\_THAN\_OR\_EQUAL\_TO
 \- IS\_NULL
 \- IS\_NULL\_THRESHOLD
 \- IS\_NOT\_EMPTY
 \- LENGTH
 \- LENGTH\_GREATER\_THAN
 \- LENGTH\_GREATER\_THAN\_OR\_EQUAL\_TO
 \- LENGTH\_LESS\_THAN
 \- LENGTH\_LESS\_THAN\_OR\_EQUAL\_TO
 \- MISSING\_DATA\_ASSET
 \- PII\_DETECTED
 ContractViolation:
 type: object
 properties:
 contractId:
 description: Unique identifier for the contract in UUID format
 type: string
 format: uuid
 contractVersion:
 description: Version of the contract
 type: string
 contractFieldName:
 description: Field of the contract where violation occured
 type: string
 contractName:
 description: Name of the contract
 type: string
 contractDomain:
 description: Domain of the contract
 type: string
 dataAssetFieldProfileId:
 description: Unique identifier for the data asset field in UUID format
 type: string
 format: uuid
 entityType:
 description: The type of entity that the changelog event is associated with.
 type: string
 enum:
 \- DATA\_CONTRACT
 eventType:
 description: The type of event that occurred
 type: string
 enum:
 \- VIOLATION
 violationType:
 description: Type of violation
 $ref: '#/components/schemas/ContractViolationType'
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 expectedValue:
 description: Expected value of the field
 type: string
 actualValue:
 description: actual value of the field
 type: string
 userId:
 description: Unique identifier for the user in UUID format
 type: string
 format: uuid
 prLink:
 description: Link to the pull request associated with the violation
 type: string
 required:
 \- contractId
 \- contractVersion
 \- violationType
 \- dataAssetResourceName
 \- contractFieldName
 \- entityType
 \- expectedValue
 \- actualValue
 ContractViolationEvent:
 allOf:
 \- $ref: '#/components/schemas/ChangelogEventBase'
 \- $ref: '#/components/schemas/ContractViolation'
 ContractOutput:
 type: object
 required:
 \- id
 \- status
 \- contractSpec
 \- contractSpecRaw
 \- createdAt
 \- updatedAt
 \- violations
 properties:
 id:
 description: Unique identifier for the contract in UUID format
 type: string
 format: uuid
 parentRowId:
 description: Unique identifier for a contract's parent row id in UUID format
 type: string
 format: uuid
 version:
 description: Version of the contract (semantic versioning)
 type: string
 status:
 $ref: '#/components/schemas/ContractStatus'
 gitHash:
 description: >-
 full length git hash corresponding to the commit this contract was
 added/updated
 type: string
 minLength: 40
 maxLength: 40
 gitRepo:
 description: full link to the git repo this contract lives in
 type: string
 format: uri
 gitUser:
 description: git user who added/updated this contract
 type: string
 fileUri:
 description: full link to the file in the repo that contains this contract
 type: string
 format: uri
 filePath:
 description: path to the contract file from the root of the git repository
 type: string
 reviewers:
 description: >-
 optional list of users who reviewed the merged PR that this contract
 added/updated in
 type: array
 items:
 type: string
 mergedAt:
 description: >-
 date time at which the PR that added/updated this contract was
 merged
 type: string
 format: date-time
 createdAt:
 description: date time at which the contract was created
 type: string
 format: date-time
 updatedAt:
 description: date time at which the contract was last updated
 type: string
 format: date-time
 contractSpec:
 description: contract spec
 $ref: '#/components/schemas/ContractSpec'
 contractSpecRaw:
 description: contract spec raw json
 type: string
 enforcementLevel:
 description: alert level for contract
 type: string
 default: INACTIVE
 enum:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 lastEditorUserId:
 description: >-
 Unique identifier for the user who last edited the contract through
 the UI
 type: string
 format: uuid
 nullable: true
 lastEditorEmail:
 description: Email of the user who last edited the contract through the UI
 type: string
 nullable: true
 lastEditorFirstName:
 description: First name of the user who last edited the contract through the UI
 type: string
 nullable: true
 lastEditorLastName:
 description: Last name of the user who last edited the contract through the UI
 type: string
 nullable: true
 lastEditorGithubHandle:
 description: >-
 GitHub handle of the user who last edited the contract through the
 UI
 type: string
 nullable: true
 violations:
 description: List of contract violations
 type: array
 items:
 $ref: '#/components/schemas/ContractViolationEvent'
 contractSpecFieldToViolationStatusMapping:
 description: >-
 Mapping of contract spec fields to a list of the violations
 currently applicable to them
 type: object
 additionalProperties:
 type: array
 items:
 $ref: '#/components/schemas/ContractViolationType'
 PutContractStageRequest:
 type: object
 required:
 \- contractStage
 properties:
 contractStage:
 type: string
 enum:
 \- ACTIVE
 \- DEPRECATED
 \- DRAFT
 \- ARCHIVED
 description: The new contract stage for the contract
 PutContractStageResponse:
 type: object
 required:
 \- message
 \- contractId
 properties:
 message:
 type: string
 description: Success message or information about the operation
 contractId:
 type: string
 format: uuid
 description: The ID of the contract that was updated
 ContractViolationCheckedResponse:
 type: object
 required:
 \- violation\_state
 properties:
 violation\_state:
 type: string
 enum:
 \- violation
 \- no\_violation
 violations:
 type: array
 items:
 type: object
 required:
 \- message
 \- field
 \- fieldType
 \- violationType
 \- expected
 properties:
 message:
 type: string
 field:
 type: string
 fieldType:
 type: string
 violationType:
 $ref: '#/components/schemas/ContractViolationType'
 expected:
 type: string
 actual:
 type: string
 checkedAt:
 type: string
 format: date-time
 description: The datetime the violation check was performed
 ContractViolationUncheckedResponse:
 type: object
 required:
 \- violation\_state
 properties:
 violation\_state:
 type: string
 enum:
 \- unchecked
 GetContractViolationStatusResponse:
 oneOf:
 \- $ref: '#/components/schemas/ContractViolationCheckedResponse'
 \- $ref: '#/components/schemas/ContractViolationUncheckedResponse'
 discriminator:
 propertyName: violation\_state
 mapping:
 violation: '#/components/schemas/ContractViolationCheckedResponse'
 no\_violation: '#/components/schemas/ContractViolationCheckedResponse'
 unchecked: '#/components/schemas/ContractViolationUncheckedResponse'
 ContractOutputPaginated:
 type: object
 description: A paginated list of contracts with total count
 required:
 \- contracts
 \- totalCount
 properties:
 contracts:
 type: array
 items:
 $ref: '#/components/schemas/ContractOutput'
 totalCount:
 type: number
 description: Total number of contracts matching the search criteria
 DataCount:
 type: object
 properties:
 count:
 type: number
 description: Total number of rows
 required:
 \- count
 PostContractResponse:
 type: object
 required:
 \- message
 \- contractIds
 properties:
 message:
 type: string
 contractIds:
 type: array
 description: >-
 List of contract IDs that were updated, if no contracts were updated
 this will be an empty list
 items:
 type: string
 format: uuid
 ContractActivityUpdateEvent:
 type: object
 required:
 \- type
 \- datetime
 properties:
 type:
 description: type of the event
 type: string
 enum:
 \- CONTRACT\_UPDATED
 datetime:
 description: date time at which the contract was updated
 type: string
 format: date-time
 fileUri:
 description: >-
 full link to the file and commit in the repo that contains this
 updated contract
 type: string
 format: uri
 gitUser:
 description: the git user who edited the contract
 type: string
 ContractActivityCreateEvent:
 type: object
 required:
 \- type
 \- datetime
 properties:
 type:
 description: type of the event
 type: string
 enum:
 \- CONTRACT\_CREATED
 datetime:
 description: date time at which the contract was created
 type: string
 format: date-time
 fileUri:
 description: >-
 full link to the file and commit in the repo that contains this
 created contract
 type: string
 format: uri
 gitUser:
 description: the git user who created the contract
 type: string
 ContractActivityResponse:
 type: array
 description: List of contract activity events in chronological order (oldest first)
 minItems: 1
 items:
 oneOf:
 \- $ref: '#/components/schemas/ContractActivityUpdateEvent'
 \- $ref: '#/components/schemas/ContractActivityCreateEvent'
 ContractSubscription:
 type: object
 required:
 \- id
 \- dataContractId
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier of the subscription
 dataContractId:
 description: Unique identifier of the contract
 type: string
 format: uuid
 userId:
 type: string
 format: uuid
 description: The unique identifier of the user
 email:
 type: string
 description: The email address of the subscriber if provided
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 githubHandle:
 type: string
 description: The GitHub handle of the subscriber if provided
 slackChannel:
 type: string
 description: The Slack channel where contract violations will be sent
 UpdateContractSubscriptionRequest:
 type: object
 required:
 \- dataContractId
 properties:
 dataContractId:
 description: Unique identifier of the contract
 type: string
 format: uuid
 userId:
 type: string
 format: uuid
 description: The unique identifier of the user
 email:
 type: string
 description: The email address of the subscriber if provided
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 githubHandle:
 type: string
 description: The GitHub handle for the subscriber if provided
 slackChannel:
 type: string
 description: The Slack channel where contract violations will be sent
 CreateContractSubscriptionRequest:
 type: object
 required:
 \- dataContractId
 properties:
 dataContractId:
 description: Unique identifier of the contract
 type: string
 format: uuid
 userId:
 type: string
 format: uuid
 description: The unique identifier of the user
 email:
 type: string
 description: The email address of the subscriber if provided
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 githubHandle:
 type: string
 description: The GitHub handle of the subscriber
 slackChannel:
 type: string
 description: The Slack channel where contract violations will be sent
 GetContractSubscriptionsResponse:
 type: array
 items:
 $ref: '#/components/schemas/ContractSubscription'
 ContractCheckComplianceRequest:
 type: object
 required:
 \- contract
 properties:
 contract:
 type: object
 required:
 \- contractSchema
 \- dataAssetResourceName
 properties:
 contractSchema:
 type: array
 items:
 $ref: '#/components/schemas/GableSchemaContractField'
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 ContractCheckComplianceResponse:
 type: object
 required:
 \- violations
 properties:
 violations:
 type: array
 items:
 type: object
 required:
 \- message
 \- field
 \- fieldType
 \- violationType
 \- expected
 properties:
 message:
 type: string
 field:
 type: string
 fieldType:
 type: string
 violationType:
 $ref: '#/components/schemas/ContractViolationType'
 expected:
 type: string
 actual:
 type: string
 BulkContractCheckComplianceRequest:
 type: object
 required:
 \- contract
 properties:
 contract:
 type: object
 required:
 \- contractSchema
 \- dataAssetResourceNames
 properties:
 contractSchema:
 type: array
 items:
 $ref: '#/components/schemas/GableSchemaContractField'
 dataAssetResourceNames:
 type: array
 items:
 $ref: '#/components/schemas/DataAssetResourceName'
 description: >-
 Array of data asset resource names to check compliance against
 the contract
 BulkContractCheckComplianceResponse:
 type: object
 required:
 \- results
 properties:
 results:
 type: object
 description: Map of data asset resource names to their compliance check results
 additionalProperties:
 type: object
 required:
 \- violations
 properties:
 violations:
 type: array
 items:
 type: object
 required:
 \- message
 \- field
 \- fieldType
 \- violationType
 \- expected
 properties:
 message:
 type: string
 field:
 type: string
 fieldType:
 type: string
 violationType:
 $ref: '#/components/schemas/ContractViolationType'
 expected:
 type: string
 actual:
 type: string
 ContractEnforcementLevel:
 type: object
 description: Represents an enforcement level associated with a contract.
 required:
 \- id
 \- contractId
 \- enforcementLevel
 \- createdAt
 \- updatedAt
 properties:
 id:
 description: >-
 Unique identifier for the contract enforcement level row in UUID
 format
 type: string
 format: uuid
 contractId:
 description: Unique identifier for the associated contract
 type: string
 format: uuid
 createdAt:
 description: Date and time at which the enforcement level was created
 type: string
 format: date-time
 updatedAt:
 description: Date and time at which the enforcement level was last updated
 type: string
 format: date-time
 enforcementLevel:
 description: alert level for contract
 type: string
 default: INACTIVE
 enum:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 x-enum-varnames:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 UpdateContractEnforcementLevelRequest:
 type: object
 description: Represents an enforcement level associated with a contract.
 required:
 \- enforcementLevel
 properties:
 enforcementLevel:
 type: string
 description: The enforcement level for the contract
 enum:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 CreateContractEnforcementLevelRequest:
 type: object
 description: Represents an enforcement level associated with a contract.
 required:
 \- contractId
 \- enforcementLevel
 properties:
 contractId:
 description: Unique identifier for the associated contract
 type: string
 format: uuid
 enforcementLevel:
 type: string
 description: The enforcement level for the contract
 enum:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 x-enum-varnames:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 DataAssetSearchResult:
 DataAssetSearchResult: null
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier for the data asset.
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 domain:
 description: >-
 The domain to which the data asset belongs. Previously referred to
 as "namespace."
 type: string
 path:
 description: >-
 The name or path identifying the data asset. Previously referred to
 as "name."
 type: string
 type:
 $ref: '#/components/schemas/SourceType'
 contractId:
 description: The contract ID associated with the data asset.
 type: string
 updatedAt:
 type: string
 format: date-time
 description: The timestamp of the most recent update to the data asset.
 required:
 \- id
 \- dataAssetResourceName
 \- domain
 \- path
 \- type
 \- updatedAt
 DataAssetSearchResultPaginated:
 type: object
 properties:
 data:
 type: array
 items:
 $ref: '#/components/schemas/DataAssetSearchResult'
 totalCount:
 type: number
 CreateOrUpdateDataAssetFieldRequest:
 type: object
 properties:
 name:
 type: string
 description: The name of the field.
 description:
 type: string
 description: A brief description of the field.
 order:
 type: integer
 description: The order or position of the field in the data asset.
 nativeDataType:
 type: string
 description: The native data type of the field in the source system.
 type:
 type: object
 additionalProperties: true
 description: >-
 A custom or specific attribute to represent the Gable type of the
 field.
 parentFieldId:
 type: string
 format: uuid
 description: For nested fields, this is the ID of the parent field.
 changeSummary:
 type: string
 description: >-
 A very brief LLM-generated summary of the changes made to the data
 asset field.
 changeDescription:
 type: string
 description: >-
 A detailed LLM-generated description of the changes made to the data
 asset field.
 required:
 \- name
 \- nativeDataType
 \- type
 DataAssetInput:
 type: object
 properties:
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 domain:
 description: The domain or category to which the data asset belongs.
 type: string
 path:
 description: The name or path identifying the data asset.
 type: string
 type:
 $ref: '#/components/schemas/SourceType'
 description:
 type: string
 description: A brief description of this particular version of the data asset.
 rawSchema:
 type: string
 description: >-
 The raw schema of the data asset from the source system. This can be
 the contents of a schema file or data from the information schema
 of a database. This is used to regenerate the schema of the data
 asset if needed.
 fields:
 description: The fields of the data asset.
 type: array
 items:
 $ref: '#/components/schemas/CreateOrUpdateDataAssetFieldRequest'
 prLink:
 description: Link to the PR that may have added or edited the data assets
 type: string
 example: https://github.com/fakeorg/fakerepo/pull/123
 required:
 \- dataAssetResourceName
 \- domain
 \- path
 \- type
 \- fields
 CreateOrUpdateDataAssetsRequest:
 type: array
 items:
 $ref: '#/components/schemas/DataAssetInput'
 DataAssetOutput:
 type: object
 required:
 \- id
 \- dataAssetResourceName
 \- versionId
 \- newVersionCreated
 properties:
 id:
 description: ID of the created or updated data asset
 type: string
 format: uuid
 versionId:
 description: Version ID of the now current data asset
 type: string
 format: uuid
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 newVersionCreated:
 description: Indicates whether a new version was created
 type: boolean
 CreateOrUpdateDataAssetsResponse:
 type: array
 items:
 $ref: '#/components/schemas/DataAssetOutput'
 DeleteDataAssetsRequest:
 type: object
 required:
 \- dataAssetsResourceNames
 properties:
 dataAssetsResourceNames:
 type: array
 items:
 type: string
 description: The unique identifiers of the data asset
 DeleteDataAssetsResponse:
 type: object
 properties:
 message:
 type: string
 description: Success message
 GetDataAssetsByDarnsResponse:
 type: array
 items:
 type: object
 required:
 \- darn
 \- status
 properties:
 darn:
 type: string
 description: The Data Asset Resource Name that was requested
 status:
 type: string
 enum:
 \- success
 \- not\_found
 \- error
 description: The status of fetching this particular asset
 data:
 $ref: '#/components/schemas/DataAssetSearchResult'
 description: The asset data (only present when status is 'success')
 errorMessage:
 type: string
 description: Error message (only present when status is 'error' or 'not\_found')
 GetDataAssetsByDarnsResponsePaginated:
 type: object
 properties:
 data:
 $ref: '#/components/schemas/GetDataAssetsByDarnsResponse'
 totalCount:
 type: integer
 description: Total number of results available
 limit:
 type: integer
 description: Maximum number of results per page
 offset:
 type: integer
 description: Number of results skipped
 required:
 \- data
 \- totalCount
 \- limit
 \- offset
 CreateOrUpdateDataAssetRequest:
 allOf:
 \- $ref: '#/components/schemas/DataAssetInput'
 CreateOrUpdateDataAssetResponse:
 allOf:
 \- $ref: '#/components/schemas/DataAssetOutput'
 CheckDataAssetsRequest:
 type: object
 required:
 \- inputs
 \- responseType
 properties:
 inputs:
 type: array
 items:
 type: object
 required:
 \- sourceName
 \- sourceType
 \- schemaContents
 properties:
 sourceName:
 type: string
 sourceType:
 $ref: '#/components/schemas/SourceType'
 schemaContents:
 type: string
 realDbName:
 type: string
 realDbSchema:
 type: string
 includeUnchangedAssets:
 description: >-
 If true, the data assets sent that have not changed compared with
 the stored assets will be checked for contract violations. If false,
 the only data assets that have changed compared with the stored
 assets will be checked for contract violations.
 type: boolean
 default: false
 responseType:
 description: >-
 Determines the format of the response from the API. Specifying
 'DETAILED' will return a detailed JSON object for each data asset
 checked. If 'COMMENT\_MARKDOWN' is specified, the response will be a
 markdown string intended to be used as a comment in a pull request.
 type: string
 enum:
 \- DETAILED
 \- COMMENT\_MARKDOWN
 prLink:
 description: >-
 Link to the pull request the proposed changes to the data asset are
 part of
 type: string
 CheckDataAssetNoContractResponse:
 type: object
 required:
 \- dataAssetNamespace
 \- dataAssetResourceName
 \- dataAssetPath
 \- responseType
 properties:
 dataAssetNamespace:
 description: The namespace of the data asset
 type: string
 examples:
 \- postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432
 \- protobuf://github.com/org/repo/path/to/file.proto
 dataAssetResourceName:
 description: >-
 The full resource name of the data asset, see \[Data\
 Assets\](https://docs.gable.ai/data\_assets\_and\_lineage/data\_assets)
 $ref: '#/components/schemas/DataAssetResourceName'
 examples:
 \- >-
 postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432:serviceone.public.sales
 \- >-
 protobuf://git@github.com/org/repo/path/to/file.proto:company.serviceone.Sales
 dataAssetPath:
 description: The relative path of the data asset within its data store
 type: string
 examples:
 \- serviceone.public.sales
 \- company.serviceone.Sales
 responseType:
 type: string
 enum:
 \- NO\_CONTRACT
 CheckDataAssetNoChangeResponse:
 type: object
 required:
 \- dataAssetNamespace
 \- dataAssetResourceName
 \- dataAssetPath
 \- responseType
 properties:
 dataAssetNamespace:
 description: The namespace of the data asset
 type: string
 examples:
 \- postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432
 \- protobuf://github.com/org/repo/path/to/file.proto
 dataAssetResourceName:
 description: >-
 The full resource name of the data asset, see \[Data\
 Assets\](https://docs.gable.ai/data\_assets\_and\_lineage/data\_assets)
 $ref: '#/components/schemas/DataAssetResourceName'
 examples:
 \- >-
 postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432:serviceone.public.sales
 \- >-
 protobuf://git@github.com/org/repo/path/to/file.proto:company.serviceone.Sales
 dataAssetPath:
 description: The relative path of the data asset within its data store
 type: string
 examples:
 \- serviceone.public.sales
 \- company.serviceone.Sales
 responseType:
 type: string
 enum:
 \- NO\_CHANGE
 CheckDataAssetDetailedResponse:
 type: object
 required:
 \- dataAssetNamespace
 \- dataAssetResourceName
 \- dataAssetPath
 \- contractId
 \- contractUrl
 \- contractNamespace
 \- contractName
 \- contractOwner
 \- subscribers
 \- responseType
 properties:
 dataAssetNamespace:
 description: The namespace of the data asset
 type: string
 examples:
 \- postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432
 \- protobuf://github.com/org/repo/path/to/file.proto
 dataAssetResourceName:
 description: >-
 The full resource name of the data asset, see \[Data\
 Assets\](https://docs.gable.ai/data\_assets\_and\_lineage/data\_assets)
 $ref: '#/components/schemas/DataAssetResourceName'
 examples:
 \- >-
 postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432:serviceone.public.sales
 \- >-
 protobuf://git@github.com/org/repo/path/to/file.proto:company.serviceone.Sales
 dataAssetPath:
 description: The relative path of the data asset within its data store
 type: string
 examples:
 \- serviceone.public.sales
 \- company.serviceone.Sales
 contractId:
 type: string
 format: uuid
 contractUrl:
 description: Link to the contract in the Gable UI
 type: string
 contractNamespace:
 type: string
 contractName:
 type: string
 contractOwner:
 type: string
 contractOwnerGithubHandle:
 type: string
 violations:
 type: array
 items:
 type: object
 required:
 \- message
 \- field
 \- fieldType
 \- violationType
 \- expected
 properties:
 message:
 type: string
 field:
 type: string
 fieldType:
 type: string
 violationType:
 $ref: '#/components/schemas/ContractViolationType'
 expected:
 type: string
 actual:
 type: string
 subscribers:
 type: array
 items:
 type: object
 properties:
 email:
 type: string
 githubHandle:
 type: string
 slackChannel:
 type: string
 responseType:
 type: string
 enum:
 \- DETAILED
 enforcementLevel:
 description: alert level for contract
 default: INACTIVE
 type: string
 enum:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 CheckDataAssetErrorResponse:
 type: object
 required:
 \- dataAssetNamespace
 \- message
 \- responseType
 properties:
 dataAssetNamespace:
 description: The namespace of the data asset
 type: string
 examples:
 \- postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432
 \- protobuf://github.com/org/repo/path/to/file.proto
 dataAssetResourceName:
 description: >-
 The full resource name of the data asset, see \[Data\
 Assets\](https://docs.gable.ai/data\_assets\_and\_lineage/data\_assets)
 $ref: '#/components/schemas/DataAssetResourceName'
 examples:
 \- >-
 postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432:serviceone.public.sales
 \- >-
 protobuf://git@github.com/org/repo/path/to/file.proto:company.serviceone.Sales
 dataAssetPath:
 description: The relative path of the data asset within its data store
 type: string
 examples:
 \- serviceone.public.sales
 \- company.serviceone.Sales
 message:
 description: The error message
 type: string
 responseType:
 type: string
 enum:
 \- ERROR
 enforcementLevel:
 description: notification tier of error response
 type: string
 enum:
 \- RECORD
 \- NOTIFY
 \- ALERT
 \- BLOCK
 \- INACTIVE
 CheckDataAssetMissingAssetResponse:
 type: object
 required:
 \- dataAssetResourceName
 \- dataAssetPath
 \- contract
 \- contractOwner
 \- subscribers
 \- responseType
 properties:
 dataAssetResourceName:
 description: >-
 The full resource name of the data asset, see \[Data\
 Assets\](https://docs.gable.ai/data\_assets\_and\_lineage/data\_assets)
 $ref: '#/components/schemas/DataAssetResourceName'
 examples:
 \- >-
 postgres://service-one.aaa.eu-west-1.rds.amazonaws.com:5432:serviceone.public.sales
 \- >-
 protobuf://git@github.com/org/repo/path/to/file.proto:company.serviceone.Sales
 dataAssetPath:
 description: The relative path of the data asset within its data store
 type: string
 examples:
 \- serviceone.public.sales
 \- company.serviceone.Sales
 contract:
 $ref: '#/components/schemas/ContractOutput'
 contractOwner:
 type: string
 contractOwnerGithubHandle:
 type: string
 subscribers:
 type: array
 items:
 type: object
 properties:
 email:
 type: string
 githubHandle:
 type: string
 slackChannel:
 type: string
 responseType:
 type: string
 enum:
 \- MISSING\_DATA\_ASSET
 CheckDataAssetResponse:
 oneOf:
 \- $ref: '#/components/schemas/CheckDataAssetNoContractResponse'
 \- $ref: '#/components/schemas/CheckDataAssetNoChangeResponse'
 \- $ref: '#/components/schemas/CheckDataAssetDetailedResponse'
 \- $ref: '#/components/schemas/CheckDataAssetErrorResponse'
 \- $ref: '#/components/schemas/CheckDataAssetMissingAssetResponse'
 discriminator:
 propertyName: responseType
 mapping:
 NO\_CONTRACT: '#/components/schemas/CheckDataAssetNoContractResponse'
 NO\_CHANGE: '#/components/schemas/CheckDataAssetNoChangeResponse'
 DETAILED: '#/components/schemas/CheckDataAssetDetailedResponse'
 ERROR: '#/components/schemas/CheckDataAssetErrorResponse'
 MISSING\_DATA\_ASSET: '#/components/schemas/CheckDataAssetMissingAssetResponse'
 CheckDataAssetCommentMarkdownResponse:
 type: object
 required:
 \- responseType
 \- shouldAlert
 \- shouldBlock
 properties:
 markdown:
 type: string
 shouldAlert:
 description: >-
 Whether or not to comment on the PR - true if at least one contract
 with a contract violation has its enforcement level set to ALERT or
 BLOCK.
 type: boolean
 shouldBlock:
 description: >-
 Whether or not to block the PR - true if at least one contract with
 a contract violation has its enforcement level set to BLOCK.
 type: boolean
 errors:
 type: array
 items:
 $ref: '#/components/schemas/CheckDataAssetErrorResponse'
 responseType:
 type: string
 enum:
 \- COMMENT\_MARKDOWN
 CheckDataAssetsResponse:
 oneOf:
 \- type: array
 items:
 $ref: '#/components/schemas/CheckDataAssetResponse'
 \- $ref: '#/components/schemas/CheckDataAssetCommentMarkdownResponse'
 StructuredDataAssetResourceName:
 type: object
 properties:
 source\_type:
 $ref: '#/components/schemas/SourceType'
 data\_source:
 type: string
 path:
 type: string
 required:
 \- source\_type
 \- data\_source
 \- path
 S3SamplingParameters:
 type: object
 description: The parameters used to sample the data
 required:
 \- rowSampleCount
 properties:
 rowSampleCount:
 type: integer
 description: Number of rows sampled per file
 recentFileCount:
 type: integer
 description: Number of most recent files whose schemas are sampled per data asset
 DataAssetFieldProfileBase:
 type: object
 description: generic data asset field profile
 required:
 \- sampledRecordsCount
 \- nullable
 \- sampledFiles
 \- samplingParameters
 properties:
 id:
 type: string
 format: uuid
 description: Unique identifier for the data asset field profile in UUID format
 sampledRecordsCount:
 type: integer
 description: Number of samples
 nullable:
 type: boolean
 description: Whether the data is nullable
 nullCount:
 type: integer
 description: Number of nulls (only defined if nullable is true)
 sampledFiles:
 type: array
 minItems: 1
 items:
 type: string
 description: List of sampled files
 sampledDate:
 description: The date the sample was taken
 type: string
 format: date-time
 samplingParameters:
 $ref: '#/components/schemas/S3SamplingParameters'
 DataAssetFieldProfileBoolean:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for boolean
 required:
 \- profileType
 \- trueCount
 \- falseCount
 properties:
 profileType:
 type: string
 enum:
 \- boolean
 trueCount:
 type: integer
 description: Number of true values
 falseCount:
 type: integer
 description: Number of false values
 DataAssetFieldProfileNumber:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for number
 required:
 \- profileType
 \- uniqueCount
 \- min
 \- max
 properties:
 profileType:
 type: string
 enum:
 \- number
 uniqueCount:
 type: integer
 description: Number of unique values
 min:
 type: number
 description: Minimum value
 max:
 type: number
 description: Maximum value
 DataAssetFieldProfileOther:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for unspecified type
 required:
 \- profileType
 properties:
 profileType:
 type: string
 enum:
 \- other
 DataAssetFieldProfileString:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for string
 required:
 \- profileType
 \- uniqueCount
 \- minLength
 \- maxLength
 \- emptyCount
 properties:
 profileType:
 type: string
 enum:
 \- string
 uniqueCount:
 type: integer
 description: Number of unique values
 minLength:
 type: integer
 description: Minimum length
 maxLength:
 type: integer
 description: Maximum length
 emptyCount:
 type: integer
 description: Number of empty values
 DataAssetFieldProfileUUID:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for a UUID
 required:
 \- profileType
 \- uniqueCount
 \- minLength
 \- maxLength
 \- emptyCount
 properties:
 profileType:
 type: string
 enum:
 \- uuid
 uniqueCount:
 type: integer
 description: Number of unique values
 minLength:
 type: integer
 description: Minimum length
 maxLength:
 type: integer
 description: Maximum length
 emptyCount:
 type: integer
 description: Number of empty values
 format:
 type: string
 description: UUID format
 uuidVersion:
 type: integer
 description: UUID version
 DataAssetFieldProfileTemporal:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for temporal
 required:
 \- profileType
 \- min
 \- max
 \- format
 properties:
 profileType:
 type: string
 enum:
 \- temporal
 min:
 type: string
 format: date-time
 description: Minimum value
 max:
 type: string
 format: date-time
 description: Maximum value
 format:
 type: string
 description: Temporal format
 DataAssetFieldProfile:
 oneOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBoolean'
 \- $ref: '#/components/schemas/DataAssetFieldProfileNumber'
 \- $ref: '#/components/schemas/DataAssetFieldProfileOther'
 \- $ref: '#/components/schemas/DataAssetFieldProfileString'
 \- $ref: '#/components/schemas/DataAssetFieldProfileUUID'
 \- $ref: '#/components/schemas/DataAssetFieldProfileTemporal'
 \- $ref: '#/components/schemas/DataAssetFieldProfileUnion'
 \- $ref: '#/components/schemas/DataAssetFieldProfileList'
 discriminator:
 propertyName: profileType
 mapping:
 boolean: '#/components/schemas/DataAssetFieldProfileBoolean'
 number: '#/components/schemas/DataAssetFieldProfileNumber'
 other: '#/components/schemas/DataAssetFieldProfileOther'
 string: '#/components/schemas/DataAssetFieldProfileString'
 uuid: '#/components/schemas/DataAssetFieldProfileUUID'
 temporal: '#/components/schemas/DataAssetFieldProfileTemporal'
 union: '#/components/schemas/DataAssetFieldProfileUnion'
 list: '#/components/schemas/DataAssetFieldProfileList'
 DataAssetFieldProfileUnion:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for union
 required:
 \- profileType
 \- profiles
 properties:
 profileType:
 type: string
 enum:
 \- union
 profiles:
 type: array
 description: List of constituent data asset field profiles
 items:
 $ref: '#/components/schemas/DataAssetFieldProfile'
 DataAssetFieldProfileList:
 allOf:
 \- $ref: '#/components/schemas/DataAssetFieldProfileBase'
 \- type: object
 description: Data asset field profile for string
 required:
 \- profileType
 \- minLength
 \- maxLength
 properties:
 profileType:
 type: string
 enum:
 \- list
 minLength:
 type: integer
 description: Minimum length
 maxLength:
 type: integer
 description: Maximum length
 DataAssetFieldsToProfilesMapping:
 type: object
 description: Mapping of a data asset's fields to their respective data profiles
 additionalProperties:
 $ref: '#/components/schemas/DataAssetFieldProfile'
 ResolvedDataAsset:
 type: object
 properties:
 source\_type:
 $ref: '#/components/schemas/SourceType'
 data\_asset\_resource\_name:
 $ref: '#/components/schemas/StructuredDataAssetResourceName'
 schema:
 description: The schema of the data asset
 $ref: '#/components/schemas/GableSchemaStruct'
 fieldNameToDataAssetFieldProfileMap:
 description: >-
 A mapping of the field name within the schema to its corresponding
 data profile
 $ref: '#/components/schemas/DataAssetFieldsToProfilesMapping'
 required:
 \- source\_type
 \- data\_asset\_resource\_name
 \- schema
 DataAssetsCheckComplianceRequest:
 type: object
 properties:
 assets:
 description: Array of data assets to check compliance for
 type: array
 items:
 $ref: '#/components/schemas/ResolvedDataAsset'
 includeUnchangedAssets:
 description: >-
 If true, the data assets sent that have not changed compared with
 the stored assets will be checked for contract violations. If false,
 the only data assets that have changed compared with the stored
 assets will be checked for contract violations.
 type: boolean
 default: false
 responseType:
 description: >-
 Determines the format of the response from the API. Specifying
 'DETAILED' will return a detailed JSON object for each data asset
 checked. If 'COMMENT\_MARKDOWN' is specified, the response will be a
 markdown string intended to be used as a comment in a pull request.
 type: string
 enum:
 \- DETAILED
 \- COMMENT\_MARKDOWN
 prLink:
 description: >-
 (optional) Link to the pull request the proposed changes to the data
 asset are part of
 type: string
 required:
 \- assets
 \- responseType
 S3Asset:
 type: object
 properties:
 schema:
 description: The schema of the data asset
 $ref: '#/components/schemas/GableSchemaStruct'
 pattern:
 description: The pattern of the data asset
 type: string
 bucket:
 description: The bucket of the data asset
 type: string
 fieldNameToDataAssetFieldProfileMap:
 description: >-
 A mapping of the field name within the recap struct schema to its
 corresponding data profile
 $ref: '#/components/schemas/DataAssetFieldsToProfilesMapping'
 required:
 \- schema
 \- pattern
 \- bucket
 CheckComplianceDataAssetsS3Request:
 type: object
 required:
 \- assets
 \- responseType
 properties:
 assets:
 description: Array of data assets to check for compliance
 type: array
 items:
 $ref: '#/components/schemas/S3Asset'
 includeUnchangedAssets:
 description: >-
 If true, the data assets sent that have not changed compared with
 the stored assets will be checked for contract violations and
 responseType: NO\_CHANGE will be returned for those assets. If false,
 the only data assets that have changed compared with the stored
 assets will be checked for contract violations.
 type: boolean
 default: false
 responseType:
 description: >-
 Determines the format of the response from the API. Specifying
 'DETAILED' will return a detailed JSON object for each data asset
 checked. If 'COMMENT\_MARKDOWN' is specified, the response will be a
 markdown string intended to be used as a comment in a pull request.
 type: string
 enum:
 \- DETAILED
 \- COMMENT\_MARKDOWN
 prLink:
 description: >-
 Link to the pull request the proposed changes to the data asset are
 part of
 type: string
 IngestDataAssetRequest:
 type: object
 properties:
 sourceType:
 $ref: '#/components/schemas/SourceType'
 sourceNames:
 description: The names of the sources
 type: array
 items:
 type: string
 databaseSchema:
 description: The name of the database schema
 type: string
 schema:
 description: >-
 Array of schemas. Each schema could be from a db information schema
 or the contents of a schema file.
 type: array
 items:
 type: string
 dryRun:
 description: If true, no data asset will be registered
 type: boolean
 default: false
 prLink:
 description: Link to the PR that may have added or edited the data assets
 type: string
 example: https://github.com/fakeorg/fakerepo/pull/123
 required:
 \- sourceType
 \- sourceNames
 \- databaseSchema
 \- schema
 IngestDataAssetResponse:
 type: object
 properties:
 message:
 description: Response message
 type: string
 registered:
 description: List of the registered data asset ids
 type: array
 items:
 type: string
 success:
 description: Whether the request was successful
 type: boolean
 required:
 \- message
 \- registered
 \- success
 ErrorResponseDeprecated:
 type: object
 required:
 \- message
 properties:
 id:
 type: number
 title:
 type: string
 message:
 type: string
 success:
 type: boolean
 RegisterDataAssetsRequest:
 type: object
 properties:
 assets:
 description: Array of data assets to register
 type: array
 items:
 $ref: '#/components/schemas/ResolvedDataAsset'
 prLink:
 description: Link to the PR that may have added or edited the data assets
 type: string
 example: https://github.com/fakeorg/fakerepo/pull/123
 required:
 \- assets
 RegisterDataAssetsResponse:
 type: object
 properties:
 asset\_registration\_outcomes:
 type: array
 items:
 type: object
 properties:
 data\_asset\_resource\_name:
 $ref: '#/components/schemas/StructuredDataAssetResourceName'
 error:
 type: string
 description: Error message if registration of this asset failed
 required:
 \- data\_asset\_resource\_name
 required:
 \- asset\_registration\_outcomes
 RegisterDataAssetS3Request:
 type: object
 properties:
 assets:
 description: Array of data assets to register
 type: array
 items:
 $ref: '#/components/schemas/S3Asset'
 dry\_run:
 description: If true, no data asset will be registered
 type: boolean
 default: false
 prLink:
 description: Link to the PR that may have added or edited the data assets
 type: string
 nullable: true
 example: https://github.com/fakeorg/fakerepo/pull/123
 required:
 \- assets
 PiiCategoryEnum:
 type: string
 enum:
 \- phone
 \- email
 \- credit\_card
 \- address
 \- person
 \- birth\_date
 \- gender
 \- nationality
 \- ssn
 \- zip\_code
 \- po\_box
 \- user\_name
 \- password
 \- religion
 \- sexual\_orientation
 \- drivers\_license
 \- passport
 \- birth\_certificate
 \- medicare
 \- concession\_card
 \- fingerprint
 \- face\_scan
 \- bank\_details
 \- contact\_details
 \- tax\_file\_number
 description: type of pii detected in the column name
 nullable: true
 DataAssetField:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier for the data asset field.
 dataAssetVersionId:
 type: string
 format: uuid
 description: The identifier of the data asset version this field belongs to.
 name:
 type: string
 description: The name of the field.
 description:
 type: string
 description: A brief description of the field.
 order:
 type: integer
 description: The order or position of the field in the data asset.
 nativeDataType:
 type: string
 description: The native data type of the field in the source system.
 type:
 type: object
 additionalProperties: true
 description: >-
 A custom or specific attribute to represent the Gable type of the
 field.
 displayType:
 type: string
 description: The display name of the field.
 parentFieldId:
 type: string
 format: uuid
 description: For nested fields, this is the ID of the parent field.
 createdAt:
 type: string
 format: date-time
 description: The timestamp when the field was created.
 updatedAt:
 type: string
 format: date-time
 description: The timestamp when the field was last updated.
 deletedAt:
 type: string
 format: date-time
 description: The timestamp when the field was marked as deleted.
 piiCategory:
 $ref: '#/components/schemas/PiiCategoryEnum'
 profile:
 $ref: '#/components/schemas/DataAssetFieldProfile'
 required:
 \- id
 \- dataAssetVersionId
 \- name
 \- nativeDataType
 \- displayType
 \- createdAt
 \- updatedAt
 \- type
 DataAssetVersion:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier for the version of the data asset.
 dataAssetId:
 type: string
 format: uuid
 description: >-
 The identifier of the parent data asset to which this version
 belongs.
 description:
 type: string
 description: A brief description of this particular version of the data asset.
 rawSchema:
 type: string
 description: >-
 The raw schema of the data asset from the source system. This can be
 the contents of a schema file or data from the information schema
 of a database. This is used to regenerate the schema of the data
 asset if needed.
 fields:
 description: The fields of the data asset.
 type: array
 items:
 $ref: '#/components/schemas/DataAssetField'
 createdAt:
 type: string
 format: date-time
 description: The timestamp when this version of the data asset was created.
 updatedAt:
 type: string
 format: date-time
 description: The timestamp when this version of the data asset was last updated.
 deletedAt:
 type: string
 format: date-time
 description: >-
 The timestamp when this version of the data asset was marked as
 deleted, if applicable.
 violations:
 description: List of contract violations associated with the data asset version.
 type: array
 items:
 $ref: '#/components/schemas/ContractViolation'
 required:
 \- id
 \- dataAssetId
 \- fields
 \- createdAt
 \- updatedAt
 \- violations
 DataAsset:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier for the data asset.
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 domain:
 description: >-
 The domain to which the data asset belongs. Previously referred to
 as "namespace."
 type: string
 path:
 description: >-
 The name or path identifying the data asset. Previously referred to
 as "name."
 type: string
 type:
 $ref: '#/components/schemas/SourceType'
 contractId:
 description: The contract ID associated with the data asset.
 type: string
 versionDetail:
 description: The version details of the data asset.
 $ref: '#/components/schemas/DataAssetVersion'
 createdAt:
 type: string
 format: date-time
 description: The timestamp of when the data asset was initially created.
 updatedAt:
 type: string
 format: date-time
 description: The timestamp of the most recent update to the data asset.
 deletedAt:
 type: string
 format: date-time
 description: >-
 The timestamp indicating when the data asset was deleted, if
 applicable.
 required:
 \- id
 \- dataAssetResourceName
 \- domain
 \- path
 \- type
 \- versionDetail
 \- createdAt
 \- updatedAt
 InferContractFromDataAssetResponse:
 type: object
 required:
 \- contractId
 \- contractSpec
 \- contractSpecRaw
 properties:
 contractId:
 description: Unique identifier for the contract in UUID format
 type: string
 format: uuid
 version:
 description: Version of the contract (semantic versioning)
 type: string
 status:
 description: status of the contract
 type: string
 enum:
 \- ACTIVE
 \- DEPRECATED
 gitHash:
 description: >-
 full length git hash corresponding to the commit this contract was
 added/updated
 type: string
 minLength: 40
 maxLength: 40
 gitRepo:
 description: full link to the git repo this contract lives in
 type: string
 format: uri
 gitUser:
 description: git user who added/updated this contract
 type: string
 fileUri:
 description: full link to the file in the repo that contains this contract
 type: string
 format: uri
 reviewers:
 description: >-
 optional list of users who reviewed the merged PR that this contract
 added/updated in
 type: array
 items:
 type: string
 mergedAt:
 description: >-
 date time at which the PR that added/updated this contract was
 merged
 type: string
 format: date-time
 createdAt:
 description: date time at which the contract was created
 type: string
 format: date-time
 updatedAt:
 description: date time at which the contract was last updated
 type: string
 format: date-time
 contractSpec:
 description: contract spec
 $ref: '#/components/schemas/ContractSpec'
 contractSpecRaw:
 description: contract spec raw json
 type: string
 CreateDataAssetProfileRequest:
 type: object
 properties:
 darn:
 description: the Data Asset Resource Name (DARN) of the data asset
 type: string
 data\_asset\_id:
 type: string
 format: uuid
 description: ID for the data asset
 fieldsToProfilesMapping:
 description: >-
 The mapping of data asset fields to data asset field profiles
 associated with the data asset
 $ref: '#/components/schemas/DataAssetFieldsToProfilesMapping'
 required:
 \- darn
 \- data\_asset\_id
 \- fieldsToProfilesMapping
 CreateDataAssetProfileResponse:
 type: object
 required:
 \- fieldsToProfilesMapping
 properties:
 fieldsToProfilesMapping:
 $ref: '#/components/schemas/DataAssetFieldsToProfilesMapping'
 GetApiKeysResponse:
 type: array
 items:
 type: object
 properties:
 id:
 description: The identifier of the API key
 type: string
 name:
 description: The name of the API key
 type: string
 value:
 description: The value of the API key
 type: string
 GetSsoSamlSetupDetailsResponse:
 type: object
 required:
 \- ssoUrl
 \- audienceUri
 properties:
 ssoUrl:
 description: >-
 The location where the SAML assertion is sent with a HTTP POST, also
 referred to as the SAML Assertion Consumer Service (ACS) URL.
 type: string
 audienceUri:
 description: >-
 (SP Entity Id) The application-defined unique identifier that is the
 intended audience of the SAML assertion. This is most often the SP
 Entity ID of your application.
 type: string
 SsoSamlUrlConfig:
 type: object
 required:
 \- type
 \- identityProvider
 \- metadataDocumentEndpointUrl
 properties:
 type:
 description: The type of SSO integration, currently only SAML is supported.
 type: string
 enum:
 \- SAML
 identityProvider:
 description: >
 The name of your identity provider. This value will be displayed to
 users when they log in.

Note: This value cannot be the strings "Google" or "SAML" as they're
 reserved words in our identity management platform.
 type: string
 examples:
 \- Okta
 \- GoogleWorkspace
 \- OneLogin
 \- JumpCloud
 pattern: ^(?=\[a-zA-Z0-9\\(\\)\\.\\-!@\]+$)(?!Google\|SAML$).\*$
 metadataDocumentEndpointUrl:
 description: >-
 The URL of the SAML metadata document. Either this or
 metadataFileContents must be provided.
 example: https://company.okta.com/app/123456789/sso/saml/metadata
 type: string
 SsoSamlFileConfig:
 type: object
 required:
 \- type
 \- identityProvider
 \- metadataFileContents
 properties:
 type:
 description: The type of SSO integration, currently only SAML is supported.
 type: string
 enum:
 \- SAML
 identityProvider:
 description: >
 The name of your identity provider. This value will be displayed to
 users when they log in.

Note: This value cannot be the strings "Google" or "SAML" as they're
 reserved words in our identity management platform.
 type: string
 examples:
 \- Okta
 \- GoogleWorkspace
 \- OneLogin
 \- JumpCloud
 pattern: ^(?=\[a-zA-Z0-9\\(\\)\\.\\-!@\]+$)(?!Google\|SAML$).\*$
 metadataFileContents:
 description: >-
 The contents of the metadata document. Either this or
 metadataDocumentEndpointUrl must be provided.
 type: string
 SsoConfig:
 oneOf:
 \- $ref: '#/components/schemas/SsoSamlUrlConfig'
 \- $ref: '#/components/schemas/SsoSamlFileConfig'
 GetUserRequest:
 type: object
 required:
 \- email
 properties:
 email:
 type: string
 description: The email address of the user, which is the primary ID in Gable
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 UserStatus:
 type: string
 enum:
 \- ACTIVE
 \- INVITED
 \- DELETED
 description: \|
 User status:

\\* \`active\` - User accepted invitation and is active
 \\* \`invited\` - The invitation is sent to the user
 \\* \`deleted\` - The user has been deleted
 UserRole:
 type: string
 enum:
 \- ADMIN
 \- EDITOR
 \- VIEWER
 User:
 type: object
 required:
 \- email
 \- status
 \- role
 properties:
 email:
 type: string
 description: The email address of the user
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 firstName:
 type: string
 description: The first name of the user, if available
 lastName:
 type: string
 description: The last name of the user, if available
 githubHandle:
 type: string
 description: The GitHub handle of the user or team, if available
 status:
 $ref: '#/components/schemas/UserStatus'
 description: The status of the user
 role:
 $ref: '#/components/schemas/UserRole'
 description: The role of the user
 UpdateUserRequest:
 type: object
 required:
 \- email
 properties:
 email:
 type: string
 description: The email address of the user, which is the primary ID in Gable
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 firstName:
 type: string
 description: The first name of the user
 lastName:
 type: string
 description: The last name of the user
 githubHandle:
 type: string
 description: The GitHub handle of the user
 pattern: ^\[a-zA-Z0-9-\]\*$
 role:
 $ref: '#/components/schemas/UserRole'
 description: The role of the user
 UpdateUserResponse:
 type: object
 required:
 \- email
 \- role
 properties:
 email:
 type: string
 description: The email address of the user, which is the primary ID in Gable
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 firstName:
 type: string
 description: The first name of the user
 lastName:
 type: string
 description: The last name of the user
 githubHandle:
 type: string
 description: The GitHub handle of the user
 role:
 $ref: '#/components/schemas/UserRole'
 description: The role of the user
 GetUsersResponse:
 type: array
 items:
 $ref: '#/components/schemas/User'
 InviteUserRequest:
 type: object
 required:
 \- email
 properties:
 email:
 type: string
 description: The email address of the user, which is the primary ID in Gable
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 firstName:
 type: string
 description: The first name of the user
 lastName:
 type: string
 description: The last name of the user
 resendInvite:
 type: boolean
 description: The flag which determines whether the invitation should be resent
 role:
 $ref: '#/components/schemas/UserRole'
 description: The role of the user
 DeleteUserRequest:
 type: object
 required:
 \- email
 properties:
 email:
 type: string
 description: The email address of the user, which is the primary ID in Gable
 pattern: ^\[a-zA-Z0-9\_.+-\]+@\[a-zA-Z0-9-\]+\\.\[a-zA-Z0-9-.\]+$
 ChangelogEventType:
 type: string
 enum:
 \- CREATED
 \- MODIFIED
 \- DELETED
 \- VIOLATION
 \- ENABLED
 \- DISABLED
 AssetCreatedEvent:
 allOf:
 \- $ref: '#/components/schemas/ChangelogEventBase'
 \- type: object
 properties:
 entityType:
 description: The type of entity that the changelog event is associated with.
 type: string
 enum:
 \- DATA\_ASSET
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 eventType:
 $ref: '#/components/schemas/ChangelogEventType'
 prLink:
 type: string
 description: Link to the pull request associated with the asset modification.
 example: https://github.com/fakeorg/fakerepo/pull/1
 piiDetected:
 type: object
 additionalProperties: true
 description: A mapping of the fieldname to the pii\_category.
 required:
 \- entityType
 \- dataAssetResourceName
 \- eventType
 AssetDeletedEvent:
 allOf:
 \- $ref: '#/components/schemas/AssetCreatedEvent'
 FieldAddedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- FIELD\_ADDED
 diff:
 description: Details of the modified field.
 type: object
 properties:
 fieldName:
 description: The name of the field being added.
 type: string
 type:
 description: The type of the field being added.
 type: string
 required:
 \- fieldName
 \- type
 required:
 \- eventType
 \- diff
 FieldModifiedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- FIELD\_MODIFIED
 diff:
 description: Details of the modified field.
 type: object
 properties:
 fieldName:
 description: The name of the field being modified.
 type: string
 attributeName:
 description: The name of the attribute being modified.
 type: string
 enum:
 \- PRECISION\_BITS
 \- SIGNED
 \- TYPE
 \- LOGICAL\_TYPE
 \- ENUM\_VALUES
 \- NULLABLE
 \- STRUCTURAL
 \- BYTES
 \- VARIABLE
 \- SCALE
 \- PRECISION
 \- UNIT
 \- TIMEZONE
 \- VALUE
 \- SEMANTIC
 \- DOC
 previousValue:
 description: The type of the field before the change.
 type: string
 newValue:
 description: The type of the field after the change.
 type: string
 summary:
 description: A very brief summary of the change for the field.
 type: string
 description:
 description: A detailed description of the change.
 type: string
 required:
 \- fieldName
 \- attributeName
 \- previousValue
 \- newValue
 required:
 \- eventType
 \- diff
 FieldDeletedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- FIELD\_DELETED
 diff:
 description: Details of the modified field.
 type: object
 properties:
 fieldName:
 description: The name of the field being deleted.
 type: string
 type:
 description: The type of the field being deleted.
 type: string
 required:
 \- fieldName
 \- type
 required:
 \- eventType
 \- diff
 AssetModifiedEvent:
 allOf:
 \- $ref: '#/components/schemas/AssetCreatedEvent'
 \- type: object
 properties:
 modifications:
 type: array
 description: >-
 List of changelog modifications in chronological order (newest
 first)
 items:
 oneOf:
 \- $ref: '#/components/schemas/FieldAddedEvent'
 \- $ref: '#/components/schemas/FieldModifiedEvent'
 \- $ref: '#/components/schemas/FieldDeletedEvent'
 piiDetected:
 type: object
 additionalProperties: true
 description: A mapping of the fieldname to the pii\_category.
 required:
 \- modifications
 ContractCreatedEvent:
 allOf:
 \- $ref: '#/components/schemas/ChangelogEventBase'
 \- type: object
 properties:
 entityType:
 description: The type of entity that the changelog event is associated with.
 type: string
 enum:
 \- DATA\_CONTRACT
 eventType:
 $ref: '#/components/schemas/ChangelogEventType'
 contractId:
 description: The unique identifier for the contract.
 type: string
 format: uuid
 contractName:
 description: The name of the contract.
 type: string
 contractDomain:
 description: The domain of the contract.
 type: string
 required:
 \- contractId
 \- entityType
 \- eventType
 ContractModifiedEvent:
 allOf:
 \- $ref: '#/components/schemas/ContractCreatedEvent'
 \- type: object
 properties:
 modifications:
 type: array
 description: >-
 List of changelog modifications in chronological order (newest
 first)
 items:
 oneOf:
 \- $ref: '#/components/schemas/FieldAddedEvent'
 \- $ref: '#/components/schemas/FieldModifiedEvent'
 \- $ref: '#/components/schemas/FieldDeletedEvent'
 required:
 \- modifications
 ContractDeleted:
 type: object
 properties:
 contractId:
 description: Unique identifier for the contract in UUID format
 type: string
 format: uuid
 entityType:
 description: The type of entity that the changelog event is associated with.
 type: string
 enum:
 \- DATA\_CONTRACT
 eventType:
 description: The type of event that occurred
 type: string
 enum:
 \- DELETED
 userId:
 description: Unique identifier for the user in UUID format
 type: string
 format: uuid
 contractName:
 description: Name of the contract
 type: string
 contractDomain:
 description: Domain/namespace of the contract
 type: string
 required:
 \- contractId
 \- entityType
 \- eventType
 \- contractName
 \- contractDomain
 ContractDeletedEvent:
 allOf:
 \- $ref: '#/components/schemas/ChangelogEventBase'
 \- $ref: '#/components/schemas/ContractDeleted'
 ActionCreatedEvent:
 allOf:
 \- $ref: '#/components/schemas/ChangelogEventBase'
 \- type: object
 properties:
 entityType:
 description: The type of entity that the changelog event is associated with.
 type: string
 enum:
 \- ACTION
 eventType:
 $ref: '#/components/schemas/ChangelogEventType'
 actionId:
 description: The unique identifier for the action.
 type: string
 format: uuid
 actionName:
 description: The name of the action.
 type: string
 required:
 \- actionId
 \- actionName
 \- entityType
 \- eventType
 ActionDeletedEvent:
 allOf:
 \- $ref: '#/components/schemas/ActionCreatedEvent'
 ActionEnabledEvent:
 allOf:
 \- $ref: '#/components/schemas/ActionCreatedEvent'
 ActionDisabledEvent:
 allOf:
 \- $ref: '#/components/schemas/ActionCreatedEvent'
 ActionTriggerType:
 type: string
 description: The type of the action trigger.
 enum:
 \- source
 \- source\_type
 \- event\_name
 \- namespace
 TriggerAddedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- TRIGGER\_ADDED
 diff:
 description: Details of the modified trigger.
 type: object
 properties:
 triggerName:
 description: The name of the trigger being added.
 type: string
 type:
 description: The type of the trigger being added.
 $ref: '#/components/schemas/ActionTriggerType'
 required:
 \- triggerName
 \- type
 required:
 \- eventType
 \- diff
 TriggerDeletedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- TRIGGER\_DELETED
 diff:
 description: Details of the modified trigger.
 type: object
 properties:
 triggerName:
 description: The name of the trigger being deleted.
 type: string
 type:
 description: The type of the trigger being deleted.
 $ref: '#/components/schemas/ActionTriggerType'
 required:
 \- triggerName
 \- type
 required:
 \- eventType
 \- diff
 ActionDestinationType:
 type: string
 description: The type of the action destination (e.g. email, slack, etc.).
 enum:
 \- slack
 \- email
 \- webhook
 DestinationAddedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- DESTINATION\_ADDED
 diff:
 description: Details of the modified destination.
 type: object
 properties:
 destinationName:
 description: The name of the destination being added.
 type: string
 type:
 description: The type of the destination being added.
 $ref: '#/components/schemas/ActionDestinationType'
 required:
 \- destinationName
 \- type
 required:
 \- eventType
 \- diff
 DestinationDeletedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- DESTINATION\_DELETED
 diff:
 description: Details of the modified destination.
 type: object
 properties:
 destinationName:
 description: The name of the destination being deleted.
 type: string
 type:
 description: The type of the destination being deleted.
 $ref: '#/components/schemas/ActionDestinationType'
 required:
 \- destinationName
 \- type
 required:
 \- eventType
 \- diff
 DestinationModifiedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- DESTINATION\_MODIFIED
 diff:
 description: Details of the modified destination.
 type: object
 properties:
 type:
 description: The type of the destination being modified.
 $ref: '#/components/schemas/ActionDestinationType'
 previousValues:
 description: Names of the destination before the change.
 type: array
 items:
 type: string
 newValues:
 description: Names of the destination after the change.
 type: array
 items:
 type: string
 summary:
 description: A very brief summary of the change for the destination.
 type: string
 description:
 description: A detailed description of the change.
 type: string
 required:
 \- type
 \- previousValue
 \- newValue
 required:
 \- eventType
 \- diff
 ActionRenamedEvent:
 type: object
 properties:
 eventType:
 type: string
 description: The type of event that occurred.
 enum:
 \- ACTION\_RENAMED
 diff:
 description: Details of the modified action.
 type: object
 properties:
 previousValue:
 description: The name of the action before the change.
 type: string
 newValue:
 description: The name of the action after the change.
 type: string
 required:
 \- previousValue
 \- newValue
 required:
 \- eventType
 \- diff
 ActionModifiedEvent:
 allOf:
 \- $ref: '#/components/schemas/ActionCreatedEvent'
 \- type: object
 properties:
 modifications:
 type: array
 description: >-
 List of changelog modifications in chronological order (newest
 first)
 items:
 oneOf:
 \- $ref: '#/components/schemas/TriggerAddedEvent'
 \- $ref: '#/components/schemas/TriggerDeletedEvent'
 \- $ref: '#/components/schemas/DestinationAddedEvent'
 \- $ref: '#/components/schemas/DestinationDeletedEvent'
 \- $ref: '#/components/schemas/DestinationModifiedEvent'
 \- $ref: '#/components/schemas/ActionRenamedEvent'
 required:
 \- modifications
 GetChangelogResponse:
 type: object
 properties:
 changelogEvents:
 type: array
 description: List of changelog events in chronological order (oldest first)
 items:
 oneOf:
 \- $ref: '#/components/schemas/AssetCreatedEvent'
 \- $ref: '#/components/schemas/AssetDeletedEvent'
 \- $ref: '#/components/schemas/AssetModifiedEvent'
 \- $ref: '#/components/schemas/ContractCreatedEvent'
 \- $ref: '#/components/schemas/ContractModifiedEvent'
 \- $ref: '#/components/schemas/ContractViolationEvent'
 \- $ref: '#/components/schemas/ContractDeletedEvent'
 \- $ref: '#/components/schemas/ActionCreatedEvent'
 \- $ref: '#/components/schemas/ActionDeletedEvent'
 \- $ref: '#/components/schemas/ActionEnabledEvent'
 \- $ref: '#/components/schemas/ActionDisabledEvent'
 \- $ref: '#/components/schemas/ActionModifiedEvent'
 required:
 \- changelogEvents
 ChangelogResponsePaginated:
 type: object
 properties:
 data:
 $ref: '#/components/schemas/GetChangelogResponse'
 totalCount:
 type: number
 ChangelogEventInput:
 oneOf:
 \- $ref: '#/components/schemas/ContractViolation'
 CreateChangelogEventRequest:
 oneOf:
 \- $ref: '#/components/schemas/ChangelogEventInput'
 \- type: array
 items:
 $ref: '#/components/schemas/ChangelogEventInput'
 CreateChangelogEventResponse:
 type: object
 required:
 \- changelogEventIds
 properties:
 changelogEventIds:
 type: array
 description: List of changelog event IDs that were create
 items:
 type: string
 format: uuid
 GetChangelogFiltersResponse:
 type: object
 properties:
 domains:
 type: array
 description: Domains list
 items:
 type: object
 properties:
 value:
 type: string
 type:
 $ref: '#/components/schemas/SourceType'
 required:
 \- value
 \- type
 types:
 type: array
 description: Types list
 items:
 $ref: '#/components/schemas/SourceType'
 required:
 \- domains
 \- types
 GetConfigResponse:
 type: object
 required:
 \- config\_type
 \- version
 \- config\_value
 \- created\_at
 \- project\_root
 \- namespace
 properties:
 config\_type:
 description: Type of configuration
 type: string
 language:
 description: Programming language associated with the config (optional)
 type: string
 nullable: true
 repo:
 description: Repository associated with the config (optional)
 type: string
 nullable: true
 project\_root:
 description: Project root directory (optional)
 type: string
 version:
 description: Version of the configuration
 type: string
 config\_value:
 description: Configuration value as JSON
 type: object
 additionalProperties:
 type: string
 namespace:
 description: Namespace (qa/sandbox/prod) of config
 type: string
 created\_at:
 description: Date time at which the config was created
 type: string
 format: date-time
 PostConfigRequest:
 type: object
 required:
 \- config\_type
 \- version
 \- config\_value
 \- created\_at
 \- project\_root
 properties:
 config\_type:
 description: Type of configuration
 type: string
 language:
 description: Programming language associated with the config (optional)
 type: string
 nullable: true
 repo:
 description: Repository associated with the config (optional)
 type: string
 nullable: true
 project\_root:
 description: Project root directory (optional)
 type: string
 version:
 description: Version of the configuration
 type: string
 config\_value:
 description: Configuration value as JSON
 type: object
 additionalProperties:
 type: string
 namespace:
 description: Namespace (qa/sandbox/prod) of config (optional, default to qa)
 type: string
 created\_at:
 description: Date time at which the config was created
 type: string
 format: date-time
 PostConfigResponse:
 type: object
 required:
 \- message
 \- configIds
 properties:
 message:
 type: string
 configIds:
 type: array
 description: >-
 List of config IDs that were updated, if no configs were updated
 this will be an empty list
 items:
 type: string
 format: uuid
 GetSlackChannelsResponse:
 type: object
 properties:
 channels:
 type: array
 items:
 type: object
 properties:
 id:
 description: The channel id
 type: string
 name:
 description: The channel name
 type: string
 workspaceName:
 type: string
 description: Slack workspace name; Slack Client not valid if missing
 required:
 \- channels
 GetSlackInstallResponse:
 type: object
 properties:
 slackInstallUrl:
 type: string
 description: URL to install Slack Client
 required:
 \- slackInstallUrl
 PostTestSlackMessageRequest:
 type: object
 properties:
 channelId:
 type: string
 description: The slack channel id name to which the test message will be sent
 required:
 \- channelId
 PostTestSlackMessageResponse:
 type: object
 properties:
 message:
 type: string
 description: Message that indicates successful action
 Webhook:
 type: object
 properties:
 id:
 description: Endpoint id
 type: string
 url:
 description: Endpoint url
 type: string
 name:
 description: Endpoint name
 type: string
 secret:
 description: Endpoint secret
 type: string
 headers:
 type: object
 description: A map of headers
 additionalProperties:
 type: string
 description: A string header value
 required:
 \- id
 \- url
 \- name
 \- secret
 GetWebhooksResponse:
 type: object
 properties:
 webhooks:
 type: array
 items:
 $ref: '#/components/schemas/Webhook'
 required:
 \- webhooks
 CreateWebhookRequest:
 type: object
 properties:
 url:
 type: string
 description: The URL that the webhooks will be sent to
 name:
 type: string
 description: The webhook name
 headers:
 type: object
 description: A map of headers
 additionalProperties:
 type: string
 description: A string header value
 required:
 \- url
 \- name
 CreateWebhookResponse:
 type: object
 properties:
 id:
 type: string
 description: The id of a created webhook
 url:
 type: string
 description: The url of a created webhook
 name:
 type: string
 description: The name of a created webhook
 headers:
 type: object
 description: A map of headers
 additionalProperties:
 type: string
 description: A string header value
 required:
 \- id
 \- url
 \- name
 PostTestWebhookMessageRequest:
 type: object
 properties:
 eventType:
 type: string
 description: The webhook event type to which the test message will be sent
 required:
 \- eventType
 PostTestWebhookMessageResponse:
 type: object
 properties:
 messageId:
 type: string
 description: The message id
 required:
 \- messageId
 GetNotificationsResponse:
 type: object
 required:
 \- notifications
 properties:
 notifications:
 type: array
 items:
 type: object
 required:
 \- id
 \- changeLogEventId
 \- actionId
 \- actionDetails
 \- status
 \- createdAt
 \- retryCount
 \- actionName
 properties:
 id:
 type: string
 description: The unique identifier of the created notification
 changeLogEventId:
 type: string
 description: >-
 The unique identifier of the change log event associated with
 the notification
 actionId:
 type: string
 description: >-
 The unique identifier of the action associated with the
 notification
 actionDetails:
 type: object
 description: >-
 Additional details about the action associated with the
 notification
 additionalProperties: true
 status:
 type: string
 description: >-
 The current status of the notification (e.g., "PENDING",
 "SENT", "FAILED")
 enum:
 \- PENDING
 \- SENT
 \- FAILED
 createdAt:
 type: string
 description: The timestamp when the notification was created
 format: date-time
 updatedAt:
 type: string
 description: The timestamp when the notification was last updated
 format: date-time
 retryCount:
 type: integer
 description: The number of times the notification has been retried
 minimum: 0
 actionName:
 type: string
 description: The name of the actions associated with the notification
 userName:
 type: string
 description: The name of the user who created the action
 NumberConstraintEnum:
 type: string
 enum:
 \- greaterThan
 \- greaterThanOrEqualTo
 \- lessThan
 \- lessThanOrEqualTo
 \- isNull
 \- isNullThreshold
 TimeConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- time
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/NumberConstraintEnum'
 FloatConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- float
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/NumberConstraintEnum'
 IntegerConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- integer
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/NumberConstraintEnum'
 LengthConstraintEnum:
 type: string
 enum:
 \- length
 \- isNotEmpty
 \- isNull
 \- isNullThreshold
 ListConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- list
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/LengthConstraintEnum'
 MapConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- map
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/LengthConstraintEnum'
 StringConstraintEnum:
 type: string
 enum:
 \- charLength
 \- isNotEmpty
 \- isNull
 \- isNullThreshold
 StringConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- string
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/StringConstraintEnum'
 UUIDConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- uuid
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/StringConstraintEnum'
 OtherConstraintEnum:
 type: string
 enum:
 \- isNull
 \- isNullThreshold
 BooleanConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- boolean
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/OtherConstraintEnum'
 OtherConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- other
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/OtherConstraintEnum'
 RecapTypeConstraintCategory:
 type: string
 enum:
 \- NUMBER
 \- TIME
 \- STRING
 \- BYTES
 \- DATA\_STRUCTURE
 \- OTHER
 RecapConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- recap
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/RecapTypeConstraintCategory'
 ContractConstraintType:
 type: string
 enum:
 \- greaterThan
 \- greaterThanOrEqualTo
 \- lessThan
 \- lessThanOrEqualTo
 \- isNull
 \- isNullThreshold
 \- charLength
 \- isNotEmpty
 \- length
 x-enum-varnames:
 \- GREATER\_THAN
 \- GREATER\_THAN\_OR\_EQUAL\_TO
 \- LESS\_THAN
 \- LESS\_THAN\_OR\_EQUAL\_TO
 \- IS\_NULL
 \- IS\_NULL\_THRESHOLD
 \- CHARACTER\_LENGTH
 \- IS\_NOT\_EMPTY
 \- LENGTH
 SupportedContractConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- contract
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/ContractConstraintType'
 ContractConstraint:
 type: object
 oneOf:
 \- $ref: '#/components/schemas/TimeConstraints'
 \- $ref: '#/components/schemas/FloatConstraints'
 \- $ref: '#/components/schemas/IntegerConstraints'
 \- $ref: '#/components/schemas/ListConstraints'
 \- $ref: '#/components/schemas/MapConstraints'
 \- $ref: '#/components/schemas/StringConstraints'
 \- $ref: '#/components/schemas/UUIDConstraints'
 \- $ref: '#/components/schemas/BooleanConstraints'
 \- $ref: '#/components/schemas/OtherConstraints'
 \- $ref: '#/components/schemas/RecapConstraints'
 \- $ref: '#/components/schemas/SupportedContractConstraints'
 discriminator:
 propertyName: type
 mapping:
 time: '#/components/schemas/TimeConstraints'
 float: '#/components/schemas/FloatConstraints'
 integer: '#/components/schemas/IntegerConstraints'
 list: '#/components/schemas/ListConstraints'
 map: '#/components/schemas/MapConstraints'
 string: '#/components/schemas/StringConstraints'
 uuid: '#/components/schemas/UUIDConstraints'
 boolean: '#/components/schemas/BooleanConstraints'
 other: '#/components/schemas/OtherConstraints'
 recap: '#/components/schemas/RecapConstraints'
 contract: '#/components/schemas/SupportedContractConstraints'
 ContractConstraintMapping:
 type: object
 description: >-
 Mapping of contract constraint types to their respective recap type
 constraint categories and detailed constraint definitions
 additionalProperties:
 $ref: '#/components/schemas/ContractConstraint'
 components:
 schemas:
 ContractConstraint:
 type: object
 oneOf:
 \- $ref: '#/components/schemas/TimeConstraints'
 \- $ref: '#/components/schemas/FloatConstraints'
 \- $ref: '#/components/schemas/IntegerConstraints'
 \- $ref: '#/components/schemas/ListConstraints'
 \- $ref: '#/components/schemas/MapConstraints'
 \- $ref: '#/components/schemas/StringConstraints'
 \- $ref: '#/components/schemas/UUIDConstraints'
 \- $ref: '#/components/schemas/BooleanConstraints'
 \- $ref: '#/components/schemas/OtherConstraints'
 \- $ref: '#/components/schemas/RecapConstraints'
 \- $ref: '#/components/schemas/SupportedContractConstraints'
 discriminator:
 propertyName: type
 mapping:
 time: '#/components/schemas/TimeConstraints'
 float: '#/components/schemas/FloatConstraints'
 integer: '#/components/schemas/IntegerConstraints'
 list: '#/components/schemas/ListConstraints'
 map: '#/components/schemas/MapConstraints'
 string: '#/components/schemas/StringConstraints'
 uuid: '#/components/schemas/UUIDConstraints'
 boolean: '#/components/schemas/BooleanConstraints'
 other: '#/components/schemas/OtherConstraints'
 recap: '#/components/schemas/RecapConstraints'
 contract: '#/components/schemas/SupportedContractConstraints'
 LengthConstraintEnum:
 type: string
 enum:
 \- length
 \- isNotEmpty
 \- isNull
 \- isNullThreshold
 RecapTypeConstraintCategory:
 type: string
 enum:
 \- NUMBER
 \- TIME
 \- STRING
 \- BYTES
 \- DATA\_STRUCTURE
 \- OTHER
 ContractConstraintType:
 type: string
 enum:
 \- greaterThan
 \- greaterThanOrEqualTo
 \- lessThan
 \- lessThanOrEqualTo
 \- isNull
 \- isNullThreshold
 \- charLength
 \- isNotEmpty
 \- length
 x-enum-varnames:
 \- GREATER\_THAN
 \- GREATER\_THAN\_OR\_EQUAL\_TO
 \- LESS\_THAN
 \- LESS\_THAN\_OR\_EQUAL\_TO
 \- IS\_NULL
 \- IS\_NULL\_THRESHOLD
 \- CHARACTER\_LENGTH
 \- IS\_NOT\_EMPTY
 \- LENGTH
 NumberConstraintEnum:
 type: string
 enum:
 \- greaterThan
 \- greaterThanOrEqualTo
 \- lessThan
 \- lessThanOrEqualTo
 \- isNull
 \- isNullThreshold
 StringConstraintEnum:
 type: string
 enum:
 \- charLength
 \- isNotEmpty
 \- isNull
 \- isNullThreshold
 OtherConstraintEnum:
 type: string
 enum:
 \- isNull
 \- isNullThreshold
 TimeConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- time
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/NumberConstraintEnum'
 FloatConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- float
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/NumberConstraintEnum'
 IntegerConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- integer
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/NumberConstraintEnum'
 ListConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- list
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/LengthConstraintEnum'
 MapConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- map
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/LengthConstraintEnum'
 StringConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- string
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/StringConstraintEnum'
 UUIDConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- uuid
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/StringConstraintEnum'
 OtherConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- other
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/OtherConstraintEnum'
 BooleanConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- boolean
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/OtherConstraintEnum'
 RecapConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- recap
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/RecapTypeConstraintCategory'
 SupportedContractConstraints:
 type: object
 required:
 \- type
 \- constraints
 properties:
 type:
 type: string
 enum:
 \- contract
 constraints:
 type: array
 items:
 $ref: '#/components/schemas/ContractConstraintType'
 IngestScaMetadataRequest:
 type: object
 properties:
 metadata:
 type: object
 additionalProperties: true
 dataAssetResourceName:
 $ref: '#/components/schemas/DataAssetResourceName'
 required:
 \- metadata
 \- dataAssetResourceName
 IngestScaMetadataResponse:
 type: object
 properties:
 newVersionCreated:
 description: Indicates whether a new version was created
 type: boolean
 TelemetryType:
 type: string
 description: The type of the telemetry event.
 enum:
 \- SCA\_PRIME
 \- GABLE\_CLIENT
 CreateTelemetryRequest:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: >-
 The unique identifier of the telemetry event. If not provided, a
 random UUID will be generated.
 data:
 type: object
 description: The data payload of the telemetry event.
 additionalProperties: true
 type:
 $ref: '#/components/schemas/TelemetryType'
 required:
 \- data
 \- type
 CreateTelemetryResponse:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The id of the created telemetry event
 required:
 \- id
 GetContractNamespacesResponse:
 type: object
 description: Response object containing a list of contract namespaces
 properties:
 namespaces:
 type: array
 items:
 type: string
 description: List of contract namespaces
 required:
 \- namespaces
 ComponentMetrics:
 type: object
 properties:
 ingressCount:
 type: integer
 description: Number of ingress records.
 egressCount:
 type: integer
 description: Number of egress records.
 pathCount:
 type: integer
 description: Number of paths.
 required:
 \- ingressCount
 \- egressCount
 \- pathCount
 ComponentCodeInfo:
 type: object
 properties:
 repoUri:
 type: string
 format: uri
 description: URL of the Git repository.
 projectRoot:
 type: string
 description: Root directory of the project within the repository.
 required:
 \- repoUri
 \- projectRoot
 Component:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier for the component.
 name:
 type: string
 description: The name of the component.
 type:
 type: string
 description: The type of the component.
 repoName:
 type: string
 description: The repository name or path associated with the component.
 lastUpdated:
 type: string
 format: date
 description: The date when the component was last updated.
 metrics:
 description: Counts of ingresses, egresses and paths recorded for this component.
 $ref: '#/components/schemas/ComponentMetrics'
 friendly\_name:
 type: string
 description: Optional user-defined friendly name for the component.
 codeInfo:
 description: Repository metadata for this component.
 $ref: '#/components/schemas/ComponentCodeInfo'
 required:
 \- id
 \- name
 \- type
 \- repoName
 \- lastUpdated
 \- metrics
 \- codeInfo
 GetComponentsHistoryResponse:
 type: object
 required:
 \- history
 properties:
 history:
 type: array
 items:
 type: object
 required:
 \- runId
 \- componentId
 \- componentName
 \- createdAt
 properties:
 runId:
 type: string
 description: The run/version identifier for this history entry.
 componentId:
 type: string
 description: The unique identifier of the component.
 componentName:
 type: string
 description: The human-readable name of the component.
 createdAt:
 type: string
 format: date-time
 description: The analysis timestamp when this run was processed.
 commitTimestamp:
 type: string
 format: date-time
 description: The git commit timestamp associated with this version.
 analysisTimestamp:
 type: string
 format: date-time
 description: The timestamp when this analysis run was processed.
 jobTrigger:
 type: string
 description: >-
 The trigger that produced this run (e.g. push, pr, manual,
 schedule, byol\_import).
 branchName:
 type: string
 description: The git branch associated with the run.
 commitSha:
 type: string
 description: The git commit SHA associated with the run.
 namespace:
 type: string
 description: >-
 The namespace associated with the run (e.g. prod, staging,
 dev).
 repoUri:
 type: string
 description: The repository URI (e.g. https://github.com/org/repo).
 job\_status:
 type: string
 enum:
 \- pending
 \- uploaded
 \- processing
 \- success
 \- error
 description: Status of the job that created this version.
 job\_id:
 type: string
 description: ID of the job that created this version.
 nextCursor:
 type: string
 nullable: true
 description: >-
 Opaque cursor for fetching the next page. Pass as \`cursor\` in the
 next request. Null when there are no more results.
 GetComponentsHistoryFiltersResponse:
 type: object
 properties:
 componentNames:
 type: array
 description: List of component names
 items:
 type: string
 branches:
 type: array
 description: List of branch names
 items:
 type: string
 namespaces:
 type: array
 description: List of namespace names
 items:
 type: string
 jobTriggers:
 type: array
 description: List of event trigger types
 items:
 type: string
 FilterSetPayload:
 type: object
 description: >-
 A single ground-truth payload included in a measurement-report filter
 set.
 required:
 \- payloadName
 properties:
 payloadName:
 type: string
 description: Name of the ground-truth payload to include in the report.
 note:
 type: string
 description: Optional free-text note describing why this payload is included.
 FilterSet:
 type: object
 description: >-
 A named, reusable set of ground-truth payloads used to scope a
 measurement report. Associated with a ground-truth component
 (version-independent).
 required:
 \- id
 \- componentId
 \- name
 \- payloads
 properties:
 id:
 type: string
 format: uuid
 description: Unique identifier for the filter set.
 componentId:
 type: string
 format: uuid
 description: Ground-truth component this filter set is associated with.
 name:
 type: string
 description: Human-readable name for the filter set.
 payloads:
 type: array
 description: Payloads included when this filter set is applied.
 items:
 $ref: '#/components/schemas/FilterSetPayload'
 createdBy:
 type: string
 description: Email of the user who created the filter set.
 createdAt:
 type: string
 description: ISO timestamp when the filter set was created.
 updatedAt:
 type: string
 description: ISO timestamp when the filter set was last updated.
 GetFilterSetsResponse:
 type: object
 description: List of measurement-report filter sets for a ground-truth component.
 required:
 \- filterSets
 properties:
 filterSets:
 type: array
 items:
 $ref: '#/components/schemas/FilterSet'
 PostFilterSetRequest:
 type: object
 description: Request body to create a measurement-report filter set.
 required:
 \- name
 \- payloads
 properties:
 name:
 type: string
 description: Human-readable name for the filter set.
 payloads:
 type: array
 description: Payloads included when this filter set is applied.
 items:
 $ref: '#/components/schemas/FilterSetPayload'
 PutFilterSetRequest:
 type: object
 description: Request body to update a measurement-report filter set.
 required:
 \- name
 \- payloads
 properties:
 name:
 type: string
 description: Human-readable name for the filter set.
 payloads:
 type: array
 description: Payloads included when this filter set is applied.
 items:
 $ref: '#/components/schemas/FilterSetPayload'
 DataFlowBoundary:
 type: object
 properties:
 id:
 description: The unique identifier for the ingress/egress.
 type: string
 format: uuid
 kind:
 description: The kind of the ingress/egress.
 type: string
 signatureName:
 description: >-
 The name of the package, class, or method that the ingress/egress
 point is associated with.
 type: string
 payloadName:
 description: The name of the ingress/egress node.
 type: string
 friendly\_name:
 description: Optional user-defined friendly name for the ingress/egress.
 type: string
 schema:
 description: The schema of the ingress/egress.
 $ref: '#/components/schemas/GableSchemaStruct'
 required:
 \- id
 \- kind
 \- schema
 Ingress:
 allOf:
 \- $ref: '#/components/schemas/DataFlowBoundary'
 Egress:
 allOf:
 \- $ref: '#/components/schemas/DataFlowBoundary'
 CodeURI:
 type: object
 description: >-
 Code URI is a unique identifier for a code location. It is used to
 identify the code location in the codebase.
 properties:
 file:
 type: string
 description: Relative file path in the repo.
 lineStart:
 type: integer
 lineEnd:
 type: integer
 columnStart:
 type: integer
 columnEnd:
 type: integer
 required:
 \- file
 \- lineStart
 \- columnStart
 CodeAnchor:
 type: object
 properties:
 anchorId:
 type: string
 description: Unique identifier for the anchor.
 name:
 type: string
 description: Human readable name of the code anchor.
 codeUri:
 $ref: '#/components/schemas/CodeURI'
 url:
 type: string
 description: URL to the code anchor.
 required:
 \- anchorId
 \- name
 \- codeUri
 FieldMappingKind:
 type: string
 description: >
 How a field mapping participates in the path.

\- DataFlow: the ingress field's value flows into the egress field
 (default).

\- KeyValueBridge: the mapping bridges a key/value pair rather than
 copying a single value.

\- ControlFlow: the ingress field influences whether/how the egress field
 is produced, but is not its value.

When absent, treat as DataFlow.
 enum:
 \- DataFlow
 \- KeyValueBridge
 \- ControlFlow
 CompletenessClassification:
 type: string
 description: A completeness classification of a ground truth element.
 enum:
 \- UNKNOWN
 \- KNOWN\_INCOMPLETE
 \- KNOWN\_COMPLETE
 Completeness:
 type: object
 properties:
 ingress:
 description: >-
 The completeness of non-schema ingress elements (name, signature,
 code anchor, etc.).
 $ref: '#/components/schemas/CompletenessClassification'
 ingress\_schema:
 description: The completeness of the ingress's field schema.
 $ref: '#/components/schemas/CompletenessClassification'
 egress:
 description: >-
 The completeness of non-schema egress elements (name, signature,
 code anchor, etc.).
 $ref: '#/components/schemas/CompletenessClassification'
 egress\_schema:
 description: The completeness of the egress's field schema.
 $ref: '#/components/schemas/CompletenessClassification'
 field\_mappings:
 description: The completeness of the field mappings.
 $ref: '#/components/schemas/CompletenessClassification'
 required:
 \- ingress
 \- ingress\_schema
 \- egress
 \- egress\_schema
 \- field\_mappings
 PathType:
 type: string
 description: >-
 Indicates how a path was created - either from a scan or via user
 override.
 enum:
 \- SCAN\_OUTPUT
 \- USER\_OVERRIDE
 Path:
 type: object
 properties:
 pathId:
 type: string
 format: uuid
 description: >-
 Unique identifier for this path. Generated as a UUID v4 when the
 path is first created.
 ingress:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier of the ingress where the path starts.
 codeAnchorId:
 type: string
 format: uuid
 description: >-
 The unique identifier of the code anchor node where the path
 starts (optional for BYOL imports).
 description:
 type: string
 description: An AI-generated summary of the ingress point.
 required:
 \- id
 egress:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier of the egress where the path ends.
 codeAnchorId:
 type: string
 format: uuid
 description: >-
 The unique identifier of the code anchor node where the path
 starts (optional for BYOL imports).
 description:
 type: string
 description: An AI-generated summary of the egress point.
 required:
 \- id
 codeAnchors:
 type: array
 items:
 $ref: '#/components/schemas/CodeAnchor'
 description: A list of node IDs that are part of this path.
 fieldMappings:
 description: >-
 A list of field mappings that describe how fields are mapped along
 the path.
 type: array
 items:
 type: object
 properties:
 ingressField:
 type: string
 description: The name of the ingress field in the mapping.
 egressField:
 type: string
 description: The name of the egress field in the mapping.
 notes:
 type: string
 description: Additional notes about the field mapping.
 kind:
 $ref: '#/components/schemas/FieldMappingKind'
 fieldDataFlowPath:
 type: array
 description: The field data flow path that represents this mapping
 items:
 $ref: '#/components/schemas/CodeAnchor'
 required:
 \- ingressField
 \- egressField
 transformationSummary:
 type: string
 description: >-
 An AI-generated summary of the data transformation that occurs along
 this path.
 transformationSummaryDetailed:
 type: string
 description: >-
 A detailed AI-generated summary of the data transformation that
 occurs along this path.
 payloadName:
 type: string
 description: The name of the payload for the path between ingress and egress.
 friendlyPayloadName:
 type: string
 description: user dictated name for the payload
 completeness:
 description: Completeness indicators for a ground truth path
 $ref: '#/components/schemas/Completeness'
 pathType:
 $ref: '#/components/schemas/PathType'
 isSuppressed:
 type: boolean
 default: false
 pathNotes:
 type: string
 description: user added notes about the suppression/un-suppression
 suppressedAt:
 type: object
 properties:
 timestamp:
 type: string
 format: date-time
 versionId:
 type: string
 description: only set if is\_suppressed
 required:
 \- ingress
 \- egress
 \- codeAnchors
 \- fieldMappings
 StaticAnalysisDependencyMetadata:
 type: object
 description: Metadata about a dependency of the code repository
 properties:
 repo\_name:
 type: string
 description: Name of the dependency repository
 commit\_sha:
 type: string
 description: Associated commit hash of the dependency repository
 commit\_timestamp:
 type: string
 description: Timestamp of the commit
 StaticAnalysisCodeMetadata:
 type: object
 description: Metadata about the code that is being analyzed
 additionalProperties: true
 required:
 \- repo\_uri
 \- repo\_branch
 \- repo\_commit
 \- project\_root
 properties:
 repo\_uri:
 type: string
 description: URI of the code repository
 repo\_ui\_url:
 type: string
 description: URL of the code repository UI (e.g. GitHub URL)
 repo\_branch:
 type: string
 description: Branch of the code repository
 repo\_commit:
 type: string
 description: Commit hash of the code
 project\_root:
 type: string
 description: Root directory targeted by the static analysis tool
 external\_component\_id:
 type: string
 description: ID of the external component that was analyzed
 repo\_name:
 type: string
 description: Name of the code repository
 event\_repo:
 type: string
 description: Name of the repository from the GitHub event
 job\_trigger:
 type: string
 enum:
 \- MERGE\_TO\_MAIN
 \- PULL\_REQUEST\_COMMENT
 \- PULL\_REQUEST\_CREATED
 \- PULL\_REQUEST\_UPDATED
 \- MANUAL
 \- UNKNOWN
 description: Type of the GitHub event
 repo\_commit\_timestamp:
 type: string
 description: Timestamp of the commit
 is\_default\_branch:
 type: boolean
 description: Whether this is the default branch of the code repository
 namespace:
 type: string
 description: Namespace of the customer (e.g. dev, qa, prod)
 docker\_image\_version:
 type: string
 description: Version of the Docker image used
 has\_uncommitted\_changes:
 type: boolean
 description: Whether there are uncommitted changes in the code repository
 operating\_system:
 type: string
 description: Operating system of the machine that ran the static analysis tool
 sca\_config\_version:
 type: string
 description: Version (git SHA) of the SCA configuration files used
 scan\_duration\_ms:
 type: integer
 format: int64
 description: >-
 Total elapsed time, in milliseconds, spent running the Gable scan
 command for this component
 raw\_payload\_size\_bytes:
 type: integer
 format: int64
 description: Size, in bytes, of the raw scan payload generated before upload
 upload\_duration\_ms:
 type: integer
 format: int64
 description: >-
 Total elapsed time, in milliseconds, spent processing the SCA
 results upload
 pr\_base\_branch:
 type: object
 properties:
 branch:
 type: string
 description: Base branch of the pull request
 commit:
 type: string
 description: Commit hash of the base branch
 description: Base branch of the pull request, if this was run from a pull request
 pr\_number:
 type: integer
 description: Number of the pull request
 gable\_cli\_version:
 type: string
 description: Version of the Gable CLI used for this run
 sca\_prime\_version:
 type: string
 description: Version of the SCA Prime binary used for this run
 dependencies:
 type: array
 items:
 $ref: '#/components/schemas/StaticAnalysisDependencyMetadata'
 description: Dependencies of the code repository
 CodeComponent:
 type: object
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier for the component.
 runId:
 type: string
 description: The ID of the run that the component belongs to
 name:
 type: string
 description: The name of the component.
 ingresses:
 description: The ingresses associated with the component.
 type: array
 items:
 $ref: '#/components/schemas/Ingress'
 egresses:
 description: The egresses associated with the component.
 type: array
 items:
 $ref: '#/components/schemas/Egress'
 paths:
 description: The paths associated with the component.
 type: array
 items:
 $ref: '#/components/schemas/Path'
 friendly\_name:
 type: string
 description: Optional user-defined friendly name for the component.
 type:
 type: string
 description: The type of the component.
 const: CODE
 metadata:
 allOf:
 \- $ref: '#/components/schemas/StaticAnalysisCodeMetadata'
 \- type: object
 properties:
 extras:
 type: object
 description: Additional metadata for the code component.
 additionalProperties:
 type: string
 collectionMechanism:
 type: string
 description: The mechanism used to collect data for this component (SCA or BYOL).
 enum:
 \- SCA
 \- BYOL
 required:
 \- id
 \- type
 \- runId
 \- name
 \- ingresses
 \- egresses
 \- paths
 \- metadata
 GetComponentVersionsResponse:
 type: array
 items:
 type: object
 properties:
 versionId:
 type: string
 description: The version ID (runId) of the component.
 createdAt:
 type: string
 format: date-time
 description: The timestamp when the component version was created.
 isLatestVersion:
 type: boolean
 description: Indicates if this version is the latest version of the component.
 job\_trigger:
 type: string
 description: Type of the event that triggered this version.
 event\_repo:
 type: string
 description: Name of the repository from the event that triggered this version.
 repo\_commit:
 type: string
 description: The commit SHA that triggered the version.
 repo\_commit\_timestamp:
 type: string
 description: The timestamp of the commit.
 job\_status:
 type: string
 enum:
 \- pending
 \- processing
 \- success
 \- error
 description: Status of the job that created this version.
 job\_id:
 type: string
 description: ID of the job that created this version.
 dependencies:
 type: array
 description: List of version-specific dependencies for this component version.
 items:
 $ref: '#/components/schemas/StaticAnalysisDependencyMetadata'
 ComponentDiffMetadata:
 type: object
 description: Metadata for a component diff comparison.
 required:
 \- componentName
 \- componentId
 \- baseEventId
 \- baseDate
 \- compareEventId
 \- compareDate
 \- totalAdded
 \- totalRemoved
 \- totalModified
 properties:
 componentName:
 type: string
 description: Stable name of the component.
 componentId:
 type: string
 format: uuid
 description: UUID of the component (retained for links and disambiguation).
 baseEventId:
 type: string
 description: Event ID of the base (older) version.
 baseDate:
 type: string
 format: date-time
 description: Timestamp of the base version.
 baseLabel:
 type: string
 description: Label for the base version (e.g. job trigger type).
 baseCommitSha:
 type: string
 description: Commit SHA of the base version, if available.
 compareEventId:
 type: string
 description: Event ID of the compare (newer) version.
 compareDate:
 type: string
 format: date-time
 description: Timestamp of the compare version.
 compareLabel:
 type: string
 description: Label for the compare version.
 compareCommitSha:
 type: string
 description: Commit SHA of the compare version, if available.
 totalAdded:
 type: integer
 description: Total number of paths added.
 totalRemoved:
 type: integer
 description: Total number of paths removed.
 totalModified:
 type: integer
 description: Total number of paths modified.
 totalUnchanged:
 type: integer
 description: Total number of unchanged paths.
 DiffStatus:
 type: string
 enum:
 \- added
 \- removed
 \- modified
 \- unchanged
 description: >-
 Status of a diff element indicating whether it was added, removed,
 modified, or unchanged between two versions.
 DiffCodeAnchor:
 type: object
 description: >-
 A code anchor with file and line location, used in diff contexts.
 Flattened from StaticAnalysisCodeAnchor.
 required:
 \- anchorId
 \- file
 \- lineStart
 properties:
 anchorId:
 type: string
 description: Unique identifier for the code anchor.
 file:
 type: string
 description: Relative file path in the repo.
 lineStart:
 type: integer
 description: Starting line number.
 lineEnd:
 type: integer
 description: Ending line number.
 columnStart:
 type: integer
 description: Starting column number.
 columnEnd:
 type: integer
 description: Ending column number.
 FieldDependency:
 type: object
 description: >-
 A field reachable from a field-level unit (field pair or field diff)
 through the lineage graph, at its minimum hop distance, with the path
 taken to reach it. Fields are matched by name across service boundaries,
 so results are only as accurate as the underlying name matching.
 properties:
 componentName:
 type: string
 description: The component the reached field belongs to.
 componentType:
 type: string
 enum:
 \- CODE
 \- DATA\_STORE
 description: >-
 Whether the reached field's component is a code component or a data
 store.
 field:
 type: string
 description: The reached field name.
 hops:
 type: integer
 description: >-
 Service boundaries crossed to reach this field. 1 = directly
 connected.
 path:
 type: array
 description: >-
 Ordered, source-first chain from this unit's field to the reached
 field. The first element is this component's field; the last element
 is the reached field itself.
 items:
 type: object
 properties:
 componentName:
 type: string
 componentType:
 type: string
 enum:
 \- CODE
 \- DATA\_STORE
 field:
 type: string
 required:
 \- componentName
 \- componentType
 \- field
 required:
 \- componentName
 \- componentType
 \- field
 \- hops
 \- path
 FieldDiff:
 type: object
 description: Diff of a single field mapping between two versions.
 required:
 \- sourceField
 \- targetField
 \- status
 properties:
 sourceField:
 type: string
 description: Source (ingress) field name.
 targetField:
 type: string
 description: Target (egress) field name.
 type:
 type: string
 description: Field type, if available.
 status:
 $ref: '#/components/schemas/DiffStatus'
 dataFlowSteps:
 type: array
 items:
 $ref: '#/components/schemas/DiffCodeAnchor'
 description: Code anchors in the compare version's data flow for this field.
 previousDataFlowSteps:
 type: array
 items:
 $ref: '#/components/schemas/DiffCodeAnchor'
 description: Code anchors in the base version's data flow for this field.
 upstreamDependencies:
 type: array
 description: >-
 Fields feeding this field, each at its minimum hop distance with the
 path taken to reach it. Used to surface who is affected upstream by
 this change.
 items:
 $ref: '#/components/schemas/FieldDependency'
 downstreamDependencies:
 type: array
 description: >-
 Fields consuming this field, each at its minimum hop distance with
 the path taken to reach it. Used to surface who is affected
 downstream by this change.
 items:
 $ref: '#/components/schemas/FieldDependency'
 PathDiff:
 type: object
 description: >-
 Diff summary for a single path (ingress→egress) between two component
 versions.
 required:
 \- pathId
 \- ingressName
 \- egressName
 \- status
 \- fieldsAdded
 \- fieldsRemoved
 \- fieldsChanged
 \- totalFields
 \- codeStepsAdded
 \- codeStepsRemoved
 \- codeStepsModified
 \- fields
 properties:
 pathId:
 type: string
 description: Unique identifier for the path.
 basePathId:
 type: string
 description: Path ID from the base version. Absent when the path is newly added.
 comparePathId:
 type: string
 description: Path ID from the compare version. Absent when the path was removed.
 basePathType:
 $ref: '#/components/schemas/PathType'
 description: Source of the base path. Absent when the path is newly added.
 comparePathType:
 $ref: '#/components/schemas/PathType'
 description: Source of the compare path. Absent when the path was removed.
 ingressName:
 type: string
 description: Name of the ingress payload.
 ingressFunction:
 type: string
 description: Function name of the ingress, if available.
 egressName:
 type: string
 description: Name of the egress payload.
 egressFunction:
 type: string
 description: Function name of the egress, if available.
 status:
 $ref: '#/components/schemas/DiffStatus'
 fieldsAdded:
 type: integer
 description: Number of fields added in this path.
 fieldsRemoved:
 type: integer
 description: Number of fields removed from this path.
 fieldsChanged:
 type: integer
 description: Number of fields modified in this path.
 totalFields:
 type: integer
 description: Total number of fields in this path.
 codeStepsAdded:
 type: integer
 description: Number of code steps added.
 codeStepsRemoved:
 type: integer
 description: Number of code steps removed.
 codeStepsModified:
 type: integer
 description: Number of code steps with file/line changes.
 fields:
 type: array
 items:
 $ref: '#/components/schemas/FieldDiff'
 description: Detailed field-level diffs for this path.
 ComponentDiffResponse:
 type: object
 description: >-
 Response for the component diff API, comparing two versions of a
 component's lineage.
 required:
 \- metadata
 \- pathChanges
 properties:
 metadata:
 $ref: '#/components/schemas/ComponentDiffMetadata'
 pathChanges:
 type: array
 items:
 $ref: '#/components/schemas/PathDiff'
 description: List of path-level diffs between the two versions.
 PathDiffMetadata:
 type: object
 description: Metadata for a path diff comparison.
 required:
 \- componentName
 \- ingressPayloadName
 \- egressPayloadName
 \- baseEventId
 \- baseDate
 \- compareEventId
 \- compareDate
 properties:
 componentName:
 type: string
 description: Stable name of the component.
 componentId:
 type: string
 format: uuid
 description: UUID of the component, for back-links.
 ingressPayloadName:
 type: string
 description: Payload name of the ingress boundary.
 egressPayloadName:
 type: string
 description: Payload name of the egress boundary.
 ingressComponent:
 type: string
 description: Name of the upstream component connected to the ingress.
 egressComponent:
 type: string
 description: Name of the downstream component connected to the egress.
 basePathType:
 $ref: '#/components/schemas/PathType'
 description: Source of the selected base path, when one exists.
 baseEventId:
 type: string
 description: Event ID of the base (older) version.
 baseDate:
 type: string
 format: date-time
 description: Timestamp of the base version.
 comparePathType:
 $ref: '#/components/schemas/PathType'
 description: Source of the selected compare path, when one exists.
 compareEventId:
 type: string
 description: Event ID of the compare (newer) version.
 compareDate:
 type: string
 format: date-time
 description: Timestamp of the compare version.
 PathStep:
 type: object
 description: >-
 A step in a code flow path, with optional file/line location and change
 indicators.
 required:
 \- id
 \- label
 properties:
 id:
 type: string
 description: Unique identifier for the step.
 label:
 type: string
 description: Display label for the step.
 sublabel:
 type: string
 description: Optional secondary label.
 componentName:
 type: string
 description: Name of the component this step belongs to.
 isIngress:
 type: boolean
 description: Whether this step is an ingress boundary.
 isEgress:
 type: boolean
 description: Whether this step is an egress boundary.
 isChanged:
 type: boolean
 description: Whether this step changed between versions.
 changeBadge:
 type: string
 description: Badge text indicating the type of change (e.g. "added", "moved").
 file:
 type: string
 description: File path in the compare version.
 lineStart:
 type: integer
 description: Start line in the compare version.
 lineEnd:
 type: integer
 description: End line in the compare version.
 previousFile:
 type: string
 description: File path in the base version.
 previousLineStart:
 type: integer
 description: Start line in the base version.
 previousLineEnd:
 type: integer
 description: End line in the base version.
 PathDiffDetail:
 type: object
 description: >-
 Detailed diff of a single path between two versions, including code flow
 steps and field mappings.
 required:
 \- codeFlowSteps
 \- codeFlowChangeCount
 \- fieldMappings
 \- fieldMappingChangeCount
 properties:
 codeFlowSteps:
 type: array
 items:
 $ref: '#/components/schemas/PathStep'
 description: Ordered code flow steps for this path.
 codeFlowChangeCount:
 type: integer
 description: Number of code flow steps that changed.
 fieldMappings:
 type: array
 items:
 $ref: '#/components/schemas/FieldDiff'
 description: Field-level diffs for this path.
 fieldMappingChangeCount:
 type: integer
 description: Number of field mappings that changed.
 PathDiffResponse:
 type: object
 description: >-
 Response for the path diff API, comparing a single path between two
 component versions.
 required:
 \- metadata
 \- diff
 properties:
 metadata:
 $ref: '#/components/schemas/PathDiffMetadata'
 diff:
 $ref: '#/components/schemas/PathDiffDetail'
 MergeHistoryMetrics:
 type: object
 description: >-
 Per-version diff metrics summarizing how many payloads changed relative
 to the previous merged version.
 required:
 \- totalAdded
 \- totalRemoved
 \- totalModified
 \- totalUnchanged
 properties:
 totalAdded:
 type: integer
 description: Number of payloads added in this version relative to its base.
 totalRemoved:
 type: integer
 description: Number of payloads removed in this version relative to its base.
 totalModified:
 type: integer
 description: Number of payloads modified in this version relative to its base.
 totalUnchanged:
 type: integer
 description: Number of payloads unchanged in this version relative to its base.
 MergeHistoryBreakage:
 type: object
 description: >-
 Downstream breakage summary for a version — how many downstream
 consumers lose a field they read as a result of this version's changes.
 required:
 \- downstreamBreakingCount
 \- affectedComponentCount
 \- isBreaking
 properties:
 downstreamBreakingCount:
 type: integer
 description: >-
 Number of distinct downstream field mappings that are breaking (a
 consumed egress field was removed).
 affectedComponentCount:
 type: integer
 description: >-
 Number of distinct downstream components with at least one breaking
 field mapping.
 isBreaking:
 type: boolean
 description: >-
 True when this version introduces at least one downstream breaking
 change.
 MergeHistoryEntry:
 type: object
 description: >-
 A single MERGE\_TO\_MAIN version of a component with its per-version diff
 metrics and downstream breakage summary.
 required:
 \- versionId
 \- baseVersionId
 \- commitTimestamp
 \- createdAt
 \- jobTrigger
 \- isLatestVersion
 \- metrics
 \- breakage
 properties:
 versionId:
 type: string
 description: The version ID (event/run ID) of this merged version.
 baseVersionId:
 type: string
 nullable: true
 description: >-
 The version ID this entry was diffed against (the previous merged
 version). Null for the oldest (baseline) version, whose metrics
 count every payload as added.
 commitSha:
 type: string
 nullable: true
 description: The commit SHA associated with this version.
 commitTimestamp:
 type: string
 description: The timestamp of the commit that produced this version.
 createdAt:
 type: string
 format: date-time
 description: The timestamp when this version's scan event was created.
 jobTrigger:
 type: string
 description: >-
 The trigger for this version's job (always MERGE\_TO\_MAIN for
 merge-history entries).
 eventRepo:
 type: string
 nullable: true
 description: Name of the repository from the event that triggered this version.
 isLatestVersion:
 type: boolean
 description: >-
 Indicates whether this is the latest merged version of the
 component.
 approvalStatus:
 type: string
 nullable: true
 enum:
 \- PENDING\_APPROVAL
 \- APPROVED
 description: >-
 Approval status for this version. Approval status is only stored for
 the current/latest component state, so it is populated for the
 latest version and null for older versions.
 metrics:
 $ref: '#/components/schemas/MergeHistoryMetrics'
 breakage:
 $ref: '#/components/schemas/MergeHistoryBreakage'
 ComponentMergeHistoryResponse:
 type: object
 description: >-
 A component's MERGE\_TO\_MAIN version history with per-version diff
 metrics and downstream breakage indicators, ordered newest-first.
 required:
 \- componentId
 \- entries
 properties:
 componentId:
 type: string
 description: The ID of the component this history belongs to.
 componentName:
 type: string
 nullable: true
 description: The name of the component this history belongs to.
 entries:
 type: array
 description: >-
 Merge history entries ordered newest-first (latest merged version
 first).
 items:
 $ref: '#/components/schemas/MergeHistoryEntry'
 StaticAnalysisSignature:
 type: object
 description: A signature for a static analysis tool
 required:
 \- class\_names
 \- method\_names
 \- kind
 properties:
 class\_names:
 type: array
 items:
 type: string
 description: The names of the classes
 method\_names:
 type: array
 items:
 type: string
 description: The names of the methods
 kind:
 type: string
 description: >-
 Unique name for the ingress/egress signature (e.g. "postgres",
 "gateway\_response"). All the signatures with the same kind are
 grouped together.
 StaticAnalysisToolConfig:
 type: object
 description: Configuration for a static analysis tool
 required:
 \- ingress\_signatures
 \- egress\_signatures
 properties:
 ingress\_signatures:
 type: array
 items:
 $ref: '#/components/schemas/StaticAnalysisSignature'
 egress\_signatures:
 type: array
 items:
 $ref: '#/components/schemas/StaticAnalysisSignature'
 StaticAnalysisToolMetadata:
 type: object
 required:
 \- name
 \- version
 properties:
 name:
 type: string
 description: Name of the SCA tool used
 version:
 type: string
 description: Version of the SCA tool
 config:
 $ref: '#/components/schemas/StaticAnalysisToolConfig'
 PostScaStartRunRequest:
 type: object
 properties:
 code\_info:
 $ref: '#/components/schemas/StaticAnalysisCodeMetadata'
 sca\_info:
 $ref: '#/components/schemas/StaticAnalysisToolMetadata'
 action:
 type: string
 description: >-
 Action to perform upon receiving the results. Register should be
 used when the results are active (like on a 'main' branch or
 production system), as assets will be registered from the lineage
 data. Check should be used when the results are from a proposed
 change (like a pull request) and resultant assets will be checked
 against any contracts. Upload is the same as register except that no
 assets will be registered, only the lineage data will be uploaded.
 enum:
 \- register
 \- check
 \- upload
 pr\_link:
 type: string
 description: >-
 Link to the pull request in the source code repository, if
 applicable
 include\_unchanged\_assets:
 type: boolean
 description: Whether to include assets that have not changed since the last run
 default: false
 output\_format:
 type: string
 description: Format of the output, either 'json', 'text', or 'markdown'
 enum:
 \- json
 \- text
 \- markdown
 type:
 type: string
 description: >-
 Type of the run, either 'code', 'data\_store', 'edge', or
 'code\_strands'
 enum:
 \- CODE
 \- DATA\_STORE
 \- EDGE
 \- CODE\_STRANDS
 default: CODE
 run\_id:
 type: string
 description: The ID of the run that the component belongs to
 collection\_mechanism:
 type: string
 description: >-
 How the lineage data was collected. SCA means Gable's static code
 analysis tool scanned the code. BYOL (Bring Your Own Lineage) means
 the caller produced the lineage data externally and is uploading it
 directly.
 enum:
 \- SCA
 \- BYOL
 default: BYOL
 required:
 \- code\_info
 \- action
 EncryptedResponse:
 type: object
 description: A response payload that has been encrypted
 properties:
 encrypted\_payload:
 description: The encrypted payload
 type: string
 required:
 \- encrypted\_payload
 PostScaStartRunResponse:
 type: object
 description: The response from the postScaStartRun function
 properties:
 runId:
 description: The unique run ID assigned to this SCA run
 type: string
 config:
 oneOf:
 \- $ref: '#/components/schemas/GetConfigResponse'
 \- $ref: '#/components/schemas/EncryptedResponse'
 required:
 \- runId
 GetScaRunStatusResponse:
 type: object
 properties:
 status:
 type: string
 description: status of the sca job
 enum:
 \- pending
 \- uploaded
 \- processing
 \- success
 \- error
 message:
 type: string
 description: message associated with the status, if any
 asset\_registration\_outcomes:
 type: array
 items:
 type: object
 properties:
 data\_asset\_resource\_name:
 $ref: '#/components/schemas/StructuredDataAssetResourceName'
 error:
 type: string
 description: Error message if registration of this asset failed
 required:
 \- data\_asset\_resource\_name
 required:
 \- status
 StaticAnalysisCodeURI:
 type: object
 description: >-
 Code URI is a unique identifier for a code location. It is used to
 identify the code location in the codebase.
 required:
 \- file
 \- line\_start
 \- column\_start
 properties:
 file:
 type: string
 description: Relative file path in the repo
 line\_start:
 type: integer
 line\_end:
 type: integer
 column\_start:
 type: integer
 column\_end:
 type: integer
 StaticAnalysisCodeAnchor:
 type: object
 properties:
 anchor\_id:
 type: string
 description: >-
 Unique identifier for the anchor. Analogous to a merge key.
 Conceptually, an anchor represents a point in code which is ideally
 stable to some set of changes to surrounding code. Generated by the
 tool.
 code\_uri:
 $ref: '#/components/schemas/StaticAnalysisCodeURI'
 required:
 \- anchor\_id
 \- code\_uri
 StaticAnalysisDataFlowPathEnds:
 type: object
 properties:
 kind:
 type: string
 description: The kind of the ingress/egress (e.g. "postgres", "gateway\_response")
 signature\_name:
 type: string
 description: >-
 The name of the package, class, or method that the ingress/egress
 point is associated with
 code\_anchor:
 description: >-
 The code anchor that represents the ingress/egress point in the
 codebase (optional for BYOL imports). This should be the same as the
 first (for ingress) or last (for egress) code anchor in the flow
 path.
 $ref: '#/components/schemas/StaticAnalysisCodeAnchor'
 schema:
 $ref: '#/components/schemas/GableSchemaStruct'
 description:
 description: An AI-generated summary of the ingress/egress point.
 type: string
 id:
 description: >-
 The ID of the ingress/egress point. This is a unique identifier for
 the ingress/egress point.
 type: string
 payload\_name:
 description: The name of the ingress/egress node.
 type: string
 required:
 \- schema
 \- signature\_name
 StaticAnalysisTabularLineageFieldMapping:
 type: object
 description: >-
 A mapping of a field in the ingress schema to a field in the egress
 schema
 required:
 \- ingress\_field
 \- egress\_field
 properties:
 ingress\_field:
 type: string
 description: The field in the ingress schema
 egress\_field:
 type: string
 description: The field in the egress schema
 notes:
 type: string
 description: Notes about the mapping
 kind:
 $ref: '#/components/schemas/FieldMappingKind'
 field\_data\_flow\_path:
 type: array
 description: The field data flow path that represents this mapping
 items:
 $ref: '#/components/schemas/StaticAnalysisCodeAnchor'
 StaticAnalysisCompletenessClassification:
 type: string
 description: A completeness classification of a ground truth element.
 enum:
 \- UNKNOWN
 \- KNOWN\_INCOMPLETE
 \- KNOWN\_COMPLETE
 StaticAnalysisCompleteness:
 type: object
 properties:
 ingress:
 description: >-
 The completeness of non-schema ingress elements (name, signature,
 code anchor, etc.).
 $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
 ingress\_schema:
 description: The completeness of the ingress's field schema.
 $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
 egress:
 description: >-
 The completeness of non-schema egress elements (name, signature,
 code anchor, etc.).
 $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
 egress\_schema:
 description: The completeness of the egress's field schema.
 $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
 field\_mappings:
 description: The completeness of the field mappings.
 $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
 required:
 \- ingress
 \- ingress\_schema
 \- egress
 \- egress\_schema
 \- field\_mappings
 StaticAnalysisDataFlowPath:
 type: object
 description: >-
 A path in the codebase that starts at an ingress node and ends at an
 egress node
 required:
 \- ingress
 \- egress
 properties:
 ingress:
 $ref: '#/components/schemas/StaticAnalysisDataFlowPathEnds'
 egress:
 $ref: '#/components/schemas/StaticAnalysisDataFlowPathEnds'
 code\_anchors:
 description: >-
 Ordered list of code anchors that represent the path from ingress to
 egress. The order of the anchors in this array represents the flow
 of data through the codebase.
 type: array
 items:
 $ref: '#/components/schemas/StaticAnalysisCodeAnchor'
 field\_mappings:
 description: >-
 List of identified field mappings between schema at ingress and
 egress.
 type: array
 items:
 $ref: '#/components/schemas/StaticAnalysisTabularLineageFieldMapping'
 transformation\_summary:
 description: >-
 An AI-generated summary of the data transformation that occurs along
 this path.
 type: string
 transformation\_summary\_detailed:
 description: >-
 A detailed, AI-generated summary of the data transformation that
 occurs along this path.
 type: string
 payload\_name:
 description: >-
 The name of the path. If provided, this value will be used directly
 without being overwritten by computed values.
 type: string
 completeness:
 description: Completeness indicators for a ground truth path
 $ref: '#/components/schemas/StaticAnalysisCompleteness'
 StaticAnalysisPathsApiRequest:
 type: object
 description: API request for uploading code lineage paths
 additionalProperties: false
 properties:
 paths:
 type: array
 items:
 $ref: '#/components/schemas/StaticAnalysisDataFlowPath'
 run\_id:
 type: string
 description: The ID of the run that the paths belong to
 upload\_context:
 $ref: '#/components/schemas/PostScaStartRunRequest'
 external\_component\_id:
 type: string
 description: Optional ID of the external component that was analyzed
 type:
 type: string
 description: The type of data being uploaded
 enum:
 \- CODE
 metadata:
 type: object
 description: Additional metadata for the component.
 properties:
 extras:
 type: object
 additionalProperties:
 type: string
 name:
 type: string
 description: The name of the component that was analyzed
 required:
 \- paths
 \- run\_id
 \- type
 CrossServiceDataStoreApiRequest:
 type: object
 description: API request for uploading data store metadata
 additionalProperties: false
 properties:
 run\_id:
 type: string
 description: The ID of the run that this data belongs to
 upload\_context:
 $ref: '#/components/schemas/PostScaStartRunRequest'
 external\_component\_id:
 type: string
 description: The provided external ID for the data store
 type:
 type: string
 enum:
 \- DATA\_STORE
 description: The type of data store
 schema:
 type: object
 additionalProperties: false
 required:
 \- fields
 properties:
 fields:
 type: array
 minItems: 1
 items:
 type: object
 additionalProperties: false
 properties:
 name:
 type: string
 description: The name of the field
 type:
 type: string
 description: The type of the field
 required:
 \- name
 \- type
 table\_metadata:
 type: object
 additionalProperties: false
 properties:
 type:
 type: string
 description: The type of data store
 enum:
 \- dynamodb
 \- redis
 \- elasticache
 \- database
 \- kafka
 \- other
 table\_name:
 type: string
 description: The name of the data store
 extras:
 type: object
 description: Additional metadata for the data store.
 additionalProperties:
 type: string
 required:
 \- type
 \- table\_name
 required:
 \- run\_id
 \- external\_component\_id
 \- type
 \- table\_metadata
 \- schema
 CrossServiceEdgeApiRequest:
 type: object
 description: API request for uploading edge definitions
 additionalProperties: false
 properties:
 run\_id:
 type: string
 description: The ID of the run that this data belongs to
 upload\_context:
 $ref: '#/components/schemas/PostScaStartRunRequest'
 type:
 type: string
 enum:
 \- EDGE
 field\_mappings:
 type: array
 minItems: 1
 items:
 type: object
 additionalProperties: false
 required:
 \- source\_field
 \- destination\_field
 properties:
 source\_field:
 type: string
 destination\_field:
 type: string
 notes:
 type: string
 source:
 type: object
 additionalProperties: false
 required:
 \- source\_component\_name
 \- type
 properties:
 component\_id:
 type: string
 description: >-
 Id of the source component (optional, for backward
 compatibility)
 source\_component\_name:
 type: string
 description: Name of the source component
 egress\_id:
 type: string
 description: Id of the source entity
 type:
 type: string
 description: the type of edge connection
 payload\_name:
 type: string
 description: The name of the payload source
 destination:
 type: object
 additionalProperties: false
 required:
 \- destination\_component\_name
 \- type
 properties:
 component\_id:
 type: string
 description: >-
 Id of the destination component (optional, for backward
 compatibility)
 destination\_component\_name:
 type: string
 description: Name of the destination component
 ingress\_id:
 type: string
 description: Id of the destination entity
 type:
 type: string
 description: the type of edge connection
 payload\_name:
 type: string
 description: The name of the payload destination
 required:
 \- run\_id
 \- type
 \- field\_mappings
 \- source
 \- destination
 Strand:
 type: object
 description: >-
 One lineage fact from the prime strands.json output (endpoints + ordered
 path steps + references into the strand metadata index). The product
 does not interpret strand bodies on the upload path — the discriminator
 engine reads strands.json directly — so the body is passed through as-is
 rather than typed here. The full shape is defined by the Prime strand
 vocabulary (crates/strands in the sca-prime repo).
 additionalProperties: true
 StrandMetadataNode:
 type: object
 description: >-
 One reusable context node from the prime strand-metadata.json index,
 keyed by metadata node ID in
 CodeStrandsApiRequest.strand\_metadata\_nodes. Each node is tagged with a
 \`kind\`; the full per-kind fields are defined by the Prime strand
 vocabulary (crates/strands in the sca-prime repo) and are passed through
 as-is. The product does not interpret node bodies on the upload path —
 the discriminator engine reads the strand-metadata.json contents
 directly — so only the \`kind\` tag is typed here. Known kinds: function,
 type, member, namespace, file, payload\_boundary, strand\_fact,
 endpoint\_schema, type\_schema; new kinds ship with a format\_version bump.
 additionalProperties: true
 required:
 \- kind
 properties:
 kind:
 type: string
 description: >-
 The kind of metadata node. Left as a free-form string (not an enum)
 so additive Prime vocabulary changes do not reject otherwise-valid
 uploads.
 CodeStrandsApiRequest:
 type: object
 description: >-
 API request for uploading prime's strand output (strands +
 strand-metadata) as one logical request carrying the complete contents
 of both artifacts for a run. Requests larger than the request-size limit
 ride the transport-level chunk mechanism documented on the
 /v0/sca/results path (the X-Gable-Chunk-\* headers: gzip -> base64 byte
 slices) and are reassembled by the backend before parsing, exactly like
 CODE uploads. The backend persists the reassembled artifacts to S3 in
 envelope form. Strand contents are not saved to Dynamo but instead
 queries through the discriminator engine.
 additionalProperties: false
 properties:
 strands:
 type: array
 description: >-
 The complete strands array from the prime strands.json output for
 this run.
 items:
 $ref: '#/components/schemas/Strand'
 strand\_metadata\_nodes:
 type: object
 description: >-
 The complete nodes map from the prime strand-metadata.json output
 for this run, keyed by metadata node ID.
 additionalProperties:
 $ref: '#/components/schemas/StrandMetadataNode'
 format\_version:
 type: string
 description: >-
 The strand vocabulary format\_version from the prime output envelopes
 (an empty string means the pre-version era).
 metadata\_version:
 type: string
 description: >-
 The version of the engine that produced the metadata index, from the
 strand-metadata.json envelope.
 program:
 type: object
 additionalProperties: true
 description: >-
 Identity of the analyzed program from the strands.json envelope
 (e.g. source\_control\_url).
 run\_id:
 type: string
 description: The ID of the run that the strands belong to
 upload\_context:
 $ref: '#/components/schemas/PostScaStartRunRequest'
 external\_component\_id:
 type: string
 description: Optional ID of the external code component that was analyzed
 type:
 type: string
 description: The type of data being uploaded
 enum:
 \- CODE\_STRANDS
 required:
 \- strands
 \- strand\_metadata\_nodes
 \- run\_id
 \- type
 AIAugmentationUploadRequest:
 type: object
 description: API request for uploading AI augmentations
 additionalProperties: false
 properties:
 type:
 type: string
 enum:
 \- AI\_AUGMENTATION
 run\_id:
 type: string
 description: The ID of the run that this augmentation belongs to
 augmentation\_run\_id:
 type: string
 description: A unique ID for this augmentation upload run
 labels\_version:
 type: string
 description: Labels/version used by the augmentation producer
 producer:
 type: object
 additionalProperties: false
 required:
 \- post\_processor\_version
 properties:
 post\_processor\_version:
 type: string
 llm\_client\_version:
 type: string
 status:
 type: string
 description: Augmentation processing status
 augmentations:
 type: array
 items:
 type: object
 additionalProperties: false
 required:
 \- scope
 properties:
 scope:
 type: string
 path\_id:
 type: string
 summary:
 type: object
 additionalProperties: false
 required:
 \- short
 \- source
 properties:
 short:
 type: string
 source:
 type: string
 required:
 \- type
 \- run\_id
 \- augmentation\_run\_id
 \- labels\_version
 \- producer
 \- status
 ScaResultsUploadRequest:
 oneOf:
 \- $ref: '#/components/schemas/StaticAnalysisPathsApiRequest'
 \- $ref: '#/components/schemas/CrossServiceDataStoreApiRequest'
 \- $ref: '#/components/schemas/CrossServiceEdgeApiRequest'
 \- $ref: '#/components/schemas/CodeStrandsApiRequest'
 \- $ref: '#/components/schemas/AIAugmentationUploadRequest'
 discriminator:
 propertyName: type
 mapping:
 CODE: '#/components/schemas/StaticAnalysisPathsApiRequest'
 DATA\_STORE: '#/components/schemas/CrossServiceDataStoreApiRequest'
 EDGE: '#/components/schemas/CrossServiceEdgeApiRequest'
 CODE\_STRANDS: '#/components/schemas/CodeStrandsApiRequest'
 AI\_AUGMENTATION: '#/components/schemas/AIAugmentationUploadRequest'
 description: >-
 Union type for uploading SCA results - can be code lineage paths, data
 store metadata, edge definitions, raw prime, or AI augmentation strand
 output
 PostScaResultsResponse:
 type: object
 description: Response from posting SCA results.
 properties:
 runId:
 type: string
 description: The run ID associated with this upload.
 createdJob:
 type: boolean
 description: Whether this request created the backing job for the run.
 required:
 \- runId
 \- createdJob
 PostDefectReportRequest:
 type: object
 properties:
 description:
 type: string
 description: Description of the defect
 expectedBehavior:
 type: string
 description: What the user expected to happen
 severity:
 type: string
 enum:
 \- low
 \- medium
 \- high
 description: Severity level
 reporterName:
 type: string
 description: Name of the reporter
 reporterEmail:
 type: string
 description: Email of the reporter
 organization:
 type: string
 description: Customer organization name
 pageUrl:
 type: string
 description: URL where the defect was reported from
 componentId:
 type: string
 description: Lineage component ID
 componentName:
 type: string
 description: Lineage component display name
 pathId:
 type: string
 description: Path ID within the component
 ingressPayloadName:
 type: string
 description: Ingress payload name for the path
 egressPayloadName:
 type: string
 description: Egress payload name for the path
 required:
 \- description
 \- expectedBehavior
 \- reporterName
 \- reporterEmail
 \- organization
 \- pageUrl
 PostDefectReportResponse:
 type: object
 DataStoreComponent:
 type: object
 description: The data store component for the cross service components.
 properties:
 id:
 type: string
 format: uuid
 description: The unique identifier for the component.
 runId:
 type: string
 description: The ID of the run that the component belongs to.
 friendly\_name:
 type: string
 description: Optional user-defined friendly name for the component.
 type:
 type: string
 description: The type of the component.
 const: DATA\_STORE
 metadata:
 allOf:
 \- $ref: '#/components/schemas/StaticAnalysisCodeMetadata'
 \- type: object
 properties:
 type:
 type: string
 description: The type of the data store.
 name:
 type: string
 description: The name of the data store.
 extras:
 type: object
 description: Additional metadata for the data store.
 additionalProperties: {}
 schema:
 type: object
 properties:
 fields:
 type: array
 items:
 type: object
 properties:
 name:
 type: string
 type:
 type: string
 required:
 \- name
 \- type
 required:
 \- fields
 collectionMechanism:
 type: string
 description: The mechanism used to collect data for this component (SCA or BYOL).
 enum:
 \- SCA
 \- BYOL
 required:
 \- id
 \- type
 \- metadata
 \- schema
 CrossServiceComponent:
 type: object
 description: The component for the cross service components.
 oneOf:
 \- $ref: '#/components/schemas/CodeComponent'
 \- $ref: '#/components/schemas/DataStoreComponent'
 discriminator:
 propertyName: type
 mapping:
 CODE: '#/components/schemas/CodeComponent'
 DATA\_STORE: '#/components/schemas/DataStoreComponent'
 EdgeMapping:
 type: object
 description: The edge mapping for the cross service components.
 properties:
 id:
 type: string
 description: The id of the edge.
 crossServiceFieldMappings:
 type: array
 description: The field mappings for the cross service components.
 items:
 type: object
 properties:
 sourceField:
 type: string
 destinationField:
 type: string
 required:
 \- sourceField
 \- destinationField
 source:
 type: object
 description: The source of the edge.
 properties:
 componentId:
 type: string
 description: The id of the component.
 sourceComponentName:
 type: string
 description: The name of the source component.
 egressId:
 type: string
 description: The id of the source egress.
 payloadName:
 type: string
 description: The payload name of the source egress.
 type:
 type: string
 description: The type of the source connection.
 example: egress
 required:
 \- sourceComponentName
 \- type
 destination:
 type: object
 description: The destination of the edge.
 properties:
 componentId:
 type: string
 description: The id of the component.
 destinationComponentName:
 type: string
 description: The name of the destination component.
 ingressId:
 type: string
 description: The id of the destination ingress.
 payloadName:
 type: string
 description: The payload name of the destination ingress.
 type:
 type: string
 description: The type of the destination connection.
 example: ingress
 required:
 \- destinationComponentName
 \- type
 type:
 type: string
 const: EDGE
 required:
 \- id
 \- crossServiceFieldMappings
 \- source
 \- destination
 \- type
 CrossServiceComponentsResponse:
 type: object
 description: The response for the cross service components.
 properties:
 components:
 type: array
 items:
 $ref: '#/components/schemas/CrossServiceComponent'
 edge\_mappings:
 type: array
 items:
 $ref: '#/components/schemas/EdgeMapping'
 required:
 \- components
 \- edge\_mappings
 LineageExportResponse:
 type: object
 properties:
 timestamp:
 type: string
 description: The timestamp of the lineage export
 items:
 type: array
 items:
 oneOf:
 \- $ref: '#/components/schemas/CodeComponent'
 \- $ref: '#/components/schemas/DataStoreComponent'
 \- $ref: '#/components/schemas/EdgeMapping'
 description: The items in the lineage export
 required:
 \- timestamp
 \- items
 DataFlowPathAddedEvent:
 type: object
 description: Lineage data flow path added event
 allOf:
 \- type: object
 required:
 \- event\_type
 \- path
 properties:
 event\_type:
 type: string
 enum:
 \- DATA\_FLOW\_PATH\_ADDED
 effective\_since\_commit\_sha:
 type: string
 description: The commit SHA that the path should apply from.
 payload\_name:
 type: string
 description: Deterministic payload name for a path if id is not available.
 reason:
 type: string
 description: The reason for the event
 path:
 $ref: '#/components/schemas/StaticAnalysisDataFlowPath'
 namespace:
 type: string
 description: Optional namespace scope for this event.
 DataFlowEdgeAddedEvent:
 type: object
 description: Lineage data flow edge added event
 allOf:
 \- type: object
 required:
 \- event\_type
 \- source
 \- destination
 \- field\_mappings
 properties:
 event\_type:
 type: string
 enum:
 \- DATA\_FLOW\_EDGE\_ADDED
 reason:
 type: string
 description: The reason for the event.
 namespace:
 type: string
 description: Optional namespace scope for this event.
 branch\_name:
 type: string
 description: Optional branch scope for this event.
 job\_trigger:
 type: string
 description: Optional trigger scope for this event.
 field\_mappings:
 type: array
 minItems: 1
 items:
 type: object
 additionalProperties: false
 required:
 \- source\_field
 \- destination\_field
 properties:
 source\_field:
 type: string
 destination\_field:
 type: string
 notes:
 type: string
 source:
 type: object
 additionalProperties: false
 required:
 \- component\_id
 \- source\_component\_name
 \- payload\_name
 \- type
 properties:
 component\_id:
 type: string
 format: uuid
 description: Source component ID for edge matching.
 source\_component\_name:
 type: string
 description: Source component name.
 egress\_id:
 type: string
 description: Optional source egress ID.
 payload\_name:
 type: string
 description: Source payload name used for edge matching.
 effective\_since\_commit\_sha:
 type: string
 description: Optional source-side effective commit SHA.
 type:
 type: string
 description: Source endpoint type.
 destination:
 type: object
 additionalProperties: false
 required:
 \- component\_id
 \- destination\_component\_name
 \- payload\_name
 \- type
 properties:
 component\_id:
 type: string
 format: uuid
 description: Destination component ID for edge matching.
 destination\_component\_name:
 type: string
 description: Destination component name.
 ingress\_id:
 type: string
 description: Optional destination ingress ID.
 payload\_name:
 type: string
 description: Destination payload name used for edge matching.
 effective\_since\_commit\_sha:
 type: string
 description: Optional destination-side effective commit SHA.
 type:
 type: string
 description: Destination endpoint type.
 DataFlowEdgeDeletedEvent:
 type: object
 description: Lineage data flow edge deleted event
 allOf:
 \- type: object
 required:
 \- event\_type
 \- edge\_id
 properties:
 event\_type:
 type: string
 enum:
 \- DATA\_FLOW\_EDGE\_DELETED
 edge\_id:
 type: string
 description: Stable server-issued edge identifier to hide.
 reason:
 type: string
 description: The reason for the event.
 namespace:
 type: string
 description: Optional namespace scope for this event.
 DataFlowPathSuppressedEvent:
 type: object
 description: Lineage data flow path suppressed event
 allOf:
 \- type: object
 required:
 \- event\_type
 properties:
 event\_type:
 type: string
 enum:
 \- DATA\_FLOW\_PATH\_SUPPRESSED
 path\_id:
 type: string
 format: uuid
 description: Stable server-issued path identifier.
 effective\_since\_commit\_sha:
 type: string
 description: The commit SHA that the path should apply from.
 reason:
 type: string
 description: The reason for the event
 namespace:
 type: string
 description: Optional namespace scope for this event.
 DataFlowPathUnsuppressedEvent:
 type: object
 description: Lineage data flow path un-suppressed event
 allOf:
 \- type: object
 required:
 \- event\_type
 properties:
 event\_type:
 type: string
 enum:
 \- DATA\_FLOW\_PATH\_UNSUPPRESSED
 path\_id:
 type: string
 format: uuid
 description: Stable server-issued path identifier.
 effective\_since\_commit\_sha:
 type: string
 description: The commit SHA that the path should apply from.
 reason:
 type: string
 description: The reason for the event
 namespace:
 type: string
 description: Optional namespace scope for this event.
 DataFlowByoPathDeletedEvent:
 type: object
 description: Lineage data flow BYO path deleted event
 allOf:
 \- type: object
 required:
 \- event\_type
 \- path\_id
 properties:
 event\_type:
 type: string
 enum:
 \- DATA\_FLOW\_BYO\_PATH\_DELETED
 path\_id:
 type: string
 format: uuid
 description: Stable server-issued path identifier.
 effective\_since\_commit\_sha:
 type: string
 description: The commit SHA that the BYO path deletion should apply from.
 reason:
 type: string
 description: The reason for the event
 namespace:
 type: string
 description: Optional namespace scope for this event.
 EventEnvelope:
 type: object
 required:
 \- events
 \- type
 additionalProperties: false
 properties:
 type:
 type: string
 enum:
 \- LINEAGE\_EVENT
 events:
 type: array
 minItems: 1
 items:
 type: object
 description: Lineage event envelope.
 required:
 \- source
 \- payload
 \- component\_id
 \- actor
 properties:
 occurred\_at:
 type: string
 format: date-time
 description: >-
 Client timestamp when the event occurred (server also records
 received time).
 source:
 type: string
 description: Origin of the event.
 enum:
 \- UI
 \- SCA
 \- BYO
 \- API
 actor:
 type: object
 description: Actor responsible for the event (optional for SCA).
 required:
 \- actor\_type
 properties:
 actor\_type:
 type: string
 enum:
 \- user
 \- api\_key
 actor\_id:
 type: string
 description: Opaque identifier for the actor.
 component\_id:
 type: string
 format: uuid
 description: The ID of the component that the path belongs to
 payload:
 oneOf:
 \- $ref: '#/components/schemas/DataFlowPathSuppressedEvent'
 \- $ref: '#/components/schemas/DataFlowPathUnsuppressedEvent'
 \- $ref: '#/components/schemas/DataFlowPathAddedEvent'
 \- $ref: '#/components/schemas/DataFlowEdgeAddedEvent'
 \- $ref: '#/components/schemas/DataFlowEdgeDeletedEvent'
 \- $ref: '#/components/schemas/DataFlowByoPathDeletedEvent'
 discriminator:
 propertyName: event\_type
 mapping:
 DATA\_FLOW\_PATH\_ADDED: '#/components/schemas/DataFlowPathAddedEvent'
 DATA\_FLOW\_EDGE\_ADDED: '#/components/schemas/DataFlowEdgeAddedEvent'
 DATA\_FLOW\_EDGE\_DELETED: '#/components/schemas/DataFlowEdgeDeletedEvent'
 DATA\_FLOW\_PATH\_SUPPRESSED: '#/components/schemas/DataFlowPathSuppressedEvent'
 DATA\_FLOW\_PATH\_UNSUPPRESSED: '#/components/schemas/DataFlowPathUnsuppressedEvent'
 DATA\_FLOW\_BYO\_PATH\_DELETED: '#/components/schemas/DataFlowByoPathDeletedEvent'
 additionalProperties: false
 PostEventsRequest:
 type: object
 description: Create lineage events or upload lineage data event
 oneOf:
 \- $ref: '#/components/schemas/StaticAnalysisPathsApiRequest'
 \- $ref: '#/components/schemas/CrossServiceDataStoreApiRequest'
 \- $ref: '#/components/schemas/CrossServiceEdgeApiRequest'
 \- $ref: '#/components/schemas/EventEnvelope'
 discriminator:
 propertyName: type
 mapping:
 CODE: '#/components/schemas/StaticAnalysisPathsApiRequest'
 DATA\_STORE: '#/components/schemas/CrossServiceDataStoreApiRequest'
 EDGE: '#/components/schemas/CrossServiceEdgeApiRequest'
 LINEAGE\_EVENT: '#/components/schemas/EventEnvelope'
 ComparisonMetadata:
 type: object
 description: Timestamps, file paths, and component information for the comparison.
 properties:
 baseTimestamp:
 type: string
 description: ISO timestamp of base version.
 compareTimestamp:
 type: string
 description: ISO timestamp of compare version.
 comparisonDate:
 type: string
 description: ISO timestamp when comparison ran.
 componentName:
 type: string
 description: Name of the component being compared.
 baseNamespace:
 type: string
 description: Namespace identifier in base version.
 compareNamespace:
 type: string
 description: Namespace identifier in compare version.
 baseComponentId:
 type: string
 description: Component identifier in base version.
 compareComponentId:
 type: string
 description: Component identifier in compare version.
 baseVersionId:
 type: string
 description: Base version/run ID.
 compareVersionId:
 type: string
 description: Compare version/run ID.
 baseScaPrimeVersion:
 type: string
 description: >-
 SCA-prime tool version that produced the base run. Absent when the
 base run did not originate from the SCA tool (e.g. imported ground
 truth).
 compareScaPrimeVersion:
 type: string
 description: >-
 SCA-prime tool version that produced the compare run. Absent when
 the compare run did not originate from the SCA tool.
 filterSet:
 type: object
 description: >-
 The payload filter set applied to this report, if any. Absent when
 no filter set was applied.
 properties:
 name:
 type: string
 description: Name of the applied filter set.
 includedPaths:
 type: integer
 description: Number of ground-truth paths included by the filter set.
 totalPaths:
 type: integer
 description: >-
 Total ground-truth paths available before the filter set was
 applied.
 required:
 \- name
 \- includedPaths
 \- totalPaths
 mappingJoinMultiplicity:
 type: object
 description: >-
 Optional diagnostics for duplicate field-mapping join keys that can
 multiply rows in the comparison.
 properties:
 baseDuplicateKeyCount:
 type: integer
 description: Number of mapping join keys duplicated in the base dataset.
 compareDuplicateKeyCount:
 type: integer
 description: Number of mapping join keys duplicated in the compare dataset.
 crossProductKeyCount:
 type: integer
 description: >-
 Number of join keys present on both sides where duplicate rows
 would create cross-product matches.
 extraJoinedRows:
 type: integer
 description: >-
 Additional joined rows introduced beyond a single expected row
 per key.
 samples:
 type: array
 description: >-
 All duplicated mapping keys that contribute to join
 multiplication.
 items:
 type: object
 properties:
 pathPayloadName:
 type: string
 ingressField:
 type: string
 egressField:
 type: string
 baseCount:
 type: integer
 compareCount:
 type: integer
 joinedRows:
 type: integer
 extraJoinedRows:
 type: integer
 required:
 \- pathPayloadName
 \- ingressField
 \- egressField
 \- baseCount
 \- compareCount
 \- joinedRows
 \- extraJoinedRows
 required:
 \- baseTimestamp
 \- compareTimestamp
 \- comparisonDate
 \- componentName
 \- baseNamespace
 \- compareNamespace
 \- baseComponentId
 \- compareComponentId
 \- baseVersionId
 \- compareVersionId
 SummarySection:
 type: object
 description: >-
 Aggregate statistics for a qualification level (fully or partially
 qualified).
 properties:
 total:
 type: integer
 description: Total path count.
 full:
 type: integer
 description: Paths with full match (green).
 partial:
 type: integer
 description: Paths with partial match (yellow).
 missing:
 type: integer
 description: Missing paths (red).
 highQualityTotal:
 type: integer
 description: Paths where all completeness = KNOWN\_COMPLETE.
 highQualityFull:
 type: integer
 description: High quality paths with full match.
 highQualityPartial:
 type: integer
 description: High quality paths with partial match.
 highQualityMissing:
 type: integer
 description: High quality paths that are missing.
 lowQualityTotal:
 type: integer
 description: Paths with incomplete base version data.
 lowQualityFull:
 type: integer
 description: Low quality paths with full match.
 lowQualityPartial:
 type: integer
 description: Low quality paths with partial match.
 lowQualityMissing:
 type: integer
 description: Low quality paths that are missing.
 required:
 \- total
 \- full
 \- partial
 \- missing
 \- highQualityTotal
 \- highQualityFull
 \- highQualityPartial
 \- highQualityMissing
 \- lowQualityTotal
 \- lowQualityFull
 \- lowQualityPartial
 \- lowQualityMissing
 ComparisonSummary:
 type: object
 description: Aggregate counts and percentages for the comparison.
 properties:
 fullyQualified:
 description: Stats for fully qualified paths.
 $ref: '#/components/schemas/SummarySection'
 partiallyQualified:
 description: Stats for partially qualified paths.
 $ref: '#/components/schemas/SummarySection'
 required:
 \- fullyQualified
 \- partiallyQualified
 IngressInfo:
 type: object
 description: Input interface details for a path.
 properties:
 id:
 type: string
 description: Interface identifier.
 payloadName:
 type: string
 description: Payload name (e.g., "EventStream").
 signatureName:
 type: string
 description: Signature name.
 schemaName:
 type: string
 description: Schema name.
 required:
 \- id
 \- payloadName
 \- signatureName
 \- schemaName
 EgressInfo:
 type: object
 description: Output interface details for a path.
 properties:
 id:
 type: string
 description: Interface identifier.
 payloadName:
 type: string
 description: Payload name (e.g., "EventStream").
 signatureName:
 type: string
 description: Signature name.
 schemaName:
 type: string
 description: Schema name.
 required:
 \- id
 \- payloadName
 \- signatureName
 \- schemaName
 OverallStatusEnum:
 type: string
 description: Overall comparison result for a path.
 enum:
 \- FULL
 \- PARTIAL
 \- MISSING
 QualityEnum:
 type: string
 description: Ground truth quality based on completeness dimensions.
 enum:
 \- HIGH
 \- LOW
 StatusEnum:
 type: string
 description: Comparison result status between base and compare versions.
 enum:
 \- PASS
 \- FAIL
 \- WARNING
 \- INFO
 \- NA
 DimensionResult:
 type: object
 description: Comparison result for a single dimension.
 properties:
 status:
 $ref: '#/components/schemas/StatusEnum'
 base:
 type: string
 description: Base value.
 compare:
 type: string
 description: Compare value.
 baseCount:
 type: integer
 description: Count in base version.
 compareCount:
 type: integer
 description: Count in compare version.
 missingCount:
 type: integer
 description: Count of missing items.
 reorderedCount:
 type: integer
 description: Count of reordered items.
 mismatches:
 type: integer
 description: Count of mismatches.
 required:
 \- status
 \- base
 \- compare
 \- baseCount
 \- compareCount
 \- missingCount
 \- reorderedCount
 \- mismatches
 PresenceEnum:
 type: string
 description: Whether an item exists in the base or compare version.
 enum:
 \- PRESENT
 \- ABSENT
 \- EXTRA
 CompletenessEnum:
 type: string
 description: Ground truth completeness level.
 enum:
 \- KNOWN\_COMPLETE
 \- KNOWN\_INCOMPLETE
 \- UNKNOWN
 SeverityEnum:
 type: string
 description: Issue severity level for reporting.
 enum:
 \- ERROR
 \- WARNING
 \- REVIEW
 \- INFO
 \- OK
 FieldDetail:
 type: object
 description: Comparison detail for a single field.
 properties:
 fieldName:
 type: string
 description: Field name.
 fieldType:
 type: string
 description: Field data type.
 base:
 $ref: '#/components/schemas/PresenceEnum'
 compare:
 $ref: '#/components/schemas/PresenceEnum'
 status:
 $ref: '#/components/schemas/StatusEnum'
 completeness:
 $ref: '#/components/schemas/CompletenessEnum'
 severity:
 $ref: '#/components/schemas/SeverityEnum'
 required:
 \- fieldName
 \- fieldType
 \- base
 \- compare
 \- status
 \- completeness
 \- severity
 MappingDetail:
 type: object
 description: Comparison detail for a field mapping.
 properties:
 ingressField:
 type: string
 description: Source field name.
 egressField:
 type: string
 description: Target field name.
 base:
 $ref: '#/components/schemas/PresenceEnum'
 compare:
 $ref: '#/components/schemas/PresenceEnum'
 status:
 $ref: '#/components/schemas/StatusEnum'
 completeness:
 $ref: '#/components/schemas/CompletenessEnum'
 severity:
 $ref: '#/components/schemas/SeverityEnum'
 kind:
 $ref: '#/components/schemas/FieldMappingKind'
 required:
 \- ingressField
 \- egressField
 \- base
 \- compare
 \- status
 \- completeness
 \- severity
 CodeStepDetail:
 type: object
 description: Comparison detail for a code transformation step.
 properties:
 stepOrder:
 type: integer
 description: Order in the transformation chain.
 base:
 $ref: '#/components/schemas/PresenceEnum'
 compare:
 $ref: '#/components/schemas/PresenceEnum'
 status:
 $ref: '#/components/schemas/StatusEnum'
 ingressField:
 type: string
 description: Associated input field.
 egressField:
 type: string
 description: Associated output field.
 completeness:
 $ref: '#/components/schemas/CompletenessEnum'
 severity:
 $ref: '#/components/schemas/SeverityEnum'
 required:
 \- stepOrder
 \- base
 \- compare
 \- status
 \- ingressField
 \- egressField
 \- completeness
 \- severity
 PathAnchorDetail:
 type: object
 description: Comparison detail for a code anchor.
 properties:
 anchorName:
 type: string
 description: Code anchor name (e.g., class/file name).
 filePath:
 type: string
 description: Path to source file.
 base:
 $ref: '#/components/schemas/PresenceEnum'
 compare:
 $ref: '#/components/schemas/PresenceEnum'
 baseLine:
 type: string
 description: Base line number.
 compareLine:
 type: string
 description: Compare line number.
 status:
 $ref: '#/components/schemas/StatusEnum'
 completeness:
 $ref: '#/components/schemas/CompletenessEnum'
 severity:
 $ref: '#/components/schemas/SeverityEnum'
 required:
 \- anchorName
 \- filePath
 \- base
 \- compare
 \- baseLine
 \- compareLine
 \- status
 \- completeness
 \- severity
 PathDetails:
 type: object
 description: Detailed field, mapping, and code step comparisons for a path.
 properties:
 ingressFields:
 type: array
 description: Input field comparisons.
 items:
 $ref: '#/components/schemas/FieldDetail'
 egressFields:
 type: array
 description: Output field comparisons.
 items:
 $ref: '#/components/schemas/FieldDetail'
 mappings:
 type: array
 description: Field mapping comparisons.
 items:
 $ref: '#/components/schemas/MappingDetail'
 codeSteps:
 type: array
 description: Data flow step comparisons.
 items:
 $ref: '#/components/schemas/CodeStepDetail'
 pathAnchors:
 type: array
 description: Code anchor comparisons.
 items:
 $ref: '#/components/schemas/PathAnchorDetail'
 required:
 \- ingressFields
 \- egressFields
 \- mappings
 \- codeSteps
 \- pathAnchors
 PathResult:
 type: object
 description: Per-path comparison result between base and compare versions.
 properties:
 pathId:
 type: string
 description: Unique path identifier (pathPayloadName).
 ingress:
 description: Input interface details.
 $ref: '#/components/schemas/IngressInfo'
 egress:
 description: Output interface details.
 $ref: '#/components/schemas/EgressInfo'
 overallStatus:
 $ref: '#/components/schemas/OverallStatusEnum'
 quality:
 $ref: '#/components/schemas/QualityEnum'
 notes:
 type: string
 description: Summary of issues found.
 dimensions:
 type: object
 description: Per-dimension comparison results.
 additionalProperties:
 $ref: '#/components/schemas/DimensionResult'
 details:
 description: Detailed field/mapping comparisons.
 $ref: '#/components/schemas/PathDetails'
 pathType:
 description: Whether this path came from a scan or a user override (BYO).
 $ref: '#/components/schemas/PathType'
 required:
 \- pathId
 \- ingress
 \- egress
 \- overallStatus
 \- quality
 \- notes
 \- dimensions
 \- details
 ExtraPath:
 type: object
 description: A path found in the compare version but not in the base version.
 properties:
 extraPathId:
 type: string
 description: Identifier (e.g., "extra-001").
 ingressPayload:
 type: string
 description: Input payload name.
 egressPayload:
 type: string
 description: Output payload name.
 pathPayloadName:
 type: string
 description: Path payload name.
 required:
 \- extraPathId
 \- ingressPayload
 \- egressPayload
 \- pathPayloadName
 ComparisonResult:
 type: object
 description: >-
 Top-level object containing all comparison data between a base and
 compare lineage export.
 properties:
 metadata:
 description: Timestamps, file paths, and component info.
 $ref: '#/components/schemas/ComparisonMetadata'
 summary:
 description: Aggregate counts and percentages.
 $ref: '#/components/schemas/ComparisonSummary'
 paths:
 type: array
 description: Per-path comparison results.
 items:
 $ref: '#/components/schemas/PathResult'
 extraPaths:
 type: array
 description: Paths in compare but not in base.
 items:
 $ref: '#/components/schemas/ExtraPath'
 required:
 \- metadata
 \- summary
 \- paths
 \- extraPaths
 EdgeBoundary:
 type: object
 description: One side (source or destination) of a cross-service edge.
 properties:
 component\_id:
 type: string
 format: uuid
 description: The component UUID.
 component\_name:
 type: string
 description: The human-readable component name.
 payload\_name:
 type: string
 description: The payload name associated with this endpoint.
 kind:
 type: string
 description: >
 The kind of boundary this endpoint represents. Maps to DynamoDB
 Source.Type / Destination.Type (unconstrained string). Values:
 'egress' (source code boundary), 'ingress' (destination code
 boundary), 'DATA\_STORE' (data store component).
 xgress\_id:
 type: string
 description: The resolved egress or ingress ID, if available.
 required:
 \- component\_id
 \- component\_name
 \- payload\_name
 \- kind
 LineageEdgeFieldMapping:
 type: object
 description: A field-level mapping on a cross-service edge.
 properties:
 source\_field:
 type: string
 description: The field name on the source side of the edge.
 destination\_field:
 type: string
 description: The field name on the destination side of the edge.
 notes:
 type: string
 description: Optional notes about this field mapping.
 required:
 \- source\_field
 \- destination\_field
 LineageEdge:
 type: object
 description: >
 A cross-service edge connecting two components. This schema is used for
 both read (GET) and write (POST/PUT) operations to enable round-trip
 editing. Fields marked readOnly are returned by GET but ignored on
 POST/PUT. Fields marked writeOnly are accepted on POST/PUT but not
 returned in GET.
 properties:
 id:
 type: string
 readOnly: true
 description: Server-assigned edge ID.
 kind:
 type: string
 readOnly: true
 description: >
 Classification of this edge. Maps to DynamoDB EdgeSchema.Type which
 is constrained to enum('cross\_service') — the only value today.
 example: cross\_service
 namespace:
 type: string
 description: The namespace this edge belongs to.
 source:
 $ref: '#/components/schemas/EdgeBoundary'
 destination:
 $ref: '#/components/schemas/EdgeBoundary'
 field\_mappings:
 type: array
 description: Field-level mappings captured on this edge.
 minItems: 1
 items:
 $ref: '#/components/schemas/LineageEdgeFieldMapping'
 reason:
 type: string
 writeOnly: true
 description: >-
 Optional reason for creating or updating this edge (stored in audit
 trail, not returned in GET).
 required:
 \- source
 \- destination
 \- field\_mappings
 LineageEdgeListResponse:
 type: object
 description: Response containing a list of edge resources.
 properties:
 edges:
 type: array
 items:
 $ref: '#/components/schemas/LineageEdge'
 required:
 \- edges
 ComponentSummaryResource:
 type: object
 description: Lightweight component summary for listing.
 properties:
 id:
 type: string
 format: uuid
 description: Component UUID.
 name:
 type: string
 description: Human-readable component name.
 type:
 type: string
 description: Component type (e.g. "service", "database", "table", "data\_store").
 namespace:
 type: string
 description: The namespace this component belongs to.
 last\_updated:
 type: string
 description: ISO timestamp of last update.
 friendly\_name:
 type: string
 description: Optional friendly display name.
 metrics:
 type: object
 properties:
 ingress\_count:
 type: integer
 egress\_count:
 type: integer
 path\_count:
 type: integer
 repo\_name:
 type: string
 description: Repository name (for code components).
 required:
 \- id
 \- name
 \- type
 ComponentListResponse:
 type: object
 description: Response containing a list of component summaries.
 properties:
 components:
 type: array
 items:
 $ref: '#/components/schemas/ComponentSummaryResource'
 required:
 \- components
 PathBoundary:
 type: object
 description: >
 One side (ingress or egress) of a path, with full boundary data inlined.
 Matches the write model structure for round-trip editing.
 properties:
 id:
 type: string
 format: uuid
 description: The boundary (ingress/egress) ID.
 kind:
 type: string
 description: The boundary kind (e.g. "postgres", "gateway\_response").
 signature\_name:
 type: string
 description: The signature name (e.g. package/class/method).
 schema:
 type: object
 description: Schema definition for this boundary.
 additionalProperties: true
 payload\_name:
 type: string
 description: The payload name associated with this boundary.
 description:
 type: string
 description: Optional description of this boundary.
 required:
 \- signature\_name
 PathFieldMapping:
 type: object
 description: A field-level mapping on a path (ingress to egress).
 properties:
 ingress\_field:
 type: string
 description: The field name on the ingress side.
 egress\_field:
 type: string
 description: The field name on the egress side.
 notes:
 type: string
 description: Optional notes about this field mapping.
 kind:
 allOf:
 \- $ref: '#/components/schemas/FieldMappingKind'
 description: The type of data flow this mapping represents.
 required:
 \- ingress\_field
 \- egress\_field
 PathCodeAnchor:
 type: object
 description: A code location anchor associated with a path.
 properties:
 anchor\_id:
 type: string
 description: Unique identifier for this anchor.
 name:
 type: string
 description: Human-readable name for this anchor.
 file:
 type: string
 description: File path relative to project root.
 line\_start:
 type: integer
 description: Starting line number.
 line\_end:
 type: integer
 description: Ending line number.
 column\_start:
 type: integer
 description: Starting column number.
 column\_end:
 type: integer
 description: Ending column number.
 url:
 type: string
 description: Full URL to this code location (if available).
 required:
 \- anchor\_id
 LineagePath:
 type: object
 description: >
 A path connecting an ingress to an egress within a component. Boundary
 data (schema, signature, kind) is inlined for round-trip editing. Fields
 marked readOnly are returned by GET but ignored on POST/PUT.
 properties:
 path\_id:
 type: string
 format: uuid
 readOnly: true
 description: Server-assigned path ID.
 path\_type:
 type: string
 enum:
 \- SCAN\_OUTPUT
 \- USER\_OVERRIDE
 readOnly: true
 description: Whether this path came from a scan or user override.
 is\_suppressed:
 type: boolean
 readOnly: true
 description: Whether this path is currently suppressed.
 default: false
 ingress:
 $ref: '#/components/schemas/PathBoundary'
 egress:
 $ref: '#/components/schemas/PathBoundary'
 field\_mappings:
 type: array
 items:
 $ref: '#/components/schemas/PathFieldMapping'
 code\_anchors:
 type: array
 items:
 $ref: '#/components/schemas/PathCodeAnchor'
 transformation\_summary:
 type: string
 description: Brief summary of the data transformation on this path.
 payload\_name:
 type: string
 description: The payload name for this path.
 completeness:
 $ref: '#/components/schemas/Completeness'
 reason:
 type: string
 writeOnly: true
 description: Optional reason for creating or updating this path.
 effective\_since\_commit\_sha:
 type: string
 writeOnly: true
 description: >
 Commit SHA this path is effective from. When omitted, defaults to
 the latest scanned commit for the component. The backend resolves
 the corresponding commit timestamp from the scan history.
 required:
 \- ingress
 \- egress
 ComponentDetailResource:
 type: object
 description: >
 Full component detail with paths in self-contained (round-trip) format.
 For CODE components, paths include inline ingress/egress boundary data.
 For DATA\_STORE components, the schema field list is included.
 properties:
 id:
 type: string
 format: uuid
 description: Component UUID.
 name:
 type: string
 description: Human-readable component name.
 type:
 type: string
 enum:
 \- CODE
 \- DATA\_STORE
 description: Component type ("CODE" or "DATA\_STORE").
 namespace:
 type: string
 description: The namespace this component belongs to.
 friendly\_name:
 type: string
 description: Optional friendly display name.
 paths:
 type: array
 description: Paths with inline boundary data (CODE components only).
 items:
 $ref: '#/components/schemas/LineagePath'
 store\_kind:
 type: string
 enum:
 \- dynamodb
 \- redis
 \- elasticache
 \- database
 \- kafka
 \- other
 description: Storage technology type (DATA\_STORE components only).
 schema:
 type: object
 description: Schema definition (DATA\_STORE components only).
 properties:
 fields:
 type: array
 items:
 type: object
 properties:
 name:
 type: string
 type:
 type: string
 required:
 \- name
 \- type
 metadata:
 type: object
 description: Component metadata.
 additionalProperties: true
 required:
 \- id
 \- name
 \- type
 FieldPairOrigin:
 type: string
 description: \|
 Provenance of a field pair row. SCAN = produced by scanner output.
 BYO\_ADD / BYO\_CHANGE / BYO\_SUPPRESS = produced by the corresponding
 user-initiated event. Stored, not derived — carries history.
 enum:
 \- SCAN
 \- BYO\_ADD
 \- BYO\_CHANGE
 \- BYO\_SUPPRESS
 FieldPairEndpoint:
 type: object
 description: One side (ingress or egress) of a field pair.
 properties:
 componentId:
 type: string
 description: The component containing the xgress.
 xgressId:
 type: string
 description: The ingress or egress (xgress) ID.
 fieldPath:
 type: string
 description: >-
 Field path within the xgress payload (e.g.
 "$.payload.amount.value").
 dataType:
 type: string
 description: Normalized data type for this field.
 required:
 \- componentId
 \- xgressId
 \- fieldPath
 FieldPair:
 type: object
 description: >-
 A logical field-to-field mapping formed by rolling up strands. Unit of
 change tracking and approval in the field-level focused views.
 properties:
 fieldPairGroupId:
 type: string
 description: Stable identity of the rolled-up field pair.
 payloadGroupId:
 type: string
 description: Stable identity of the parent payload (xgress pair).
 componentId:
 type: string
 description: The component this field pair lives on.
 ingress:
 $ref: '#/components/schemas/FieldPairEndpoint'
 egress:
 $ref: '#/components/schemas/FieldPairEndpoint'
 origin:
 $ref: '#/components/schemas/FieldPairOrigin'
 isSuppressed:
 type: boolean
 description: Whether this field pair is currently suppressed in projections.
 upstreamSourcesCount:
 type: integer
 description: Number of upstream sources feeding this pair's ingress field.
 downstreamConsumersCount:
 type: integer
 description: Number of downstream consumers of this pair's egress field.
 upstreamDependencies:
 type: array
 description: >-
 Fields feeding this pair's ingress field, each at its minimum hop
 distance with the path taken to reach it. The component-level
 dependency summary is aggregated from these client-side.
 items:
 $ref: '#/components/schemas/FieldDependency'
 downstreamDependencies:
 type: array
 description: >-
 Fields consuming this pair's egress field, each at its minimum hop
 distance with the path taken to reach it.
 items:
 $ref: '#/components/schemas/FieldDependency'
 strandIds:
 type: array
 description: >-
 Identifiers of the strands that rolled up into this field pair (for
 traceback to the underlying scanner output).
 items:
 type: string
 createdAt:
 type: string
 format: date-time
 description: When this row was produced.
 createdBy:
 type: string
 description: >-
 Actor that produced this row (user or api key id). Absent for
 SCAN-origin rows.
 required:
 \- fieldPairGroupId
 \- payloadGroupId
 \- componentId
 \- ingress
 \- egress
 \- origin
 \- isSuppressed
 GetFieldPairsResponse:
 type: object
 description: List of field pairs for a component.
 properties:
 fieldPairs:
 type: array
 items:
 $ref: '#/components/schemas/FieldPair'
 required:
 \- fieldPairs
 StaticAnalysisPathsUploadRequest:
 type: object
 description: >-
 The lineage data for a component. This is not actually part of the API,
 but is used to generate the type for validation at the CLI and in the
 backend lineage queue handler.
 properties:
 paths:
 type: array
 items:
 $ref: '#/components/schemas/StaticAnalysisDataFlowPath'
 run\_id:
 type: string
 description: The ID of the run that the paths belong to
 external\_component\_id:
 type: string
 description: Optional ID of the external component that was analyzed
 type:
 type: string
 description: The type of component that was analyzed
 const: CODE
 name:
 type: string
 description: The name of the component that was analyzed
 metadata:
 type: object
 description: Additional metadata for the component.
 properties:
 extras:
 type: object
 additionalProperties:
 type: string
 required:
 \- paths
 \- run\_id
 CrossServiceDataStore:
 type: object
 description: Request to upload non code based BYOL data
 additionalProperties: false
 properties:
 external\_component\_id:
 type: string
 description: The provided external ID for the data store
 run\_id:
 type: string
 description: The version ID for this data store
 type:
 type: string
 const: DATA\_STORE
 description: The type of data store
 schema:
 type: object
 additionalProperties: false
 required:
 \- fields
 properties:
 fields:
 type: array
 minItems: 1
 items:
 type: object
 additionalProperties: false
 properties:
 name:
 type: string
 description: The name of the field
 type:
 type: string
 description: The type of the field
 required:
 \- name
 \- type
 table\_metadata:
 type: object
 additionalProperties: false
 required:
 \- type
 \- table\_name
 properties:
 type:
 type: string
 description: The type of data store
 enum:
 \- dynamodb
 \- redis
 \- elasticache
 \- database
 \- kafka
 \- other
 table\_name:
 type: string
 description: The name of the data store
 extras:
 type: object
 description: Additional metadata for the data store.
 additionalProperties:
 type: string
 required:
 \- external\_component\_id
 \- run\_id
 \- type
 \- table\_metadata
 \- schema
 CrossServiceEdge:
 type: object
 additionalProperties: false
 required:
 \- type
 \- field\_mappings
 \- source
 \- destination
 properties:
 run\_id:
 type: string
 description: The ID of the run that this data belongs to
 type:
 type: string
 const: EDGE
 field\_mappings:
 type: array
 minItems: 1
 items:
 type: object
 additionalProperties: false
 required:
 \- source\_field
 \- destination\_field
 properties:
 source\_field:
 type: string
 destination\_field:
 type: string
 notes:
 type: string
 source:
 type: object
 additionalProperties: false
 required:
 \- source\_component\_name
 \- type
 properties:
 component\_id:
 type: string
 description: Id of the source component
 source\_component\_name:
 type: string
 description: Name of the source component
 egress\_id:
 type: string
 description: Id of the source entity
 type:
 type: string
 description: the type of edge connection
 payload\_name:
 type: string
 description: The name of the payload source
 destination:
 type: object
 additionalProperties: false
 required:
 \- destination\_component\_name
 \- type
 properties:
 component\_id:
 type: string
 description: Id of the destination component
 destination\_component\_name:
 type: string
 description: Name of the destination component
 ingress\_id:
 type: string
 description: Id of the destination entity
 type:
 type: string
 description: the type of edge connection
 payload\_name:
 type: string
 description: The name of the payload destination
 EgressSchemaV0:
 type: object
 description: Legacy DARN-based egress schema key
 properties:
 version:
 type: string
 const: V0
 darn:
 $ref: '#/components/schemas/DataAssetResourceName'
 required:
 \- version
 \- darn
 additionalProperties: false
 EgressSchemaV1:
 type: object
 description: Structured, DARN-free egress schema key
 properties:
 version:
 type: string
 const: V1
 egress\_callsite\_id:
 type: string
 description: Stable identifier of the egress callsite (tooling/build-derived).
 egress\_callsite\_hints:
 type: object
 additionalProperties: false
 properties:
 file\_path:
 type: string
 nullable: true
 line:
 type: integer
 nullable: true
 minimum: 0
 column:
 type: integer
 nullable: true
 minimum: 0
 function:
 type: string
 nullable: true
 package:
 type: string
 nullable: true
 service:
 type: string
 nullable: true
 type\_fqn:
 type: string
 description: Fully-qualified logical type name.
 type\_namespace:
 type: string
 nullable: true
 env:
 type: object
 additionalProperties: false
 properties:
 language:
 type: string
 nullable: true
 runtime:
 type: string
 nullable: true
 tool:
 type: string
 nullable: true
 tool\_version:
 type: string
 nullable: true
 required:
 \- version
 \- egress\_callsite\_id
 \- type\_fqn
 additionalProperties: false
 EgressSchemaMergeKey:
 type: object
 description: Versioned EgressSchema merge-key (version-level union)
 oneOf:
 \- $ref: '#/components/schemas/EgressSchemaV0'
 \- $ref: '#/components/schemas/EgressSchemaV1'
 discriminator:
 propertyName: version
 mapping:
 V0: '#/components/schemas/EgressSchemaV0'
 V1: '#/components/schemas/EgressSchemaV1'
 EgressSchema:
 type: object
 description: EgressSchema merge-key wrapper
 properties:
 kind:
 type: string
 const: EgressSchema
 data:
 $ref: '#/components/schemas/EgressSchemaMergeKey'
 required:
 \- kind
 \- data
 additionalProperties: false
 IngressToEgressV0:
 type: object
 description: Ingress-to-egress flow key V0
 properties:
 version:
 type: string
 const: V0
 ingress\_callsite:
 type: string
 nullable: true
 egress\_callsite:
 type: string
 nullable: true
 flow\_id:
 type: string
 nullable: true
 service:
 type: string
 nullable: true
 notes:
 type: string
 nullable: true
 required:
 \- version
 additionalProperties: false
 IngressToEgressMergeKey:
 type: object
 description: Versioned IngressToEgress merge-key (version-level union)
 oneOf:
 \- $ref: '#/components/schemas/IngressToEgressV0'
 discriminator:
 propertyName: version
 mapping:
 V0: '#/components/schemas/IngressToEgressV0'
 IngressToEgress:
 type: object
 description: IngressToEgress merge-key wrapper
 properties:
 kind:
 type: string
 const: IngressToEgress
 data:
 $ref: '#/components/schemas/IngressToEgressMergeKey'
 required:
 \- kind
 \- data
 additionalProperties: false
 MergeKey:
 type: object
 description: MergeKey (kind-level union)
 oneOf:
 \- $ref: '#/components/schemas/EgressSchema'
 \- $ref: '#/components/schemas/IngressToEgress'
 discriminator:
 propertyName: kind
 mapping:
 EgressSchema: '#/components/schemas/EgressSchema'
 IngressToEgress: '#/components/schemas/IngressToEgress'
 FakeResponseForTypeGeneration:
 type: object
 properties:
 fakeProperty3:
 oneOf:
 \- $ref: '#/components/schemas/StaticAnalysisPathsUploadRequest'
 \- $ref: '#/components/schemas/CrossServiceDataStore'
 \- $ref: '#/components/schemas/CrossServiceEdge'
 mergeKey:
 $ref: '#/components/schemas/MergeKey'
