openapi: 3.0.0
info:
  title: Cube Core Data REST (JSON) API
  version: 1.0.0
  description: |-
    Deliver data from Cube over HTTP. Run queries with `POST /v1/load` and
    retrieve the data model with `GET /v1/meta`. The `{base_path}` segment
    (`/cubejs-api` by default) is configurable.
servers:
  - url: https://{deployment}.{region}.cubecloudapp.dev/cubejs-api
    description: >-
      Cube Cloud deployment REST API. The host includes your deployment slug and
      region; copy the exact URL from your deployment's API settings. The
      /cubejs-api base path is configurable.
    variables:
      deployment:
        default: your-deployment
        description: Your Cube Cloud deployment slug
      region:
        default: aws-us-east-1
        description: >-
          Cloud region of your deployment, e.g. aws-us-east-1, aws-eu-central-1,
          gcp-us-central1
  - url: http://localhost:4000/cubejs-api
    description: Self-hosted Cube (default port and base path).
security:
  - apiToken: []
tags:
  - name: Data
paths:
  /v1/load:
    post:
      summary: JSON query
      operationId: loadV1
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/V1LoadRequest'
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1LoadResponse'
        4XX:
          description: Request could not be completed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1Error'
        5XX:
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1Error'
      tags:
        - Data
      security:
        - apiToken: []
  /v1/cubesql:
    post:
      operationId: cubesqlV1
      summary: SQL query
      description: >-
        Run a SQL query against the Cube [SQL
        API](/reference/core-data-apis/sql-api) and stream the results. The
        response is newline-delimited JSON: the first line carries the `schema`
        (column names and types) and optionally `lastRefreshTime`; each
        subsequent line carries a `data` chunk with one or more result rows.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - query
              properties:
                query:
                  type: string
                  description: The SQL query to run.
                timezone:
                  type: string
                  description: >-
                    Time zone for the query in TZ database name format, e.g.
                    America/Los_Angeles.
                cache:
                  type: string
                  enum:
                    - stale-if-slow
                    - stale-while-revalidate
                    - must-revalidate
                    - no-cache
                  default: stale-if-slow
                  description: >-
                    In-memory cache strategy (see [Cache
                    control](/reference/core-data-apis/rest-api#cache-control)):


                    - `stale-if-slow` (default): if refresh keys are up to date,
                    return the cached value; if expired, fetch fresh data but
                    fall back to the stale value when the source query is slow.

                    - `stale-while-revalidate`: if expired, return stale data
                    immediately and refresh the cache in the background.

                    - `must-revalidate`: if expired, always wait for fresh data
                    from the source, even if slow.

                    - `no-cache`: skip refresh-key checks and always query the
                    data source.
      responses:
        '200':
          description: >-
            Newline-delimited JSON stream. The first line carries `schema` (and
            optionally `lastRefreshTime`); subsequent lines carry `data` chunks.
          content:
            application/json:
              schema:
                type: object
                properties:
                  schema:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                        column_type:
                          type: string
                  lastRefreshTime:
                    type: string
                    format: date-time
                  data:
                    type: array
                    items:
                      type: array
                      items: {}
              examples:
                schemaLine:
                  summary: First line (schema)
                  value:
                    schema:
                      - name: value
                        column_type: Int64
                    lastRefreshTime: '2025-01-13T12:00:00.000Z'
                dataLine:
                  summary: Data chunk
                  value:
                    data:
                      - - '123'
      tags:
        - Data
      security:
        - apiToken: []
  /v1/meta:
    get:
      summary: Load Metadata
      description: ''
      operationId: metaV1
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1MetaResponse'
        4XX:
          description: Request could not be completed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1Error'
        5XX:
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/V1Error'
      tags:
        - Data
      security:
        - apiToken: []
components:
  securitySchemes:
    apiToken:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Cube API token (a JWT). Sent directly in the Authorization header, e.g.
        `Authorization: <CUBE_API_TOKEN>` (no "Bearer" prefix).
  schemas:
    V1CubeMeta:
      type: object
      required:
        - name
        - type
        - measures
        - dimensions
        - segments
      properties:
        name:
          type: string
        title:
          type: string
        type:
          $ref: '#/components/schemas/V1CubeMetaType'
        meta:
          type: object
        description:
          type: string
        measures:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaMeasure'
        dimensions:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaDimension'
        segments:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaSegment'
        joins:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaJoin'
        folders:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaFolder'
        nestedFolders:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaNestedFolder'
        hierarchies:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaHierarchy'
    V1CubeMetaCustomNumericFormat:
      type: object
      description: Custom numeric format for numeric measures and dimensions
      properties:
        type:
          type: string
          enum:
            - custom-numeric
          description: Type of the format (must be 'custom-numeric')
        value:
          type: string
          description: >-
            d3-format specifier string (e.g., '.2f', ',.0f', '$,.2f', '.0%',
            '.2s'). See https://d3js.org/d3-format
        alias:
          type: string
          description: >-
            Name of the predefined format (e.g., 'percent_2', 'currency_1').
            Present only when a named format was used.
      required:
        - type
        - value
    V1CubeMetaCustomTimeFormat:
      type: object
      description: Custom time format for time dimensions
      properties:
        type:
          type: string
          enum:
            - custom-time
          description: Type of the format (must be 'custom-time')
        value:
          type: string
          description: >-
            POSIX strftime format string (IEEE Std 1003.1 / POSIX.1) with
            d3-time-format extensions (e.g., '%Y-%m-%d', '%d/%m/%Y %H:%M:%S').
            See
            https://pubs.opengroup.org/onlinepubs/009695399/functions/strptime.html
            and https://d3js.org/d3-time-format
      required:
        - type
        - value
    V1CubeMetaDimension:
      type: object
      required:
        - name
        - type
      properties:
        name:
          type: string
        title:
          type: string
        shortTitle:
          type: string
        description:
          type: string
        type:
          type: string
        aliasMember:
          description: >-
            When dimension is defined in View, it keeps the original path:
            Cube.dimension
          type: string
        granularities:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMetaDimensionGranularity'
        meta:
          type: object
        format:
          $ref: '#/components/schemas/V1CubeMetaFormat'
        formatDescription:
          $ref: '#/components/schemas/V1CubeMetaFormatDescription'
        currency:
          type: string
          description: ISO 4217 currency code in uppercase (3 characters, e.g. USD, EUR)
        order:
          $ref: '#/components/schemas/V1CubeMetaDimensionOrder'
        key:
          type: string
          description: Key reference for the dimension
    V1CubeMetaDimensionGranularity:
      type: object
      required:
        - name
        - title
      properties:
        name:
          type: string
        title:
          type: string
        interval:
          type: string
        sql:
          type: string
        offset:
          type: string
        origin:
          type: string
    V1CubeMetaDimensionOrder:
      type: string
      enum:
        - asc
        - desc
    V1CubeMetaFolder:
      type: object
      required:
        - name
        - members
      properties:
        name:
          type: string
        members:
          type: array
          items:
            type: string
    V1CubeMetaFormat:
      oneOf:
        - $ref: '#/components/schemas/V1CubeMetaSimpleFormat'
        - $ref: '#/components/schemas/V1CubeMetaLinkFormat'
        - $ref: '#/components/schemas/V1CubeMetaCustomTimeFormat'
        - $ref: '#/components/schemas/V1CubeMetaCustomNumericFormat'
      description: >-
        Format of measure or dimension - can be a simple string format, a link
        configuration, a custom time format, or a custom numeric format
    V1CubeMetaFormatDescription:
      type: object
      description: >-
        Resolved format description with the predefined name and d3-format
        specifier
      required:
        - name
        - specifier
      properties:
        name:
          type: string
          description: >-
            Predefined format name (e.g., 'percent_2', 'currency_1') or a base
            name like 'number', or 'custom' for ad-hoc specifiers
        specifier:
          type: string
          description: >-
            d3-format specifier string (e.g., '.2f', ',.0f', '$,.2f'). See
            https://d3js.org/d3-format
        currency:
          type: string
          description: >-
            ISO 4217 currency code in uppercase (e.g. USD, EUR). Present when a
            currency format is used.
    V1CubeMetaHierarchy:
      type: object
      required:
        - name
        - levels
      properties:
        name:
          type: string
        aliasMember:
          description: >-
            When hierarchy is defined in Cube, it keeps the original path:
            Cube.hierarchy
          type: string
        title:
          type: string
        levels:
          type: array
          items:
            type: string
    V1CubeMetaJoin:
      type: object
      required:
        - name
        - relationship
      properties:
        name:
          type: string
        relationship:
          type: string
    V1CubeMetaLinkFormat:
      type: object
      description: Link format with label and type
      properties:
        label:
          type: string
          description: Label for the link
        type:
          type: string
          enum:
            - link
          description: Type of the format (must be 'link')
      required:
        - label
        - type
    V1CubeMetaMeasure:
      type: object
      required:
        - name
        - type
      properties:
        name:
          type: string
        title:
          type: string
        shortTitle:
          type: string
        description:
          type: string
        type:
          type: string
        aggType:
          type: string
        meta:
          type: object
        format:
          $ref: '#/components/schemas/V1CubeMetaFormat'
        formatDescription:
          $ref: '#/components/schemas/V1CubeMetaFormatDescription'
        currency:
          type: string
          description: ISO 4217 currency code in uppercase (3 characters, e.g. USD, EUR)
        aliasMember:
          description: >-
            When measure is defined in View, it keeps the original path:
            Cube.measure
          type: string
    V1CubeMetaNestedFolder:
      type: object
      required:
        - name
        - members
      properties:
        name:
          type: string
        members:
          type: array
          items:
            type: string
            oneOf:
              - type: string
              - $ref: '#/components/schemas/V1CubeMetaNestedFolder'
    V1CubeMetaSegment:
      type: object
      required:
        - name
        - title
        - shortTitle
      properties:
        name:
          type: string
        title:
          type: string
        description:
          type: string
        shortTitle:
          type: string
        meta:
          type: object
    V1CubeMetaSimpleFormat:
      type: string
      description: Simple format
      enum:
        - percent
        - currency
        - number
        - imageUrl
        - id
        - link
    V1CubeMetaType:
      type: string
      description: Type of cube
      enum:
        - cube
        - view
    V1Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
    V1LoadRequest:
      type: object
      properties:
        queryType:
          type: string
        cache:
          type: string
          enum:
            - stale-if-slow
            - stale-while-revalidate
            - must-revalidate
            - no-cache
        query:
          type: object
          $ref: '#/components/schemas/V1LoadRequestQuery'
    V1LoadRequestJoinHint:
      type: array
      items:
        type: string
    V1LoadRequestQuery:
      type: object
      properties:
        measures:
          type: array
          items:
            type: string
        dimensions:
          type: array
          items:
            type: string
        segments:
          type: array
          items:
            type: string
        timeDimensions:
          type: array
          items:
            $ref: '#/components/schemas/V1LoadRequestQueryTimeDimension'
        order:
          type: array
          items:
            type: array
            items:
              type: string
        limit:
          type: integer
          format: int32
        offset:
          type: integer
          format: int32
        filters:
          type: array
          items:
            $ref: '#/components/schemas/V1LoadRequestQueryFilterItem'
        ungrouped:
          type: boolean
        subqueryJoins:
          type: array
          items:
            $ref: '#/components/schemas/V1LoadRequestQueryJoinSubquery'
        joinHints:
          type: array
          items:
            $ref: '#/components/schemas/V1LoadRequestJoinHint'
        timezone:
          type: string
        responseFormat:
          type: string
          description: >-
            Output format of the result `data` payload. `default` returns
            row-oriented data (`V1LoadResultDataRow`); `compact` returns a `{
            members, dataset }` object with rows of primitive arrays
            (`V1LoadResultDataCompact`); `columnar` returns a `{ members,
            columns }` object with one primitive array per member
            (`V1LoadResultDataColumnar`).
          enum:
            - default
            - compact
            - columnar
    V1LoadRequestQueryFilterBase:
      type: object
      properties:
        member:
          type: string
        operator:
          type: string
        values:
          type: array
          items:
            type: string
    V1LoadRequestQueryFilterItem:
      oneOf:
        - $ref: '#/components/schemas/V1LoadRequestQueryFilterBase'
        - $ref: '#/components/schemas/V1LoadRequestQueryFilterLogicalOr'
        - $ref: '#/components/schemas/V1LoadRequestQueryFilterLogicalAnd'
    V1LoadRequestQueryFilterLogicalAnd:
      type: object
      properties:
        and:
          type: array
          items:
            type: object
    V1LoadRequestQueryFilterLogicalOr:
      type: object
      properties:
        or:
          type: array
          items:
            type: object
    V1LoadRequestQueryJoinSubquery:
      type: object
      properties:
        sql:
          type: string
        'on':
          type: string
        joinType:
          type: string
        alias:
          type: string
      required:
        - sql
        - 'on'
        - joinType
        - alias
    V1LoadRequestQueryTimeDimension:
      type: object
      required:
        - dimension
      properties:
        dimension:
          type: string
        granularity:
          type: string
        dateRange:
          type: object
    V1LoadResponse:
      type: object
      required:
        - results
      properties:
        pivotQuery:
          type: object
        slowQuery:
          type: boolean
        queryType:
          type: string
        results:
          type: array
          items:
            $ref: '#/components/schemas/V1LoadResult'
    V1LoadResult:
      type: object
      required:
        - annotation
        - data
      properties:
        dataSource:
          type: string
        annotation:
          $ref: '#/components/schemas/V1LoadResultAnnotation'
        data:
          $ref: '#/components/schemas/V1LoadResultData'
        refreshKeyValues:
          type: array
          items:
            type: object
        lastRefreshTime:
          type: string
    V1LoadResultAnnotation:
      type: object
      required:
        - measures
        - dimensions
        - segments
        - timeDimensions
      properties:
        measures:
          type: object
        dimensions:
          type: object
        segments:
          type: object
        timeDimensions:
          type: object
    V1LoadResultData:
      description: >-
        Result `data` payload. Either an array of objects keyed by member name
        (default); a compact `{ members, dataset }` object when
        `responseFormat=compact`; or a columnar `{ members, columns }` object
        when `responseFormat=columnar`.
      oneOf:
        - $ref: '#/components/schemas/V1LoadResultDataRow'
        - $ref: '#/components/schemas/V1LoadResultDataCompact'
        - $ref: '#/components/schemas/V1LoadResultDataColumnar'
    V1LoadResultDataColumnar:
      type: object
      description: >-
        Columnar data format - members list paired with one primitive array per
        column. Returned when `responseFormat=columnar` is requested.
      required:
        - members
        - columns
      properties:
        members:
          type: array
          description: >-
            Ordered list of member names. Element `i` of `columns` holds the
            values for `members[i]` across all rows.
          items:
            type: string
        columns:
          type: array
          description: >-
            One array per member, in the same order as `members`. Each inner
            array contains the primitive value of that member for every row
            (null, boolean, number, string).
          items:
            type: array
            items: {}
    V1LoadResultDataCompact:
      type: object
      description: >-
        Compact data format - a single object with the members list and a
        dataset of primitive arrays. Returned when `responseFormat=compact` is
        requested.
      required:
        - members
        - dataset
      properties:
        members:
          type: array
          description: >-
            Ordered list of member names that correspond to each cell position
            in `dataset` rows.
          items:
            type: string
        dataset:
          type: array
          description: >-
            Array of rows, where each row is an array of primitive values (null,
            boolean, number, string) aligned with `members`.
          items:
            type: array
            items: {}
    V1LoadResultDataRow:
      type: array
      description: >-
        Row-oriented (default) data format - an array of rows, each row is an
        object keyed by member name.
      items:
        type: object
    V1MetaResponse:
      type: object
      properties:
        cubes:
          type: array
          items:
            $ref: '#/components/schemas/V1CubeMeta'
        compilerId:
          type: string
