> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gable.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Post SCA results

> Post SCA results



## OpenAPI

````yaml /api-reference/bundled.yaml post /v0/sca/results
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: <your-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/sca/results:
    post:
      tags:
        - sca
      summary: Post SCA results
      description: Post SCA results
      operationId: postScaResults
      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'
components:
  schemas:
    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:
            $ref: '#/components/schemas/StaticAnalysisPathsApiRequest'
          DATA_STORE:
            $ref: '#/components/schemas/CrossServiceDataStoreApiRequest'
          EDGE:
            $ref: '#/components/schemas/CrossServiceEdgeApiRequest'
          CODE_STRANDS:
            $ref: '#/components/schemas/CodeStrandsApiRequest'
          AI_AUGMENTATION:
            $ref: '#/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
    ErrorResponse:
      type: object
      required:
        - message
      properties:
        id:
          type: number
        title:
          type: string
        message:
          type: string
    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
    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
    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:
          type: string
          description: >-
            An AI-generated summary of the data transformation that occurs along
            this path.
        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:
          $ref: '#/components/schemas/StaticAnalysisCompleteness'
          description: Completeness indicators for a ground truth path
    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
    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.
    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:
          $ref: '#/components/schemas/StaticAnalysisCodeAnchor'
          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.
        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
    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
    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'
    StaticAnalysisCompleteness:
      type: object
      properties:
        ingress:
          $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
          description: >-
            The completeness of non-schema ingress elements (name, signature,
            code anchor, etc.).
        ingress_schema:
          $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
          description: The completeness of the ingress's field schema.
        egress:
          $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
          description: >-
            The completeness of non-schema egress elements (name, signature,
            code anchor, etc.).
        egress_schema:
          $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
          description: The completeness of the egress's field schema.
        field_mappings:
          $ref: '#/components/schemas/StaticAnalysisCompletenessClassification'
          description: The completeness of the field mappings.
      required:
        - ingress
        - ingress_schema
        - egress
        - egress_schema
        - field_mappings
    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
    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'
    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
    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
    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
    StaticAnalysisCompletenessClassification:
      type: string
      description: A completeness classification of a ground truth element.
      enum:
        - UNKNOWN
        - KNOWN_INCOMPLETE
        - KNOWN_COMPLETE
    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
    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'
    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:
            $ref: '#/components/schemas/GableSchemaFieldStruct'
          'null':
            $ref: '#/components/schemas/GableSchemaFieldNull'
          bool:
            $ref: '#/components/schemas/GableSchemaFieldBool'
          int:
            $ref: '#/components/schemas/GableSchemaFieldInt'
          float:
            $ref: '#/components/schemas/GableSchemaFieldFloat'
          string:
            $ref: '#/components/schemas/GableSchemaFieldString'
          bytes:
            $ref: '#/components/schemas/GableSchemaFieldBytes'
          list:
            $ref: '#/components/schemas/GableSchemaFieldList'
          map:
            $ref: '#/components/schemas/GableSchemaFieldMap'
          enum:
            $ref: '#/components/schemas/GableSchemaFieldEnum'
          union:
            $ref: '#/components/schemas/GableSchemaFieldUnion'
          aliasReference:
            $ref: '#/components/schemas/GableSchemaFieldAliasReference'
          unknown:
            $ref: '#/components/schemas/GableSchemaFieldUnknown'
    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.
    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
    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
    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
    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
    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
    LogicalEnumTemporal:
      type: string
      enum:
        - Date
        - Time
        - Duration
        - Timestamp
    LogicalEnumText:
      type: string
      enum:
        - UUID
        - org.iso.8601.Date
        - org.iso.8601.DateTime
        - org.iso.8601.Time
    LogicalEnumNumeric:
      type: string
      enum:
        - Decimal
        - Interval
    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:
                $ref: '#/components/schemas/GableSchemaStruct'
              'null':
                $ref: '#/components/schemas/GableSchemaNull'
              bool:
                $ref: '#/components/schemas/GableSchemaBool'
              int:
                $ref: '#/components/schemas/GableSchemaInt'
              float:
                $ref: '#/components/schemas/GableSchemaFloat'
              string:
                $ref: '#/components/schemas/GableSchemaString'
              bytes:
                $ref: '#/components/schemas/GableSchemaBytes'
              list:
                $ref: '#/components/schemas/GableSchemaList'
              map:
                $ref: '#/components/schemas/GableSchemaMap'
              enum:
                $ref: '#/components/schemas/GableSchemaEnum'
              union:
                $ref: '#/components/schemas/GableSchemaUnion'
              aliasReference:
                $ref: '#/components/schemas/GableSchemaAliasReference'
              unknown:
                $ref: '#/components/schemas/GableSchemaUnknown'
    GableSchemaTypeName:
      type: string
      enum:
        - 'null'
        - bool
        - int
        - float
        - string
        - bytes
        - list
        - map
        - struct
        - enum
        - union
    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
    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
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY

````