CloudQuery insights API

The insights API from CloudQuery — 8 operation(s) for insights.

OpenAPI Specification

cloudquery-insights-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  contact:
    email: support@cloudquery.io
    name: CloudQuery Support Team
    url: https://cloudquery.io
  description: 'Welcome to the CloudQuery Platform API documentation! This API can be used to interact with the CloudQuery platform. As a user, the API allows you to search the CloudQuery asset inventory, run SQL queries against the data warehouse, save and load searches, and much more. As an administrator, it allows you to manage your teams, syncs, and other objects.

    ### Authentication

    The API is secured using bearer tokens. To get started, you can generate an API key for your Platform deployment from your platform dashboard. For a step-by-step guide, see: https://www.cloudquery.io/docs/cli/managing-cloudquery/deployments/generate-api-key.

    The base URL for the API depends on where your CloudQuery Platform is hosted. If running locally, this is usually http://localhost:3000/api. In a production deployment it should be an HTTPS URL. For purposes of illustration, we will assume the platform instance is available at https://cloudquery.mycompany.com. In this case, the base API endpoint will be https://cloudquery.mycompany.com/api.

    ### Example Request

    To test your connection to the API, we can use the `/plugins` endpoint. For example:

    `curl -v -H "Authorization: Bearer $CLOUDQUERY_API_KEY" \ https://cloudquery.mycompany.com/api/plugins`

    '
  license:
    name: MIT
    url: https://spdx.org/licenses/MIT
  termsOfService: https://www.cloudquery.io/terms
  title: CloudQuery Platform OpenAPI Spec admin insights API
  version: 1.0.0
security:
- bearerAuth: []
- cookieAuth: []
tags:
- name: insights
paths:
  /insights:
    get:
      description: List insights with optional filtering
      operationId: PlatformListPlatformInsights
      parameters:
      - $ref: '#/components/parameters/platform_page'
      - $ref: '#/components/parameters/platform_per_page'
      - name: search
        in: query
        required: false
        schema:
          type: string
        description: Search in title, evidence (description), mitigation, or related fields
      - name: severities
        in: query
        required: false
        schema:
          type: array
          items:
            $ref: '#/components/schemas/PlatformInsightSeverity'
        style: form
        explode: true
        description: Filter by severities (any match)
      - name: cloud
        in: query
        required: false
        schema:
          type: string
        description: Filter by cloud
      - name: account
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by account (repeat for multiple values, OR)
      - name: region
        in: query
        required: false
        schema:
          type: string
        description: Filter by region
      - name: insight_category
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by insight category (repeat for multiple values, OR)
      - name: source_category
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by source category (repeat for multiple values, OR)
      - name: source
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by source (repeat for multiple values, OR)
      - name: resource_types
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by resource types
      - name: tags
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by tags (any match)
      - name: sort_by
        in: query
        required: false
        schema:
          type: string
          enum:
          - title
          - severity
          - insight_category
          - source_category
          - account
          - source
          - resource_types
          - resources_count
          - accounts_count
          - created_at
          - detected_at
          default: detected_at
        description: Field to sort by
      - name: sort_dir
        in: query
        required: false
        schema:
          type: string
          enum:
          - asc
          - desc
          default: desc
        description: Sort direction
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                required:
                - items
                - metadata
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/PlatformInsight'
                  metadata:
                    $ref: '#/components/schemas/PlatformInsightsListMetadata'
        '400':
          $ref: '#/components/responses/PlatformBadRequest'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
  /insights/columns/{column_name}/distinct-values:
    get:
      description: 'Get the candidate values for the next filter dimension (`column_name`), given the current active filters. The supplied filter parameters represent where the user currently is in the filter matrix; only values for `column_name` that would yield at least one insight when added to that current position are returned. Values that would produce zero results are omitted, preventing the user from navigating to an empty state.

        The filter parameter corresponding to `column_name` is always ignored when computing candidates — asking "which severities exist where severity=X" is self-referential and nonsensical. For example, if `column_name=severity` then any `severities` filter in the request is not applied; if `column_name=source` then any `source` filter is not applied; and so on. This ensures the full set of viable values for that dimension is always returned given the other active filters.

        When `owner_tag` is specified (e.g., "team", "department"), this endpoint returns distinct values for that specific ownership tag key, ignoring the `column_name` parameter. The corresponding tags filter for this owner key is ignored to prevent self-referential queries.

        When querying for `column_name=tag` without `owner_tag`, ownership tags configured in platform settings are automatically excluded from results.'
      operationId: PlatformGetPlatformInsightColumnDistinctValues
      parameters:
      - $ref: '#/components/parameters/platform_page'
      - $ref: '#/components/parameters/platform_per_page'
      - $ref: '#/components/parameters/platform_insight_column_name'
      - name: owner_tag
        in: query
        required: false
        schema:
          type: string
        description: When specified, returns distinct values for this ownership tag key (e.g., "team", "department"). The column_name parameter is ignored when owner_tag is provided.
      - name: search
        in: query
        required: false
        schema:
          type: string
        description: Search in title, evidence (description), mitigation, or related fields
      - name: severities
        in: query
        required: false
        schema:
          type: array
          items:
            $ref: '#/components/schemas/PlatformInsightSeverity'
        style: form
        explode: true
        description: Filter by severities (any match)
      - name: cloud
        in: query
        required: false
        schema:
          type: string
        description: Filter by cloud
      - name: account
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by account (repeat for multiple values, OR)
      - name: region
        in: query
        required: false
        schema:
          type: string
        description: Filter by region
      - name: insight_category
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by insight category (repeat for multiple values, OR)
      - name: source_category
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by source category (repeat for multiple values, OR)
      - name: source
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by source (repeat for multiple values, OR)
      - name: resource_types
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by resource types
      - name: tags
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by tags (any match)
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                required:
                - values
                properties:
                  values:
                    type: array
                    items:
                      type: string
        '400':
          $ref: '#/components/responses/PlatformBadRequest'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
  /insights/saved-filters:
    get:
      description: List saved insight filters
      operationId: PlatformListInsightFilters
      parameters:
      - $ref: '#/components/parameters/platform_per_page'
      - $ref: '#/components/parameters/platform_page'
      - name: search_term
        in: query
        required: false
        schema:
          type: string
        description: Search in filter name or description
      - name: insight_category
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by insight category
      - name: severities
        in: query
        required: false
        schema:
          type: array
          items:
            $ref: '#/components/schemas/PlatformInsightSeverity'
        style: form
        explode: true
        description: Filter by severities (any match)
      - name: resource_types
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by resource types
      - name: source
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by source
      - name: source_category
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by source category
      - name: tags
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by tags (any match)
      - name: group_by
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by group by fields
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                required:
                - items
                - metadata
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/PlatformInsightFilter'
                  metadata:
                    $ref: '#/components/schemas/PlatformListMetadata'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '422':
          $ref: '#/components/responses/PlatformUnprocessableEntity'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
    post:
      description: Create a new saved insight filter
      operationId: PlatformCreateInsightFilter
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlatformInsightFilterCreate'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformInsightFilter'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '422':
          $ref: '#/components/responses/PlatformUnprocessableEntity'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
  /insights/saved-filters/{insight_filter_id}:
    get:
      description: Get a saved insight filter by ID
      operationId: PlatformGetInsightFilterByID
      parameters:
      - $ref: '#/components/parameters/platform_insight_filter_id'
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformInsightFilter'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '422':
          $ref: '#/components/responses/PlatformUnprocessableEntity'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
    patch:
      description: Update a saved insight filter
      operationId: PlatformUpdateInsightFilter
      parameters:
      - $ref: '#/components/parameters/platform_insight_filter_id'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PlatformInsightFilterUpdate'
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformInsightFilter'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '422':
          $ref: '#/components/responses/PlatformUnprocessableEntity'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
    delete:
      description: Delete a saved insight filter
      operationId: PlatformDeleteInsightFilter
      parameters:
      - $ref: '#/components/parameters/platform_insight_filter_id'
      responses:
        '204':
          description: Deleted
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '422':
          $ref: '#/components/responses/PlatformUnprocessableEntity'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
  /insights/{insight_id}:
    get:
      description: Get insight by ID
      operationId: PlatformGetPlatformInsight
      parameters:
      - $ref: '#/components/parameters/platform_insight_id'
      - name: search
        in: query
        required: false
        schema:
          type: string
        description: Search in asset name, account, region, etc.
      - name: accounts
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by account IDs
      - name: clouds
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by cloud providers (e.g. aws, azure, gcp, github, backstage, digitalocean, wiz)
      - name: regions
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by regions
      - name: resource_type
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by resource type
      - name: instance_type
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by instance type (from additional_properties.instance_type, e.g. EC2 instance class)
      - name: tags
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by tags (key:value strings; all pairs must match)
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PlatformInsight'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
  /insights/{insight_id}/assets:
    get:
      description: List assets affected by an insight
      operationId: PlatformGetPlatformInsightAssets
      parameters:
      - $ref: '#/components/parameters/platform_insight_id'
      - $ref: '#/components/parameters/platform_page'
      - $ref: '#/components/parameters/platform_per_page'
      - name: search
        in: query
        required: false
        schema:
          type: string
        description: Search in asset name, account, region, etc.
      - name: accounts
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by account IDs
      - name: clouds
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by cloud providers (e.g. aws, azure, gcp, github, backstage, digitalocean, wiz)
      - name: regions
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by regions
      - name: resource_type
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by resource type
      - name: instance_type
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by instance type (from additional_properties.instance_type, e.g. EC2 instance class)
      - name: tags
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by tags (key:value strings; all pairs must match)
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                required:
                - items
                - metadata
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/PlatformPolicyViolation'
                  metadata:
                    $ref: '#/components/schemas/PlatformListMetadata'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
  /insights/assets/columns/{column_name}/distinct-values:
    get:
      description: 'Get candidate values for the next filter dimension (`column_name`) for assets listed under an insight, given the current active filters. The supplied filter parameters represent where the user is in the filter matrix; only values for `column_name` that would yield at least one matching asset row when added to that position are returned.

        The filter parameter corresponding to `column_name` is always ignored when computing candidates (no self-filtering).

        When querying for `column_name=tag`, ownership tag keys configured in platform settings are excluded from results, matching the insights list filter behavior.

        `instance-type` values are read from `additional_properties.instance_type` on each row.'
      operationId: PlatformGetPlatformInsightAssetColumnDistinctValues
      parameters:
      - $ref: '#/components/parameters/platform_page'
      - $ref: '#/components/parameters/platform_per_page'
      - $ref: '#/components/parameters/platform_insight_asset_column_name'
      - name: insight_id
        in: query
        required: true
        schema:
          $ref: '#/components/schemas/PlatformInsightID'
        description: Insight whose affected assets are being filtered.
      - name: search
        in: query
        required: false
        schema:
          type: string
        description: Search in title, description, or mitigation (same as asset list).
      - name: accounts
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by account IDs
      - name: clouds
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by cloud providers
      - name: regions
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by regions
      - name: resource_type
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by resource type
      - name: instance_type
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by instance type (from additional_properties.instance_type)
      - name: tags
        in: query
        required: false
        schema:
          type: array
          items:
            type: string
        style: form
        explode: true
        description: Filter by tags (any match)
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                required:
                - values
                properties:
                  values:
                    type: array
                    items:
                      type: string
        '400':
          $ref: '#/components/responses/PlatformBadRequest'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
  /insights/assets/{asset_id}:
    get:
      description: List insights for a specific asset (by _cq_platform_id)
      operationId: PlatformGetPlatformAssetInsights
      parameters:
      - $ref: '#/components/parameters/platform_asset_id'
      - $ref: '#/components/parameters/platform_page'
      - $ref: '#/components/parameters/platform_per_page'
      - name: search
        in: query
        required: false
        schema:
          type: string
        description: Search in asset name, account, region, etc.
      - name: sort_by
        in: query
        required: false
        schema:
          type: string
          enum:
          - title
          - severity
          - insight_category
          - source_category
          - account
          - source
          - resource_types
          - resources_count
          - accounts_count
          - created_at
          - detected_at
          default: detected_at
        description: Field to sort by
      - name: sort_dir
        in: query
        required: false
        schema:
          type: string
          enum:
          - asc
          - desc
          default: desc
        description: Sort direction
      responses:
        '200':
          description: Response
          content:
            application/json:
              schema:
                required:
                - items
                - metadata
                properties:
                  items:
                    type: array
                    items:
                      $ref: '#/components/schemas/PlatformInsight'
                  metadata:
                    $ref: '#/components/schemas/PlatformListMetadata'
        '400':
          $ref: '#/components/responses/PlatformBadRequest'
        '401':
          $ref: '#/components/responses/PlatformRequiresAuthentication'
        '403':
          $ref: '#/components/responses/PlatformForbidden'
        '404':
          $ref: '#/components/responses/PlatformNotFound'
        '500':
          $ref: '#/components/responses/PlatformInternalError'
      tags:
      - insights
components:
  schemas:
    PlatformInsightFilterCreate:
      title: Insight Filter Create
      type: object
      description: Definition for creating a new saved insight filter
      additionalProperties: false
      required:
      - name
      properties:
        name:
          type: string
          example: My Saved Security Filter
        description:
          type: string
          example: Filters for critical security insights in AWS
        search:
          type: string
          example: s3 bucket
        insight_category:
          type: array
          items:
            type: string
        severities:
          type: array
          items:
            $ref: '#/components/schemas/PlatformInsightSeverity'
        resource_types:
          type: array
          items:
            type: string
        source:
          type: array
          items:
            type: string
        source_category:
          type: array
          items:
            type: string
        clouds:
          type: array
          items:
            type: string
        accounts:
          type: array
          items:
            type: string
        regions:
          type: array
          items:
            type: string
        tags:
          type: array
          items:
            type: string
        ownership_tags:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
          description: Ownership tag filters keyed by tag name
          example:
            team:
            - engineering
            - platform
            org:
            - cloud
        group_by:
          type: array
          items:
            type: string
    PlatformListMetadata:
      required:
      - page_size
      properties:
        total_count:
          type: integer
        last_page:
          type: integer
        page_size:
          type: integer
        time_ms:
          type: integer
    PlatformFieldError:
      allOf:
      - $ref: '#/components/schemas/PlatformBasicError'
      - properties:
          errors:
            items:
              type: string
            type: array
          field_errors:
            additionalProperties:
              type: string
            type: object
        type: object
    PlatformInsight:
      title: Insight
      type: object
      description: Security or compliance insight summary
      additionalProperties: false
      required:
      - id
      - title
      - severity
      - insight_category
      - source
      - source_category
      - resource_types
      - resources_count
      - accounts_count
      - created_at
      - detected_at
      - last_synced_at
      properties:
        id:
          $ref: '#/components/schemas/PlatformInsightID'
        title:
          type: string
          description: Title of the insight
        evidence:
          type: string
          description: Detailed evidence (description) of the insight (Markdown)
        mitigation:
          type: string
          description: Mitigation steps for the insight (Markdown)
        severity:
          $ref: '#/components/schemas/PlatformInsightSeverity'
        insight_category:
          type: string
          description: Category (e.g. Security, FinOps)
        source:
          type: string
          description: Source (e.g. Platform, Wiz, Lacework)
        source_category:
          type: string
          description: Source category (e.g. Platform, Third Party, Custom)
        subcategory:
          type: string
          nullable: true
        resource_types:
          type: string
          description: Resource types affected
        resources_count:
          type: integer
          format: int64
          description: Number of resources affected
        accounts_count:
          type: integer
          format: int64
          description: Number of accounts affected
        additional_properties:
          type: object
          description: Insight-specific metadata summed for all affected resources (e.g. cost insight fields).
          additionalProperties: true
        tags:
          type: array
          items:
            type: string
          description: Tags associated with the insight
        created_at:
          type: string
          format: date-time
          description: When the insight record was created
        detected_at:
          type: string
          format: date-time
          description: When the insight was first detected
        last_synced_at:
          type: string
          format: date-time
          description: When the insight was last synced
    Pla

# --- truncated at 32 KB (41 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/cloudquery/refs/heads/main/openapi/cloudquery-insights-api-openapi.yml