CloudChipr API

The CloudChipr Enterprise API - 26 operations over 26 paths, described by a public OpenAPI 3.0.3 document CloudChipr serves from its own GitHub Pages site and links from its homepage and docs. Covers billing-explorer aggregation with runtime discovery of valid groupings, filters and filter values plus a dry-run validate call; savings opportunities; connected cloud accounts; live resources and resource lookup; budgets with thresholds and period history; cost-allocation dimensions and categories; dashboards and three typed widgets; and custom data sources with NDJSON ingestion. Authentication is a single x-api-key header scheme applied to every operation. Read-heavy: three of the 26 operations mutate, only one of those carries an idempotency key, and none is reversible. No pagination and no documented rate limits.

Operations 26

POST /billing-explorer Get billing data aggregation #
POST /savings-opportunities Filter savings opportunities #
GET /budgets List budgets #
GET /budgets/{budgetId} Get a budget #
GET /budgets/{budgetId}/history Get budget history per period #
POST /data-sources Creates a data source destination. #
GET /telemetry List telemetries #
GET /custom-sources List custom sources #
GET /resources/lookup Get a resource by its identifier #
GET /dimensions List dimensions with their categories #
PUT /dimensions/category-structure Update category structure for an organisation #
POST /accounts/{accountId}/resources Get resources matched with provided filters #
GET /providers/{provider}/filters Get Filters #
GET /accounts/{accountId} Get account by id #
GET /accounts Get accounts #
GET /providers/{provider}/regions Get regions #
GET /dashboards/{dashboardId} Get dashboard by id #
GET /widgets/largest-cost-changes/{widgetId} GET largest cost changes widget #
GET /widgets/cost-and-usage-summary/{widgetId} GET cost and usage summary widget #
GET /widgets/cost-breakdown/{widgetId} GET cost breakdown widget #
GET /resource-explorer/possible-groupings Get resource explorer possible groupings #
GET /billing-explorer/reports/{reportId} Get billing report data by id #
GET /resource-explorer/possible-filters Get resource explorer possible filters #
GET /resource-explorer/filters/{filterProvider}/{filterType}/values Get filter values for a specific filter type #
POST /billing-explorer/validate Validate billing explorer request #
POST /ingest/{destinationId} Ingest custom data #

Documentation

Specifications

Other Resources

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/cloudchipr-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

cloudchipr-enterprise-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: CloudChipr Enterprise API
  description: CloudChipr Enterprise API document provides detailed description about how to interact with CloudChipr Enterprise service
  version: 0.1.0
  contact:
    email: info@cloudchipr.com
  license:
    name: Cloudchipr 1.0
    url: 'https://cloudchipr.com'
tags:
  - name: Resources
    description: Endpoints for resources
  - name: Filters
    description: Everything about filters
  - name: Accounts
    description: Everything about accounts
  - name: Dashboards
    description: Everything about dashboards
  - name: Resource Explorer
    description: Everything about Resource Explorer
  - name: Widgets
    description: Everything about widgets
  - name: Categories
    description: Everything about categories
  - name: Custom Data
    description: Everything about custom data sources
  - name: Savings Opportunities
    description: Everything about savings opportunities
  - name: Budgets
    description: Everything about budgets
servers:
  - url: 'https://api.cloudchipr.com'
paths:
  /billing-explorer:
    post:
      summary: Get billing data aggregation
      description: Retrieves billing data for an organisation with various filtering and grouping options
      operationId: billingDataByOrganisation
      tags:
        - Resource Explorer
      security:
        - ApiKey: [ ]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BillingDataRequest'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillingAggregateResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /savings-opportunities:
    post:
      summary: Filter savings opportunities
      description: Returns savings opportunities for the organisation associated with the API key, filtered by the provided filter tree.
      operationId: filterSavingsOpportunities
      tags:
        - Savings Opportunities
      security:
        - ApiKey: [ ]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SavingsOpportunityFilteredRequest'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SavingsOpportunityResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /budgets:
    get:
      summary: List budgets
      description: Returns every budget of the organisation associated with the API key, including the current amount, actual spend to date, forecast, thresholds and scope (filter tree or view).
      operationId: listBudgets
      tags:
        - Budgets
      security:
        - ApiKey: [ ]
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Budget'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  '/budgets/{budgetId}':
    get:
      summary: Get a budget
      description: Returns a single budget of the organisation associated with the API key.
      operationId: getBudget
      tags:
        - Budgets
      security:
        - ApiKey: [ ]
      parameters:
        - name: budgetId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Budget'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
  '/budgets/{budgetId}/history':
    get:
      summary: Get budget history per period
      description: >-
        Returns one entry per budget period (month, quarter, day or year depending on the budget's period)
        with the budget amount that was in force during that period, the period's actual spend, and — for the
        period still in flight — the current forecast. Closed periods have a null forecast because no
        end-of-period snapshot exists for them. Amount history is recorded from the moment this feature
        shipped; periods before the first recorded change report the amount known at that time.
      operationId: getBudgetHistory
      tags:
        - Budgets
      security:
        - ApiKey: [ ]
      parameters:
        - name: budgetId
          in: path
          required: true
          schema:
            type: string
            format: uuid
        - $ref: '#/components/parameters/QueryDateFrom'
        - $ref: '#/components/parameters/QueryDateTo'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BudgetHistoryEntry'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /data-sources:
    post:
      summary: Creates a data source destination.
      description: Creates a data source destination.
      operationId: createDataSource
      tags:
        - Custom Data
      security:
        - ApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDataSourceRequest'
      responses:
        '201':
          description: Data source created. Use ingest_url to send data to this destination.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateDataSourceResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
  /telemetry:
    get:
      summary: List telemetries
      operationId: listTelemetries
      tags:
        - Custom Data
      security:
        - ApiKey: []
      responses:
        '200':
          description: List of telemetry destinations
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Telemetry'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
  /custom-sources:
    get:
      summary: List custom sources
      operationId: listCustomSources
      tags:
        - Custom Data
      security:
        - ApiKey: []
      responses:
        '200':
          description: List of custom sources
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/CustomSource'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
  /resources/lookup:
    get:
      summary: Get a resource by its identifier
      description: >-
        Returns the full data of a single live resource — its details, prices, account, creation metadata
        and the complete cloud tag list (including any creator/owner tag the organisation uses). The
        resource is identified by its provider identifier (e.g. an EC2 instance id or an ARN); when the
        owning account is not given, every connected cloud account of the organisation is searched.
        The response shape varies by resource type; the fields listed in the schema are common to all types.
      operationId: lookupResource
      tags:
        - Resources
      security:
        - ApiKey: [ ]
      parameters:
        - name: resource_id
          in: query
          required: true
          schema:
            type: string
          description: The provider identifier of the resource (instance id, ARN, resource name, ...)
        - name: resource_type
          in: query
          required: false
          schema:
            type: string
          description: Optional resource type (e.g. EC2, EBS, RDS) to speed up the lookup
        - name: account_id
          in: query
          required: false
          schema:
            type: string
            format: uuid
          description: Optional CloudChipr account id when the owning account is known
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceDetails'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /dimensions:
    get:
      summary: List dimensions with their categories
      description: Returns every dimension of the organisation associated with the API key, each with its categories. A category's filter describes the scope it covers and can be matched against a budget's filter tree or used to attribute costs to a team.
      operationId: listDimensions
      tags:
        - Categories
      security:
        - ApiKey: [ ]
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Dimension'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /dimensions/category-structure:
    put:
      summary: Update category structure for an organisation
      description: Updates the entire category structure for the specified organisation, including dimensions, categories, and shared costs
      operationId: updateCategoryStructure
      tags:
        - Categories
      security:
        - ApiKey: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCategoryStructureRequest'
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DimensionWithCategoriesResponse'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
  '/accounts/{accountId}/resources':
    post:
      summary: Get resources matched with provided filters
      description: Get resources matched with provided filters
      tags:
        - Resources
      security:
        - ApiKey: []
      parameters:
        - name: accountId
          required: true
          in: path
          description: The id of account which resources will be fetched
          schema:
            type: string
            format: UUID
      requestBody:
        $ref: '#/components/requestBodies/GetResourcesWithFilters'
      responses:
        '200':
          description: Json object of resources that matched with filters
          content:
            application/json:
              schema:
                type: object
                properties:
                  ebs:
                    description: List of elastic block stores
                    nullable: false
                    type: array
                    items:
                      $ref: '#/components/schemas/Ebs'
                  ec2:
                    description: List of AWS ec2 instances
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Ec2'
                  rds:
                    description: List of AWS rds instances
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Rds'
                  eip:
                    description: List of AWS eip addresses
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Eip'
                  elc:
                    description: List of AWS elasticache resources
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Elc'
                  elb:
                    description: List of AWS load balancers
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Elb'
                  vm:
                    description: List of GCP virtual machines
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Vm'
                  disk:
                    description: List of GCP disks
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Disk'
                  sql:
                    description: List of GCP sql instances
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Sql'
                  ip:
                    description: List of GCP Ip addresses
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Ip'
                  lb:
                    description: List of GCP load balancers
                    type: array
                    nullable: false
                    items:
                      $ref: '#/components/schemas/Lb'
                required:
                  - ebs
                  - ec2
                  - rds
                  - eip
                  - elb
                  - elc
                  - disk
                  - sql
                  - vm
                  - ip
                  - lb
              examples:
                FilteredResourcesResponse:
                  $ref: '#/components/examples/FilteredResourcesResponseExample'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
      operationId: get-resources
  '/providers/{provider}/filters':
    get:
      summary: Get Filters
      tags:
        - Filters
      security:
        - ApiKey: []
      parameters:
        - name: provider
          required: true
          in: path
          description: Cloud provider
          schema:
            $ref: '#/components/schemas/ProviderType'
      responses:
        '200':
          $ref: '#/components/responses/Filters'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
      operationId: get-filters
      description: Get filters
    parameters:
      - schema:
          type: string
          enum:
            - aws
            - gcp
        name: provider
        in: path
        required: true
  '/accounts/{accountId}':
    parameters:
      - schema:
          type: string
          format: uuid
          example: 00018acc-a66f-4747-9670-fadc3a2ead87
        name: accountId
        in: path
        required: true
    get:
      summary: Get account by id
      tags:
        - Accounts
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Account'
              examples:
                Example 1:
                  value:
                    id: 497f6eca-6276-4993-bfeb-53cbbbba6f08
                    type: aws
                    access_type: read_write
                    provider_account_id: '389986441234'
                    provider_account_name: string
                    provider_details:
                      aws:
                        is_root: false
                        organisation_id: c-xtzel6z9g1
                    is_sub_account: false
                    status: connected
                    created_at: '2019-08-24T14:15:22Z'
                    outdated: false
                    last_resource_updated_date: '2019-08-24T14:15:22Z'
                    estimated_monthly_savings: 0
                    total_monthly_saved_costs: 10
                    total_costs: 9.15
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
      operationId: get-accounts-accountId
      description: Get account by id
      security:
        - ApiKey: []
  /accounts:
    get:
      summary: Get accounts
      tags:
        - Accounts
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Account'
              examples:
                Example 1:
                  value:
                    - id: 497f6eca-6276-4993-bfeb-53cbbbba6f08
                      type: aws
                      access_type: read_write
                      provider_account_id: '389986441234'
                      provider_account_name: string
                      provider_details:
                        aws:
                          is_root: false
                          organisation_id: c-xtzel6z9g1
                      is_sub_account: false
                      status: connected
                      created_at: '2019-08-24T14:15:22Z'
                      outdated: false
                      last_resource_updated_date: '2019-08-24T14:15:22Z'
                      estimated_monthly_savings: 0
                      total_monthly_saved_costs: 10
                      total_costs: 9.15
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
      operationId: get-accounts
      description: Get accounts
      security:
        - ApiKey: []
      parameters:
        - schema:
            type: string
            example: 'connected,deactivated'
          in: query
          name: statuses
        - schema:
            type: string
            enum:
              - aws
              - gcp
            example: aws
          in: query
          name: provider
        - schema:
            type: string
            enum:
              - read
              - read_write
            example: read_write
          in: query
          name: access_type
  '/providers/{provider}/regions':
    get:
      summary: Get regions
      tags:
        - Regions
      parameters:
        - name: provider
          required: true
          in: path
          description: Cloud provider
          schema:
            $ref: '#/components/schemas/ProviderType'
      security:
        - ApiKey: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Regions'
              examples:
                AWSRegions:
                  value:
                    - name: US West (N. California)
                      key: us-west-1
                    - name: US East (N. Virginia)
                      key: us-east-1
                GCPRegions:
                  value:
                    - name: asia-east1 (Taiwan)
                      key: asia-east1
                    - name: asia-east2 (Hong Kong)
                      key: asia-east2
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
      operationId: get-regions
      description: Get regions
    parameters:
      - schema:
          type: string
          enum:
            - aws
            - gcp
            - azure
        name: provider
        in: path
        required: true
  '/dashboards/{dashboardId}':
    parameters:
      - schema:
          type: string
          format: uuid
          example: 00018acc-a66f-4747-9670-fadc3a2ead87
        name: dashboardId
        in: path
        required: true
    get:
      summary: Get dashboard by id
      tags:
        - Dashboards
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/responses/DashboardDetails'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      operationId: get-dashboard-dashboardId
      description: Get dashboard by id
      security:
        - ApiKey: [ ]
  /widgets/largest-cost-changes/{widgetId}:
    parameters:
      - $ref: '#/components/parameters/PathWidgetId'
      - $ref: '#/components/parameters/QueryCategoryId'
      - $ref: '#/components/parameters/QueryDateLabel'
      - $ref: '#/components/parameters/QueryDateFrom'
      - $ref: '#/components/parameters/QueryDateTo'
      - $ref: '#/components/parameters/QueryDateType'
      - $ref: '#/components/parameters/QueryDateValue'
      - $ref: '#/components/parameters/QueryDateUnit'
    get:
      summary: GET largest cost changes widget
      tags:
        - Widgets
      responses:
        '200':
          $ref: '#/components/responses/LargestCostChangesWidgetResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
      operationId: get-users-me-organisations-current-widgets-largest-cost-changes
      security:
        - ApiKey: [ ]
      description: GET largest cost changes widget
  /widgets/cost-and-usage-summary/{widgetId}:
    parameters:
      - $ref: '#/components/parameters/PathWidgetId'
      - $ref: '#/components/parameters/QueryCategoryId'
      - $ref: '#/components/parameters/QueryDateLabel'
      - $ref: '#/components/parameters/QueryDateFrom'
      - $ref: '#/components/parameters/QueryDateTo'
      - $ref: '#/components/parameters/QueryDateType'
      - $ref: '#/components/parameters/QueryDateValue'
      - $ref: '#/components/parameters/QueryDateUnit'
    get:
      summary: GET cost and usage summary widget
      tags:
        - Widgets
      responses:
        '200':
          $ref: '#/components/responses/CostAndUsageSummaryWidgetResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
      operationId: get-widgets-cost-and-usage-summary
      security:
        - ApiKey: [ ]
      description: GET cost and usage summary widget
  /widgets/cost-breakdown/{widgetId}:
    parameters:
      - $ref: '#/components/parameters/PathWidgetId'
      - $ref: '#/components/parameters/QueryCategoryId'
      - $ref: '#/components/parameters/QueryDateLabel'
      - $ref: '#/components/parameters/QueryDateFrom'
      - $ref: '#/components/parameters/QueryDateTo'
      - $ref: '#/components/parameters/QueryDateType'
      - $ref: '#/components/parameters/QueryDateValue'
      - $ref: '#/components/parameters/QueryDateUnit'
    get:
      summary: GET cost breakdown widget
      tags:
        - Widgets
      responses:
        '200':
          $ref: '#/components/responses/CostBreakdownWidgetResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '405':
          $ref: '#/components/responses/MethodNotAllowed'
      operationId: get-users-me-organisations-current-widgets-cost-breakdown
      security:
        - ApiKey: [ ]
      description: GET cost breakdown widget
  /resource-explorer/possible-groupings:
    get:
      summary: Get resource explorer possible groupings
      tags:
        - Resource Explorer
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceExplorerPossibleGroupings'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
      operationId: get-resource-explorer-possible-groupings
      description: Get resource explorer possible groupings
      security:
        - ApiKey: [ ]
  '/billing-explorer/reports/{reportId}':
    get:
      summary: Get billing report data by id
      description: Retrieves billing aggregation data for a saved billing explorer report using its id.
      operationId: get-billing-explorer-report-billing-data
      tags:
        - Resource Explorer
      security:
        - ApiKey: [ ]
      parameters:
        - name: reportId
          in: path
          required: true
          description: Billing explorer report id
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BillingAggregateResponse'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /resource-explorer/possible-filters:
    get:
      summary: Get resource explorer possible filters
      description: Returns the list of available filter types per provider
      operationId: get-resource-explorer-possible-filters
      tags:
        - Resource Explorer
      security:
        - ApiKey: [ ]
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  '/resource-explorer/filters/{filterProvider}/{filterType}/values':
    get:
      summary: Get filter values for a specific filter type
      description: Returns possible values for a specific filter provider and filter type
      operationId: get-resource-explorer-filter-values
      tags:
        - Resource Explorer
      security:
        - ApiKey: [ ]
      parameters:
        - name: filterProvider
          in: path
          required: true
          description: The cloud provider for the filter (e.g. aws, gcp, azure)
          schema:
            type: string
        - name: filterType
          in: path
          required: true
          description: The filter type to retrieve values for
          schema:
            type: string
        - name: key
          in: query
          required: false
          description: Optional key to further narrow the filter values
          schema:
            type: string
      responses:
        '200':
          description: Successful operation
          content:
            application/json:
              schema:
                type: object
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /billing-explorer/validate:
    post:
      summary: Validate billing explorer request
      description: Validates a billing explorer request body without executing the query. Returns 204 No Content on success.
      operationId: validate-billing-explorer
      tags:
        - Resource Explorer
      security:
        - ApiKey: [ ]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BillingDataRequest'
      responses:
        '204':
          description: Validation successful, no content returned
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '500':
          $ref: '#/components/responses/InternalServerError'
  /ingest/{destinationId}:
    post:
      summary: Ingest custom data
      description: Ingests newline-delimited JSON (NDJSON) payload to a destination.
      operationId: ingestCustomData
      tags:
        - Custom Data
      security:
        - ApiKey: []
      parameters:
        - name: destinationId
          in: path
          required: true
          description: Destination identifier (Telemetry or Custom Source Id)
          schema:
            type: string
            format: uuid
        - name: Idempotency-Key
          in: header
          required: true
          description: Idempotency key to ensure request is processed only once
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/x-ndjson:
            schema:
              type: string
            examples:
              ndjsonWithDate:
                summary: NDJSON lines with date-only field
                description: Each line is a JSON object. The "date" field must be a date in yyyy-MM-dd format.
                value: |-
                  {"deviceId":"1b2e5e34-2c3a-4a5f-9c1a-2d3e4f5a6b7c","metric":"cpu_usage","value":73.4,"date":"2026-02-16"}
                  {"deviceId":"1b2e5e34-2c3a-4a5f-9c1a-2d3e4f5a6b7c","metric":"memory_usage","value":58.1,"date":"2026-02-16"}
      responses:
        '200':
          description: Ingestion result
          content:
            application/json:
              schema:
                type: object
                properties:
                  processed_rows:
                    type: integer
                required:
                  - processed_rows
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                oneOf:
                  - type: object
                    properties:
                      errors:
                        type: array
                        items:
                          oneOf:
                            - type: object
                              description: Invalid JSON
                              properties:
                                code:
                                  $ref: '#/components/schemas/ErrorCode'
                              required:
                                - code
                            - type: object
                              description: Mandatory field missing
                              properties:
                                column:
                                  type: string
                                code:
                                  $ref: '#/components/schemas/ErrorCode'
                              required:
                                - code
                                - column
                            - type: object
                              description: Invalid column format
                              properties:
                              

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