openapi: 3.1.0 info: title: Cube Platform API version: 1.0.0 description: |- Programmatically manage Cube: deployments and everything scoped to them (environments, folders, reports, workbooks, notifications, workspace, and agents), plus account-level users, groups, policies, embedding, and AI settings. Data-model authoring, dev mode, branches, and uploads live under /build/api/v1 — same host and token, routed to the build pods. servers: - url: https://{tenant}.cubecloud.dev description: Your tenant host. Replace the whole host if you use a custom domain. variables: tenant: default: your-tenant description: Your Cube tenant subdomain security: - bearerAuth: [] tags: - name: Deployments - name: Deployment Creation - name: Environments - name: Env Variables - name: Regions - name: Data Model - name: Data Model Uploads - name: GitHub - name: GitHub Connection - name: dbt Sync - name: Databricks Metric View Publication - name: Databricks Metric View Integration - name: Snowflake Semantic View Sync - name: Folders - name: Reports - name: External Documents - name: Workbooks - name: Workbook Promotions - name: Dashboard Exports - name: Notifications - name: Scheduled Tasks - name: Workspace - name: Agents - name: Users - name: Users Admin - name: API Keys - name: Roles - name: User Attributes - name: User Attribute Values - name: Tenant Settings - name: OAuth Integrations - name: User OAuth Tokens - name: OIDC Token Configs - name: App Theme - name: Embed - name: Embed Tenants - name: Dashboard Embed Access - name: Usage Analytics - name: OpenAPI Spec - name: Chat History - name: Ossie Conversion - name: Report Deliveries paths: /api/v1/api-keys: get: operationId: listApiKeys parameters: - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ApiKeysListResponse' description: '' summary: List API keys tags: - API Keys post: operationId: createApiKey requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateApiKeyInput' description: CreateApiKeyInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/ApiKeyCreatedResponse' description: '' summary: Create API key tags: - API Keys /api/v1/api-keys/{id}: delete: operationId: deleteApiKey parameters: - in: path name: id required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete API key tags: - API Keys get: operationId: getApiKey parameters: - in: path name: id required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/ApiKeyResponse' description: '' summary: Get API key tags: - API Keys /api/v1/app-config: get: operationId: getAppConfig responses: '200': content: application/json: schema: $ref: '#/components/schemas/AppConfigResponse' description: '' summary: Get app config tags: - App Theme /api/v1/deployments: get: operationId: getDeployments parameters: - in: query name: creationStep required: false schema: oneOf: - items: enum: - project - upload - schema - github - ssh - databases - ready - demo type: string type: array $ref: '#/components/schemas/CreationStep' - type: array items: $ref: '#/components/schemas/CreationStep' - in: query name: offset required: false schema: oneOf: - minimum: 0 type: integer - type: 'null' type: integer minimum: 0 - in: query name: limit required: false schema: oneOf: - minimum: 0 type: integer - type: 'null' type: integer minimum: 0 - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentsListResponse' description: '' summary: Get deployments tags: - Deployments /api/v1/deployments/{deploymentId}: delete: operationId: deleteDeployment parameters: - in: path name: deploymentId required: true schema: type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentDeleteResponse' description: '' summary: Delete deployment tags: - Deployments get: operationId: getDeployment parameters: - in: path name: deploymentId required: true schema: type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/Deployment' description: '' summary: Get deployment tags: - Deployments put: operationId: updateDeployment parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateDeploymentInput' description: UpdateDeploymentInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentSettings' description: '' summary: Update a deployment tags: - Deployments x-mint: content: >- Update any subset of a deployment’s settings — everything the console’s Settings pages own — and read the full settings back. Fields you omit are left alone, and `templateVariables` is merged key-by-key rather than replaced, so setting one configuration flag never clears the others. `releaseChannelVersion` must be one of the versions `GET /:deploymentId/versions` lists for the target channel (in any of the forms it reports) — anything else is a 400, and the container image is resolved from the version rather than sent. Choosing a version that is not the channel’s latest also sets `releaseChannelVersionHold` unless you send it explicitly, so auto-upgrade does not undo the pin. /api/v1/deployments/{deploymentId}/agent-suggestions: get: operationId: getAgentSuggestions parameters: - in: path name: deploymentId required: true schema: type: number - in: query name: agent schema: oneOf: - type: string - type: 'null' - in: query name: branchName schema: oneOf: - type: string - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/AgentSuggestionsListResponse' description: '' summary: Get agent suggestions tags: - Agents /api/v1/deployments/{deploymentId}/build-status: get: operationId: buildStatus parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: branchName schema: oneOf: - type: string - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/BuildStatusResponse' description: '' summary: Latest build/compile status for a branch (production build or dev-mode) tags: - Deployments /api/v1/deployments/{deploymentId}/chat-history/threads: get: operationId: listChatHistoryThreads parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: createdAfter schema: description: Only threads whose `createdAt` is at or after this ISO 8601 date or date-time. oneOf: - pattern: ^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$ type: string - type: 'null' - in: query name: createdBefore schema: description: >- Only threads whose `createdAt` is at or before this ISO 8601 date-time. A date alone (`2026-10-01`) includes that whole day, UTC. oneOf: - pattern: ^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$ type: string - type: 'null' - in: query name: updatedAfter schema: description: >- Only threads whose `updatedAt` is at or after this ISO 8601 date or date-time. A thread is updated by every new turn, so this is the filter for incremental exports. oneOf: - pattern: ^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$ type: string - type: 'null' - in: query name: updatedBefore schema: description: >- Only threads whose `updatedAt` is at or before this ISO 8601 date-time. A date alone (`2026-10-01`) includes that whole day, UTC. oneOf: - pattern: ^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$ type: string - type: 'null' - in: query name: userId schema: description: Cube user ids. Repeat the parameter to match any of several values, up to 100. oneOf: - items: type: integer type: array maxItems: 100 - type: 'null' - in: query name: userEmail schema: description: >- User emails, matched case-insensitively against Cube users and against the email an embedded user signed in with. Repeat the parameter to match any of several values, up to 100. oneOf: - items: type: string type: array maxItems: 100 - type: 'null' - in: query name: externalUserId schema: description: >- External ids of embedded-analytics users, as your application passed them. Repeat the parameter to match any of several values, up to 100. oneOf: - items: type: string type: array maxItems: 100 - type: 'null' - in: query name: userType schema: description: >- `internal` for Cube users, `external` for embedded-analytics users. Combines with the user filters above, which match any of their values. oneOf: - $ref: '#/components/schemas/ChatHistoryThreadsQueryUserType' - type: 'null' - in: query name: source schema: description: >- Where the thread was started: `web` (the Cube app or embedded analytics), `api` (the Chat API), `mcp`, `slack` or `scheduled` (a scheduled task). Repeat the parameter to match any of several values, up to 100. oneOf: - items: type: string enum: - web - api - mcp - slack - scheduled type: array maxItems: 100 - type: 'null' - in: query name: initialContext schema: description: >- The surface inside the app the thread began on. Repeat the parameter to match any of several values, up to 100. oneOf: - items: type: string enum: - chat - workbook - model - dashboard - external - mcp - ai-widget - onboarding - explore - connection_setup - slack_dm - published-dashboard - sheets type: array maxItems: 100 - type: 'null' - in: query name: agentId schema: description: >- Agent ids; `-1` selects the Auto agent. Repeat the parameter to match any of several values, up to 100. oneOf: - items: type: integer type: array maxItems: 100 - type: 'null' - in: query name: search schema: description: Case-insensitive match on the thread title or its chat id. oneOf: - type: string - type: 'null' - in: query name: sortBy schema: description: Defaults to `updatedAt`. oneOf: - $ref: '#/components/schemas/ChatHistoryThreadsQuerySortBy' - type: 'null' - in: query name: sortOrder schema: description: Defaults to `desc`. oneOf: - $ref: '#/components/schemas/ChatHistoryThreadsQuerySortOrder' - type: 'null' - in: query name: includeTurns schema: description: >- Return every thread with its turns. Pages then default to 20 threads and hold at most 50. oneOf: - type: boolean - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/ChatHistoryThreadListResponse' description: '' summary: List chat threads tags: - Chat History x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Every user's AI chat threads in the deployment, most recently updated first, for analyzing how people use the agent. Filters combine with AND; a filter given several values matches any of them. Set `includeTurns=true` to get each thread's turns in the same response. A turn is one prompt and everything the agent did to answer it: the final answer, the tools it called, and each query it ran with its SQL, status, row count and any thumbs-up/down feedback. Query result rows are never included. A prompt, answer or SQL longer than 20,000 characters, or an error longer than 2,000, is cut and ends in `…`. A page holds up to 200 threads, or 50 with turns; a larger `first` is lowered to that. For an incremental export, keep the newest `updatedAt` you have seen and pass it as `updatedAfter` next time. Chat history export is in preview: when it is not enabled for the account, `404` is returned. /api/v1/deployments/{deploymentId}/chat-history/threads/{chatId}: get: operationId: getChatHistoryThread parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: chatId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/ChatHistoryThread' description: '' summary: Get a chat thread tags: - Chat History x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. One chat thread with all of its turns, oldest first. A turn is one prompt and everything the agent did to answer it: the final answer, the tools it called, and each query it ran with its SQL, status, row count and any thumbs-up/down feedback. Query result rows are never included. A prompt, answer or SQL longer than 20,000 characters, or an error longer than 2,000, is cut and ends in `…`. Chat history export is in preview: when it is not enabled for the account, `404` is returned. /api/v1/deployments/{deploymentId}/creation-step/advance: post: operationId: advanceCreationStep parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/AdvanceCreationStepInput' description: AdvanceCreationStepInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Deployment' description: '' summary: Advance a deployment to a given onboarding step (e.g. after connecting a source) tags: - Deployments /api/v1/deployments/{deploymentId}/creation-step/reset: post: operationId: resetCreationStep parameters: - in: path name: deploymentId required: true schema: type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/Deployment' description: '' summary: Reset a deployment to the first onboarding step (project) tags: - Deployments /api/v1/deployments/{deploymentId}/dashboard-exports: post: operationId: startExport parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the dashboard. requestBody: content: application/json: schema: $ref: '#/components/schemas/StartDashboardExportInput' description: StartDashboardExportInput required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/DashboardExportJobResponse' description: '' summary: Export a dashboard as PNG or PDF tags: - Dashboard Exports x-mint: content: >- Submit a render of a published dashboard. Identify it with either `dashboardId` (numeric) or `dashboardPublicId` (string) — supply exactly one; it must belong to this deployment, otherwise `404` is returned. Returns as soon as the job is accepted, because a render waits for every widget to finish querying. Poll `GET /dashboard-exports/{jobId}` until `status` is `completed`, then fetch the file from `GET /dashboard-exports/{jobId}/download`. The job and its file are dropped at `expiresAt` (5 minutes) — download before then or submit again. Pass `filters`, `timeGrains` and `memberSwitchers` to render the board with specific control values, exactly as a scheduled notification does; omit them to render its saved defaults. Pass `layout: print` with `format: pdf` for the paginated A4 document the dashboard's "Print version" menu item produces — one column, every table row, the filter state as a summary line — instead of the default `screenshot` of the board. `print` with `format: png` returns `400`. By default the dashboard renders under the calling user's own security context, so the file shows what that user would see. Requires **manage** access to the dashboard's workbook — the same permission the console's own "Download as PNG / PDF" actions require, because a whole-dashboard render is a bulk data export. To export on someone else's behalf, pass `renderAs`: the queries behind the image then run under that user's security context instead of yours. **Requires the caller to be a tenant administrator.** Name a console user by `userId` or `email` (`type: USER`), or an embed user by `embedTenantName` + `externalId` (`type: EMBED_USER`). A deactivated console user is not a valid subject and returns `404`; an email is matched case-insensitively. An embed subject is provisioned if it does not exist yet, and `groups`, `userAttributes` and `securityContext` apply to **this render only** — they are carried on the render's own session and are NOT written to the user's stored context, so exporting for someone never changes what their live embedded sessions see. (Use the embed-tenant users API to change a user's stored context.) An embed subject additionally requires the dashboard's workbook to be shared with that embed tenant, otherwise `403` is returned. Returns `403` when the workspace has data downloads restricted — including for an on-behalf-of export, which deliberately does **not** bypass that setting the way a built-in scheduled notification does — and `429` when there are already too many exports in flight for the identity being rendered as. /api/v1/deployments/{deploymentId}/dashboard-exports/{jobId}: get: operationId: getExportStatus parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the dashboard. - in: path name: jobId required: true schema: type: string description: Job id returned when the export was submitted. responses: '200': content: application/json: schema: $ref: '#/components/schemas/DashboardExportStatusResponse' description: '' summary: Get the status of a dashboard export tags: - Dashboard Exports x-mint: content: >- Progress of a submitted render. Poll until `status` is `completed` (then download it) or `failed` (then read `error`); `pending` and `processing` both mean keep waiting. Returns `404` once the job has expired, and for a job submitted by a different user — a job is only ever visible to whoever started it. /api/v1/deployments/{deploymentId}/dashboard-exports/{jobId}/download: get: operationId: downloadExport parameters: - in: path name: deploymentId required: true description: Numeric id of the deployment that owns the dashboard. schema: type: integer - in: path name: jobId required: true description: Job id returned when the export was submitted. schema: type: string - in: query name: filename required: false description: Filename stem for the attachment, without extension. Defaults to `dashboard`. schema: type: string responses: '200': content: application/pdf: schema: format: binary type: string image/png: schema: format: binary type: string description: The rendered dashboard. summary: Download a completed dashboard export tags: - Dashboard Exports x-mint: content: >- Stream the rendered file as an attachment, named `dashboard.png` / `dashboard.pdf` unless `?filename=` supplies a different stem (the extension always follows the rendered format). Returns `409` while the job is still rendering — poll `GET /dashboard-exports/{jobId}` first — `422` if the render failed (terminal: submit a new export rather than retrying this one), and `404` once the job has expired or if it belongs to a different user. /api/v1/deployments/{deploymentId}/databricks-metric-view-integrations/{dataSourceName}: get: operationId: getIntegration parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: dataSourceName required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewIntegrationResponse' description: '' summary: Get Databricks Metric View publication settings tags: - Databricks Metric View Integration x-mint: content: >- Requires a Databricks datasource. This is currently in preview — reach out to the Cube support team to activate it for your account. put: operationId: saveIntegration parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: dataSourceName required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/SaveDatabricksMetricViewIntegrationInput' description: SaveDatabricksMetricViewIntegrationInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewIntegrationResponse' description: '' summary: Create or update Databricks Metric View publication settings tags: - Databricks Metric View Integration x-mint: content: >- Uses optimistic configuration versioning. Pass `expectedConfigurationVersion` 0 to create. Requires a Databricks datasource. This is currently in preview — reach out to the Cube support team to activate it for your account. /api/v1/deployments/{deploymentId}/databricks-metric-view-integrations/{dataSourceName}/syncs: get: operationId: listSyncs parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: dataSourceName required: true schema: type: string - in: query name: status schema: oneOf: - $ref: '#/components/schemas/ListDatabricksMetricViewSyncsQueryStatus' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewSyncRunListResponse' description: '' summary: List Databricks Metric View publication runs tags: - Databricks Metric View Integration x-mint: content: >- Durable run history for this datasource, newest first. It remains available after a run finishes. Requires a Databricks datasource. This is currently in preview — reach out to the Cube support team to activate it for your account. post: operationId: startSync parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: dataSourceName required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/StartDatabricksMetricViewSyncInput' description: StartDatabricksMetricViewSyncInput required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewSyncStartResponse' description: '' summary: Start a Databricks Metric View publication run tags: - Databricks Metric View Integration x-mint: content: >- Converts the configured Cube views from the deployment's latest successful build and creates or replaces each one's managed Databricks Metric View. Views publish independently: one that is incompatible, fails Databricks validation, or whose destination belongs to another integration keeps its last good definition and does not stop the others, and a view whose definition is unchanged is skipped without a Databricks write. One run per integration at a time; a second start while one is active returns 409. Requires a Databricks datasource, enabled publication settings, and SchemaUpdate access. This is currently in preview — reach out to the Cube support team to activate it for your account. /api/v1/deployments/{deploymentId}/databricks-metric-view-integrations/{dataSourceName}/syncs/{runId}: delete: operationId: cancelSync parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: dataSourceName required: true schema: type: string - in: path name: runId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewSyncRunResponse' description: '' summary: Cancel a Databricks Metric View publication run tags: - Databricks Metric View Integration x-mint: content: >- Requests cancellation of an active run and returns its state. Metric Views already written in the run are not rolled back. Requires SchemaUpdate access. get: operationId: syncRun parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: dataSourceName required: true schema: type: string - in: path name: runId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewSyncRunResponse' description: '' summary: Get a Databricks Metric View publication run tags: - Databricks Metric View Integration x-mint: content: >- Returns the run with its per-view outcomes, plus live stage and published counts while it is still active. /api/v1/deployments/{deploymentId}/databricks-metric-view-previews: post: operationId: startPreview parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewInput' description: DatabricksMetricViewPublicationPreviewInput required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewStartResponse' description: '' summary: Start a Databricks Metric View publication preview tags: - Databricks Metric View Publication x-mint: content: >- Queues an offline conversion of static YAML from the deployment's latest successful build and returns polling URLs immediately. Exact retries while the same content-addressed preview is running reuse that work; a later submission starts a fresh execution. Preview payloads and results are retained for at most seven days. The conversion supports scalar dimensions, common and calculated measures, and acyclic many-to-one equi-joins from one Databricks datasource. Access policies, templating, extends, unsafe fanout, unsupported expressions, multiple datasources, and converter loss are blocked per view. Two-part schema.table sources are qualified with `CUBEJS_DB_DATABRICKS_CATALOG` for the selected datasource; without that setting they fail closed with an actionable issue. Requires `SchemaRead` or `SchemaUpdate` access. This is currently in preview — reach out to the Cube support team to activate it for your account. /api/v1/deployments/{deploymentId}/databricks-metric-view-previews/{previewId}: delete: operationId: cancelPreview parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: previewId required: true schema: type: string responses: '200': content: application/json: {} description: Successful response summary: Cancel a Databricks Metric View preview tags: - Databricks Metric View Publication get: operationId: previewStatus parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: previewId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewStatusResponse' description: '' summary: Get Databricks Metric View preview status tags: - Databricks Metric View Publication /api/v1/deployments/{deploymentId}/databricks-metric-view-previews/{previewId}/result: get: operationId: previewResult parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: previewId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewResultResponse' description: '' summary: Get a completed Databricks Metric View preview result tags: - Databricks Metric View Publication x-mint: content: Returns 409 while the preview is still running or if it ended without a conversion result. /api/v1/deployments/{deploymentId}/dbt-sync: get: operationId: listDbtSyncs parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: status schema: description: Return only runs with this status. oneOf: - $ref: '#/components/schemas/DbtSyncRunsQueryStatus' - type: 'null' - in: query name: trigger schema: description: Return only runs started this way. oneOf: - $ref: '#/components/schemas/DbtSyncRunsQueryTrigger' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DbtSyncRunListResponse' description: '' summary: List dbt syncs for a deployment tags: - dbt Sync post: operationId: startDbtSync parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/StartDbtSyncInput' description: StartDbtSyncInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DbtSyncResponse' description: '' summary: Start a dbt sync for a deployment tags: - dbt Sync /api/v1/deployments/{deploymentId}/dbt-sync/{syncJobId}: delete: operationId: cancelDbtSync parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DbtSyncCancelResponse' description: '' summary: Cancel a running dbt sync tags: - dbt Sync get: operationId: getDbtSyncStatus parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DbtSyncStatusResponse' description: '' summary: Get the status of a dbt sync tags: - dbt Sync /api/v1/deployments/{deploymentId}/dbt-sync/{syncJobId}/generated-files: get: operationId: getDbtSyncGeneratedFiles parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/DbtSyncGeneratedFilesListResponse' description: '' summary: Get the files generated by a dbt sync that did not commit them tags: - dbt Sync /api/v1/deployments/{deploymentId}/dbt-sync/{syncJobId}/logs: get: operationId: getDbtSyncLogs parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DbtSyncLogEntriesListResponse' description: '' summary: Get the log of a dbt sync tags: - dbt Sync /api/v1/deployments/{deploymentId}/dbt-sync/{syncJobId}/result: get: operationId: getDbtSyncResult parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/DbtSyncResultResponse' description: '' summary: Get the result of a completed dbt sync tags: - dbt Sync /api/v1/deployments/{deploymentId}/embed-tenants/{embedTenantName}/workbooks: get: operationId: listEmbedTenantWorkbooks parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: embedTenantName required: true schema: type: string - in: query name: accessSource schema: description: >- Filter workbooks by how access is granted: - `tenant`: the workbook itself is explicitly shared with the named embed tenant. Excludes workbooks available only through the all-embed-users group or a shared folder. - `allEmbedUsers`: the workbook itself is explicitly shared with the built-in all-embed-users group, making it available to every embed tenant. Excludes tenant-specific direct shares and folder-inherited access. - `folder`: access is inherited because the workbook is inside a shared folder or any of its descendant folders. The folder may be shared specifically with the named tenant or with all embed users. Omit this parameter to return the union of all three access sources. A workbook can match more than one source. oneOf: - $ref: '#/components/schemas/EmbedTenantWorkbooksListQueryAccessSource' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedTenantWorkbooksListResponse' description: '' summary: List workbooks accessible to an embed tenant tags: - Dashboard Embed Access x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Return every workbook the named embed tenant can access in this deployment. Effective access includes workbooks shared directly with the tenant, workbooks shared with all embed users, and workbooks inherited from shared folders. Supports `first`/`after` cursor pagination. Filter workbooks by how access is granted: - `tenant`: the workbook itself is explicitly shared with the named embed tenant. Excludes workbooks available only through the all-embed-users group or a shared folder. - `allEmbedUsers`: the workbook itself is explicitly shared with the built-in all-embed-users group, making it available to every embed tenant. Excludes tenant-specific direct shares and folder-inherited access. - `folder`: access is inherited because the workbook is inside a shared folder or any of its descendant folders. The folder may be shared specifically with the named tenant or with all embed users. Omit this parameter to return the union of all three access sources. A workbook can match more than one source. /api/v1/deployments/{deploymentId}/env-vars: get: operationId: getEnvVariables parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/EnvVariablesListResponse' description: '' summary: Get env variables tags: - Env Variables x-mint: content: >- Lists the deployment environment variables, cursor-paginated via `first`/`after`. Values of secret-named variables (containing PASS, SECRET, TOKEN, KEY, or CREDENTIAL) are returned as `[ENCRYPTED]`. put: operationId: setEnvVariables parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/SetEnvVariablesInput' description: SetEnvVariablesInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/EnvVariablesListResponse' description: '' summary: Set env variables tags: - Env Variables x-mint: content: >- Upserts deployment environment variables by name; variables not included keep their existing values. Passing the `[ENCRYPTED]` placeholder (the masked read value) is rejected — omit variables you do not intend to change. New variable names must be POSIX identifiers (`^[A-Za-z_][A-Za-z0-9_]*$`); names already stored on the deployment may be resent unchanged so a legacy name can still be updated or removed. /api/v1/deployments/{deploymentId}/environments: get: operationId: getDeploymentEnvironments parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: type required: false schema: oneOf: - $ref: '#/components/schemas/GetDeploymentEnvironmentsQueryType' - type: 'null' type: string enum: - production - staging - development - in: query name: offset required: false schema: oneOf: - minimum: 0 type: integer - type: 'null' type: integer minimum: 0 - in: query name: limit required: false schema: oneOf: - minimum: 0 type: integer - type: 'null' type: integer minimum: 0 - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentEnvironmentsListResponse' description: '' summary: Get deployment environments tags: - Environments /api/v1/deployments/{deploymentId}/environments/{environmentId}/tokens: get: operationId: getDeploymentEnvironmentTokens parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: environmentId required: true schema: type: integer - in: query name: offset required: false schema: oneOf: - minimum: 0 type: integer - type: 'null' type: integer minimum: 0 - in: query name: limit required: false schema: oneOf: - minimum: 0 type: integer - type: 'null' type: integer minimum: 0 - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentEnvironmentTokensListResponse' description: '' summary: Get deployment environment tokens tags: - Environments post: operationId: createDeploymentEnvironmentToken parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: environmentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateDeploymentEnvironmentTokenInput' description: CreateDeploymentEnvironmentTokenInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentEnvironmentTokenResponse' description: '' summary: Create deployment environment token tags: - Environments /api/v1/deployments/{deploymentId}/environments/{environmentId}/tokens-for-meta-sync: post: operationId: createDeploymentEnvironmentTokenForMetaSync parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: environmentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateDeploymentEnvironmentTokenInput' description: CreateDeploymentEnvironmentTokenInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentEnvironmentTokenResponse' description: '' summary: Create deployment environment token for meta sync tags: - Environments /api/v1/deployments/{deploymentId}/folders: get: operationId: getFolders parameters: - in: path name: deploymentId required: true schema: type: number - in: query name: parentId schema: oneOf: - minimum: 0 type: integer - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/FoldersListResponse' description: '' summary: List folders tags: - Folders x-mint: content: >- List the folders in a deployment's workspace. By default this returns the folders at the workspace root. Pass the `parentId` query parameter to list the direct children of a specific folder instead. Results are scoped to the calling user: only folders the user can see are returned. A folder is visible when the user owns it, has been granted access to it directly, or has access to something inside it (a sub-folder, workbook, or dashboard), in which case the ancestor folders are surfaced as navigation. This endpoint is not recursive — it returns a single level of the folder tree per call. Use `parentId` to walk deeper, or `GET /folders/{folderId}/ancestors` to resolve a breadcrumb path. Results are returned in pages using cursor-based pagination: pass `first` to set the page size and `after` (the previous response's `pageInfo.endCursor`) to fetch the next page. The legacy `data` and `count` fields are still populated for backwards compatibility but are deprecated in favour of `items` and `pageInfo`. post: operationId: createFolder parameters: - in: path name: deploymentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateFolderInput' description: CreateFolderInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Folder' description: '' summary: Create a folder tags: - Folders x-mint: content: >- Create a new folder in a deployment's workspace. Provide a `name`, and optionally a `parentId` to nest the folder inside an existing one (omit it to create the folder at the workspace root). An optional `position` controls the folder's ordering among its siblings. Requires the **AI BI User** role (or higher). When `parentId` is set, the caller must additionally have **edit** or **manage** access to that parent folder. Folders can be nested up to a fixed maximum depth; exceeding it returns `400`. /api/v1/deployments/{deploymentId}/folders/{folderId}: delete: operationId: deleteFolder parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: folderId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete a folder tags: - Folders x-mint: content: >- Delete a folder from a deployment's workspace. Responds with `204 No Content` on success. The folder must be empty of sub-folders: if it still has child folders, the request is rejected with `400` — delete or move the sub-folders first. Content directly inside the folder (workbooks, dashboards, reports) is **not** deleted. It is detached and returned to the workspace root. Requires **manage** access to the folder. Returns `404` if the folder does not exist or belongs to a different deployment. put: operationId: updateFolder parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: folderId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateFolderInput' description: UpdateFolderInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Folder' description: '' summary: Update a folder tags: - Folders x-mint: content: >- Update a folder's metadata — its `name` and/or its `position` among its siblings. Both fields are optional; only the fields you send are changed. This endpoint does **not** move a folder to a different parent. To re-parent a folder, use `POST /workspace/move` with `type: FOLDER`. Requires **edit** access to the folder. Returns `404` if the folder does not exist or belongs to a different deployment. /api/v1/deployments/{deploymentId}/folders/{folderId}/ancestors: get: operationId: getFolderAncestors parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: folderId required: true schema: type: number responses: '200': content: application/json: schema: items: $ref: '#/components/schemas/Folder' type: array description: '' summary: List folder ancestors tags: - Folders x-mint: content: >- Return the ancestor chain of a folder, ordered from the workspace root down to (and including) the folder itself. Use this to render a breadcrumb path for a nested folder. For example, for `Root / Sales / Q1` requested on the `Q1` folder, the response is `[Root, Sales, Q1]`. Requires visibility access to the target folder. Returns `404` if the folder does not exist or belongs to a different deployment. /api/v1/deployments/{deploymentId}/logs: get: operationId: logs parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: source schema: oneOf: - $ref: '#/components/schemas/DeploymentLogsQuerySource' - type: 'null' - in: query name: pod schema: oneOf: - type: string - type: 'null' - in: query name: container schema: oneOf: - $ref: '#/components/schemas/DeploymentLogsQueryContainer' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentLogsResponse' description: '' summary: >- Recent runtime logs (tail) for a deployment. With no `source`, reads both the production API / worker pods and the dev-mode worker, merged chronologically; scope with `?source=production` or `?source=dev`. tags: - Deployments /api/v1/deployments/{deploymentId}/notifications: get: operationId: getNotifications parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. - in: query name: dashboardId schema: description: >- Optional filter: only return notifications for this numeric dashboard id. Provide this OR dashboardPublicId, not both. oneOf: - minimum: 1 type: integer - type: 'null' - in: query name: dashboardPublicId schema: description: >- Optional filter: only return notifications for this dashboard public id. Provide this OR dashboardId, not both. oneOf: - type: string - type: 'null' - in: query name: recipientUserId schema: description: >- Optional filter: only return notifications received by this user, by user id. Mutually exclusive with recipientEmail and the embed-user filter. oneOf: - minimum: 1 type: integer - type: 'null' - in: query name: recipientEmail schema: description: >- Optional filter: only return notifications received by this user, by email. Mutually exclusive with recipientUserId and the embed-user filter. oneOf: - type: string - type: 'null' - in: query name: recipientEmbedTenantName schema: description: >- Optional filter: only return notifications received by this embed user. Required together with recipientExternalId; mutually exclusive with the user filters. oneOf: - type: string - type: 'null' - in: query name: recipientExternalId schema: description: >- Optional filter: only return notifications received by this embed user. Required together with recipientEmbedTenantName; mutually exclusive with the user filters. oneOf: - type: string - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationsListResponse' description: '' summary: List scheduled notifications tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Returns the deployment’s scheduled notifications (recurring dashboard runs), ordered by creation time (newest first) and cursor-paginated. Optionally filter to a single dashboard with either `dashboardId` (numeric) or `dashboardPublicId` (string), and/or to the notifications a single recipient receives — a user (`recipientUserId` or `recipientEmail`) or an embed user (`recipientEmbedTenantName` + `recipientExternalId`). At most one identifier per dashboard/recipient dimension. Each item describes the schedule only; recipients are managed through the `/recipients` sub-resource. post: operationId: createNotification parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateNotificationInput' description: CreateNotificationInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationDto' description: '' summary: Create a scheduled notification tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Creates a scheduled notification — a recurring run of a dashboard whose rendered result is delivered to its recipients. The cadence is set by `scheduleType` plus the relevant time fields (`minute`, `hour`, `dayOfWeek`, `dayOfMonth`) or a raw `customCron` expression when `scheduleType` is `CUSTOM`; `timezone` defaults to UTC. Identify the target dashboard with either `dashboardId` (numeric) or `dashboardPublicId` (string) — supply exactly one; it must belong to this deployment, otherwise `404` is returned. The created notification has no recipients — add them via `POST /notifications/{id}/recipients`. /api/v1/deployments/{deploymentId}/notifications/{id}: delete: operationId: deleteNotification parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. - in: path name: id required: true schema: type: integer description: Numeric id of the notification (scheduled run). responses: '200': content: application/json: {} description: Successful response '204': description: Notification deleted. summary: Delete a scheduled notification tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Permanently deletes a scheduled notification and all of its recipients (main, embed, and Slack) in a single cascade. Returns `204 No Content` on success, or `404` if the notification does not belong to this deployment. get: operationId: getNotification parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. - in: path name: id required: true schema: type: integer description: Numeric id of the notification (scheduled run). responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationDto' description: '' summary: Get a scheduled notification tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Returns a single scheduled notification by id, including its cron expression, timezone, enabled state, notification format, and a human-readable schedule summary. Returns `404` if the notification does not exist or does not belong to this deployment. put: operationId: updateNotification parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. - in: path name: id required: true schema: type: integer description: Numeric id of the notification (scheduled run). requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateNotificationInput' description: UpdateNotificationInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationDto' description: '' summary: Update a scheduled notification tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Updates a notification’s schedule definition. Any subset of the schedule fields may be supplied (`scheduleType` + time fields or `customCron`, `timezone`), along with `isEnabled`, `notificationEnabled`, and `notificationFormat`. Omitted fields are left unchanged. This endpoint never modifies recipients — manage those through the `/recipients` sub-resource. Returns `404` if the notification is not part of this deployment. /api/v1/deployments/{deploymentId}/notifications/{id}/recipients: delete: operationId: removeRecipients parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. - in: path name: id required: true schema: type: integer description: Numeric id of the notification (scheduled run). requestBody: content: application/json: schema: $ref: '#/components/schemas/RemoveNotificationRecipientsInput' description: RemoveNotificationRecipientsInput required: false responses: '200': content: application/json: {} description: Successful response '204': description: Recipients removed. summary: Remove notification recipients tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Unsubscribes one or more recipients (1–1000 per request) from a notification. Each entry is identified by `type` plus the `id` returned by the API — `userId` for `USER`, `embedUserId` for `EMBED_USER`, or `channelId` for `SLACK`. `EMBED_USER` entries must also include `embedTenantName`, which locates the recipient’s storage partition. Removals are idempotent (deleting a recipient that isn’t subscribed is a no-op). Returns `204 No Content`, or `404` if the notification is not part of this deployment. get: operationId: getRecipients parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. - in: path name: id required: true schema: type: integer description: Numeric id of the notification (scheduled run). - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationRecipientsListResponse' description: '' summary: List notification recipients tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Returns the recipients subscribed to a notification, cursor-paginated and ordered by creation time (newest first). Recipients span three kinds, distinguished by `type`: `USER` (a main console user, with `userId` + `email`), `EMBED_USER` (an embed user, with `embedUserId`, `embedTenantName`, `externalId`, and `email`), and `SLACK` (a channel, with `channelId` + `channelName`). Returns `404` if the notification is not part of this deployment. post: operationId: addRecipients parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the notification. - in: path name: id required: true schema: type: integer description: Numeric id of the notification (scheduled run). requestBody: content: application/json: schema: $ref: '#/components/schemas/AddNotificationRecipientsInput' description: AddNotificationRecipientsInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationRecipientsMutationResponse' description: '' summary: Add notification recipients tags: - Notifications x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Subscribes one or more recipients (1–1000 per request) to a notification. Each recipient is one of: a main console `USER` (identified by `userId` or `email`); an `EMBED_USER` (identified by `embedTenantName` + `externalId`, auto-provisioned if it does not yet exist, and optionally given `securityContext`, `userAttributes`, and `groups` that drive per-recipient rendering); or `SLACK` — **not yet supported**, a request containing a Slack recipient is rejected with `400`. Every recipient must resolve to a valid email (an embed user’s `email`, or an email-shaped `externalId`); otherwise the whole request fails with `400` before anything is written. The operation is idempotent: the response buckets each recipient into `createdRecipients`, `updatedRecipients` (an existing recipient whose embed properties changed), or `unchangedRecipients`. /api/v1/deployments/{deploymentId}/ossie-conversions: post: operationId: startConversion parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/OssieConversionInput' description: OssieConversionInput required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/OssieConversionStartResponse' description: '' summary: Start an Apache Ossie conversion tags: - Ossie Conversion x-mint: content: >- Converts between a Cube data model and an [Apache Ossie (Open Semantic Interchange)](https://github.com/apache/ossie) model, and returns polling URLs immediately. An export converts the YAML data model of the deployment's latest successful build, or uploaded YAML files, to one Ossie model; an import converts an uploaded Ossie model to Cube data model files. Neither changes the deployment. Only static YAML model files are converted; JavaScript models and Jinja-templated files are skipped. Uploads are limited to 512 files of at most 2 MiB each and 20 MiB in total. Requests and results are kept for at most one day. Requires `SchemaRead` or `SchemaUpdate` access. This is currently in preview — reach out to the Cube support team to activate it for your account. /api/v1/deployments/{deploymentId}/ossie-conversions/{conversionId}: delete: operationId: cancelConversion parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: conversionId required: true schema: type: string responses: '200': content: application/json: {} description: Successful response '204': description: Cancelled, or already finished. summary: Cancel an Apache Ossie conversion tags: - Ossie Conversion get: operationId: conversionStatus parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: conversionId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/OssieConversionStatusResponse' description: '' summary: Get an Apache Ossie conversion status tags: - Ossie Conversion /api/v1/deployments/{deploymentId}/ossie-conversions/{conversionId}/files: get: operationId: conversionFiles parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: conversionId required: true schema: type: string - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/OssieConversionFilesListResponse' description: '' summary: Get the files of an Apache Ossie conversion tags: - Ossie Conversion x-mint: content: >- Returns `ossie.yaml` for an export, or the generated Cube data model files for an import; empty when the conversion failed. Returns 409 while the conversion is still running or if it ended without a result. /api/v1/deployments/{deploymentId}/ossie-conversions/{conversionId}/result: get: operationId: conversionResult parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: conversionId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/OssieConversionResultResponse' description: '' summary: Get an Apache Ossie conversion result tags: - Ossie Conversion x-mint: content: >- Returns the outcome, counts, issues and converter versions of a completed conversion. Returns 409 while the conversion is still running or if it ended without a result. Read the converted files from `/files`. /api/v1/deployments/{deploymentId}/pods: get: operationId: pods parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentPodsResponse' description: '' summary: List the pods currently scheduled for a deployment tags: - Deployments /api/v1/deployments/{deploymentId}/report-deliveries: get: operationId: getReportDeliveries parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: query name: reportId schema: description: Only deliveries of this report. oneOf: - minimum: 1 type: integer - type: 'null' - in: query name: ownerUserId schema: description: Only deliveries owned by this user. oneOf: - minimum: 0 type: integer - type: 'null' - in: query name: spreadsheet schema: description: Only deliveries into this spreadsheet (its URL or its id). oneOf: - type: string - type: 'null' - in: query name: status schema: description: >- Only deliveries in this status, e.g. `failing` or `no_sheet_access` for the ones needing attention. oneOf: - $ref: '#/components/schemas/GetReportDeliveriesQueryStatus' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveriesListResponse' description: '' summary: List report deliveries tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Newest first. Filter by `reportId`, `ownerUserId`, `spreadsheet` or `status`. Admins see every delivery; others only their own. post: operationId: createReportDelivery parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateReportDeliveryInput' description: CreateReportDeliveryInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveryResponse' description: '' summary: Create a report delivery tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Writes a report’s results into a Google Sheets tab from `destination.anchorCell`. The caller owns it: their Google account writes, with their data access. Needs read access to the report. /api/v1/deployments/{deploymentId}/report-deliveries/{id}: delete: operationId: deleteReportDelivery parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. responses: '200': content: application/json: {} description: Successful response '204': description: Report delivery deleted. summary: Delete a report delivery tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Also deletes its run history. Cells it already wrote stay in the spreadsheet. get: operationId: getReportDelivery parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveryResponse' description: '' summary: Get a report delivery tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. `404` if the caller cannot see it. Admins see every delivery; others only their own. put: operationId: updateReportDelivery parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateReportDeliveryInput' description: UpdateReportDeliveryInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveryResponse' description: '' summary: Update a report delivery tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Omitted fields stay unchanged; `destination` and `schedule` are replaced whole, and `schedule: null` removes it. A new `reportId` needs read access to that report; `ownerUserId` transfers the delivery. /api/v1/deployments/{deploymentId}/report-deliveries/{id}/pause: post: operationId: pauseReportDelivery parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveryResponse' description: '' summary: Pause a report delivery tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Its schedule stops firing until it is resumed; a run can still be started by hand. Pausing a paused delivery changes nothing. /api/v1/deployments/{deploymentId}/report-deliveries/{id}/resume: post: operationId: resumeReportDelivery parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveryResponse' description: '' summary: Resume a paused report delivery tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Its schedule fires again from the next due time; the fires missed while paused are not run. /api/v1/deployments/{deploymentId}/report-deliveries/{id}/runs: get: operationId: getReportDeliveryRuns parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. - in: query name: sortDirection schema: description: 'Order by when the run started: `DESC` (default) is newest first.' oneOf: - $ref: '#/components/schemas/GetReportDeliveryRunsQuerySortDirection' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveryRunsListResponse' description: '' summary: List runs of a report delivery tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Newest first unless `sortDirection` says otherwise, a running one included. `404` if the caller cannot see the delivery. Admins see every delivery; others only their own. post: operationId: startReportDeliveryRun parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. responses: '202': content: application/json: schema: $ref: '#/components/schemas/StartReportDeliveryRunResponse' description: '' summary: Run a report delivery now tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Starts a run in the background and returns its id. The run writes the report’s current results into the destination, whether or not the delivery is paused. `409` while another run of it is still going. /api/v1/deployments/{deploymentId}/report-deliveries/{id}/runs/{runId}: get: operationId: getReportDeliveryRun parameters: - in: path name: deploymentId required: true schema: type: integer description: Numeric id of the deployment that owns the delivery. - in: path name: id required: true schema: type: integer description: Numeric id of the report delivery. - in: path name: runId required: true schema: type: integer description: Numeric id of the run, as returned when it was started. responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportDeliveryRunResponse' description: '' summary: Get a report delivery run tags: - Report Deliveries x-mint: content: >- In preview: ask Cube support to enable it. Poll it after starting a run: `status` stays `running` until the run finishes. /api/v1/deployments/{deploymentId}/reports: get: operationId: getReports parameters: - in: path name: deploymentId required: true schema: type: number - in: query name: workbookId schema: oneOf: - type: integer - type: 'null' - in: query name: folderId schema: oneOf: - type: integer - type: 'null' - in: query name: externalWorkbookId schema: oneOf: - type: string - type: 'null' - in: query name: search schema: oneOf: - type: string - type: 'null' - in: query name: limit schema: oneOf: - type: integer - type: 'null' - in: query name: page schema: oneOf: - type: integer - type: 'null' - in: query name: sortBy schema: oneOf: - $ref: '#/components/schemas/GetReportsQuerySortBy' - type: 'null' - in: query name: sortDirection schema: oneOf: - $ref: '#/components/schemas/GetReportsQuerySortDirection' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/ReportsListResponse' description: '' summary: List reports tags: - Reports x-mint: content: >- List the reports in a deployment, scoped to the reports the calling user can access. Results are returned in pages using cursor-based pagination: pass `first` to set the page size and `after` (the previous response's `pageInfo.endCursor`) to fetch the next page. Cursor pagination is not supported when sorting by `lastViewedAt` (a per-viewer sort with no stable cursor column). post: operationId: createReport parameters: - in: path name: deploymentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateReportInput' description: CreateReportInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Report' description: '' summary: Create a report tags: - Reports x-mint: content: >- Create a report in a deployment. You may supply your own `publicId` (a 12-character `[0-9A-Za-z]` id) to key the report for as-code management; omit it to have one generated. It must be an id you chose — the auto-generated placeholder ids shown for reports that have no stable id yet are a reserved, non-unique shape and are rejected with `400`. /api/v1/deployments/{deploymentId}/reports/by-public-id/{publicId}: put: operationId: upsertReportByPublicId parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: publicId required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateReportInput' description: CreateReportInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Report' description: '' summary: Create or update a report by publicId tags: - Reports x-mint: content: >- Idempotent create-or-update ("upsert") of a report keyed by its portable `publicId` — the stable identity for managing dashboards as code (CI/CD pipelines re-applying the same definition against any environment). If a report with this `publicId` exists in the deployment, it is updated with the fields you send (same semantics as `PUT /reports/:reportId`); otherwise a new report is created with this `publicId`. Re-applying the same request is a no-op. The `publicId` must be a 12-character alphanumeric id (`[0-9A-Za-z]`); mint one client-side when authoring the definition. This endpoint returns `409` for three different reasons, distinguished by the response body's `code` — handle them differently: - **No `code`** — the `publicId` already belongs to a report in a **different** deployment. Because `publicId` is unique across the account, it is rejected rather than silently updating across deployments (reported regardless of whether you have access to that report). This is **permanent**: retrying will not help; use a different `publicId`. - **`code: "upsert_branch_changed"`** — whether this request creates or updates is decided, and access-checked, before it is applied; another writer changed that in between (created or deleted the report with this `publicId`). The request was rejected rather than applied under the wrong permission check. This is **transient: retry the request**. It only happens when two writers target the same `publicId` concurrently, e.g. two pipeline runs applying the same bundle at once. - **`code: "ambiguous_legacy_id"`** — the id given is one of the ids synthesized for reports that predate stable ids (see below), and it matches more than one of them, so it cannot identify a single report. Nothing was changed. This is **permanent**, and the fix is different from the case above: assign the report you mean a `publicId` of your own with `PUT /deployments/{deploymentId}/reports/{reportId}`, then key on that. **Reports created before stable ids** do not store a `publicId`; the API synthesizes one for them from the report's internal id. Those synthesized ids are **not unique** — several reports can share one, and in practice most do. This endpoint resolves such an id only when it is unambiguous, adopting it as the report's real `publicId` at that point; otherwise it returns the `ambiguous_legacy_id` conflict above. For anything you intend to manage as code, do not rely on a synthesized id: give the report a `publicId` you chose. `PUT /deployments/{deploymentId}/reports/{reportId}` accepts `publicId` for exactly this, on any report that does not have one yet (it is write-once — a report's existing `publicId` cannot be changed, since clients may already have stored it). `source` is **create-only**: it is recorded when the report is first created and ignored on subsequent updates (it describes where the report originated, not its current definition). Access: updating requires **edit** access to the existing report; creating requires the same access as `POST /reports`. /api/v1/deployments/{deploymentId}/reports/{reportId}: delete: operationId: deleteReport parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: reportId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete report tags: - Reports get: operationId: getReport parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: reportId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/Report' description: '' summary: Get report tags: - Reports put: operationId: updateReport parameters: - in: path name: deploymentId required: true schema: type: string - in: path name: reportId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateReportInput' description: UpdateReportInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Report' description: '' summary: Update a report tags: - Reports x-mint: content: >- Update a report. All fields are optional; only the fields you send are changed. `publicId` is **write-once**: you may assign one to a report that does not have one yet — which is how a report created before stable ids is adopted into as-code management, so `PUT /reports/by-public-id/{publicId}` can key on it — but a report's existing `publicId` cannot be changed, since clients may already have stored it. Attempting to change it returns `400`; a `publicId` already used by another report returns `409`. The id you assign must be one you chose (any distinct 12-character `[0-9A-Za-z]` id). The auto-generated placeholder id shown for a report that has no stable id yet cannot be assigned — it is not unique — and is rejected with `400`. Requires **edit** access to the report. /api/v1/deployments/{deploymentId}/reports/{reportId}/connect-workbook: delete: operationId: disconnectReportFromWorkbook parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: reportId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/DisconnectReportFromWorkbookInput' description: DisconnectReportFromWorkbookInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Report' description: '' summary: Disconnect a report from one spot in a spreadsheet tags: - Reports x-mint: content: |- Remove a single placement of a report — one sheet + anchor in one spreadsheet — leaving every other placement, in this workbook and in others, alone. Address the placement by `placementId`, or (for placements recorded before ids existed) by `externalWorkbookId` plus `sheetName` and `anchorCell` — or a `resultLocation` naming both. Neither the sheet name nor the anchor is optional in that form: matching is by sheet + anchor, and a target missing either addresses nothing. `sheetId` is an optional extra, not a substitute for `sheetName`: a placement written before that field existed has only a name, and no id the server could resolve to it, so an id-only address would match nothing while looking correct. Send a `sheetId` only when you know it is the one the placement was stored with. It NARROWS the target — a placement recorded under a different id is not matched, even when the sheet name and anchor agree, because the stored name may belong to a tab that has since been renamed and the id is the only stable identity. If your id may have moved on (a tab deleted and recreated under the same name reports a new one), address the placement by `placementId`, or by sheet name with no `sheetId` at all. A target that matches no placement succeeds and changes nothing, so retrying is safe. Like connecting, this records nothing about the report's definition and so requires only read access: unplacing a report from your own sheet is not an edit to the report. put: operationId: connectReportToWorkbook parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: reportId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/ConnectReportToWorkbookInput' description: ConnectReportToWorkbookInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Report' description: '' summary: Connect a report to the calling spreadsheet tags: - Reports x-mint: content: |- Link a report to the caller's own spreadsheet by recording its placement (workbook id + result location) so the add-in can list and refresh it there. This upserts only the placement for the given workbook and never changes the report's query, name, or other definition — so, like refresh, it requires only read access to the report. A user who can view a report can place its data into their own sheet without being its creator or having edit rights. /api/v1/deployments/{deploymentId}/reports/{reportId}/file: get: operationId: getReportFile parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: reportId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/JsonConfigFileDto' description: '' summary: Read a report definition as editable JSON text tags: - Reports x-mint: content: >- Returns the report's definition as canonical JSON text (`content`) and its SHA-256 (`hash`): `name` plus the definition fields of `meta` (`sqlQuery`, `chartCategory`, chart specs, `pivotItems`, …). `vegaSpec` appears as a JSON object. Placements and run state are left out. Use it with `PATCH /reports/{reportId}/file` to change part of a report without resending it. patch: operationId: replaceReportFileText parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: reportId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/ReplaceJsonConfigTextInput' description: ReplaceJsonConfigTextInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/JsonConfigFileDto' description: '' summary: Replace text in a report definition tags: - Reports x-mint: content: >- Changes part of a report by exact-text replacement, so a small change (a column, a filter, one chart property) sends only that change instead of the whole report. Read `GET /reports/{reportId}/file` first and copy each `oldText` from its `content`, including whitespace. Without `replaceAll`, `oldText` must occur exactly once. Edits apply in order; if any one fails, nothing is saved. A field removed from the file is cleared; fields outside the file cannot be added. Returns the new `content` and `hash`. Pass `expectedHash` to get `409` instead of editing a report that changed since you read it. Requires **edit** access to the report. /api/v1/deployments/{deploymentId}/reports/{reportId}/refresh: put: operationId: refreshReport parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: reportId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/RefreshReportInput' description: RefreshReportInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Report' description: '' summary: Refresh report tags: - Reports /api/v1/deployments/{deploymentId}/scheduled-tasks: get: operationId: listScheduledTasks parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ScheduledTaskListResponse' description: '' summary: List scheduled tasks tags: - Scheduled Tasks x-mint: content: >- The scheduled tasks in the deployment the caller can see — their own and those shared with them, or every task for an admin — most recently updated first, with each next run time. Needs access to the deployment; embed sessions get `403`. post: operationId: createScheduledTask parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateScheduledTaskInput' description: CreateScheduledTaskInput required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ScheduledTaskResponse' description: '' summary: Create a scheduled task tags: - Scheduled Tasks x-mint: content: >- Saves a prompt the agent runs as the caller on `cronExpression` in `timezone`, or on demand. Needs `ScheduledTasksCreate` (`403` otherwise). A cron fires at most hourly (`400` otherwise), and a user can have 20 active tasks (`409` past that). /api/v1/deployments/{deploymentId}/scheduled-tasks/{taskId}: delete: operationId: deleteScheduledTask parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: taskId required: true schema: type: integer responses: '200': content: application/json: {} description: Successful response summary: Delete a scheduled task tags: - Scheduled Tasks x-mint: content: >- Deletes the task and its schedule; the chat threads of past runs are kept. Only the creator or an admin may do this (`403` otherwise). get: operationId: getScheduledTask parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: taskId required: true schema: type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/ScheduledTaskResponse' description: '' summary: Get a scheduled task tags: - Scheduled Tasks x-mint: content: >- A task is visible to its creator, to admins and to whoever it is shared with; anyone else gets `404`. put: operationId: updateScheduledTask parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: taskId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateScheduledTaskInput' description: UpdateScheduledTaskInput required: true responses: '200': content: application/json: schema: $ref: '#/components/schemas/ScheduledTaskResponse' description: '' summary: Update a scheduled task tags: - Scheduled Tasks x-mint: content: >- Changes the fields sent; `cronExpression: null` makes the task Manual. Only the creator or an admin may do this (`403` otherwise). A cron fires at most hourly (`400` otherwise), and a user can have 20 active tasks (`409` past that). /api/v1/deployments/{deploymentId}/scheduled-tasks/{taskId}/run: post: operationId: runScheduledTask parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: taskId required: true schema: type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/RunScheduledTaskResponse' description: '' summary: Run a scheduled task now tags: - Scheduled Tasks x-mint: content: >- Starts one run now, even for a paused or Manual task, and returns its chat thread. Only the creator or an admin may do this (`403` otherwise). /api/v1/deployments/{deploymentId}/scheduled-tasks/{taskId}/runs: get: operationId: listScheduledTaskRuns parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: taskId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ScheduledTaskRunsListResponse' description: '' summary: List a scheduled task's runs tags: - Scheduled Tasks x-mint: content: >- The chat threads of the task's latest 50 runs, newest first. Opening a thread follows the usual chat-history access rules. /api/v1/deployments/{deploymentId}/settings: get: operationId: getDeploymentSettings parameters: - in: path name: deploymentId required: true schema: type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentSettings' description: '' summary: Get deployment settings tags: - Deployments x-mint: content: >- Every setting of a deployment in one payload — the full contents of the console Settings pages (general, configuration flags, deploy, launchpad, Cube Store private storage), plus the read-only values displayed alongside them. Secrets are excluded; read environment variables through `/env-vars` instead. Writes go to `PUT /:deploymentId`, which accepts the same fields and returns this payload. /api/v1/deployments/{deploymentId}/shared-workspace: get: operationId: sharedWorkspaceObjects parameters: - in: path name: deploymentId required: true schema: type: number - in: query name: folderId schema: oneOf: - type: integer - type: 'null' - in: query name: types schema: oneOf: - items: enum: - FOLDER - WORKBOOK - REPORT type: string type: array - type: 'null' - in: query name: orderByField schema: oneOf: - $ref: '#/components/schemas/GetWorkspaceObjectsQueryOrderByField' - type: 'null' - in: query name: orderByDirection schema: oneOf: - $ref: '#/components/schemas/GetWorkspaceObjectsQueryOrderByDirection' - type: 'null' - in: query name: search schema: oneOf: - type: string - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkspaceConnectionResponse' description: '' summary: List shared workspace items tags: - Workspace x-mint: content: >- List the workspace items (folders, workbooks, reports) that have been shared with embed users via the built-in "All embed users" group or the caller's per-embed-tenant `system:tenant:{embedTenantName}` group. Unlike `GET /workspace`, this feed is not per-user: every valid embed caller from the same embed tenant sees the same set, scoped to what those groups have been granted. Owner identities are blanked out so they are not exposed to embed users. Accepts the same `folderId`, `types`, `search`, sorting, and cursor-pagination parameters as `GET /workspace`. Folders reachable only because a nested item inside them was shared are surfaced as navigation, but their unshared siblings stay hidden. /api/v1/deployments/{deploymentId}/snowflake-semantic-view-pulls: post: operationId: startSnowflakeSemanticViewPull parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/StartSnowflakeSemanticViewPullInput' description: StartSnowflakeSemanticViewPullInput required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/SnowflakeSemanticViewSyncStartResponse' description: '' summary: Pull Snowflake Semantic Views into Cube tags: - Snowflake Semantic View Sync x-mint: content: >- Pulls Snowflake Semantic Views into a Cube branch and returns a job ID to poll. Generated files are committed to the branch. Requires an API key or OAuth deployment.write token, SQL runner access, and preview enablement. /api/v1/deployments/{deploymentId}/snowflake-semantic-view-pulls/{syncJobId}: get: operationId: getSnowflakeSemanticViewPullStatus parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/SnowflakeSemanticViewSyncStatusResponse' description: '' summary: Get Snowflake Semantic View pull status tags: - Snowflake Semantic View Sync x-mint: content: >- Poll the syncJobId returned by the pull start request. COMPLETED and FAILED are terminal; a 404 means the job is not visible to this deployment. /api/v1/deployments/{deploymentId}/snowflake-semantic-view-pulls/{syncJobId}/result: get: operationId: getSnowflakeSemanticViewPullResult parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/SnowflakeSemanticViewPullResultResponse' description: '' summary: Get the result of a completed Snowflake Semantic View pull tags: - Snowflake Semantic View Sync x-mint: content: >- Returns the generated file paths committed to the Cube branch, view count, and duration. Poll status first; this endpoint returns 404 until the pull completes. /api/v1/deployments/{deploymentId}/snowflake-semantic-view-syncs: post: operationId: startSnowflakeSemanticViewPush parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/StartSnowflakeSemanticViewSyncInput' description: StartSnowflakeSemanticViewSyncInput required: true responses: '202': content: application/json: schema: $ref: '#/components/schemas/SnowflakeSemanticViewSyncStartResponse' description: '' summary: Push Cube views to Snowflake Semantic Views tags: - Snowflake Semantic View Sync x-mint: content: >- Queues a push of selected Cube views to Snowflake and returns a syncJobId for polling. Requires an API key or OAuth deployment.write token, Semantic View sync, SQL DDL access, and preview enablement. /api/v1/deployments/{deploymentId}/snowflake-semantic-view-syncs/{syncJobId}: get: operationId: getSnowflakeSemanticViewPushStatus parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/SnowflakeSemanticViewSyncStatusResponse' description: '' summary: Get Snowflake Semantic View push status tags: - Snowflake Semantic View Sync x-mint: content: >- Poll the syncJobId returned by the push start request. COMPLETED and FAILED are terminal; a 404 means the job is not visible to this deployment. /api/v1/deployments/{deploymentId}/snowflake-semantic-view-syncs/{syncJobId}/result: get: operationId: getSnowflakeSemanticViewPushResult parameters: - in: path name: deploymentId required: true schema: type: integer - in: path name: syncJobId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/SnowflakeSemanticViewPushResultResponse' description: '' summary: Get the result of a completed Snowflake Semantic View push tags: - Snowflake Semantic View Sync x-mint: content: >- Returns the number of Snowflake Semantic Views published and the duration. Poll status first; this endpoint returns 404 until the push completes. /api/v1/deployments/{deploymentId}/token: post: operationId: deploymentToken parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateDeploymentTokenInput' description: CreateDeploymentTokenInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentTokenResponse' description: '' summary: Deployment token tags: - Deployments /api/v1/deployments/{deploymentId}/versions: get: operationId: listDeploymentVersions parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/DeploymentVersionsResponse' description: '' summary: List available Cube versions tags: - Deployments x-mint: content: >- Every Cube version this deployment can be switched to — the same set the console’s version picker offers: the head of each release channel, plus the older versions the tenant has run before (its release history). Pass a listed `releaseChannelVersion` to `PUT /:deploymentId`; anything else is rejected. The container image is resolved server-side and is not part of the write surface. /api/v1/deployments/{deploymentId}/workbooks: get: operationId: getWorkbooks parameters: - in: path name: deploymentId required: true schema: type: number - in: query name: folderId schema: oneOf: - minimum: 0 type: integer - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbooksListResponse' description: '' summary: Get workbooks tags: - Workbooks post: operationId: createWorkbook parameters: - in: path name: deploymentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateWorkbookInput' description: CreateWorkbookInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Workbook' description: '' summary: Create workbook tags: - Workbooks /api/v1/deployments/{deploymentId}/workbooks/by-slug/{slug}: put: operationId: upsertWorkbookBySlug parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: slug required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateWorkbookInput' description: CreateWorkbookInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Workbook' description: '' summary: Create or update a workbook by slug tags: - Workbooks x-mint: content: >- Idempotent create-or-update ("upsert") of a workbook keyed by its deployment-scoped slug — the portable identity for managing dashboards as code (CI/CD pipelines re-applying the same definition against any environment). If a workbook with this slug exists in the deployment, it is updated: only the fields you send are changed, and `meta` is merged into the existing metadata (a `meta.dashboardDraft` is validated like everywhere else). Otherwise a new workbook is created with this slug. The slug is normalized (trimmed, lowercased) before matching. Re-applying the same request is a no-op. Access: updating requires **edit** access to the workbook holding the slug (requests that include `folderId` require **manage** access, plus **edit** access to the destination folder); creating requires the same access as `POST /workbooks` (AI BI User role or higher). Whether this request creates or updates is decided — and access-checked — before it is applied. If another writer changes that in between (creates or deletes the workbook holding this slug), the request is rejected with `409` and `code: "upsert_branch_changed"` rather than applied under the wrong permission check. This is **transient: retry the request**. It only happens when two writers target the same slug concurrently — for example two pipeline runs applying the same bundle at once, where one creates the workbook and the other must then retry into the update path. Returns `404` if the deployment does not exist. /api/v1/deployments/{deploymentId}/workbooks/{workbookId}: delete: operationId: deleteWorkbook parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete workbook tags: - Workbooks get: operationId: getWorkbook parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/Workbook' description: '' summary: Get workbook tags: - Workbooks put: operationId: updateWorkbook parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateWorkbookInput' description: UpdateWorkbookInput required: false responses: '200': content: application/json: {} description: Successful response summary: Update a workbook tags: - Workbooks x-mint: content: >- Update a workbook's properties. All fields are optional; only the fields you send are changed. - `name` — rename the workbook. - `meta` — replace the workbook's metadata object. - `folderId` — move the workbook between folders. Set it to a folder id to move the workbook into that folder, or to `null` to move it back to the workspace root. Access depends on what you change. Renaming or editing metadata requires **edit** access to the workbook. Moving the workbook (any request that includes `folderId`) requires **manage** access to the workbook, plus **edit** access to the destination folder when moving into one. To move a workbook you can use either this endpoint or the unified `POST /workspace/move`. Returns `404` if the workbook does not exist or belongs to a different deployment. /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/dashboard: put: operationId: updateWorkbookDashboard parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/WorkbookDashboardInput' description: WorkbookDashboardInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbookDashboard' description: '' summary: Update workbook dashboard tags: - Workbooks /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/dashboard/ai-widget-thread: post: operationId: updatePublishedDashboardAiWidgetThread parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdatePublishedAiWidgetThreadInput' description: UpdatePublishedAiWidgetThreadInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Dashboard' description: '' summary: Update published dashboard AI widget thread tags: - Workbooks /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/dashboard/file: get: operationId: getWorkbookDashboardFile parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/JsonConfigFileDto' description: '' summary: Read the dashboard draft as editable JSON text tags: - Workbooks x-mint: content: >- Returns the workbook's classic dashboard draft as canonical JSON text (`content`) and its SHA-256 (`hash`). Use it with `PATCH /workbooks/{workbookId}/dashboard/file` to change part of the dashboard without resending the whole configuration. Returns `400` for a workbook whose dashboard is a Dashboard App. patch: operationId: replaceWorkbookDashboardFileText parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/ReplaceJsonConfigTextInput' description: ReplaceJsonConfigTextInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/JsonConfigFileDto' description: '' summary: Replace text in the dashboard draft tags: - Workbooks x-mint: content: >- Changes part of the classic dashboard draft by exact-text replacement, so a small change sends only that change instead of the whole configuration. Read `GET /workbooks/{workbookId}/dashboard/file` first and copy each `oldText` from its `content`, including whitespace. Without `replaceAll`, `oldText` must occur exactly once. Edits apply in order; if any one fails, nothing is saved. The result is validated like `PUT /workbooks/{workbookId}/dashboard`. Returns the new `content` and `hash`. Pass `expectedHash` to get `409` instead of editing a draft that changed since you read it. Requires **edit** access to the workbook. /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/duplicate: post: operationId: duplicateWorkbook parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/DuplicateWorkbookInput' description: DuplicateWorkbookInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Workbook' description: '' summary: Clone a workbook tags: - Workbooks x-mint: content: >- Create a full copy of a workbook, including its reports and its published dashboard, and return the new workbook. The clone is named "Copy of \{original name\}". All report references inside the dashboard (and the dashboard draft) are re-pointed at the copied reports, so the duplicate is fully self-contained and independent of the original. Per-user view history (last-viewed timestamps) is **not** carried over. The clone does **not** inherit the source's sharing: no user or group policies are copied, and signed embedding (`allowEmbed`) starts disabled on the cloned dashboard even when it is enabled on the source. Placement follows the caller's access to the source's folder. With **edit** access to that folder the clone (and its reports) is created alongside the original, and therefore inherits the access that folder grants. With only **read** access — or when the source is at the root — the clone is created at the workspace root instead, so a viewer never writes into a folder they don't control. Requires **read** access to the source workbook and the **AI BI User** role (or higher). The new workbook is owned by the calling user. Creator-mode embed sessions can also clone a workbook from the **shared workspace** (the items listed by `GET /shared-workspace`) by passing `{ "shared": true }` in the request body — `workbookId` is then resolved against the shared workspace instead of the caller's own. Such a clone is built from the workbook's **published dashboard**: a fresh report is created per report snapshot, the dashboard is re-published onto the new workbook, and the same config seeds the workbook's draft — the source's live reports and unpublished draft are not copied. The clone is placed at the workspace root. Requires the workbook to have a published dashboard (`400` otherwise); `403` for non-creator-mode callers. If the deployment's plan enforces a workbook limit and it has been reached, the request is rejected with `400`. Returns `404` if the workbook does not exist or belongs to a different deployment. /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/embed-access: get: operationId: getEmbedAccess parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedAccessResponse' description: '' summary: List a dashboard's embed access tags: - Dashboard Embed Access x-mint: content: >- Return the embed audience of a workbook's published dashboard: the global `allowEmbed` (signed-embedding) flag, whether it is shared with **all embed users**, and the list of individual embed **tenants** it is shared with. Embed access is a read-only share of the workbook with a system sharing group, so this is scoped to the workbook that owns the dashboard. Requires **read** access to the workbook. Returns `404` if the workbook does not exist or belongs to a different deployment. put: operationId: updateEmbedAccess parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateEmbedAccessInput' description: UpdateEmbedAccessInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedAccessResponse' description: '' summary: Update a dashboard's embed access tags: - Dashboard Embed Access x-mint: content: >- Add, update, or remove one embed audience from a workbook's published dashboard, and/or toggle signed embedding. Returns the updated embed-access view. Provide exactly one target — `embedTenantName` (a single embed tenant) or `allEmbedUsers: true` (every embed tenant) — together with `action`: `"read"` grants access, `"none"` removes it. Include `allowEmbed` to also flip "Allow signed embedding" in the same request; omit both targets to change only `allowEmbed`. Requires **manage** access to the workbook. Returns `404` if the workbook or the named embed tenant does not exist, and `400` if the request specifies no change or sets `allowEmbed` on a workbook that has no published dashboard. /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/promotion: get: operationId: getWorkbookPromotion parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbookPromotionSummaryResponse' description: '' summary: Get workbook promotion provenance tags: - Workbook Promotions /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/promotion-links: get: operationId: getWorkbookPromotionLinks parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbookPromotionLinksListResponse' description: '' summary: List workbook promotion destinations tags: - Workbook Promotions /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/promotion-previews: post: operationId: previewWorkbookPromotion parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/PreviewWorkbookPromotionInput' description: PreviewWorkbookPromotionInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbookPromotionPreviewDto' description: '' summary: Preview a workbook promotion tags: - Workbook Promotions x-mint: content: >- Validate promotion of the complete workbook and published dashboard to another deployment. The source slug is preserved so deployment-scoped dashboard links remain stable. Returns content hashes for optimistic concurrency; no preview is stored. Requires access to both deployments. /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/promotions: get: operationId: getWorkbookPromotions parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbookPromotionsListResponse' description: '' summary: List workbook promotion history tags: - Workbook Promotions post: operationId: promoteWorkbook parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/ApplyWorkbookPromotionInput' description: ApplyWorkbookPromotionInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkbookPromotionDto' description: '' summary: Promote and publish a workbook tags: - Workbook Promotions x-mint: content: >- Promote the current workbook atomically if its source hash still matches the preview. Repeated promotions update the linked copy, including its deployment-scoped slug. Override replaces destination edits, never source validation or permissions. An idempotency key makes retries safe. /api/v1/deployments/{deploymentId}/workbooks/{workbookId}/publish: post: operationId: publishDashboard parameters: - in: path name: deploymentId required: true schema: type: number - in: path name: workbookId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/PublishDashboardInput' description: PublishDashboardInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Dashboard' description: '' summary: Publish a dashboard tags: - Workbooks x-mint: content: >- Publishes the saved dashboard draft when config is omitted. Save layout or app changes to the workbook draft before publishing; the request only needs workbookId. An explicit config remains supported for existing clients. /api/v1/deployments/{deploymentId}/workspace: get: operationId: workspaceObjects parameters: - in: path name: deploymentId required: true schema: type: number - in: query name: folderId schema: oneOf: - type: integer - type: 'null' - in: query name: types schema: oneOf: - items: enum: - FOLDER - WORKBOOK - REPORT type: string type: array - type: 'null' - in: query name: orderByField schema: oneOf: - $ref: '#/components/schemas/GetWorkspaceObjectsQueryOrderByField' - type: 'null' - in: query name: orderByDirection schema: oneOf: - $ref: '#/components/schemas/GetWorkspaceObjectsQueryOrderByDirection' - type: 'null' - in: query name: search schema: oneOf: - type: string - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/WorkspaceConnectionResponse' description: '' summary: List workspace items tags: - Workspace x-mint: content: >- List the items in a deployment's workspace — folders, workbooks, and reports — in a single unified, paginated feed. By default this returns the items at the workspace root. Pass `folderId` to list the contents of a specific folder instead. Folders are always returned ahead of other item types so they render at the top of a listing. Supported query parameters: - `folderId` — list the contents of this folder (omit for the root). - `types` — restrict the results to one or more item types (`FOLDER`, `WORKBOOK`, `REPORT`). Repeat the parameter to pass several. - `search` — case-insensitive substring match on item names; searches across all folders, not just the current level. - `orderByField` / `orderByDirection` — sort the non-folder items (e.g. by `name`, `updated_at`, `created_at`, or `viewer_last_viewed_at`). - `first` / `after` — cursor-based pagination. Results are scoped to the calling user: only items the user can access are returned. /api/v1/deployments/{deploymentId}/workspace/bulk-delete: post: operationId: bulkDeleteWorkspaceObjects parameters: - in: path name: deploymentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/BulkDeleteWorkspaceObjectsInput' description: BulkDeleteWorkspaceObjectsInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/BulkDeleteWorkspaceObjectsPayload' description: '' summary: Delete workspace items in bulk tags: - Workspace x-mint: content: >- Delete up to 100 workspace items — workbooks, reports, and folders, mixed freely — in a single request. Request body: - `items` — the items to delete, each `{ type, id }` with `type` one of `WORKBOOK`, `REPORT`, `FOLDER`. Repeated references to the same item are collapsed, so the response holds exactly one entry per distinct item requested. **This endpoint is partially successful.** It returns `200` whenever the request itself is well formed, and reports each item's outcome separately: - `deleted` — the `(type, id)` of each item that was deleted. - `failed` — the items that were not deleted, each with the `(type, id)` requested and an `error` carrying the `status` and `message` the per-type delete endpoint would have returned for it (`403` when the caller lacks access, `404` when the item does not exist or belongs to another deployment, `400` when a folder still has sub-folders). An empty `failed` array means the whole batch applied. Items are deleted one at a time in the order given, each in its own transaction, so **deletions are not rolled back** when a later item fails — the response is the record of what was applied. Deleting a folder does not delete the workbooks, dashboards, and reports directly inside it: they are detached and returned to the workspace root, matching `DELETE /folders/:folderId`. Access is checked per item with the same rules as the per-type delete endpoints: **manage** access for a workbook or folder, and **edit** access plus the report-manage permission for a report. /api/v1/deployments/{deploymentId}/workspace/bulk-move: post: operationId: bulkMoveWorkspaceObjects parameters: - in: path name: deploymentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/BulkMoveWorkspaceObjectsInput' description: BulkMoveWorkspaceObjectsInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/BulkMoveWorkspaceObjectsResponse' description: '' summary: Move workspace items in bulk tags: - Workspace x-mint: content: >- Move up to 100 workspace items — workbooks, reports, and folders, mixed freely — into one destination folder in a single request. Request body: - `items` — the items to move, each `{ type, id }` with `type` one of `WORKBOOK`, `REPORT`, `FOLDER`. Repeated references to the same item are collapsed, so the response holds exactly one entry per distinct item requested. - `folderId` — the destination folder id for the whole batch, or `null` to move the items to the workspace root. For a folder item this becomes its new parent. **This endpoint is partially successful.** It returns `200` whenever the request itself is well formed, and reports each item's outcome separately: - `moved` — the items that were moved, serialized exactly as `POST /workspace/move` returns them. - `failed` — the items that were not moved, each with the `(type, id)` requested and an `error` carrying the `status` and `message` the single-item move would have returned for it (`403` when the caller lacks access, `404` when the item does not exist or belongs to another deployment, `400` for an invalid move such as a folder into its own descendant). An empty `failed` array means the whole batch applied. Items are applied one at a time in the order given, each in its own transaction, so earlier moves are **not** rolled back when a later item fails — the response is the record of what was applied. Access is checked per item with the same rules as the single-item move, so a batch mixing items the caller may and may not move applies the permitted ones and reports the rest. /api/v1/deployments/{deploymentId}/workspace/move: post: operationId: moveWorkspaceObject parameters: - in: path name: deploymentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/MoveWorkspaceObjectInput' description: MoveWorkspaceObjectInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Workbook' description: '' summary: Move a workspace item tags: - Workspace x-mint: content: >- Move any workspace item — a workbook, report, or folder — into a folder, in one unified endpoint. Returns the moved item. Request body: - `type` — the item type: `WORKBOOK`, `REPORT`, or `FOLDER`. - `id` — the id of the item to move. - `folderId` — the destination folder id, or `null` to move the item to the workspace root. For a folder, this becomes its new parent. Access requirements depend on the item type and mirror the per-type rules: - **Workbook** — manage access to the workbook, plus edit access to the destination folder when moving into one. - **Report** — edit access to the report (with the report-manage permission). - **Folder** — manage access to the folder being moved, plus manage or edit access to the destination parent folder. Moving a folder into one of its own descendants, or exceeding the maximum folder depth, is rejected with `400`. Returns `404` if the item does not exist or belongs to a different deployment. /api/v1/embed-tenants: get: operationId: listEmbedTenants parameters: - in: query name: search schema: oneOf: - type: string - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedTenantsPublicResponse' description: '' summary: List embed tenants tags: - Embed Tenants x-mint: content: >- List the account's embed tenants, cursor-paginated. Supports `first`/`after` pagination and a case-insensitive `search` substring match on the tenant name. Requires an admin API key. /api/v1/embed-tenants/{embedTenantName}: delete: operationId: deleteEmbedTenant parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). responses: '200': content: application/json: {} description: Successful response '204': description: Embed tenant deleted, or did not exist. summary: Delete embed tenant tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Deletes an embed tenant and everything inside it — users, groups, memberships, attributes, policies, and content — plus the tenant's `system:tenant:*` sharing group. Idempotent: deleting a tenant that does not exist succeeds. The name must already be in canonical form (lowercase, per the `embedTenantName` rule); unlike the routes below, a name that differs only in case is rejected with `400` rather than being lowercased, so a typo can never cascade-delete a tenant the caller did not name exactly. /api/v1/embed-tenants/{embedTenantName}/groups: get: operationId: getGroups parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserGroupsConnectionResponse' description: '' summary: List embed groups tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Lists the embed tenant's own groups (`embed_user_groups`), cursor-paginated, newest first, each with its member count. These are the groups an embed session references through `tenantGroups`; the implicit `system:tenant:*` sharing group is not included. post: operationId: createGroup parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateEmbedGroupInput' description: CreateEmbedGroupInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserGroupDTO' description: '' summary: Create an embed group tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Creates a group inside the embed tenant. The name must be unique within the tenant and may not start with `system:` (that prefix is reserved for platform-managed groups). The group is immediately usable as a `tenantGroups` entry when generating a creator-mode embed session, and reaches the data model as `system:tenant:{embedTenantName}:{name}`. Returns `400` if the name is taken or reserved. /api/v1/embed-tenants/{embedTenantName}/groups/{id}: delete: operationId: deleteGroup parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: path name: id required: true schema: type: integer description: Numeric id of the group, as returned by the groups endpoints. responses: '200': content: application/json: {} description: Successful response '204': description: Group deleted. summary: Delete an embed group tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Deletes one of the embed tenant’s groups. Returns `400` while the group still has members — remove them first — and `404` if the group does not exist in this tenant. get: operationId: getGroup parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: path name: id required: true schema: type: integer description: Numeric id of the group, as returned by the groups endpoints. responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserGroupDTO' description: '' summary: Get an embed group tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Returns one of the embed tenant’s groups with its member count, or `404` if no such group exists in this tenant. patch: operationId: updateGroup parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: path name: id required: true schema: type: integer description: Numeric id of the group, as returned by the groups endpoints. requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateEmbedGroupInput' description: UpdateEmbedGroupInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserGroupDTO' description: '' summary: Update an embed group tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Updates a group’s description. The name is deliberately immutable: it is part of the security context an embed session carries (`system:tenant:{embedTenantName}:{name}`), so renaming would silently detach the data-model access policies written against it — create a new group instead. Pass an empty `description` to clear it. /api/v1/embed-tenants/{embedTenantName}/groups/{id}/users: delete: operationId: removeGroupMembers parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: path name: id required: true schema: type: integer description: Numeric id of the group, as returned by the groups endpoints. requestBody: content: application/json: schema: $ref: '#/components/schemas/EmbedGroupMembersInput' description: EmbedGroupMembersInput required: false responses: '200': content: application/json: {} description: Successful response '204': description: Members removed. summary: Remove embed group members tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Removes one or more embed users (1–1000 per request) from a group, identified the same way as when adding them — exactly one of `externalId` or `embedUserId` each. Only this group’s membership is dropped; the users themselves and their other groups are left alone, and unlike adding, an unknown `externalId` is never provisioned. Idempotent: removing a user who is not a member is a no-op. Returns `204 No Content`, or `404` if the group does not exist in this tenant. get: operationId: getGroupMembers parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: path name: id required: true schema: type: integer description: Numeric id of the group, as returned by the groups endpoints. - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedUsersPublicResponse' description: '' summary: List embed group members tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Lists the embed users that belong to a group, cursor-paginated, most recently added first. Each member carries both its numeric `id` and its `externalId`. Returns `404` if the group does not exist in this tenant. post: operationId: addGroupMembers parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: path name: id required: true schema: type: integer description: Numeric id of the group, as returned by the groups endpoints. requestBody: content: application/json: schema: $ref: '#/components/schemas/EmbedGroupMembersInput' description: EmbedGroupMembersInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedGroupMembersMutationResponse' description: '' summary: Add embed group members tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Adds one or more embed users (1–1000 per request) to a group. Each member is identified by exactly one of `externalId` (the id passed to `generate-session`) or `embedUserId` (the numeric id this API returns). An `externalId` that has never signed in is provisioned as an embed user, so groups can be populated ahead of a user’s first session; an unknown `embedUserId` is a `404` instead. Memberships are added, never replaced: the user’s other groups — including the account-wide `groups` that drive data-model access — are left untouched. Idempotent: the response buckets every requested member into `addedMembers` or `unchangedMembers`. /api/v1/embed-tenants/{embedTenantName}/user: post: operationId: provisionEmbedUser parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). requestBody: content: application/json: schema: $ref: '#/components/schemas/ProvisionEmbedUserInput' description: ProvisionEmbedUserInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedUser' description: '' summary: Provision an embed user tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Creates or updates one embed user from the identity your own system knows. An embed user is otherwise created the first time they generate a session, so this is how an integration puts its own directory into Cube up front: a user provisioned here is immediately addressable — listable, searchable, assignable to groups, and selectable wherever the product offers a choice of users — before they have ever opened the embed. Idempotent, and the body is the desired state: provisioning an `externalId` that already exists updates it rather than failing. `email`, `userProfile.displayName` and `userProfile.picture` are overwritten when supplied and preserved when omitted; each group lane is REPLACED when supplied, preserved when omitted, and cleared by `[]`. The embed tenant itself is created on demand, so it need not exist yet. Everything set here is exactly what `generate-session` would have set, and a later session for the same `externalId` re-applies whatever it carries — so provisioning changes when a user exists, never what their session grants them. /api/v1/embed-tenants/{embedTenantName}/users: get: operationId: listEmbedUsers parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). - in: query name: search schema: description: Case-insensitive substring match against the embed user’s email or external id. oneOf: - type: string - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedUsersPublicResponse' description: '' summary: List embed users tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Lists the embed users belonging to one embed tenant, cursor-paginated and ordered by email. Alongside the numeric `id` this API uses, a user carries the `externalId` your integration knows it by (the id passed to `generate-session`) whenever it was recorded on the account — users provisioned before it was recorded come back without an `externalId`, though they stay addressable by it everywhere it is accepted as input. Use `search` to match a substring of the email or external id, or a complete external id, which resolves a user even when the response cannot echo it back. post: operationId: provisionEmbedUsers parameters: - in: path name: embedTenantName required: true schema: type: string description: Name of the embed tenant (the `embedTenantName` used to generate embed sessions). requestBody: content: application/json: schema: $ref: '#/components/schemas/ProvisionEmbedUsersInput' description: ProvisionEmbedUsersInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/ProvisionEmbedUsersResponse' description: '' summary: Provision embed users in bulk tags: - Embed Tenants x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Provisions up to 100 embed users in one request, each exactly as `POST /embed-tenants/{embedTenantName}/user` would. Use it to load a user directory into an embed tenant, and send further requests to cover a directory larger than one batch. **This endpoint is partially successful.** It returns `200` whenever the request itself is well formed, and reports each user separately: - `succeeded` — the users that were provisioned, in the order requested. - `failed` — the entries that were not, each with the `externalId` and an `error` carrying the `status` and `message` the single-user endpoint would have returned (`400` for a group name that does not exist, `429` once the tenant is at its embed-user limit). Users are applied one at a time in the order given, and earlier ones are not rolled back when a later one fails. Since provisioning is idempotent, resending the whole batch after fixing the failures is safe. A repeated `externalId` within one batch is applied once per entry, so the last one wins. /api/v1/embed/dashboard/{publicId}: get: operationId: getDashboard parameters: - in: path name: publicId required: true schema: type: string responses: '200': content: application/json: schema: $ref: '#/components/schemas/Dashboard' description: '' summary: Get an embeddable dashboard tags: - Embed x-mint: content: >- Returns the dashboard identified by its `publicId` — including its reports/widgets — resolved within the caller's embed session scope, for rendering inside an embedded view. Access is authorized against the embed user: the dashboard is returned when the user owns its workbook, has been granted workbook access (folder-based or direct), holds `EmbedDashboardRead` on the dashboard, or when it has been shared with all embed users (creator-mode flow). Returns `404` if the dashboard does not exist or is not visible to the caller. Signed embedding additionally requires the dashboard to have "Allow signed embedding" enabled; the trusted screenshoter and creator-mode session flows are exempt. Returns `403` when embedding is not permitted for the dashboard. patch: operationId: updateDashboardEmbedding parameters: - in: path name: publicId required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateDashboardEmbeddingInput' description: UpdateDashboardEmbeddingInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DashboardEmbeddingResponse' description: '' summary: Enable or disable signed embedding for a dashboard tags: - Embed x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Sets the dashboard's "Allow signed embedding" flag (`allowEmbed`), which gates the customer-signed embedding path: with the flag off, embed sessions fetching `GET /api/v1/embed/dashboard/{publicId}` receive `403`. Trusted cube-cloud session flows (screenshoter, creator mode) and dashboards shared with all embed users are not affected by this flag. Note that the flag alone does not make a dashboard embeddable — it must also be published and shared with the embed tenant. Returns `404` if the dashboard does not exist. /api/v1/embed/dashboard/{publicId}/comments: get: operationId: listDashboardComments parameters: - in: path name: publicId required: true schema: type: string - in: query name: includeResolved schema: oneOf: - type: boolean - type: 'null' - in: query name: resolvedOnly schema: oneOf: - type: boolean - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedDashboardCommentThreadsListResponse' description: '' summary: List comment threads on an embeddable dashboard tags: - Embed x-mint: content: >- Returns one page of comment threads — each a root comment plus its replies, oldest first — for the dashboard identified by its `publicId`, scoped to the caller's embed tenant. Threads are ordered newest-first by when they started, so a thread holds its place while it is being replied to. Open threads are returned by default; pass `includeResolved` to widen the page to resolved ones too, or `resolvedOnly` to replace the set with just those. A comment whose author deleted it is returned with an empty `body` and `removedAt` set, so a thread keeps its shape and the surviving replies stay readable. Requires a signed embed session scoped to an embed tenant. Every comment endpoint does: a conversation lives inside one embed tenant's partition, so a credential that names no tenant — an API key, a console session — has no conversation to be served and receives `403`. post: operationId: createDashboardComment parameters: - in: path name: publicId required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateEmbedDashboardCommentBody' description: CreateEmbedDashboardCommentBody required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedDashboardCommentDto' description: '' summary: Post a comment on an embeddable dashboard tags: - Embed x-mint: content: >- Starts a thread, or replies to one when `parentId` names a thread root. The comment is attributed to the calling embed user — the author is taken from the signed session, never from the request body. Nesting is one level deep: replying to a reply returns `400`, and `404` covers a `parentId` that names a comment on another dashboard, a deleted thread, or nothing at all. /api/v1/embed/dashboard/{publicId}/comments/mentionable-users: get: operationId: listMentionableEmbedUsers parameters: - in: path name: publicId required: true schema: type: string - in: query name: search schema: oneOf: - maxLength: 255 type: string - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedMentionableUsersListResponse' description: '' summary: List embed users mentionable in a dashboard comment tags: - Embed x-mint: content: >- Returns one page of the caller's fellow embed users, for a mention autocomplete, ordered by username. Scoped to the caller's own embed tenant and to embed users only — console users of the host tenant are never returned. Pass `search` to filter by username or email. `email` may be `null`: `username` is the only identity field an embed user is guaranteed to have. /api/v1/embed/dashboard/{publicId}/comments/{commentId}: delete: operationId: removeDashboardComment parameters: - in: path name: publicId required: true schema: type: string - in: path name: commentId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete a comment on an embeddable dashboard tags: - Embed x-mint: content: >- Soft-deletes a comment. Author only. Deleting a thread root takes its replies with it, so a deleted thread leaves nothing behind. Deleting a reply re-derives its thread's last-activity marker, so the thread does not keep its position on the strength of a message that is gone. patch: operationId: updateDashboardComment parameters: - in: path name: publicId required: true schema: type: string - in: path name: commentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateEmbedDashboardCommentBody' description: UpdateEmbedDashboardCommentBody required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedDashboardCommentDto' description: '' summary: Edit a comment on an embeddable dashboard tags: - Embed x-mint: content: >- Replaces a comment's body and stamps `editedAt`. Author only: another embed user's comment returns `403`, and a comment that is not on this dashboard returns `404` rather than revealing that it exists elsewhere. /api/v1/embed/dashboard/{publicId}/comments/{commentId}/resolve: post: operationId: setDashboardCommentResolved parameters: - in: path name: publicId required: true schema: type: string - in: path name: commentId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/SetEmbedDashboardCommentResolvedBody' description: SetEmbedDashboardCommentResolvedBody required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/EmbedDashboardCommentThreadDto' description: '' summary: Resolve or re-open a comment thread tags: - Embed x-mint: content: >- Marks a thread resolved, or re-opens it. Author only — the embed user who started the thread. The console surface is wider: there, a workbook editor may also resolve someone else's thread. That branch has no analogue here, because an embed viewer holds no workbook rights at all, so authorship is the whole rule. Threads only — a reply has no resolve state of its own, and one carrying it would put two answers on the same thread, so `400` is returned for a reply's id. A thread whose root was deleted while replies survive is still resolvable, or it would sit in the unresolved list forever. /api/v1/embed/dashboard/{publicId}/python-run: post: operationId: postDashboardPythonRun parameters: - in: path name: publicId required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/EmbedPythonFilteredRunInput' description: EmbedPythonFilteredRunInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/PythonAnalysisFilteredRun' description: '' summary: Run a python report over dashboard-filtered SQL tags: - Embed x-mint: content: >- Re-runs the Python analysis attached to one of this dashboard's reports over `sqlQuery` — the report's own query with the dashboard's filters and time grains already applied — and returns the result **without persisting it**. Authorized against the dashboard, exactly as `GET /api/v1/embed/dashboard/{publicId}` is. The `reportVersionId` must be one of that dashboard's published report snapshots and must belong to `reportId`; anything else returns `403`. The Python itself is read server-side from that snapshot — it is never supplied by the caller. The analysis runs under the calling embed user's own security context, so row-level security applies to the viewer, and the stored result other viewers see is left untouched. Results are cached briefly per (report, code, SQL, user); failures are not cached. Returns `403` when Python analysis is not enabled for the account. /api/v1/embed/generate-session: post: operationId: generateSession requestBody: content: application/json: schema: $ref: '#/components/schemas/GenerateSession' description: GenerateSessionDTO required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/GenerateSessionResponse' description: '' summary: Generate an embed session tags: - Embed x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Creates a one-time embed session for a deployment and returns its `sessionId`. The session captures the embed context that will be baked into the embed token once redeemed — the target `deploymentId`, the end user's identity (`externalId` / `email` / `userProfile`), their group memberships, `userAttributes`, and an optional `securityContext`. Exchange the returned `sessionId` for a signed embed JWT via `POST /api/v1/embed/session/token` (single use). The end user can be assigned to two independent kinds of group, which serve different purposes: - **`groups`** — global, tenant-wide groups for **data-model access control**. Their names are passed verbatim into the Cube security context (`cubeCloud.groups`), where your data model's `access_policy` rules use them to gate cubes, views, members, and row-/column-level filters. They must already exist in the tenant. - **`tenantGroups`** — per-embed-tenant groups for **sharing and organizing content within a single embed tenant** (e.g. sharing a workbook or dashboard with a group in Creator Mode). Requires `creatorMode: true` and `embedTenantName`; create them inline via `tenantGroupDefinitions`. In the security context they are namespaced as `system:tenant:{embedTenantName}:group:{group}`, so they never collide with a same-named global group. See the individual request-body fields for the full contract. `deploymentId` is required and the caller must have read access to it. Embedding must be enabled for the tenant, otherwise `403` is returned. /api/v1/embed/session/revoke: post: operationId: revokeSession requestBody: content: application/json: schema: $ref: '#/components/schemas/RevokeEmbedSessionInput' description: RevokeEmbedSessionInput required: false responses: '200': content: application/json: {} description: Successful response '204': description: Session revoked, or did not exist. summary: Revoke an embed session tags: - Embed x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Ends an embed session from the server side — call it from your application's logout handler. Pass the `sessionId` that `POST /api/v1/embed/generate-session` returned. Works in either state the session can be in: an id that has not been exchanged yet can no longer be redeemed via `POST /api/v1/embed/session/token`, and the token an already-exchanged id produced is rejected with `401` from this moment on. The embedded iframe does not tear itself down — remove it on logout as before. Idempotent: revoking an unknown, expired or already-revoked id also responds `204` — so the response alone never tells you whether a token was still revocable. That depends on Cube, not on the client library you call from: only tokens Cube issued after this endpoint shipped carry the claim revocation is checked against, and an older token keeps working until it expires on its own, within 24 hours. A Cube API token the embed obtained from `POST /api/v1/deployments/{deploymentId}/token` is a separate credential and is not affected. Embedding must be enabled for the account, otherwise `403` is returned. /api/v1/embed/session/token: post: operationId: postTokenBySessionId requestBody: content: application/json: schema: $ref: '#/components/schemas/PostTokenBySessionIdInput' description: PostTokenBySessionIdInputDTO required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/GenerateEmbedTokenResponse' description: '' summary: Exchange a session for an embed token tags: - Embed x-mint: content: >- Exchanges a one-time embed session id (created via `POST /api/v1/embed/generate-session`) for a signed, short-lived embed JWT used to authenticate the embedded analytics in the browser. The session is **single-use**: it is consumed (deleted) on the first successful exchange, so a given `sessionId` can be redeemed only once. The returned token is signed with the tenant's embed secret, issued by `cubecloud`, and expires after 24 hours. This endpoint is unauthenticated — it is called from the embedding client and the session id itself is the credential. Returns `401` if the session id is unknown or has already been redeemed. /api/v1/external-documents/{externalWorkbookId}/placements: get: operationId: listExternalDocumentPlacements parameters: - in: path name: externalWorkbookId required: true schema: type: string - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/ExternalDocumentPlacementsListResponse' description: '' '422': description: >- The document holds more placements than this endpoint will report on. A state, not a malformed request: the answer is deliberately an error rather than a page that silently omits placements no cursor can reach. summary: List the Cube placements in an external spreadsheet tags: - External Documents x-mint: content: >- Every block of Cube-written cells in the external document `externalWorkbookId` — a Google Drive file id, or the custom property the Excel add-in writes — across the whole tenant. Unlike `GET /api/v1/deployments/{deploymentId}/reports?externalWorkbookId=`, which lists only the reports the caller can read, this endpoint also reports the placements they **cannot**: each entry carries `access`, which is `GRANTED` when the caller may open the exploration and `DENIED` when they may not. It is how a recipient of a shared workbook learns that a block they are looking at is backed by an exploration nobody has shared with them, and who to ask. A `DENIED` entry carries only the placement's address (`resultLocation`/`sheetId`/`sheetName`/`anchorCell`/`endResultCell`/`host`), its opaque `reportId`/`placementId`, the owning `deploymentId`, the placement's `placedAt`/`refreshedAt` timestamps, and the exploration's `owner` — including their email address, so the recipient can ask for access. `owner` is `null` for an embed-partition exploration whose owning user record no longer exists — embed report ownership carries no foreign key, so the row can outlive its owner; a main-workspace exploration's owner always exists, since deleting the owner cascades to delete the report. `reportName` is `null` on a denied entry — the name is withheld along with the exploration — and reading the report itself still answers `403`. Results are returned in pages using cursor-based pagination: pass `first` to set the page size and `after` (the previous response's `pageInfo.endCursor`) to fetch the next page. Omitting `first` returns every placement in the document. A document holding more than 500 placed explorations, or more than 2000 placements in total, is answered with `422` rather than a truncated page — an inventory that looks complete but is not would hide the very placement a recipient needs to see. /api/v1/github/installations: get: operationId: installations parameters: - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/GitHubInstallationsListResponse' description: '' summary: List the user's GitHub App installations (orgs/accounts) tags: - GitHub /api/v1/github/installations/{installationId}/repositories: get: operationId: repositories parameters: - in: path name: installationId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/GitHubReposListResponse' description: '' summary: List repositories accessible to a GitHub App installation tags: - GitHub /api/v1/github/repositories/{owner}/{repo}/branches: get: operationId: branches parameters: - in: path name: owner required: true schema: type: string - in: path name: repo required: true schema: type: string - in: query name: installationId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/GitHubBranchesListResponse' description: '' summary: List branches of a repository tags: - GitHub /api/v1/github/status: get: operationId: status responses: '200': content: application/json: schema: $ref: '#/components/schemas/GitHubConnectStatusResponse' description: '' summary: Whether GitHub is linked, plus the link/install URLs tags: - GitHub /api/v1/oauth-integrations: get: operationId: listOAuthIntegrations responses: '200': content: application/json: schema: items: $ref: '#/components/schemas/OAuthIntegration' type: array description: '' summary: List OAuth integrations tags: - OAuth Integrations post: operationId: createOAuthIntegration requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateOAuthIntegrationInput' description: CreateOAuthIntegrationInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/OAuthIntegration' description: '' summary: Create OAuth integration tags: - OAuth Integrations /api/v1/oauth-integrations/{id}: delete: operationId: deleteOAuthIntegration parameters: - in: path name: id required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete OAuth integration tags: - OAuth Integrations get: operationId: getOAuthIntegration parameters: - in: path name: id required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/OAuthIntegration' description: '' summary: Get OAuth integration tags: - OAuth Integrations put: operationId: updateOAuthIntegration parameters: - in: path name: id required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateOAuthIntegrationInput' description: UpdateOAuthIntegrationInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/OAuthIntegration' description: '' summary: Update OAuth integration tags: - OAuth Integrations /api/v1/oidc-token-configs: get: operationId: listOidcTokenConfigs responses: '200': content: application/json: schema: items: $ref: '#/components/schemas/OidcTokenConfig' type: array description: '' summary: List OIDC token configs tags: - OIDC Token Configs post: operationId: createOidcTokenConfig requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateOidcTokenConfigInput' description: CreateOidcTokenConfigInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/OidcTokenConfig' description: '' summary: Create OIDC token config tags: - OIDC Token Configs /api/v1/oidc-token-configs/{id}: delete: operationId: deleteOidcTokenConfig parameters: - in: path name: id required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete OIDC token config tags: - OIDC Token Configs get: operationId: getOidcTokenConfig parameters: - in: path name: id required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/OidcTokenConfig' description: '' summary: Get OIDC token config tags: - OIDC Token Configs put: operationId: updateOidcTokenConfig parameters: - in: path name: id required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateOidcTokenConfigInput' description: UpdateOidcTokenConfigInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/OidcTokenConfig' description: '' summary: Update OIDC token config tags: - OIDC Token Configs /api/v1/regions: get: operationId: listRegions parameters: - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/RegionsListResponse' description: '' summary: List regions tags: - Regions x-mint: content: >- Lists the regions available to the account, cursor-paginated via `first`/`after`. The legacy `data` field returns the full, unpaginated list and is deprecated — use `items` + `pageInfo` instead. /api/v1/roles: get: operationId: getRoles parameters: - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/RolesListResponse' description: '' summary: List custom roles tags: - Roles x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Lists the tenant's custom roles, newest first, cursor-paginated via `first`/`after`. Cube's built-in roles are not included — they are not tenant data. post: operationId: createRole requestBody: content: application/json: schema: $ref: '#/components/schemas/RoleCreateBody' description: RoleCreateBody required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Role' description: '' '400': description: >- The name is one of the built-in role names, or a policy grants no action, names no resource, or scopes a `Deployment` to something that is not a deployment id. '409': description: A role with that name already exists. summary: Create a custom role tags: - Roles x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Creates a role and returns it with the `id` to assign it by. Role names are unique, so recreating one that already exists answers `409`. To scope the role to specific deployments, send a `Deployment` policy whose `resources` are the deployment ids as strings. A role usually also needs a `Global` policy naming the holder's license tier — `AIBIView`, `AIBIExplore` or `AIBIDevelop` — which is what the console calls the role's Base Role. Pick a tier that covers the deployment actions you grant: apart from the handful of actions available at every tier, the console forces Developer (`AIBIDevelop`), so a lower tier here produces a role its role builder would not have let you save. The current list of those actions is in [Auto-bump to Developer](https://docs.cube.dev/admin/users-and-permissions/custom-roles#auto-bump-to-developer). For example: ```json { "name": "team-analytics", "policies": [ { "resourceType": "Global", "actions": ["AIBIDevelop"], "resources": ["All"] }, { "resourceType": "Deployment", "actions": ["DeploymentRead", "SchemaRead", "SqlRunnerRead"], "resources": ["1734"] } ] } ``` The tier is **not** required and is **not** derived from the deployment actions: a role sent without one is accepted and simply confers no tier, so a user holding only that role gets the deployment grants and still cannot use the product. That is deliberate — a user holds the union of their roles, so a role that only adds a deployment scope beside another role carrying the tier is valid — but it means nothing warns you. Omit the `Global` policy only when some other role supplies the tier. Note the console does require one on every role it writes, so a role created here without a tier shows an unset Base Role when opened in the role builder. Use `["All"]` as `resources` to cover every deployment, and `"All"` as the single action for full access to the deployments in scope. A policy is rejected when it grants no action, when it names no resource, or when a `Deployment` resource is not a deployment id — pass the numeric id returned by POST /build/api/v1/deployments, not a slug or a name. Ids are checked for shape, not existence, so an id whose deployment was since deleted is kept and simply grants nothing. /api/v1/roles/{roleId}: delete: operationId: deleteRole parameters: - in: path name: roleId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response '204': description: Role deleted. '404': description: No custom role has that id. summary: Delete a custom role tags: - Roles x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Deletes the role and every assignment of it, from users and from groups. Built-in roles cannot be deleted. get: operationId: getRole parameters: - in: path name: roleId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/Role' description: '' '404': description: No custom role has that id. summary: Get a custom role tags: - Roles x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Returns one custom role by id, with its policies. put: operationId: updateRole parameters: - in: path name: roleId required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/RoleUpdateBody' description: RoleUpdateBody required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Role' description: '' '400': description: >- `name` or `policies` was `null`, the new name is one of the built-in role names, or a policy is not a valid one. '404': description: No custom role has that id. '409': description: A role with that name already exists. summary: Update a custom role tags: - Roles x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Updates the fields present in the body and leaves the rest alone. Sending `policies` replaces the role's policies outright, so read the role first if you mean to add one rather than start over. Renaming to a name another role already holds answers `409`. Built-in roles cannot be updated. /api/v1/roles/{roleId}/users/{userId}: delete: operationId: removeRoleFromUser parameters: - in: path name: roleId required: true schema: type: number - in: path name: userId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response '204': description: Role removed, or was not held. '404': description: The user is unknown. summary: Remove a role from a user tags: - Roles x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Takes the role away from the user. Idempotent — removing a role the user does not hold changes nothing. Returns `404` if the user is unknown. put: operationId: assignRoleToUser parameters: - in: path name: roleId required: true schema: type: number - in: path name: userId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response '204': description: Role assigned, or already held. '404': description: >- The user or the role is unknown. Cube's Admin role is not resolvable here, so its id answers `404` as well. summary: Assign a role to a user tags: - Roles x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Gives the user everything the role grants. Idempotent — assigning a role the user already holds changes nothing. Returns `404` if either the user or the role is unknown. Unlike the other endpoints here, this one is not limited to your custom roles: it also accepts the id of a built-in role, and assigning one grants everything that role confers. **Cube's Admin role is the exception and cannot be granted this way** — it is not among the built-in roles this endpoint resolves, so its id returns `404`. No call to this endpoint can make a user an account-wide administrator. /api/v1/spec: get: operationId: getSpec responses: '200': content: application/json: schema: additionalProperties: true type: object description: The OpenAPI 3.1 document summary: Get the OpenAPI specification tags: - OpenAPI Spec x-mint: content: >- The full OpenAPI 3.1 document for this API, as served by the build handling the request — every path, parameter, request body and schema. Intended for runtime discovery by clients and agents; `cube spec` wraps it with filtering. /api/v1/tenant/settings: get: operationId: getTenantSettings responses: '200': content: application/json: schema: $ref: '#/components/schemas/TenantSettings' description: '' summary: Get tenant settings tags: - Tenant Settings put: operationId: updateTenantSettings requestBody: content: application/json: schema: $ref: '#/components/schemas/TenantSettingsInput' description: TenantSettingsInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/TenantSettings' description: '' summary: Update tenant settings tags: - Tenant Settings /api/v1/usage-analytics/token: post: operationId: createToken responses: '200': content: application/json: schema: $ref: '#/components/schemas/UsageAnalyticsTokenResponse' description: '' summary: Issue a Cube API token for Usage Analytics tags: - Usage Analytics x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Issues a short-lived Cube API token for Cube's internal **Usage Analytics** deployment — the data shown on **Admin → Usage Analytics** — so you can query your own usage and billing data programmatically (REST API, BI tools, scripts) instead of only through the embedded page. The token is scoped to your account: it carries the same server-resolved security context as the embedded Usage Analytics page, so queries only ever see your own data. Send it as `Authorization: Bearer ` on requests to the returned `apiUrl` (the deployment's [Cube REST API](/reference/core-data-apis/rest-api)). Tokens expire after 1 hour (see `expiresAt`). Issue a fresh one per session or scheduled refresh — issuing is idempotent and cheap. Requires Usage Analytics to be enabled for the account, otherwise `404` is returned. /api/v1/user-attribute-values: post: operationId: upsertUserAttributeValue requestBody: content: application/json: schema: $ref: '#/components/schemas/UserAttributeValueCreateInput' description: UserAttributeValueCreateInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserAttributeValue' description: '' summary: Upsert user attribute value tags: - User Attribute Values /api/v1/user-attribute-values/{userId}: get: operationId: getUserAttributeValues parameters: - in: path name: userId required: true schema: type: number responses: '200': content: application/json: schema: items: $ref: '#/components/schemas/UserAttributeValue' type: array description: '' summary: Get user attribute values tags: - User Attribute Values /api/v1/user-attributes: get: operationId: getUserAttributes parameters: - in: query name: offset schema: oneOf: - type: integer - type: 'null' - in: query name: limit schema: oneOf: - type: integer - type: 'null' - in: query name: name schema: oneOf: - type: string - type: 'null' - in: query name: type schema: oneOf: - $ref: '#/components/schemas/GetUserAttributesQueryType' - type: 'null' - in: query name: after schema: type: string - in: query name: first schema: minimum: 1 type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserAttributesListResponse' description: '' summary: Get user attributes tags: - User Attributes x-mint: content: >- List user attributes, newest first, cursor-paginated via `first`/`after`. The legacy `offset`/`limit` query params and the `data`/`count` response fields are deprecated — use `items` + `pageInfo` instead. post: operationId: createUserAttribute requestBody: content: application/json: schema: $ref: '#/components/schemas/UserAttributeCreateInput' description: UserAttributeCreateInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserAttribute' description: '' summary: Create user attribute tags: - User Attributes /api/v1/user-attributes/{id}: put: operationId: updateUserAttribute parameters: - in: path name: id required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UserAttributeUpdateInput' description: UserAttributeUpdateInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserAttribute' description: '' summary: Update user attribute tags: - User Attributes /api/v1/user-oauth-tokens: get: operationId: listUserOAuthTokens responses: '200': content: application/json: schema: items: $ref: '#/components/schemas/UserOAuthToken' type: array description: '' summary: List user OAuth tokens tags: - User OAuth Tokens /api/v1/user-oauth-tokens/{integrationId}: delete: operationId: revokeUserOAuthToken parameters: - in: path name: integrationId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Revoke user OAuth token tags: - User OAuth Tokens get: operationId: getUserOAuthToken parameters: - in: path name: integrationId required: true schema: type: number responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserOAuthToken' description: '' summary: Get user OAuth token tags: - User OAuth Tokens /api/v1/user-oauth-tokens/{integrationId}/initiate: post: operationId: initiateOAuthFlow parameters: - in: path name: integrationId required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Initiate OAuth flow tags: - User OAuth Tokens /api/v1/users: post: operationId: createUser requestBody: content: application/json: schema: $ref: '#/components/schemas/UserCreateInput' description: UserCreateInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/User' description: '' summary: Create user tags: - Users Admin /api/v1/users/bulk: post: operationId: bulkUserAction requestBody: content: application/json: schema: $ref: '#/components/schemas/BulkUserActionInput' description: BulkUserActionInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/BulkUserActionPayload' description: '' summary: Apply an action to many users tags: - Users Admin x-mint: content: >- **🔒 Admin only.** Requires administrator privileges — the authenticated principal (API key, embed JWT, or any bearer token) must belong to a user with the admin role. Apply one action to up to 100 users in a single request. Request body: - `action` — `DEACTIVATE` (revoke access and end the users' sessions), `ACTIVATE` (restore access to deactivated users), or `DELETE` (remove the users outright). - `userIds` — the users to act on. Repeated ids are collapsed, so the response holds exactly one entry per distinct user requested. **This endpoint is partially successful.** It returns `200` whenever the request itself is well formed, and reports each user's outcome separately: - `succeeded` — ids of the users the action was applied to. - `failed` — the users it was not applied to, each with an `error` carrying the `status` and `message` the single-user endpoint would have returned (`404` for an unknown id, `403` when a guard refuses the change). An empty `failed` array means the whole batch applied. Users are processed one at a time in the order given, each in its own transaction, so earlier changes are **not** rolled back when a later user fails — the response is the record of what was applied. Every guard of the single-user endpoints still applies, per user: - The caller's own id fails rather than the request: `DEACTIVATE` on self is `403`, `DELETE` on self is `400`. - A tenant must always keep at least one active, direct admin, so the action that would remove the last one fails with `403` while the rest of the batch still applies. Reapplying an action a user is already in (deactivating a deactivated user) succeeds as a no-op. /api/v1/users/me/settings: patch: operationId: updateMySettings requestBody: content: application/json: schema: $ref: '#/components/schemas/UserSettingsInput' description: UserSettings required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/User' description: '' summary: Update my settings tags: - Users x-mint: content: >- Merge a partial patch into the authenticated user's own settings. Omitted fields are left as they are; `sheets` merges field-by-field, and an explicit `null` clears it. /api/v1/users/{id}: delete: operationId: deleteUser parameters: - in: path name: id required: true schema: type: number responses: '200': content: application/json: {} description: Successful response summary: Delete user tags: - Users Admin put: operationId: updateUser parameters: - in: path name: id required: true schema: type: number requestBody: content: application/json: schema: $ref: '#/components/schemas/UserUpdateInput' description: UserUpdateInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/User' description: '' summary: Update user tags: - Users Admin /build/api/v1/deployments: post: operationId: createDeployment requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateDeploymentInput' description: CreateDeploymentInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Deployment' description: '' summary: Create a deployment with an empty starter project and trigger its first build tags: - Deployment Creation x-mint: content: >- Scaffolds an empty starter project and triggers the first build. When `creationMethod` is `github`, no starter project is scaffolded — connect a repository afterwards via POST /build/api/v1/deployments/:deploymentId/github/connect. /build/api/v1/deployments/{deploymentId}/branches: delete: operationId: removeBranch parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: branchName required: true schema: type: string - in: query name: removeOnUpstream required: false schema: type: boolean default: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DataModelWriteResponse' description: '' summary: Delete a branch tags: - Data Model x-mint: content: >- Deletes the branch and its git ref — the API-side counterpart of pruning a branch in Cube Cloud, for callers that create branches per run (a CI job syncing dbt on every pull request, say) and would otherwise accumulate them forever. Child branches are re-parented onto the deleted branch’s own parent, and anyone viewing the branch in dev mode is moved back to the default branch, so a branch that is currently open is deleted rather than refused. The deploy branch cannot be deleted (400) and an unknown branch is a 404. `removeOnUpstream=true` additionally deletes the branch on the connected git provider (GitHub/GitLab). It defaults to `false`, so by default the branch is removed from Cube Cloud only and the ref on your own remote is left alone — a CI job cleaning up branches it created itself should opt in explicitly. `branchName` is a query parameter rather than a path segment because branch names contain slashes (`dbt-sync/main-20260817120000-a1b2c3d4`). get: operationId: listBranches parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/BranchesListResponse' description: '' summary: List a deployment's branches tags: - Data Model post: operationId: createBranch parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CreateBranchRequest' description: CreateBranchRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DevBranchResponse' description: '' summary: Create a branch (optionally entering dev mode on it) tags: - Data Model /build/api/v1/deployments/{deploymentId}/branches/staging-environment: put: operationId: setBranchStagingEnvironment parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/SetBranchStagingEnvironmentRequest' description: SetBranchStagingEnvironmentRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/SetBranchStagingEnvironmentResponse' description: '' summary: Enable or disable a branch's staging environment tags: - Data Model x-mint: content: >- Enabling a branch keeps its staging environment always active and accessible at `/dev-mode/{branchName}/cubejs-api/v1`; disabled (the default) it is only active while the branch is viewed in Cube Cloud. Enabled branches are the ones listed by `GET /api/v1/deployments/{deploymentId}/environments?type=staging`. Only shared branches qualify — personal dev branches and the deploy branch are rejected. /build/api/v1/deployments/{deploymentId}/commit: post: operationId: commitChanges parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CommitChangesRequest' description: CommitChangesRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DataModelWriteResponse' description: '' summary: Commit (and push) the active branch's pending changes tags: - Data Model /build/api/v1/deployments/{deploymentId}/data-model/file-hashes: get: operationId: fileHashes parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: live schema: oneOf: - type: boolean - type: 'null' - in: query name: branchName schema: oneOf: - type: string - type: 'null' - in: query name: useDeployProjectRoot schema: oneOf: - type: boolean - type: 'null' responses: '200': content: application/json: schema: additionalProperties: $ref: '#/components/schemas/FileHash' type: object description: Map of project-relative file path to its content hash summary: Content hashes of the current data-model files (for upload diffing) tags: - Data Model Uploads /build/api/v1/deployments/{deploymentId}/data-model/files: delete: operationId: removeFiles parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/RemoveDataModelFilesInput' description: RemoveDataModelFilesInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DataModelWriteResponse' description: '' summary: Delete data-model source files tags: - Data Model get: operationId: listFiles parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: withContent required: false schema: type: boolean - in: query name: branchName required: false schema: type: string - in: query name: showLastCLIUpload required: false schema: type: boolean - in: query name: after schema: oneOf: - type: string - type: 'null' - in: query name: first schema: oneOf: - minimum: 1 type: integer - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/SourceTreeResponse' description: '' summary: List the data-model source files for a deployment tags: - Data Model x-mint: content: >- Returns the data-model file tree. `first`/`after` (from the shared cursor params) paginate the **top-level** tree nodes only — a single node can carry a large subtree, so this bounds the number of roots returned, not the total file count. Omit `first` to get the whole tree. put: operationId: updateFiles parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateDataModelFilesInput' description: UpdateDataModelFilesInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DataModelWriteResponse' description: '' summary: Create or overwrite data-model source files tags: - Data Model /build/api/v1/deployments/{deploymentId}/data-model/files/rename: post: operationId: renameFiles parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/RenameDataModelFilesInput' description: RenameDataModelFilesInput required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DataModelWriteResponse' description: '' summary: Rename data-model source files tags: - Data Model /build/api/v1/deployments/{deploymentId}/data-model/upload/file: post: operationId: uploadFile parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: live schema: oneOf: - type: boolean - type: 'null' - in: query name: branchName schema: oneOf: - type: string - type: 'null' - in: query name: useDeployProjectRoot schema: oneOf: - type: boolean - type: 'null' requestBody: content: multipart/form-data: schema: allOf: - $ref: '#/components/schemas/UploadFileBody' - type: object properties: file: type: string format: binary responses: '200': content: application/json: {} description: Successful response summary: Upload a single file into an open transaction tags: - Data Model Uploads /build/api/v1/deployments/{deploymentId}/data-model/upload/finish: post: operationId: finishUpload parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: live schema: oneOf: - type: boolean - type: 'null' - in: query name: branchName schema: oneOf: - type: string - type: 'null' - in: query name: useDeployProjectRoot schema: oneOf: - type: boolean - type: 'null' requestBody: content: application/json: schema: $ref: '#/components/schemas/FinishUploadBody' description: FinishUploadBody required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/FinishUploadResponse' description: '' summary: Finish the upload transaction (prune removed files) and trigger a build tags: - Data Model Uploads /build/api/v1/deployments/{deploymentId}/data-model/upload/start: post: operationId: startUpload parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: live schema: oneOf: - type: boolean - type: 'null' - in: query name: branchName schema: oneOf: - type: string - type: 'null' - in: query name: useDeployProjectRoot schema: oneOf: - type: boolean - type: 'null' responses: '200': content: application/json: schema: $ref: '#/components/schemas/StartUploadResponse' description: '' summary: Start a data-model upload transaction tags: - Data Model Uploads /build/api/v1/deployments/{deploymentId}/data-model/validate: get: operationId: validateDataModel parameters: - in: path name: deploymentId required: true schema: type: integer - in: query name: branchName required: false schema: type: string - in: query name: devMode required: false schema: type: boolean responses: '200': content: application/json: schema: $ref: '#/components/schemas/DataModelValidationResponse' description: '' summary: Compile a deployment's data model and report compilation errors tags: - Data Model x-mint: content: >- Asks the branch's own Cube runtime for `GET /cubejs-api/v1/meta` — the same call the console makes in dev mode — so the verdict is the one that branch's API would give. With neither parameter it validates the deploy branch (production). `branchName` validates a named branch, and `devMode=true` validates the caller's active dev-mode branch; the two are mutually exclusive. Answers 200 with `valid: false` and the compiler's errors when the model doesn't compile — a broken model is a result, not a request error. /build/api/v1/deployments/{deploymentId}/dev-mode: delete: operationId: stopDevMode parameters: - in: path name: deploymentId required: true schema: type: integer responses: '200': content: application/json: schema: $ref: '#/components/schemas/DataModelWriteResponse' description: '' summary: Exit dev mode tags: - Data Model post: operationId: startDevMode parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/StartDevModeRequest' description: StartDevModeRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/DevBranchResponse' description: '' summary: Enter dev mode (switch to a branch) tags: - Data Model /build/api/v1/deployments/{deploymentId}/github/connect: post: operationId: connect parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/ConnectGitHubRequest' description: ConnectGitHubRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/Deployment' description: '' summary: Connect a deployment to a GitHub repository and trigger a build tags: - GitHub Connection /build/api/v1/deployments/{deploymentId}/merge: post: operationId: mergeIntoParentBranch parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/MergeIntoParentBranchRequest' description: MergeIntoParentBranchRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/MergeResponse' description: '' summary: Merge a branch into its parent branch (git-flow merge) tags: - Data Model /build/api/v1/deployments/{deploymentId}/merge-to-default: post: operationId: mergeToDefaultBranch parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/MergeToDefaultBranchRequest' description: MergeToDefaultBranchRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/MergeResponse' description: '' summary: Merge a branch straight into the deploy (default) branch tags: - Data Model /build/api/v1/deployments/{deploymentId}/pull: post: operationId: pull parameters: - in: path name: deploymentId required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/PullRequest' description: PullRequest required: false responses: '200': content: application/json: schema: $ref: '#/components/schemas/PullResponse' description: '' summary: Pull the latest for a branch from its remote and rebuild if changed tags: - Data Model components: securitySchemes: bearerAuth: type: http scheme: bearer description: 'Token authentication. Send `Authorization: Bearer `.' schemas: AddNotificationRecipientsInput: properties: recipients: description: Recipients to subscribe (1–1000 per request) items: $ref: '#/components/schemas/NotificationRecipientInput' maxItems: 1000 minItems: 1 type: array required: - recipients type: object AdvanceCreationStepInput: properties: creationStep: $ref: '#/components/schemas/CreationStep' required: - creationStep type: object AgentSuggestionsListResponse: properties: items: items: type: string type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object ApiKeyCreatedResponse: properties: allowedEndpoints: oneOf: - items: type: string type: array - type: 'null' createdAt: oneOf: - format: date type: string - format: date-time type: string deploymentIds: oneOf: - items: type: integer type: array - type: 'null' expiresAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' id: type: integer lastUsedAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' name: type: string suffix: oneOf: - type: string - type: 'null' token: type: string updatedAt: oneOf: - format: date type: string - format: date-time type: string userId: type: integer required: - id - userId - name - createdAt - updatedAt - token type: object ApiKeyResponse: properties: allowedEndpoints: oneOf: - items: type: string type: array - type: 'null' createdAt: oneOf: - format: date type: string - format: date-time type: string deploymentIds: oneOf: - items: type: integer type: array - type: 'null' expiresAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' id: type: integer lastUsedAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' name: type: string suffix: oneOf: - type: string - type: 'null' updatedAt: oneOf: - format: date type: string - format: date-time type: string userId: type: integer required: - id - userId - name - createdAt - updatedAt type: object ApiKeysListResponse: properties: items: items: $ref: '#/components/schemas/ApiKeyResponse' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object AppConfigResponse: properties: aiPaywalled: type: boolean appTheme: oneOf: - $ref: '#/components/schemas/AppTheme' - type: 'null' applyThemeGlobally: type: boolean boardDashboardsEnabled: type: boolean creatorMode: oneOf: - $ref: '#/components/schemas/CreatorMode' - type: 'null' dashboardAppsEnabled: type: boolean embedding: oneOf: - $ref: '#/components/schemas/EmbedSettings' - type: 'null' restrictDataDownload: type: boolean sheetsAgentChatEnabled: type: boolean sheetsUi: oneOf: - $ref: '#/components/schemas/SheetsUiSettings' - type: 'null' timezoneSettings: oneOf: - $ref: '#/components/schemas/TimezoneSettings' - type: 'null' required: - applyThemeGlobally - restrictDataDownload - sheetsAgentChatEnabled - dashboardAppsEnabled - boardDashboardsEnabled - aiPaywalled type: object AppTheme: properties: dark: $ref: '#/components/schemas/AppThemeScheme' deprecated: true description: 'Deprecated: use palette and logoUrl instead.' light: $ref: '#/components/schemas/AppThemeScheme' deprecated: true description: 'Deprecated: use palette and logoUrl instead.' logoUrl: type: string palette: $ref: '#/components/schemas/AppThemePalette' typography: oneOf: - $ref: '#/components/schemas/AppThemeTypography' - type: 'null' required: - palette - logoUrl - light - dark type: object AppThemeCodePalette: properties: saturation: oneOf: - maximum: 100 type: number minimum: 0 - type: 'null' type: object AppThemeFontRef: properties: fontRef: type: string fontWeight: type: number required: - fontRef - fontWeight type: object AppThemePalette: properties: accent: oneOf: - $ref: '#/components/schemas/AppThemePaletteSeed' - type: 'null' base: oneOf: - $ref: '#/components/schemas/AppThemePaletteSeed' - type: 'null' contrastLevel: oneOf: - maximum: 100 type: number minimum: 0 - type: 'null' pastel: oneOf: - type: boolean - type: 'null' surfaceMode: oneOf: - $ref: '#/components/schemas/AppThemeSurfaceMode' - type: 'null' themes: oneOf: - $ref: '#/components/schemas/AppThemePaletteThemes' - type: 'null' type: object AppThemePaletteSeed: properties: color: oneOf: - type: string - type: 'null' hue: oneOf: - maximum: 360 type: number minimum: 0 - type: 'null' saturation: oneOf: - maximum: 100 type: number minimum: 0 - type: 'null' type: object AppThemePaletteThemes: properties: code: oneOf: - $ref: '#/components/schemas/AppThemeCodePalette' - type: 'null' danger: oneOf: - $ref: '#/components/schemas/AppThemePaletteSeed' - type: 'null' note: oneOf: - $ref: '#/components/schemas/AppThemePaletteSeed' - type: 'null' success: oneOf: - $ref: '#/components/schemas/AppThemePaletteSeed' - type: 'null' warning: oneOf: - $ref: '#/components/schemas/AppThemePaletteSeed' - type: 'null' type: object AppThemeScheme: properties: accentColor: type: string backgroundColor: type: string contrast: type: number foregroundColor: type: string logoUrl: type: string required: - accentColor - backgroundColor - foregroundColor - contrast - logoUrl type: object AppThemeSurfaceMode: enum: - neutral - tinted type: string AppThemeTypography: properties: body: $ref: '#/components/schemas/AppThemeFontRef' fonts: items: $ref: '#/components/schemas/ThemeFont' type: array heading: $ref: '#/components/schemas/AppThemeFontRef' required: - fonts - body - heading type: object ApplyWorkbookPromotionInput: properties: expectedDestinationHash: oneOf: - pattern: ^[a-f0-9]{64}$ type: string - type: 'null' expectedSourceHash: pattern: ^[a-f0-9]{64}$ type: string idempotencyKey: format: uuid type: string override: oneOf: - type: boolean - type: 'null' targetDeploymentId: minimum: 1 type: integer targetFolderId: oneOf: - minimum: 1 type: integer - type: 'null' required: - targetDeploymentId - expectedSourceHash - idempotencyKey type: object BranchResponse: properties: id: type: integer isStagingEnvironmentEnabled: oneOf: - type: boolean - type: 'null' lastHash: oneOf: - type: string - type: 'null' name: type: string parentBranch: oneOf: - type: string - type: 'null' required: - id - name type: object BranchesListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/BranchResponse' type: array items: items: $ref: '#/components/schemas/BranchResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object BuildStatusResponse: properties: branchName: type: string buildJobId: oneOf: - type: integer - type: 'null' deploymentId: type: integer deploymentStatus: oneOf: - type: string - type: 'null' errorText: oneOf: - type: string - type: 'null' filesHash: oneOf: - type: string - type: 'null' lastHash: oneOf: - type: string - type: 'null' mode: type: string status: type: string updatedAt: oneOf: - type: string - type: 'null' required: - deploymentId - branchName - mode - status type: object BulkActionError: properties: message: type: string status: type: integer required: - status - message type: object BulkDeleteWorkspaceObjectsInput: properties: items: items: $ref: '#/components/schemas/WorkspaceItemRefInput' maxItems: 100 minItems: 1 type: array required: - items type: object BulkDeleteWorkspaceObjectsPayload: properties: deleted: items: $ref: '#/components/schemas/WorkspaceItemRef' type: array failed: items: $ref: '#/components/schemas/WorkspaceBulkFailure' type: array required: - deleted - failed type: object BulkMoveWorkspaceObjectsInput: properties: folderId: oneOf: - type: integer - type: 'null' items: items: $ref: '#/components/schemas/WorkspaceItemRefInput' maxItems: 100 minItems: 1 type: array required: - items type: object BulkMoveWorkspaceObjectsResponse: properties: failed: items: $ref: '#/components/schemas/WorkspaceBulkFailure' type: array moved: items: $ref: '#/components/schemas/Workbook' type: array required: - moved - failed type: object BulkUserActionFailure: properties: error: $ref: '#/components/schemas/BulkActionError' userId: type: integer required: - userId - error type: object BulkUserActionInput: properties: action: $ref: '#/components/schemas/BulkUserActionInputAction' userIds: items: type: integer maxItems: 100 minItems: 1 type: array required: - action - userIds type: object BulkUserActionInputAction: enum: - DEACTIVATE - ACTIVATE - DELETE type: string BulkUserActionPayload: properties: action: $ref: '#/components/schemas/BulkUserActionResponseAction' failed: items: $ref: '#/components/schemas/BulkUserActionFailure' type: array succeeded: items: type: integer type: array required: - action - succeeded - failed type: object BulkUserActionResponseAction: enum: - DEACTIVATE - ACTIVATE - DELETE type: string ChatHistoryQuery: properties: dataSource: description: The data source a `runSql` query ran on. oneOf: - type: string - type: 'null' error: oneOf: - type: string - type: 'null' feedback: description: The latest thumbs up or down on this query, if any. oneOf: - $ref: '#/components/schemas/ChatHistoryQueryFeedback' - type: 'null' messageId: description: The tool-call message id. type: string rowCount: description: Rows the query returned. The rows themselves are never included. oneOf: - type: integer - type: 'null' sql: description: The SQL the agent generated. oneOf: - type: string - type: 'null' status: $ref: '#/components/schemas/ChatHistoryQueryStatus' description: '`incomplete` when the query never returned: the turn was stopped or failed.' title: oneOf: - type: string - type: 'null' tool: description: >- `cubeSqlApi` for a query against the semantic layer, `runSql` for one against a warehouse data source. type: string required: - messageId - tool - status type: object ChatHistoryQueryFeedback: properties: createdAt: type: string isPositive: type: boolean userId: description: Who rated the query. oneOf: - type: integer - type: 'null' required: - isPositive - createdAt type: object ChatHistoryQueryStatus: enum: - success - error - incomplete type: string ChatHistoryThread: properties: agentId: description: Null for the Auto agent. oneOf: - type: integer - type: 'null' chatId: description: The thread id, as used in chat URLs and the Chat API. type: string createdAt: type: string initialContext: description: The surface inside the app the thread began on; null when it was not recorded. oneOf: - type: string - type: 'null' source: description: Where the thread was started; null for a source this API does not name. oneOf: - $ref: '#/components/schemas/ChatHistoryThreadSource' - type: 'null' title: oneOf: - type: string - type: 'null' turns: description: Oldest first. Present on a single thread, and on a list with `includeTurns=true`. oneOf: - items: $ref: '#/components/schemas/ChatHistoryTurn' type: array - type: 'null' updatedAt: description: When the thread last changed, normally its latest turn. type: string user: $ref: '#/components/schemas/ChatHistoryUser' required: - chatId - user - createdAt - updatedAt type: object ChatHistoryThreadListResponse: properties: items: items: $ref: '#/components/schemas/ChatHistoryThread' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object ChatHistoryThreadSource: enum: - web - api - mcp - slack - scheduled type: string ChatHistoryThreadsQuerySortBy: enum: - createdAt - updatedAt type: string ChatHistoryThreadsQuerySortOrder: enum: - asc - desc type: string ChatHistoryThreadsQueryUserType: enum: - internal - external type: string ChatHistoryTurn: properties: endedAt: description: >- The agent's last write in the turn. Null for turns recorded before Cube stored turn times. oneOf: - type: string - type: 'null' files: description: Names of files the user attached. Their content is never included. items: type: string type: array finalAnswer: description: The agent's last text reply in the turn; null when it answered only with a chart. oneOf: - type: string - type: 'null' index: description: Position in the thread, from 0. type: integer messageId: description: The id of the user message that opened the turn. type: string prompt: description: What the user asked, as they typed it. type: string queries: items: $ref: '#/components/schemas/ChatHistoryQuery' type: array startedAt: description: When the user sent the prompt. Null for turns recorded before Cube stored turn times. oneOf: - type: string - type: 'null' tools: description: Every tool the agent called in the turn, in first-call order. items: type: string type: array required: - index - messageId - prompt - files - tools - queries type: object ChatHistoryUser: properties: email: description: Null when the Cube user was deleted, or the embedded user had no email. oneOf: - type: string - type: 'null' externalId: description: Embedded users only. oneOf: - type: string - type: 'null' id: description: >- For a Cube user, their user id. For an embedded user, an id in a separate number space: identify them by `externalId`. type: integer name: description: Cube users only. oneOf: - type: string - type: 'null' type: $ref: '#/components/schemas/ChatHistoryUserType' required: - id - type type: object ChatHistoryUserType: enum: - internal - external type: string ColumnFormatOverride: properties: decimalPlaces: oneOf: - type: integer - type: 'null' type: $ref: '#/components/schemas/ColumnFormatOverrideDtoType' required: - type type: object ColumnFormatOverrideDtoType: enum: - currency - percent - number type: string CommitChangesRequest: properties: exitDevMode: oneOf: - type: boolean - type: 'null' message: oneOf: - type: string - type: 'null' resolveMergeConflict: oneOf: - type: boolean - type: 'null' type: object ConnectGitHubRequest: properties: deployBranchName: oneOf: - type: string - type: 'null' deployProjectRoot: oneOf: - type: string - type: 'null' installationId: type: integer isNewRepo: oneOf: - type: boolean - type: 'null' name: minLength: 1 type: string private: oneOf: - type: boolean - type: 'null' required: - installationId - name type: object ConnectReportToWorkbookInput: properties: addressOnly: oneOf: - type: boolean - type: 'null' anchorCell: oneOf: - type: string - type: 'null' endResultCell: oneOf: - type: string - type: 'null' externalWorkbookId: type: string host: oneOf: - $ref: '#/components/schemas/ConnectReportToWorkbookInputHost' - type: 'null' placementId: oneOf: - type: string - type: 'null' resultChecksum: oneOf: - $ref: '#/components/schemas/ReportPlacementResultChecksumInput' - type: 'null' resultLocation: type: string sheetId: oneOf: - type: string - type: 'null' sheetName: oneOf: - type: string - type: 'null' workbookName: oneOf: - type: string - type: 'null' required: - externalWorkbookId - resultLocation type: object ConnectReportToWorkbookInputHost: enum: - GOOGLE_SHEETS - EXCEL type: string ControlThemeBorderSectionInput: properties: color: oneOf: - type: string - type: 'null' radius: oneOf: - type: string - type: 'null' style: oneOf: - type: string - type: 'null' width: oneOf: - type: string - type: 'null' type: object ControlThemeSectionInput: properties: backgroundColor: oneOf: - type: string - type: 'null' border: oneOf: - $ref: '#/components/schemas/ControlThemeBorderSectionInput' - type: 'null' padding: oneOf: - type: string - type: 'null' title: oneOf: - $ref: '#/components/schemas/ControlThemeTitleSectionInput' - type: 'null' type: object ControlThemeTitleSectionInput: properties: color: oneOf: - type: string - type: 'null' fontFamily: oneOf: - type: string - type: 'null' fontSize: oneOf: - type: string - type: 'null' fontWeight: oneOf: - type: string - type: 'null' type: object CreateApiKeyInput: properties: allowedEndpoints: oneOf: - items: type: string type: array - type: 'null' deploymentIds: oneOf: - items: type: integer type: array - type: 'null' name: type: string ttlHours: oneOf: - minimum: 1 type: integer - type: 'null' required: - name type: object CreateBranchRequest: properties: activate: oneOf: - type: boolean - type: 'null' from: oneOf: - type: string - type: 'null' name: type: string required: - name type: object CreateDeploymentEnvironmentTokenInput: properties: expires_in: oneOf: - maximum: 3600 type: integer minimum: 1 - type: 'null' scopes: oneOf: - items: type: string type: array - type: 'null' security_context: additionalProperties: true not: type: 'null' type: object required: - security_context type: object CreateDeploymentInput: properties: cloudProvider: $ref: '#/components/schemas/CreateDeploymentInputCloudProvider' creationMethod: oneOf: - $ref: '#/components/schemas/CreateDeploymentInputCreationMethod' - type: 'null' creationStep: $ref: '#/components/schemas/CreationStep' deployMode: oneOf: - $ref: '#/components/schemas/CreateDeploymentInputDeployMode' - type: 'null' isManaged: type: boolean name: type: string region: type: string targetPlatform: type: string required: - name - cloudProvider - isManaged - region - targetPlatform - creationStep type: object CreateDeploymentInputCloudProvider: enum: - cubecloud - aws - gcp type: string CreateDeploymentInputCreationMethod: enum: - upload - cubecloud - github - ssh type: string CreateDeploymentInputDeployMode: enum: - git - cli type: string CreateDeploymentTokenInput: properties: expiresIn: description: >- Token lifetime in seconds, between 60 and 86400. Omit to keep the historical default of 24 hours (86400). Callers that hold the token outside a browser session — scripts, BI tools, scheduled jobs — should request a short lifetime and re-issue tokens instead. oneOf: - maximum: 86400 type: integer minimum: 60 - type: 'null' type: object CreateEmbedDashboardCommentBody: properties: body: maxLength: 10000 minLength: 1 type: string parentId: oneOf: - type: integer - type: 'null' required: - body type: object CreateEmbedGroupInput: properties: description: description: Optional human-readable description. oneOf: - maxLength: 500 type: string - type: 'null' name: description: >- Group name, unique within the embed tenant. The `system:` prefix is reserved and rejected. maxLength: 100 minLength: 1 type: string required: - name type: object CreateFolderInput: properties: name: maxLength: 255 type: string parentId: oneOf: - type: integer - type: 'null' position: oneOf: - type: integer - type: 'null' required: - name type: object CreateNotificationInput: properties: customCron: description: Custom cron expression (required if scheduleType is CUSTOM) oneOf: - type: string - type: 'null' dashboardId: description: >- Numeric id of the dashboard to run on the schedule. Provide this OR dashboardPublicId (exactly one). oneOf: - type: integer - type: 'null' dashboardPublicId: description: >- Public id of the dashboard to run on the schedule. Provide this OR dashboardId (exactly one). oneOf: - type: string - type: 'null' dayOfMonth: description: Day of month (1-31) oneOf: - type: integer - type: 'null' dayOfWeek: description: Day of week (0-6, Sunday=0) oneOf: - type: integer - type: 'null' filters: description: >- Dimension filters applied to the dashboard when the notification is rendered (substituted into the screenshot/PDF for every recipient). oneOf: - items: $ref: '#/components/schemas/DashboardFilterInput' type: array - type: 'null' hour: description: Hour of the day (0-23) oneOf: - type: integer - type: 'null' memberSwitchers: description: Field-switcher selections applied to the dashboard when the notification is rendered. oneOf: - items: $ref: '#/components/schemas/DashboardMemberSwitcherInput' type: array - type: 'null' minute: description: Minute of the hour (0-59) oneOf: - type: integer - type: 'null' notificationAiSummary: description: Include an AI-generated "what changed" summary in the notification body. Off by default. oneOf: - type: boolean - type: 'null' notificationEnabled: oneOf: - type: boolean - type: 'null' notificationFormat: oneOf: - $ref: '#/components/schemas/CreateNotificationInputNotificationFormat' - type: 'null' scheduleType: $ref: '#/components/schemas/CreateNotificationInputScheduleType' description: Type of schedule timeGrains: description: Time-grain overrides applied to the dashboard when the notification is rendered. oneOf: - items: $ref: '#/components/schemas/DashboardTimeGrainInput' type: array - type: 'null' timezone: description: Timezone for the schedule (e.g. "America/New_York") oneOf: - type: string - type: 'null' required: - scheduleType type: object CreateNotificationInputNotificationFormat: enum: - png - pdf - pdf_print type: string CreateNotificationInputScheduleType: enum: - HOURLY - DAILY - WEEKLY - MONTHLY - CUSTOM type: string CreateOAuthIntegrationInput: properties: authUrl: format: url type: string clientId: type: string clientSecret: type: string config: additionalProperties: true type: object name: type: string redirectUri: format: url type: string scopes: items: type: string type: array tokenUrl: format: url type: string type: type: string required: - clientSecret - name - type - authUrl - tokenUrl - clientId - redirectUri type: object CreateOidcTokenConfigInput: properties: audienceType: type: string customAudience: oneOf: - type: string - type: 'null' customClaims: oneOf: - type: object - type: 'null' isEnabled: oneOf: - type: boolean - type: 'null' name: oneOf: - pattern: ^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$ type: string - type: 'null' subFormat: oneOf: - pattern: ^(?:[A-Za-z0-9:_-]|\{(?:deployment_id|component|region)\})+$ type: string maxLength: 200 - type: 'null' targetEnvVar: oneOf: - pattern: ^[A-Z_][A-Z0-9_]*$ type: string maxLength: 128 - type: 'null' required: - audienceType type: object CreateReportDeliveryInput: properties: destination: $ref: '#/components/schemas/ReportDeliveryDestinationInput' not: type: 'null' name: maxLength: 255 minLength: 1 type: string notifications: description: >- How the owner hears that the delivery failed or recovered. A delivery that runs more than once a day reports only changes in its status; a daily or rarer one reports every failed run. Omit it for the inbox only. oneOf: - $ref: '#/components/schemas/ReportDeliveryNotificationsInput' - type: 'null' reportId: description: >- Id of the report whose results are delivered. It must belong to this deployment, and the caller must be able to read it. type: integer schedule: description: When the delivery runs. Omit it for a delivery that runs only on request. oneOf: - $ref: '#/components/schemas/ReportDeliveryScheduleInput' - type: 'null' shape: description: >- Which columns land in the sheet, in what order, under which headers. Omit it to deliver every column the query returns, in its order, headed by its name. oneOf: - $ref: '#/components/schemas/ReportDeliveryShapeInput' - type: 'null' writeMode: description: >- What each run does with what the previous one wrote. `overwrite` (the default) replaces the delivered block. `append` adds the whole result below it, header only on the first run and no deduplication. `new_sheet` writes each run to a new tab. oneOf: - $ref: '#/components/schemas/CreateReportDeliveryInputWriteMode' - type: 'null' required: - name - reportId - destination type: object CreateReportDeliveryInputWriteMode: enum: - overwrite - append - new_sheet type: string CreateReportInput: properties: endResultCell: oneOf: - type: string - type: 'null' externalWorkbookId: oneOf: - type: string - type: 'null' folderId: oneOf: - type: integer - type: 'null' host: oneOf: - $ref: '#/components/schemas/CreateReportInputHost' - type: 'null' jsonQuery: oneOf: - type: string - type: 'null' meta: oneOf: - type: object additionalProperties: true - type: 'null' name: oneOf: - maxLength: 255 type: string - type: 'null' pivotItems: oneOf: - $ref: '#/components/schemas/PivotItemsInput' - type: 'null' publicId: oneOf: - pattern: ^[0-9A-Za-z]+$ type: string minLength: 12 maxLength: 12 - type: 'null' resultChecksum: oneOf: - $ref: '#/components/schemas/ReportPlacementResultChecksumInput' - type: 'null' resultLocation: oneOf: - type: string - type: 'null' sheetId: oneOf: - type: string - type: 'null' source: oneOf: - $ref: '#/components/schemas/CreateReportInputSource' - type: 'null' sqlQuery: oneOf: - type: string - type: 'null' title: oneOf: - maxLength: 255 type: string - type: 'null' workbookId: oneOf: - type: integer - type: 'null' workbookName: oneOf: - type: string - type: 'null' type: object CreateReportInputHost: enum: - GOOGLE_SHEETS - EXCEL type: string CreateReportInputSource: enum: - GOOGLE_SHEETS - EXCEL - PLAYGROUND - D3 type: string CreateScheduledTaskInput: properties: agentId: description: The agent that runs the task. Omit for the deployment default. oneOf: - type: integer - type: 'null' condition: description: >- Notify only when: on each fire the measure is read once, before the agent runs, and the agent runs only when the condition starts to hold, with the crossing facts at the top of its thread; it runs again only after the condition has stopped holding. A `change` or `anomaly` rule needs `timeDimension` and `granularity`. The creator gets an inbox row only with `notificationEnabled: true`. Omit to run the agent on every fire. oneOf: - $ref: '#/components/schemas/ScheduledTaskCondition' - type: 'null' cronExpression: description: >- Standard 5-field cron (minute hour day-of-month month day-of-week), e.g. `0 9 * * 1-5` for 9:00 on weekdays. A task runs at most once an hour, so the minute field is a single number. Null or omitted makes the task Manual: it runs only when started with `POST /scheduled-tasks/{taskId}/run`. oneOf: - maxLength: 100 type: string - type: 'null' description: oneOf: - type: string - type: 'null' isEnabled: description: Create the schedule paused with `false`. Defaults to `true`. oneOf: - type: boolean - type: 'null' name: maxLength: 255 minLength: 1 type: string notificationEnabled: description: >- Notify the creator in Cube's notification inbox when a run finishes, whether it succeeds or fails. Defaults to `false`. oneOf: - type: boolean - type: 'null' prompt: description: >- What the agent is asked on every run, shown as the task's Instructions in Cube. Each run starts a new chat thread with no memory of earlier ones, so write the whole request. minLength: 1 type: string timezone: description: IANA time zone the cron is read in, e.g. `America/New_York`. Defaults to `UTC`. oneOf: - maxLength: 100 type: string - type: 'null' required: - name - prompt type: object CreateWorkbookInput: properties: folderId: oneOf: - type: number - type: 'null' meta: oneOf: - type: object additionalProperties: true - type: 'null' name: oneOf: - type: string - type: 'null' type: object CreatedDeploymentEnvironmentToken: properties: created_at: type: string expires_at: type: string scopes: items: type: string type: array security_context: additionalProperties: true type: object token: type: string required: - scopes - token - security_context - created_at - expires_at type: object CreationStep: enum: - project - upload - schema - github - ssh - databases - ready - demo type: string CreatorMode: properties: localizedTitles: oneOf: - items: $ref: '#/components/schemas/LocalizedValue' type: array maxItems: 50 - type: 'null' showGeneratedSql: oneOf: - type: boolean - type: 'null' showSemanticSql: oneOf: - type: boolean - type: 'null' showWorkspaceTitle: oneOf: - type: boolean - type: 'null' workspaceTitle: oneOf: - type: string - type: 'null' type: object CspsConfig: properties: awsRoleArn: oneOf: - type: string - type: 'null' azureClientId: oneOf: - type: string - type: 'null' azureContainer: oneOf: - type: string - type: 'null' azureStorageAccount: oneOf: - type: string - type: 'null' azureTenantId: oneOf: - type: string - type: 'null' enabled: type: boolean gcpServiceAccountEmail: oneOf: - type: string - type: 'null' gcpWorkloadIdentityProvider: oneOf: - type: string - type: 'null' gcsBucket: oneOf: - type: string - type: 'null' s3Bucket: oneOf: - type: string - type: 'null' s3Region: oneOf: - type: string - type: 'null' s3Sse: oneOf: - type: string - type: 'null' storageProvider: type: string required: - enabled - storageProvider type: object CspsConfigInput: properties: awsRoleArn: oneOf: - type: string - type: 'null' azureClientId: oneOf: - type: string - type: 'null' azureContainer: oneOf: - type: string - type: 'null' azureStorageAccount: oneOf: - type: string - type: 'null' azureTenantId: oneOf: - type: string - type: 'null' enabled: type: boolean gcpServiceAccountEmail: oneOf: - type: string - type: 'null' gcpWorkloadIdentityProvider: oneOf: - type: string - type: 'null' gcsBucket: oneOf: - type: string - type: 'null' s3Bucket: oneOf: - type: string - type: 'null' s3Region: oneOf: - type: string - type: 'null' s3Sse: oneOf: - type: string - type: 'null' storageProvider: type: string required: - enabled - storageProvider type: object Dashboard: properties: allowEmbed: type: boolean config: $ref: '#/components/schemas/DashboardConfig' createdBy: oneOf: - type: integer - type: 'null' deploymentId: type: integer description: oneOf: - type: string - type: 'null' fromSharedWorkspace: oneOf: - type: boolean - type: 'null' id: type: integer publicId: type: string reportSnapshots: items: $ref: '#/components/schemas/ReportSnapshot' type: array restrictDataDownload: oneOf: - type: boolean - type: 'null' status: $ref: '#/components/schemas/DashboardDtoStatus' title: oneOf: - type: string - type: 'null' useBoardDashboards: oneOf: - type: boolean - type: 'null' versionId: type: integer versionNumber: type: integer workbookId: type: integer required: - id - publicId - deploymentId - workbookId - status - allowEmbed - config - versionNumber - versionId - reportSnapshots type: object DashboardAppManifest: properties: dependencies: oneOf: - type: object additionalProperties: type: string - type: 'null' version: oneOf: - type: integer - type: 'null' type: object DashboardAppManifestInput: properties: dependencies: oneOf: - type: object additionalProperties: type: string - type: 'null' version: oneOf: - type: integer - type: 'null' type: object DashboardAppSource: properties: entry: oneOf: - maxLength: 255 type: string - type: 'null' files: oneOf: - type: object additionalProperties: type: string - type: 'null' html: oneOf: - type: string - type: 'null' manifest: oneOf: - $ref: '#/components/schemas/DashboardAppManifest' - type: 'null' type: object DashboardAppSourceInput: properties: entry: oneOf: - maxLength: 255 type: string - type: 'null' files: oneOf: - type: object additionalProperties: type: string - type: 'null' html: oneOf: - type: string - type: 'null' manifest: oneOf: - $ref: '#/components/schemas/DashboardAppManifestInput' - type: 'null' type: object DashboardBreakpointCols: properties: lg: oneOf: - type: integer - type: 'null' md: oneOf: - type: integer - type: 'null' sm: oneOf: - type: integer - type: 'null' xs: oneOf: - type: integer - type: 'null' xxs: oneOf: - type: integer - type: 'null' title: DashboardBreakpointColsDto type: object DashboardBreakpointColsInput: properties: lg: oneOf: - type: integer - type: 'null' md: oneOf: - type: integer - type: 'null' sm: oneOf: - type: integer - type: 'null' xs: oneOf: - type: integer - type: 'null' xxs: oneOf: - type: integer - type: 'null' title: DashboardBreakpointColsInput type: object DashboardBreakpoints: properties: lg: oneOf: - type: integer - type: 'null' md: oneOf: - type: integer - type: 'null' sm: oneOf: - type: integer - type: 'null' xs: oneOf: - type: integer - type: 'null' xxs: oneOf: - type: integer - type: 'null' title: DashboardBreakpointsDto type: object DashboardBreakpointsInput: properties: lg: oneOf: - type: integer - type: 'null' md: oneOf: - type: integer - type: 'null' sm: oneOf: - type: integer - type: 'null' xs: oneOf: - type: integer - type: 'null' xxs: oneOf: - type: integer - type: 'null' title: DashboardBreakpointsInput type: object DashboardConfig: properties: app: oneOf: - $ref: '#/components/schemas/DashboardAppSource' - type: 'null' description: oneOf: - type: string - type: 'null' kind: oneOf: - $ref: '#/components/schemas/DashboardConfigKind' - type: 'null' layout: oneOf: - $ref: '#/components/schemas/DashboardLayout' - type: 'null' settings: oneOf: - type: object additionalProperties: true - type: 'null' theme: oneOf: - type: object additionalProperties: true - type: 'null' title: oneOf: - type: string - type: 'null' widgets: oneOf: - items: $ref: '#/components/schemas/DashboardWidget' type: array - type: 'null' type: object DashboardConfigDraftInput: properties: app: oneOf: - $ref: '#/components/schemas/DashboardAppSourceInput' - type: 'null' description: oneOf: - type: string - type: 'null' kind: oneOf: - $ref: '#/components/schemas/DashboardConfigDraftInputKind' - type: 'null' layout: oneOf: - $ref: '#/components/schemas/DashboardLayoutInput' - type: 'null' settings: oneOf: - type: object additionalProperties: true - type: 'null' theme: oneOf: - $ref: '#/components/schemas/DashboardThemeInput' - type: 'null' title: oneOf: - type: string - type: 'null' widgets: oneOf: - items: $ref: '#/components/schemas/DashboardWidgetDraftInput' type: array - type: 'null' type: object DashboardConfigDraftInputKind: enum: - CLASSIC - APP type: string DashboardConfigInput: properties: app: oneOf: - $ref: '#/components/schemas/DashboardAppSourceInput' - type: 'null' description: oneOf: - type: string - type: 'null' kind: oneOf: - $ref: '#/components/schemas/DashboardConfigInputKind' - type: 'null' layout: oneOf: - $ref: '#/components/schemas/DashboardLayoutInput' - type: 'null' settings: oneOf: - type: object additionalProperties: true - type: 'null' theme: oneOf: - $ref: '#/components/schemas/DashboardThemeInput' - type: 'null' title: oneOf: - type: string - type: 'null' widgets: oneOf: - items: $ref: '#/components/schemas/DashboardWidgetInput' type: array - type: 'null' type: object DashboardConfigInputKind: enum: - CLASSIC - APP type: string DashboardConfigKind: enum: - CLASSIC - APP type: string DashboardDtoStatus: enum: - draft - published - archived type: string DashboardEmbeddingResponse: properties: allowEmbed: type: boolean publicId: type: string required: - publicId - allowEmbed type: object DashboardExportJobResponse: properties: expiresAt: description: >- When the job (and its rendered file) is evicted from the renderer cache. Download before this, or submit a new export. format: date-time type: string jobId: description: Job id to poll for status and to download the finished file with. type: string required: - jobId - expiresAt type: object DashboardExportStatusResponse: properties: contentType: description: MIME type of the rendered file. Present once `status` is `completed`. oneOf: - type: string - type: 'null' error: description: Why the render failed. Present only when `status` is `failed`. oneOf: - type: string - type: 'null' progress: description: Rendering progress, 0-100, when the renderer reports one. oneOf: - type: number - type: 'null' status: $ref: '#/components/schemas/DashboardExportStatusResponseStatus' description: >- Job lifecycle: `pending` and `processing` mean keep polling, `completed` means the file is ready to download, `failed` means it will never be. required: - status type: object DashboardExportStatusResponseStatus: enum: - pending - processing - completed - failed type: string DashboardFilter: properties: caseSensitive: oneOf: - {} - type: 'null' endInclusive: oneOf: - {} - type: 'null' member: type: string operator: oneOf: - $ref: '#/components/schemas/DashboardFilterOperator' - type: 'null' startInclusive: oneOf: - {} - type: 'null' value: oneOf: - oneOf: - type: string - type: number - type: boolean - type: array items: {} - type: 'null' required: - member type: object DashboardFilterInput: properties: caseSensitive: description: 'For string filters: whether matching is case-sensitive' oneOf: - {} - type: 'null' endInclusive: description: 'For between filters: whether the end bound is inclusive' oneOf: - {} - type: 'null' member: description: Dimension path, e.g. "Orders.status" pattern: .+\..+ type: string operator: description: >- Filter operator (defaults to "equals"; with an empty value, omitting it clears the control instead) oneOf: - $ref: '#/components/schemas/DashboardFilterInputOperator' - type: 'null' startInclusive: description: 'For between filters: whether the start bound is inclusive' oneOf: - {} - type: 'null' value: description: >- Filter value. Omit for is_null / is_not_null / is_empty / is_not_empty; provide a 2-element [start, end] array for between. An empty array or empty string with no operator renders the filter cleared; with an operator, the filter keeps that operator. oneOf: - oneOf: - type: string - type: number - type: boolean - type: array items: {} - type: 'null' required: - member type: object DashboardFilterInputOperator: enum: - equals - not_equals - greater_than - greater_than_or_equal - less_than - less_than_or_equal - contains - not_contains - starts_with - not_starts_with - ends_with - not_ends_with - in_month - not_in_month - in_quarter - not_in_quarter - in_year - not_in_year - is_null - is_not_null - is_empty - is_not_empty - between - custom type: string DashboardFilterOperator: enum: - equals - not_equals - greater_than - greater_than_or_equal - less_than - less_than_or_equal - contains - not_contains - starts_with - not_starts_with - ends_with - not_ends_with - in_month - not_in_month - in_quarter - not_in_quarter - in_year - not_in_year - is_null - is_not_null - is_empty - is_not_empty - between - custom type: string DashboardLayout: properties: breakpoints: oneOf: - $ref: '#/components/schemas/DashboardBreakpoints' - type: 'null' cols: oneOf: - $ref: '#/components/schemas/DashboardBreakpointCols' - type: 'null' containerPadding: oneOf: - items: type: integer type: array - type: 'null' margin: oneOf: - items: type: integer type: array - type: 'null' rowHeight: oneOf: - type: integer - type: 'null' type: object DashboardLayoutInput: properties: breakpoints: oneOf: - $ref: '#/components/schemas/DashboardBreakpointsInput' - type: 'null' cols: oneOf: - $ref: '#/components/schemas/DashboardBreakpointColsInput' - type: 'null' containerPadding: oneOf: - items: type: integer type: array - type: 'null' margin: oneOf: - items: type: integer type: array - type: 'null' rowHeight: oneOf: - type: integer - type: 'null' type: object DashboardMemberSwitcher: properties: member: type: string selected: type: string required: - member - selected type: object DashboardMemberSwitcherInput: properties: member: description: Path of the member the control replaces, e.g. "Orders.status" pattern: .+\..+ type: string selected: description: Name of the member to show in its place, e.g. "city" (no view prefix) type: string required: - member - selected type: object DashboardResponsiveLayouts: properties: lg: oneOf: - $ref: '#/components/schemas/DashboardWidgetPosition' - type: 'null' md: oneOf: - $ref: '#/components/schemas/DashboardWidgetPosition' - type: 'null' sm: oneOf: - $ref: '#/components/schemas/DashboardWidgetPosition' - type: 'null' xs: oneOf: - $ref: '#/components/schemas/DashboardWidgetPosition' - type: 'null' xxs: oneOf: - $ref: '#/components/schemas/DashboardWidgetPosition' - type: 'null' type: object DashboardResponsiveLayoutsInput: properties: lg: oneOf: - $ref: '#/components/schemas/DashboardWidgetPositionInput' - type: 'null' md: oneOf: - $ref: '#/components/schemas/DashboardWidgetPositionInput' - type: 'null' sm: oneOf: - $ref: '#/components/schemas/DashboardWidgetPositionInput' - type: 'null' xs: oneOf: - $ref: '#/components/schemas/DashboardWidgetPositionInput' - type: 'null' xxs: oneOf: - $ref: '#/components/schemas/DashboardWidgetPositionInput' - type: 'null' type: object DashboardThemeInput: properties: backgroundColor: oneOf: - type: string - type: 'null' controls: oneOf: - $ref: '#/components/schemas/ControlThemeSectionInput' - type: 'null' dashboard: oneOf: - $ref: '#/components/schemas/DashboardThemeSectionInput' - type: 'null' fontFamily: oneOf: - type: string - type: 'null' primaryColor: oneOf: - type: string - type: 'null' themeId: oneOf: - type: string - type: 'null' widgets: oneOf: - $ref: '#/components/schemas/WidgetThemeSectionInput' - type: 'null' type: object DashboardThemeSectionInput: properties: backgroundColor: oneOf: - type: string - type: 'null' padding: oneOf: - type: string - type: 'null' type: object DashboardTimeGrain: properties: grain: type: string member: type: string required: - member - grain type: object DashboardTimeGrainInput: properties: grain: description: Granularity, e.g. "day", "week", "month". An empty string renders the control cleared. type: string member: description: Time dimension path, e.g. "Orders.created_at" pattern: .+\..+ type: string required: - member - grain type: object DashboardWidget: properties: config: oneOf: - type: object additionalProperties: true - type: 'null' id: type: string position: $ref: '#/components/schemas/DashboardWidgetPosition' responsiveLayouts: oneOf: - $ref: '#/components/schemas/DashboardResponsiveLayouts' - type: 'null' style: oneOf: - type: object additionalProperties: true - type: 'null' type: $ref: '#/components/schemas/DashboardWidgetDtoType' required: - id - type - position type: object DashboardWidgetDraftInput: properties: config: oneOf: - type: object additionalProperties: true - type: 'null' id: oneOf: - maxLength: 128 type: string - type: 'null' position: $ref: '#/components/schemas/DashboardWidgetPositionInput' responsiveLayouts: oneOf: - $ref: '#/components/schemas/DashboardResponsiveLayoutsInput' - type: 'null' style: oneOf: - type: object additionalProperties: true - type: 'null' type: $ref: '#/components/schemas/DashboardWidgetDraftInputType' required: - type - position type: object DashboardWidgetDraftInputType: enum: - CHART - TEXT - FILTER - AI - TIME_GRAIN - FIELD - PARENT - SPACER - DIVIDER - CONTAINER type: string DashboardWidgetDtoType: enum: - CHART - TEXT - FILTER - AI - TIME_GRAIN - FIELD - PARENT - SPACER - DIVIDER - CONTAINER type: string DashboardWidgetInput: properties: config: oneOf: - type: object additionalProperties: true - type: 'null' id: maxLength: 128 type: string position: $ref: '#/components/schemas/DashboardWidgetPositionInput' responsiveLayouts: oneOf: - $ref: '#/components/schemas/DashboardResponsiveLayoutsInput' - type: 'null' style: oneOf: - type: object additionalProperties: true - type: 'null' type: $ref: '#/components/schemas/DashboardWidgetInputType' required: - id - type - position type: object DashboardWidgetInputType: enum: - CHART - TEXT - FILTER - AI - TIME_GRAIN - FIELD - PARENT - SPACER - DIVIDER - CONTAINER type: string DashboardWidgetPosition: properties: h: type: integer w: type: integer x: type: integer 'y': type: integer required: - x - 'y' - w - h type: object DashboardWidgetPositionInput: properties: h: type: integer w: type: integer x: type: integer 'y': type: integer required: - x - 'y' - w - h type: object DataModelFileContent: properties: content: type: string path: type: string required: - path - content type: object DataModelFilePath: properties: path: type: string required: - path type: object DataModelFileRename: properties: newPath: type: string path: type: string required: - path - newPath type: object DataModelValidationError: properties: fileName: oneOf: - type: string - type: 'null' message: type: string required: - message type: object DataModelValidationResponse: properties: branchName: type: string cubesCount: oneOf: - type: integer - type: 'null' deploymentId: type: integer errors: items: $ref: '#/components/schemas/DataModelValidationError' type: array mode: $ref: '#/components/schemas/DataModelValidationResponseMode' valid: type: boolean required: - deploymentId - branchName - mode - valid - errors type: object DataModelValidationResponseMode: enum: - production - dev_mode type: string DataModelWriteResponse: properties: success: type: boolean required: - success type: object DatabricksMetricViewIntegrationConfigurationResponse: properties: deletionPolicy: $ref: '#/components/schemas/DatabricksMetricViewIntegrationConfigurationResponseDeletionPolicy' enabled: type: boolean selectionMode: $ref: '#/components/schemas/DatabricksMetricViewIntegrationConfigurationResponseSelectionMode' sourceOverrides: oneOf: - type: object additionalProperties: type: string - type: 'null' targetCatalog: type: string targetNamePrefix: oneOf: - type: string - type: 'null' targetNames: oneOf: - type: object additionalProperties: type: string - type: 'null' targetSchema: type: string version: $ref: '#/components/schemas/DatabricksMetricViewIntegrationConfigurationResponseVersion' viewNameRegex: oneOf: - type: string - type: 'null' viewNames: oneOf: - items: type: string type: array - type: 'null' required: - version - enabled - targetCatalog - targetSchema - selectionMode - deletionPolicy type: object DatabricksMetricViewIntegrationConfigurationResponseDeletionPolicy: enum: - retain - delete-managed type: string DatabricksMetricViewIntegrationConfigurationResponseSelectionMode: enum: - all - selected - pattern type: string DatabricksMetricViewIntegrationConfigurationResponseVersion: enum: - 1 type: number DatabricksMetricViewIntegrationResponse: properties: accessTest: oneOf: - type: object - type: 'null' configuration: $ref: '#/components/schemas/DatabricksMetricViewIntegrationConfigurationResponse' configurationVersion: type: integer createdAt: oneOf: - format: date type: string - format: date-time type: string dataSourceName: type: string deploymentId: type: integer publicId: type: string updatedAt: oneOf: - format: date type: string - format: date-time type: string required: - publicId - deploymentId - dataSourceName - configurationVersion - configuration - createdAt - updatedAt type: object DatabricksMetricViewPublicationCounts: properties: dimensions: type: integer errors: type: integer joins: type: integer measures: type: integer warnings: type: integer required: - dimensions - measures - joins - warnings - errors type: object DatabricksMetricViewPublicationDatasetSource: properties: dataSource: type: string dataset: type: string originalSource: type: string resolvedSource: type: string required: - dataset - dataSource - originalSource - resolvedSource type: object DatabricksMetricViewPublicationIssue: properties: code: type: string element: oneOf: - type: string - type: 'null' message: type: string severity: $ref: '#/components/schemas/DatabricksMetricViewPublicationIssueSeverity' stage: $ref: '#/components/schemas/DatabricksMetricViewPublicationIssueStage' required: - code - severity - stage - message type: object DatabricksMetricViewPublicationIssueSeverity: enum: - ERROR - WARNING type: string DatabricksMetricViewPublicationIssueStage: enum: - INPUT - VIEW_PROJECTION - OSSIE_VALIDATION - OSSIE_TO_DATABRICKS - OUTPUT_VALIDATION - EXECUTION type: string DatabricksMetricViewPublicationPreviewInput: properties: dataSourceName: type: string selectionMode: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewInputSelectionMode' description: >- Choose every deployed Cube view ('all'), an exact ordered list ('selected'), or names matching viewNameRegex ('pattern'). sourceOverrides: description: >- Optional map of Cube view name to the root source dataset the view projects from, for view projections where that root would otherwise be ambiguous. oneOf: - type: object additionalProperties: type: string - type: 'null' targetNames: description: Optional Cube view name to Databricks Metric View name overrides. oneOf: - type: object additionalProperties: type: string - type: 'null' viewNameRegex: description: >- A safe, bounded regex subset for view names. Supports literals, ^, $, dot, and one .* wildcard; grouping, alternation, lookaround, and backreferences are rejected. oneOf: - type: string - type: 'null' viewNames: description: Required only when selectionMode is 'selected'. oneOf: - items: type: string type: array - type: 'null' required: - dataSourceName - selectionMode type: object DatabricksMetricViewPublicationPreviewInputSelectionMode: enum: - all - selected - pattern type: string DatabricksMetricViewPublicationPreviewResultResponse: properties: buildJobId: type: integer commit: oneOf: - type: string - type: 'null' completedAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string dataSourceName: type: string deploymentId: type: integer durationMs: type: integer outcome: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewResultResponseOutcome' previewId: type: string runtime: $ref: '#/components/schemas/DatabricksMetricViewPublicationRuntime' sourceSha256: type: string version: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewResultResponseVersion' views: items: $ref: '#/components/schemas/DatabricksMetricViewPublicationViewResult' type: array required: - previewId - deploymentId - dataSourceName - buildJobId - completedAt - durationMs - version - outcome - sourceSha256 - views - runtime type: object DatabricksMetricViewPublicationPreviewResultResponseOutcome: enum: - success - partial - failed type: string DatabricksMetricViewPublicationPreviewResultResponseVersion: enum: - 2 type: integer DatabricksMetricViewPublicationPreviewStartResponse: properties: buildJobId: type: integer commit: oneOf: - type: string - type: 'null' dataSourceName: type: string deploymentId: type: integer previewId: type: string resultUrl: type: string reused: type: boolean status: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewStartResponseStatus' statusUrl: type: string required: - previewId - deploymentId - dataSourceName - buildJobId - reused - status - statusUrl - resultUrl type: object DatabricksMetricViewPublicationPreviewStartResponseStatus: enum: - QUEUED type: string DatabricksMetricViewPublicationPreviewStatusResponse: properties: dataSourceName: type: string deploymentId: type: integer error: oneOf: - type: string - type: 'null' previewId: type: string progress: $ref: '#/components/schemas/DatabricksMetricViewPublicationProgress' resultAvailable: type: boolean startedAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string status: $ref: '#/components/schemas/DatabricksMetricViewPublicationPreviewStatusResponseStatus' updatedAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string required: - previewId - deploymentId - dataSourceName - status - progress - resultAvailable - startedAt - updatedAt type: object DatabricksMetricViewPublicationPreviewStatusResponseStatus: enum: - QUEUED - RUNNING - COMPLETED - FAILED - CANCELLED type: string DatabricksMetricViewPublicationProgress: properties: message: type: string percentComplete: type: integer stage: $ref: '#/components/schemas/DatabricksMetricViewPublicationProgressStage' required: - stage - percentComplete - message type: object DatabricksMetricViewPublicationProgressStage: enum: - QUEUED - RUNNING - COMPLETED - FAILED - CANCELLED type: string DatabricksMetricViewPublicationRuntime: properties: bridgeCommit: type: string bridgeVersion: type: string cubeConverterVersion: type: string databricksConverterVersion: type: string ossieCommit: type: string ossieCoreVersion: type: string policyVersion: type: integer runnerVersion: type: string templateName: type: string required: - bridgeCommit - bridgeVersion - ossieCommit - ossieCoreVersion - databricksConverterVersion - cubeConverterVersion - templateName - runnerVersion - policyVersion type: object DatabricksMetricViewPublicationViewResult: properties: counts: $ref: '#/components/schemas/DatabricksMetricViewPublicationCounts' cubeViewName: type: string datasetSources: items: $ref: '#/components/schemas/DatabricksMetricViewPublicationDatasetSource' type: array eligibleForPublication: type: boolean issues: items: $ref: '#/components/schemas/DatabricksMetricViewPublicationIssue' type: array metricViewName: type: string metricViewSha256: oneOf: - type: string - type: 'null' metricViewYaml: oneOf: - type: string - type: 'null' outcome: $ref: '#/components/schemas/DatabricksMetricViewPublicationViewResultOutcome' description: >- 'partial' means the view published without measures it cannot represent; read withheldMembers for which. source: oneOf: - type: string - type: 'null' withheldMembers: description: >- Measures this view could not publish, each named with the cube it comes from. A view with entries here is queryable but incomplete. items: $ref: '#/components/schemas/DatabricksMetricViewPublicationWithheldMember' type: array required: - cubeViewName - metricViewName - outcome - eligibleForPublication - issues - withheldMembers - datasetSources - counts type: object DatabricksMetricViewPublicationViewResultOutcome: enum: - success - partial - failed type: string DatabricksMetricViewPublicationWithheldMember: properties: code: description: Why it could not be published, as a stable code. type: string cube: type: string member: type: string required: - cube - member - code type: object DatabricksMetricViewSyncProgressResponse: properties: published: type: integer stage: type: string total: type: integer required: - stage - published - total type: object DatabricksMetricViewSyncRunListResponse: properties: items: items: $ref: '#/components/schemas/DatabricksMetricViewSyncRunResponse' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object DatabricksMetricViewSyncRunResponse: properties: buildJobId: oneOf: - type: integer - type: 'null' cancelRequestedAt: oneOf: - pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string - type: 'null' commit: oneOf: - type: string - type: 'null' completedAt: oneOf: - pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string - type: 'null' configurationVersion: oneOf: - type: integer - type: 'null' createdAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string dataSourceName: type: string deletionPolicy: oneOf: - type: string - type: 'null' deploymentId: type: integer durationMs: oneOf: - type: integer - type: 'null' incompleteViewCount: description: >- How many published views are missing measures the conversion could not represent. A run reports COMPLETED with this above zero, because every view published — so automation that treats COMPLETED as "fully published" should assert this is 0. Read views[].withheldMembers for which measures, and why. minimum: 0 type: integer integrationPublicId: type: string progress: description: Live progress while the run is active; null once it is terminal. oneOf: - $ref: '#/components/schemas/DatabricksMetricViewSyncProgressResponse' - type: 'null' runId: type: string stage: oneOf: - type: string - type: 'null' startedAt: oneOf: - pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string - type: 'null' status: $ref: '#/components/schemas/DatabricksMetricViewSyncRunResponseStatus' description: >- PARTIAL means at least one view published and another did not. Every non-successful view keeps its previous Databricks definition. targetCatalog: oneOf: - type: string - type: 'null' targetSchema: oneOf: - type: string - type: 'null' trigger: $ref: '#/components/schemas/DatabricksMetricViewSyncRunResponseTrigger' viewNames: description: The Cube views this run was planned against. items: type: string type: array views: items: $ref: '#/components/schemas/DatabricksMetricViewSyncViewOutcomeResponse' type: array required: - runId - deploymentId - integrationPublicId - dataSourceName - trigger - status - viewNames - views - incompleteViewCount - createdAt type: object DatabricksMetricViewSyncRunResponseStatus: enum: - QUEUED - RUNNING - CANCELLING - COMPLETED - PARTIAL - FAILED - CANCELLED type: string DatabricksMetricViewSyncRunResponseTrigger: enum: - MANUAL type: string DatabricksMetricViewSyncStartResponse: properties: buildJobId: description: The build whose deployed model this run publishes. type: integer commit: oneOf: - type: string - type: 'null' dataSourceName: type: string deploymentId: type: integer integrationPublicId: type: string reused: description: True when an idempotent retry returned an existing run. type: boolean runId: type: string statusUrl: type: string required: - runId - deploymentId - dataSourceName - integrationPublicId - buildJobId - reused - statusUrl type: object DatabricksMetricViewSyncViewOutcomeResponse: properties: cubeViewName: type: string detail: description: A stable reason code, never raw Databricks output. oneOf: - type: string - type: 'null' outcome: $ref: '#/components/schemas/DatabricksMetricViewSyncViewOutcomeResponseOutcome' withheldMembers: description: >- Measures this view published without, as 'cube.member'. Non-empty means the Metric View is queryable but incomplete. items: type: string type: array required: - cubeViewName - outcome - withheldMembers type: object DatabricksMetricViewSyncViewOutcomeResponseOutcome: enum: - unchanged - created - updated - blocked - validation_failed - publish_failed - retained_obsolete - deleted_obsolete type: string DbtGeneratedFileContent: properties: content: description: The generated YAML. type: string path: description: Path of the generated file within the data model project. type: string required: - path - content type: object DbtSyncCancelResponse: properties: message: type: string required: - message type: object DbtSyncGeneratedFile: properties: path: description: Path of the generated file within the data model project. type: string required: - path type: object DbtSyncGeneratedFilesListResponse: properties: items: description: The generated cube files, ready to write into your repository. items: $ref: '#/components/schemas/DbtGeneratedFileContent' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object DbtSyncLogEntriesListResponse: properties: items: items: $ref: '#/components/schemas/DbtSyncLogEntry' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object DbtSyncLogEntry: properties: durationMs: description: For a phase line, how long the phase took, in milliseconds. oneOf: - type: integer - type: 'null' level: description: info or error. type: string message: type: string phase: description: The phase this line belongs to, e.g. dbt-compile. oneOf: - type: string - type: 'null' stream: description: >- Always "system" in this version. "stdout" and "stderr" join it once dbt’s own output is captured, so treat this as an open set. type: string timestamp: description: When the line was produced, as an ISO 8601 timestamp. type: string required: - timestamp - level - stream - message type: object DbtSyncManifestStats: properties: macros: type: integer models: type: integer sources: type: integer required: - models - sources - macros type: object DbtSyncProgress: properties: message: description: Human-readable description of what the sync is doing right now. oneOf: - type: string - type: 'null' percentComplete: description: >- Rough completion percentage derived from the stage. Progress reporting only — do not gate on it; gate on the status reaching COMPLETED or FAILED. type: integer stage: description: The stage the sync is currently in, from the same set of values as the sync status. type: string required: - stage - percentComplete type: object DbtSyncResponse: properties: branchName: type: string syncJobId: type: string workflowId: type: string required: - syncJobId - workflowId - branchName type: object DbtSyncResultResponse: properties: completedAt: description: When the sync finished, as an ISO 8601 timestamp. type: string cubeCount: description: How many cubes the sync generated from the dbt manifest. type: integer durationMs: description: End-to-end sync duration in milliseconds. type: integer generatedFiles: description: The cube files this sync generated and committed to the branch it created. items: $ref: '#/components/schemas/DbtSyncGeneratedFile' type: array manifestStats: $ref: '#/components/schemas/DbtSyncManifestStats' syncJobId: type: string required: - syncJobId - generatedFiles - manifestStats - cubeCount - completedAt - durationMs type: object DbtSyncRun: properties: branchName: description: The Cube branch this sync wrote its generated cubes to. type: string completedAt: description: >- When the sync finished, as an ISO 8601 timestamp, or null while it is still running. This is stamped by the process that ran the sync whereas startedAt is stamped by the process that launched it — two different clocks — so for a run that failed moments after starting, completedAt can even precede startedAt. Use durationMs to show how long a run took rather than subtracting these. oneOf: - type: string - type: 'null' deploymentId: type: integer durationMs: description: >- How long the sync took, in milliseconds, and the value to use when showing a duration. Measured from a single clock, so it is never negative — prefer it over subtracting startedAt from completedAt, which can disagree with it by a small skew. oneOf: - type: integer - type: 'null' errorMessage: description: Why the sync stopped. Present only for a failed run. oneOf: - type: string - type: 'null' failedPhase: description: The phase that failed, e.g. dbt-compile. oneOf: - type: string - type: 'null' gitRef: description: The dbt-repository ref this sync was run against, when pinned. oneOf: - type: string - type: 'null' lastStage: description: The pipeline stage the run reached, e.g. COMPILING_DBT. oneOf: - type: string - type: 'null' phases: description: Per-phase timings, in the order they ran. Absent while the sync is running. oneOf: - items: $ref: '#/components/schemas/DbtSyncRunPhase' type: array - type: 'null' source: description: >- Where this sync got its dbt metadata: `git` (Cube cloned the dbt repository and ran dbt) or `manifest` (the caller uploaded a `manifest.json` and no repository was accessed). Runs predating the manifest source report `git`. type: string startedAt: description: >- When the sync started, as an ISO 8601 timestamp. See completedAt before comparing the two. type: string stats: oneOf: - $ref: '#/components/schemas/DbtSyncRunStats' - type: 'null' status: description: >- RUNNING, COMPLETED, FAILED, CANCELLED or UNKNOWN. UNKNOWN means the outcome could not be established (the run’s record was lost and the workflow engine no longer knows the workflow) and is deliberately distinct from FAILED. Treat an unrecognized value as non-terminal. type: string syncJobId: type: string trigger: description: >- What started the sync: manual (the Cube Cloud UI), api (this REST API), webhook (a push to the dbt repository), agent (Cube AI), or unknown. type: string triggerContext: oneOf: - $ref: '#/components/schemas/DbtSyncRunTriggerContext' - type: 'null' userId: description: The Cube user who started the sync, when a user started it. oneOf: - type: integer - type: 'null' required: - syncJobId - deploymentId - status - trigger - source - branchName - startedAt type: object DbtSyncRunListResponse: properties: items: items: $ref: '#/components/schemas/DbtSyncRun' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object DbtSyncRunPhase: properties: durationMs: description: How long the phase took, in milliseconds. type: integer outcome: description: ok or failed. type: string phase: description: Phase token, e.g. repo-clone, dbt-deps, dbt-compile. type: string startedOffsetMs: description: When the phase began, in milliseconds after the sync started. type: integer required: - phase - startedOffsetMs - durationMs - outcome type: object DbtSyncRunStats: properties: cubeCount: description: How many cubes the sync generated. oneOf: - type: integer - type: 'null' dbtVersion: description: >- The dbt version that produced the converted manifest, from its `metadata` block. Advisory — absent when the producer omitted it. oneOf: - type: string - type: 'null' generatedFileCount: description: How many files the sync wrote to the branch it created. oneOf: - type: integer - type: 'null' macros: description: dbt macros found in the manifest. oneOf: - type: integer - type: 'null' manifestGeneratedAt: description: >- When dbt generated the converted manifest, as an ISO 8601 timestamp. For an uploaded manifest this is how you tell a stale upload from a fresh one; it is NOT when the sync ran. oneOf: - type: string - type: 'null' models: description: dbt models found in the manifest. oneOf: - type: integer - type: 'null' sources: description: dbt sources found in the manifest. oneOf: - type: integer - type: 'null' type: object DbtSyncRunTriggerContext: properties: headSha: oneOf: - type: string - type: 'null' pushedBranch: oneOf: - type: string - type: 'null' targetBranch: oneOf: - type: string - type: 'null' type: object DbtSyncRunsQueryStatus: enum: - RUNNING - COMPLETED - FAILED - CANCELLED - UNKNOWN type: string DbtSyncRunsQueryTrigger: enum: - manual - api - webhook - agent - unknown type: string DbtSyncStatusResponse: properties: error: description: Why the sync stopped. Present only when the status is FAILED. oneOf: - type: string - type: 'null' progress: $ref: '#/components/schemas/DbtSyncProgress' status: description: >- One of INITIALIZING, CREATING_SANDBOX, UPLOADING_PROJECT, INSTALLING_DEPENDENCIES, RUNNING_DBT_DEPS, COMPILING_DBT, PROCESSING_MANIFEST, WRITING_CUBE_FILES, FINALIZING, COMPLETED, FAILED. COMPLETED and FAILED are the only terminal values: poll until one of them, then read the result. Treat any unrecognized value as still running. type: string syncJobId: type: string updatedAt: description: When this status was last updated, as an ISO 8601 timestamp. type: string required: - syncJobId - status - progress - updatedAt type: object Deployment: properties: creationStep: $ref: '#/components/schemas/CreationStep' deploymentUrl: type: string id: type: integer name: type: string required: - id - name - deploymentUrl - creationStep type: object DeploymentDeleteResponse: properties: success: type: boolean required: - success type: object DeploymentEnvironment: properties: api_credentials: items: $ref: '#/components/schemas/DeploymentEnvironmentApiCredential' type: array branch: oneOf: - type: string - type: 'null' id: type: string type: $ref: '#/components/schemas/DeploymentEnvironmentType' user: oneOf: - type: string - type: 'null' required: - id - type - api_credentials type: object DeploymentEnvironmentApiCredential: properties: database: oneOf: - type: string - type: 'null' host: oneOf: - type: string - type: 'null' port: oneOf: - minimum: 1 type: integer - type: 'null' type: $ref: '#/components/schemas/DeploymentEnvironmentApiCredentialType' url: oneOf: - type: string - type: 'null' version: minimum: 1 type: integer required: - type - version type: object DeploymentEnvironmentApiCredentialType: enum: - rest - sql type: string DeploymentEnvironmentToken: properties: created_at: type: string expires_at: type: string security_context: additionalProperties: true type: object token: type: string required: - token - security_context - created_at - expires_at type: object DeploymentEnvironmentTokenResponse: properties: data: $ref: '#/components/schemas/CreatedDeploymentEnvironmentToken' required: - data type: object DeploymentEnvironmentTokensListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/DeploymentEnvironmentToken' type: array items: items: $ref: '#/components/schemas/DeploymentEnvironmentToken' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' pagination: deprecated: true description: 'Deprecated: use `pageInfo` instead. Kept for backward compatibility.' oneOf: - $ref: '#/components/schemas/DeploymentsPagination' - type: 'null' required: - items - data type: object DeploymentEnvironmentType: enum: - production - staging - development type: string DeploymentEnvironmentsListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/DeploymentEnvironment' type: array items: items: $ref: '#/components/schemas/DeploymentEnvironment' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' pagination: deprecated: true description: 'Deprecated: use `pageInfo` instead. Kept for backward compatibility.' oneOf: - $ref: '#/components/schemas/DeploymentsPagination' - type: 'null' required: - items - data type: object DeploymentLogLine: properties: date: type: string message: type: string pod: type: string required: - pod - date - message type: object DeploymentLogsQueryContainer: enum: - INIT - MAIN - cubejs-server - vector - api-proxy type: string DeploymentLogsQuerySource: enum: - production - dev type: string DeploymentLogsResponse: properties: items: items: $ref: '#/components/schemas/DeploymentLogLine' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object DeploymentPod: properties: containers: oneOf: - items: type: string type: array - type: 'null' name: type: string ready: oneOf: - type: boolean - type: 'null' restartCount: oneOf: - type: integer - type: 'null' status: oneOf: - type: string - type: 'null' type: oneOf: - type: string - type: 'null' required: - name type: object DeploymentPodsResponse: properties: items: items: $ref: '#/components/schemas/DeploymentPod' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object DeploymentSettings: properties: autoDomain: oneOf: - type: string - type: 'null' cloudProvider: $ref: '#/components/schemas/DeploymentSettingsCloudProvider' creationMethod: oneOf: - $ref: '#/components/schemas/DeploymentSettingsCreationMethod' - type: 'null' creationStep: $ref: '#/components/schemas/CreationStep' cspsConfig: oneOf: - $ref: '#/components/schemas/CspsConfig' - type: 'null' cubeImageCloud: oneOf: - type: string - type: 'null' cubeImageVersion: oneOf: - type: string - type: 'null' customDomain: oneOf: - type: string - type: 'null' defaultLaunchpadViewGroup: oneOf: - type: string - type: 'null' deployBranchMergeAllowed: type: boolean deployBranchName: type: string deployBranchReadOnly: type: boolean deployMode: oneOf: - $ref: '#/components/schemas/DeploymentSettingsDeployMode' - type: 'null' deployProjectRoot: type: string deploymentUrl: type: string id: type: integer isCold: oneOf: - type: boolean - type: 'null' isCubeSqlEnabled: type: boolean isManaged: oneOf: - type: boolean - type: 'null' isSupportPreAggregations: type: boolean launchpadTabs: oneOf: - items: type: string type: array - type: 'null' name: type: string region: oneOf: - type: string - type: 'null' releaseChannel: $ref: '#/components/schemas/DeploymentSettingsReleaseChannel' releaseChannelVersion: oneOf: - type: string - type: 'null' releaseChannelVersionHold: oneOf: - type: boolean - type: 'null' repoType: oneOf: - $ref: '#/components/schemas/DeploymentSettingsRepoType' - type: 'null' targetPlatform: oneOf: - type: string - type: 'null' template: $ref: '#/components/schemas/DeploymentSettingsTemplate' templateVariables: oneOf: - type: object additionalProperties: true - type: 'null' required: - id - name - template - cloudProvider - creationStep - deploymentUrl - releaseChannel - deployBranchName - deployBranchReadOnly - deployBranchMergeAllowed - deployProjectRoot - isCubeSqlEnabled - isSupportPreAggregations type: object DeploymentSettingsCloudProvider: enum: - cubecloud - aws - gcp type: string DeploymentSettingsCreationMethod: enum: - upload - cubecloud - github - ssh type: string DeploymentSettingsDeployMode: enum: - git - cli type: string DeploymentSettingsReleaseChannel: enum: - latest - release type: string DeploymentSettingsRepoType: enum: - git - deployRepo type: string DeploymentSettingsTemplate: enum: - single - simpleCluster - multiCluster type: string DeploymentTokenResponse: properties: cubeApiToken: type: string required: - cubeApiToken type: object DeploymentVersion: properties: isCurrent: type: boolean isLatestInChannel: type: boolean releaseChannel: $ref: '#/components/schemas/DeploymentVersionReleaseChannel' releaseChannelVersion: type: string version: type: string required: - releaseChannelVersion - version - releaseChannel - isLatestInChannel - isCurrent type: object DeploymentVersionReleaseChannel: enum: - latest - release type: string DeploymentVersionsResponse: properties: items: items: $ref: '#/components/schemas/DeploymentVersion' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object DeploymentsListResponse: properties: count: deprecated: true description: >- Deprecated: total number of accessible deployments, ignoring pagination. Kept for backward compatibility. oneOf: - minimum: 0 type: integer - type: 'null' data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/Deployment' type: array items: items: $ref: '#/components/schemas/Deployment' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' pagination: $ref: '#/components/schemas/DeploymentsPagination' deprecated: true description: 'Deprecated: use `pageInfo` instead. Kept for backward compatibility.' totalCount: deprecated: true description: 'Deprecated: use `count`. Kept for backward compatibility.' oneOf: - minimum: 0 type: integer - type: 'null' required: - items - data - pagination type: object DeploymentsPagination: properties: limit: minimum: 0 type: integer offset: minimum: 0 type: integer total: minimum: 0 type: integer required: - total - offset - limit type: object DevBranchResponse: properties: active: type: boolean branchName: oneOf: - type: string - type: 'null' parentBranch: oneOf: - type: string - type: 'null' required: - active type: object DisconnectReportFromWorkbookInput: properties: anchorCell: oneOf: - type: string - type: 'null' externalWorkbookId: oneOf: - type: string - type: 'null' placementId: oneOf: - type: string - type: 'null' resultLocation: oneOf: - type: string - type: 'null' sheetId: oneOf: - type: string - type: 'null' sheetName: oneOf: - type: string - type: 'null' type: object DuplicateWorkbookInput: properties: shared: oneOf: - type: boolean - type: 'null' type: object EmbedAccessAllEmbedUsers: properties: action: $ref: '#/components/schemas/EmbedAccessAllEmbedUsersAction' enabled: type: boolean groupId: oneOf: - type: integer - type: 'null' required: - enabled - action type: object EmbedAccessAllEmbedUsersAction: enum: - read - none type: string EmbedAccessResponse: properties: allEmbedUsers: $ref: '#/components/schemas/EmbedAccessAllEmbedUsers' allowEmbed: type: boolean tenants: items: $ref: '#/components/schemas/EmbedAccessTenantEntry' type: array required: - allowEmbed - allEmbedUsers - tenants type: object EmbedAccessTenantEntry: properties: action: $ref: '#/components/schemas/EmbedAccessTenantEntryAction' embedTenantName: type: string groupId: type: integer required: - embedTenantName - groupId - action type: object EmbedAccessTenantEntryAction: enum: - read - none type: string EmbedDashboardCommentDto: properties: body: type: string createdAt: oneOf: - format: date type: string - format: date-time type: string dashboardId: type: string editedAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' id: type: integer isOwn: type: boolean removedAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' userId: oneOf: - type: integer - type: 'null' required: - id - dashboardId - body - createdAt - isOwn type: object EmbedDashboardCommentThreadDto: properties: replies: items: $ref: '#/components/schemas/EmbedDashboardCommentDto' type: array resolvedAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' resolvedBy: oneOf: - type: integer - type: 'null' root: $ref: '#/components/schemas/EmbedDashboardCommentDto' required: - root - replies type: object EmbedDashboardCommentThreadsListResponse: properties: items: items: $ref: '#/components/schemas/EmbedDashboardCommentThreadDto' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object EmbedGroupMemberInput: properties: embedUserId: description: Numeric id of an existing embed user. Provide this OR `externalId`. oneOf: - minimum: 1 type: integer - type: 'null' externalId: description: >- External id of the embed user (the `externalId` passed to `generate-session`). Provide this OR `embedUserId`. oneOf: - minLength: 1 type: string - type: 'null' type: object EmbedGroupMembersInput: properties: members: description: Embed users to add or remove (1–1000 per request). items: $ref: '#/components/schemas/EmbedGroupMemberInput' maxItems: 1000 minItems: 1 type: array required: - members type: object EmbedGroupMembersMutationResponse: properties: addedMembers: items: $ref: '#/components/schemas/EmbedUser' type: array unchangedMembers: items: $ref: '#/components/schemas/EmbedUser' type: array required: - addedMembers - unchangedMembers type: object EmbedMentionableUserDto: properties: email: oneOf: - type: string - type: 'null' firstName: oneOf: - type: string - type: 'null' id: type: integer username: type: string required: - id - username type: object EmbedMentionableUsersListResponse: properties: items: items: $ref: '#/components/schemas/EmbedMentionableUserDto' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object EmbedPythonFilteredRunInput: properties: reportId: type: integer reportVersionId: type: integer sqlQuery: type: string required: - reportId - sqlQuery - reportVersionId type: object EmbedSessionSettings: properties: allowAi: description: >- Whether this session may use AI at all. This is the master switch over every AI surface in the embed: the dashboard agent, the workbook chat, the AI summary widgets and the standalone embedded chat. Omit to inherit the account-wide embed setting (allowed by default); `false` disables AI even if it is enabled account-wide. Unlike the `show*` keys below it is enforced server-side — the session cannot obtain AI Chat credentials at all, so no request made with it can consume AI tokens — and it outranks them: a `false` here disables a surface whose own `show*` key is `true`. It does not change user roles or permissions for non-AI API calls. `null` is accepted and means the same as omitting it. oneOf: - type: boolean - type: 'null' allowChatWorkspaceAuthoring: description: >- Whether AI Chat authenticated with this session may create or modify persistent Cube Workspace content. Set to `false` for headless chat integrations that render answers in their own UI: ad-hoc data analysis and inline tables/charts remain available, but the agent cannot save or update standalone explorations/reports, create or modify workbooks, create or publish dashboards, or direct users to those Cube UI surfaces. Omit or set to `true` to preserve the session user's role-derived authoring capabilities; `true` never grants access the user does not already have. This setting changes only AI Chat tools and instructions. It does not change user roles or permissions for direct API calls. oneOf: - type: boolean - type: 'null' locale: description: >- UI language for every embed viewed with this session, as a BCP-47 code — a full code (`es-ES`), a short code (`es`) or a regional variant all resolve to a shipped locale. Sits between the per-iframe `?locale=` parameter, which still wins because it is the more specific answer, and the account-wide default under Embed → Settings. A language Cube does not ship falls through to that default rather than failing the session. oneOf: - type: string - type: 'null' showAiWidgets: description: >- Whether AI summary widgets are authorable and refreshable with this session: the "AI widget" entry in the dashboard editor's Add widgets menu, and the prompt input plus Generate/Regenerate controls on an existing widget. An already-generated summary still renders, so a published dashboard keeps its content — it simply cannot be regenerated. Omit to inherit the account-wide embed setting (enabled by default); `false` disables them even if they are enabled account-wide, `true` enables them even if they are disabled account-wide. oneOf: - type: boolean - type: 'null' showDashboardChat: description: >- Whether embedded published dashboards viewed with this session show the AI chat (agent panel and launcher bubble). Omit to inherit the account-wide embed setting (shown by default); `false` hides the chat even if it is enabled account-wide, `true` shows it even if it is disabled account-wide. Only affects the dashboard surface, and only hides the entry point — use `allowAi` to withhold AI from the session. oneOf: - type: boolean - type: 'null' showDashboardSettings: description: >- Whether the dashboard editor viewed with this session offers its settings panel — the gear button and the sidebar behind it. That panel is the ONLY place an embed user can reach the dashboard slug, the per-dashboard time zone, the per-dashboard agent, the grid behaviour switches and the dashboard theme, so `false` withdraws all of them together. Omit or set to `true` to keep the panel (the default). oneOf: - type: boolean - type: 'null' showGroupByCube: description: >- Whether the workbook data pane viewed with this session offers the "Group by Cube" / "Group by Folder" item in its more-actions menu. `false` hides the item AND pins the pane to the grouping it would have defaulted to — by folder when the view defines folders, by cube otherwise. The choice is remembered per browser, so pinning is what makes the pane look the same for every user of the session rather than freezing whatever each of them last picked. No content is withdrawn either way. Omit or set to `true` to leave the choice with the user (the default). oneOf: - type: boolean - type: 'null' showMemberNames: description: >- Whether the workbook data pane viewed with this session may display raw member NAMES instead of their titles (the "Show Member Names" item in the pane's more-actions menu). Member names are the data model's own identifiers, so this is a schema-protection setting in the same family as the account-wide Show Generated SQL switch. `false` hides the menu item AND pins the pane to titles, so a user who already switched to names is returned to titles — hiding the control alone would leave them stuck on names with no way back. Omit or set to `true` to leave the choice with the user (the default). oneOf: - type: boolean - type: 'null' showWorkbookChat: description: >- Whether the Creator Mode workbook viewed with this session shows its AI entry points: the chat side panel and its toggle, the launchpad's "Ask Cube Agent" button and the "Fix in chat" action on a failed report. Omit to inherit the account-wide embed setting (shown by default); `false` hides them even if they are enabled account-wide, `true` shows them even if they are disabled account-wide. Hides entry points only — use `allowAi` to withhold AI from the session. oneOf: - type: boolean - type: 'null' showWorkbookShare: description: >- Whether the Creator Mode workspace viewed with this session offers sharing: the workbook header's Share button and the Share action on a workbook, dashboard, exploration or folder row in the workspace list. Set to `false` for a deployment where each embed user should only ever see their own content. Omit or set to `true` to keep sharing available (the default). Hides the entry points only — it does not revoke access already granted, and it never widens what the session's own permissions allow. oneOf: - type: boolean - type: 'null' timezone: description: >- IANA time zone the agent runs its queries in for every embed viewed with this session (e.g. `America/New_York`). Sits between the per-iframe `?timezone=` parameter and the account-wide default, and remains subject to the tenant time-zone policy — it is not a way around it. A bare UTC offset or an unknown name falls through to the account default rather than failing the session, because Cube would compute in UTC and report nothing. oneOf: - type: string - type: 'null' type: object EmbedSettings: properties: allowAi: oneOf: - type: boolean - type: 'null' enableDashboardComments: oneOf: - type: boolean - type: 'null' locale: oneOf: - type: string - type: 'null' showAiWidgets: oneOf: - type: boolean - type: 'null' showDashboardChat: oneOf: - type: boolean - type: 'null' showWorkbookChat: oneOf: - type: boolean - type: 'null' timezone: oneOf: - type: string - type: 'null' type: object EmbedTenant: properties: createdAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' displayName: oneOf: - type: string - type: 'null' id: type: integer name: type: string userCount: type: integer required: - id - name - userCount type: object EmbedTenantProfile: properties: displayName: oneOf: - type: string - type: 'null' type: object EmbedTenantWorkbooksListQueryAccessSource: enum: - tenant - allEmbedUsers - folder type: string EmbedTenantWorkbooksListResponse: properties: items: items: $ref: '#/components/schemas/Workbook' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object EmbedTenantsPublicResponse: properties: items: items: $ref: '#/components/schemas/EmbedTenant' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object EmbedTheme: properties: analyticsChat: oneOf: - $ref: '#/components/schemas/EmbedThemeAnalyticsChat' type: object - type: 'null' chat: oneOf: - $ref: '#/components/schemas/EmbedThemeChat' type: object - type: 'null' font: oneOf: - type: string - type: 'null' primaryColor: oneOf: - type: string - type: 'null' type: object EmbedThemeAnalyticsChat: properties: backgroundColor: oneOf: - type: string - type: 'null' chatInput: oneOf: - $ref: '#/components/schemas/EmbedThemeAnalyticsChatInput' type: object - type: 'null' type: object EmbedThemeAnalyticsChatInput: properties: backgroundColor: oneOf: - type: string - type: 'null' borderColor: oneOf: - type: string - type: 'null' type: object EmbedThemeChat: properties: inputColor: oneOf: - type: string - type: 'null' type: object EmbedUser: properties: createdAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' email: oneOf: - type: string - type: 'null' externalId: oneOf: - type: string - type: 'null' firstName: oneOf: - type: string - type: 'null' id: type: integer lastLogin: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' username: type: string required: - id - username type: object EmbedUserProfile: properties: displayName: oneOf: - type: string - type: 'null' picture: oneOf: - format: url type: string - type: 'null' type: object EmbedUsersPublicResponse: properties: items: items: $ref: '#/components/schemas/EmbedUser' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object EnvVariableItem: properties: name: type: string value: type: string required: - name - value type: object EnvVariablesListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/EnvVariableItem' type: array items: items: $ref: '#/components/schemas/EnvVariableItem' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object ExportSubjectInput: properties: email: description: >- Main user email (for type=USER; provide this OR userId). For type=EMBED_USER it is the email recorded on the provisioned embed user, and the externalId is used when it is omitted. oneOf: - type: string - type: 'null' embedTenantName: description: Embed tenant name (for type=EMBED_USER) oneOf: - type: string - type: 'null' externalId: description: >- Embed user external id (for type=EMBED_USER). The user is provisioned if it does not exist yet. oneOf: - type: string - type: 'null' groups: description: >- Embed user groups (type=EMBED_USER). Must reference groups that already exist; drives what the rendered dashboard is allowed to show. oneOf: - items: type: string type: array - type: 'null' securityContext: description: >- Security context applied to the embed user before rendering (type=EMBED_USER) — the same object a generate-session call takes. Row-level rules in the data model see exactly this. oneOf: - type: object additionalProperties: true - type: 'null' type: $ref: '#/components/schemas/ExportSubjectInputType' description: Subject kind userAttributes: description: >- Embed user attribute values (type=EMBED_USER). Names must reference attribute definitions that already exist. oneOf: - items: $ref: '#/components/schemas/UserAttributeInput' type: array - type: 'null' userId: description: Main user id (for type=USER; provide this OR email) oneOf: - type: integer - type: 'null' required: - type type: object ExportSubjectInputType: enum: - USER - EMBED_USER type: string ExternalDocumentPlacementResponse: properties: access: $ref: '#/components/schemas/ExternalDocumentPlacementResponseAccess' anchorCell: oneOf: - type: string - type: 'null' deploymentId: type: integer endResultCell: oneOf: - type: string - type: 'null' host: oneOf: - $ref: '#/components/schemas/ExternalDocumentPlacementResponseHost' - type: 'null' owner: oneOf: - $ref: '#/components/schemas/ResourceOwner' - type: 'null' placedAt: oneOf: - type: string - type: 'null' placementId: oneOf: - type: string - type: 'null' refreshedAt: oneOf: - type: string - type: 'null' reportId: type: integer reportName: oneOf: - type: string - type: 'null' resultLocation: type: string sheetId: oneOf: - type: string - type: 'null' sheetName: oneOf: - type: string - type: 'null' required: - access - reportId - deploymentId - resultLocation type: object ExternalDocumentPlacementResponseAccess: enum: - GRANTED - DENIED type: string ExternalDocumentPlacementResponseHost: enum: - GOOGLE_SHEETS - EXCEL type: string ExternalDocumentPlacementsListResponse: properties: items: items: $ref: '#/components/schemas/ExternalDocumentPlacementResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object FileHash: properties: hash: type: string required: - hash type: object FillMissingRows: properties: excludedDimensions: oneOf: - items: type: string type: array - type: 'null' member: type: string required: - member type: object FinishUploadBody: properties: autoRemoveFiles: default: true oneOf: - type: boolean - type: 'null' awaitGitOperations: default: true oneOf: - type: boolean - type: 'null' commitMessage: oneOf: - type: string - type: 'null' files: type: object transaction: $ref: '#/components/schemas/UploadTransaction' required: - transaction - files type: object FinishUploadResponse: properties: lastHash: oneOf: - type: string - type: 'null' type: object Folder: properties: createdAt: oneOf: - format: date type: string - format: date-time type: string createdBy: type: integer deploymentId: type: integer folderPath: items: $ref: '#/components/schemas/WorkspaceFolderPathEntry' type: array id: type: integer name: type: string parentId: oneOf: - type: integer - type: 'null' position: type: integer type: $ref: '#/components/schemas/FolderDtoType' updatedAt: oneOf: - format: date type: string - format: date-time type: string updatedBy: oneOf: - type: integer - type: 'null' user: oneOf: - $ref: '#/components/schemas/ResourceOwner' - type: 'null' required: - name - position - id - deploymentId - createdAt - updatedAt - type type: object FolderDtoType: enum: - FOLDER - WORKBOOK - REPORT type: string FoldersListResponse: properties: count: deprecated: true description: >- Deprecated: total number of accessible folders, ignoring pagination. Kept for backward compatibility. oneOf: - minimum: 0 type: integer - type: 'null' data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/Folder' type: array items: items: $ref: '#/components/schemas/Folder' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object GenerateEmbedTokenResponse: properties: token: type: string required: - token type: object GenerateSession: properties: branchName: description: >- Branch of `deploymentId` whose data model this session queries. Omit it — or pass the deployment’s production branch — to query the production environment, which is the default. Any other branch of the deployment is accepted: a branch with a staging environment enabled, a shared branch, or a personal dev branch. The branch must be served when the session is generated, otherwise the request is rejected: a branch without a staging environment runs only while someone has it open in Cube (dev mode or the branch switcher), so enable its staging environment for a branch an embedded app should be able to reach at any time. A name that is not a branch of the deployment returns `404`. Content (dashboards, workbooks, reports) is not branch-scoped — the same saved content is rendered against the branch’s data model. oneOf: - type: string - type: 'null' creatorMode: oneOf: - type: boolean - type: 'null' deploymentId: type: number email: oneOf: - type: string - type: 'null' embedTenantName: oneOf: - pattern: ^[a-z][a-z0-9-]{0,34}[a-z0-9]$ type: string - type: 'null' embedTenantProfile: oneOf: - $ref: '#/components/schemas/EmbedTenantProfile' type: object - type: 'null' embedTheme: oneOf: - $ref: '#/components/schemas/EmbedTheme' type: object - type: 'null' externalId: oneOf: - type: string - type: 'null' groupDefinitions: deprecated: true description: >- Deprecated and ignored. Global groups can no longer be created through this endpoint — define them beforehand via the Cube UI or admin API. Still accepted for backward compatibility (no error), but it has no effect. To create per-embed-tenant groups, use `tenantGroupDefinitions`. oneOf: - items: $ref: '#/components/schemas/GroupDefinition' type: array - type: 'null' groups: description: >- Global user groups — defined once at the tenant level and shared across every embed tenant — to assign this embed user to. Use `groups` for **data-model access control**: each name is placed verbatim into the Cube security context as `cubeCloud.groups`, where your data model's `access_policy` rules reference it to gate cubes, views, members, and row-/column-level filters. The groups must already exist in the tenant (create them via the Cube UI or admin API beforehand) — this endpoint never creates global groups, and names that do not resolve to an existing group are rejected. Global groups are NOT shown in an embed tenant’s Creator Mode UI. To share or organize content inside a single embed tenant, use `tenantGroups` instead. oneOf: - items: type: string type: array - type: 'null' internalId: oneOf: - type: string - type: 'null' isEphemeral: oneOf: - type: boolean - type: 'null' publicDashboardId: oneOf: - type: string - type: 'null' roles: oneOf: - items: type: string type: array - type: 'null' securityContext: oneOf: - type: object additionalProperties: true - type: 'null' settings: description: >- Per-session overrides for embed behavior, stored in the signed embed token. Each documented key applies only to this session; omitted keys preserve their existing default behavior. oneOf: - $ref: '#/components/schemas/EmbedSessionSettings' type: object - type: 'null' tenantGroupDefinitions: description: >- Idempotently create or update the per-embed-tenant groups referenced by `tenantGroups`, before they are assigned. Requires `creatorMode: true` and `embedTenantName`. Use this to declare a tenant’s groups in the same call that assigns them, so you do not need a separate admin request. Applies only to per-embed-tenant groups; global groups must be defined beforehand. oneOf: - items: $ref: '#/components/schemas/GroupDefinition' type: array - type: 'null' tenantGroups: description: >- Per-embed-tenant user groups — scoped to the single embed tenant named by `embedTenantName` — to assign this embed user to. Use `tenantGroups` for **content sharing and organization within one embed tenant**: for example, so a creator can share a workbook, dashboard, or folder with a group of that tenant’s users. These are the only groups shown in the embed tenant’s Creator Mode UI. Requires `creatorMode: true` and `embedTenantName`. Define the groups beforehand — or in the same request — via `tenantGroupDefinitions`. In the Cube security context they appear namespaced as `system:tenant:{embedTenantName}:group:{groupName}`, so a tenant group can never collide with — or be mistaken for — a global `groups` entry of the same name. For organization-wide data-model access policies, use `groups`. oneOf: - items: type: string type: array - type: 'null' userAttributeDefinitions: oneOf: - items: $ref: '#/components/schemas/UserAttributeDefinition' type: array - type: 'null' userAttributes: oneOf: - items: $ref: '#/components/schemas/UserAttributeInput' type: array - type: 'null' userProfile: oneOf: - $ref: '#/components/schemas/EmbedUserProfile' type: object - type: 'null' required: - deploymentId type: object GenerateSessionResponse: properties: sessionId: type: string required: - sessionId type: object GetDeploymentEnvironmentsQueryType: enum: - production - staging - development type: string GetReportDeliveriesQueryStatus: enum: - active - failing - needs_reconnect - no_sheet_access - orphaned type: string GetReportDeliveryRunsQuerySortDirection: enum: - ASC - DESC type: string GetReportsQuerySortBy: enum: - name - createdAt - updatedAt - lastViewedAt type: string GetReportsQuerySortDirection: enum: - ASC - DESC type: string GetUserAttributesQueryType: enum: - string - number - boolean - string_array - number_array type: string GetWorkspaceObjectsQueryOrderByDirection: enum: - ASC - DESC type: string GetWorkspaceObjectsQueryOrderByField: enum: - updated_at - created_at - name - viewer_last_viewed_at type: string GitHubBranchResponse: properties: isDefault: type: boolean name: type: string required: - name - isDefault type: object GitHubBranchesListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/GitHubBranchResponse' type: array items: items: $ref: '#/components/schemas/GitHubBranchResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object GitHubConnectStatusResponse: properties: connected: type: boolean linkUrl: type: string settingsUrl: type: string required: - connected - linkUrl - settingsUrl type: object GitHubInstallationResponse: properties: avatarUrl: type: string id: type: string installationId: type: string login: type: string required: - installationId - id - login - avatarUrl type: object GitHubInstallationsListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/GitHubInstallationResponse' type: array items: items: $ref: '#/components/schemas/GitHubInstallationResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object GitHubRepoResponse: properties: htmlUrl: type: string id: type: integer name: type: string required: - id - name - htmlUrl type: object GitHubReposListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/GitHubRepoResponse' type: array items: items: $ref: '#/components/schemas/GitHubRepoResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object GroupDefinition: properties: description: oneOf: - type: string - type: 'null' name: type: string required: - name type: object JsonConfigFileDto: properties: content: description: >- The configuration as canonical JSON text: keys sorted, 2-space indentation, trailing newline. `oldText` in a replacement must match this text exactly. type: string hash: description: >- SHA-256 of `content`. Send it back as `expectedHash` to reject the write if the configuration changed since you read it. type: string required: - content - hash type: object ListDatabricksMetricViewSyncsQueryStatus: enum: - QUEUED - RUNNING - CANCELLING - COMPLETED - PARTIAL - FAILED - CANCELLED type: string LocalizedValue: properties: locale: maxLength: 35 type: string value: maxLength: 1000 type: string required: - locale - value type: object MergeIntoParentBranchRequest: properties: branchId: type: integer branchName: type: string deleteBranch: oneOf: - type: boolean - type: 'null' message: oneOf: - type: string - type: 'null' squashCommits: oneOf: - type: boolean - type: 'null' switchToParentBranch: oneOf: - type: boolean - type: 'null' type: object MergeResponse: properties: branchDeleted: type: boolean merged: type: boolean required: - merged - branchDeleted type: object MergeToDefaultBranchRequest: properties: branchId: type: integer branchName: type: string message: type: string removeBranchAfterMerge: oneOf: - type: boolean - type: 'null' required: - message type: object MoveWorkspaceObjectInput: properties: folderId: oneOf: - type: integer - type: 'null' id: type: integer type: $ref: '#/components/schemas/MoveWorkspaceObjectInputType' required: - type - id type: object MoveWorkspaceObjectInputType: enum: - FOLDER - WORKBOOK - REPORT type: string NotificationDto: properties: cronExpression: type: string dashboardId: type: integer deploymentId: type: integer filters: description: Dimension filters applied when the notification is rendered. oneOf: - items: $ref: '#/components/schemas/DashboardFilter' type: array - type: 'null' humanReadableSchedule: description: Human-readable description of the cron schedule type: string id: type: integer isEnabled: type: boolean memberSwitchers: description: Field-switcher selections applied when the notification is rendered. oneOf: - items: $ref: '#/components/schemas/DashboardMemberSwitcher' type: array - type: 'null' notificationAiSummary: description: Whether this notification carries an AI-generated "what changed" summary in its body. type: boolean notificationEnabled: type: boolean notificationFormat: type: string timeGrains: description: Time-grain overrides applied when the notification is rendered. oneOf: - items: $ref: '#/components/schemas/DashboardTimeGrain' type: array - type: 'null' timezone: type: string required: - id - dashboardId - deploymentId - cronExpression - timezone - isEnabled - humanReadableSchedule - notificationEnabled - notificationFormat - notificationAiSummary type: object NotificationRecipient: properties: channelId: oneOf: - type: string - type: 'null' channelName: oneOf: - type: string - type: 'null' email: oneOf: - type: string - type: 'null' embedTenantName: oneOf: - type: string - type: 'null' embedUserId: oneOf: - type: integer - type: 'null' externalId: oneOf: - type: string - type: 'null' type: $ref: '#/components/schemas/NotificationRecipientType' userId: oneOf: - type: integer - type: 'null' username: oneOf: - type: string - type: 'null' required: - type type: object NotificationRecipientInput: properties: channelId: description: Slack channel id (for type=SLACK) oneOf: - type: string - type: 'null' channelName: description: Slack channel display name (optional, for type=SLACK) oneOf: - type: string - type: 'null' email: description: Main user email (for type=USER; provide this OR userId) oneOf: - type: string - type: 'null' embedTenantName: description: Embed tenant name (for type=EMBED_USER) oneOf: - type: string - type: 'null' externalId: description: Embed user external id (for type=EMBED_USER) oneOf: - type: string - type: 'null' groups: description: >- Embed user groups (type=EMBED_USER). Must reference groups that already exist; drives per-recipient access when the report is rendered. oneOf: - items: type: string type: array - type: 'null' securityContext: description: >- Embed user security context (type=EMBED_USER). Applied for per-recipient row-level security when the report is rendered. oneOf: - type: object additionalProperties: true - type: 'null' type: $ref: '#/components/schemas/NotificationRecipientInputType' description: Recipient kind userAttributes: description: >- Embed user attribute values (type=EMBED_USER). Names must reference attribute definitions that already exist. oneOf: - items: $ref: '#/components/schemas/UserAttributeInput' type: array - type: 'null' userId: description: Main user id (for type=USER; provide this OR email) oneOf: - type: integer - type: 'null' required: - type type: object NotificationRecipientInputType: enum: - USER - EMBED_USER - SLACK type: string NotificationRecipientType: enum: - USER - EMBED_USER - SLACK type: string NotificationRecipientsListResponse: properties: items: items: $ref: '#/components/schemas/NotificationRecipient' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object NotificationRecipientsMutationResponse: properties: createdRecipients: description: Recipients newly subscribed by this request items: $ref: '#/components/schemas/NotificationRecipient' type: array unchangedRecipients: description: Recipients that already existed and were left unchanged items: $ref: '#/components/schemas/NotificationRecipient' type: array updatedRecipients: description: >- Existing recipients whose properties (e.g. embed security context / attributes / groups, or Slack channel name) were updated items: $ref: '#/components/schemas/NotificationRecipient' type: array required: - createdRecipients - updatedRecipients - unchangedRecipients type: object NotificationsListResponse: properties: items: items: $ref: '#/components/schemas/NotificationDto' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object OAuthIntegration: properties: authUrl: format: url type: string clientId: type: string config: oneOf: - type: object additionalProperties: true - type: 'null' createdAt: oneOf: - format: date type: string - format: date-time type: string id: type: integer name: type: string redirectUri: format: url type: string scopes: oneOf: - items: {} type: array - type: 'null' tokenUrl: format: url type: string type: type: string updatedAt: oneOf: - format: date type: string - format: date-time type: string required: - id - name - type - authUrl - tokenUrl - clientId - redirectUri - createdAt - updatedAt type: object OidcTokenConfig: properties: audience: type: string audienceType: type: string createdAt: oneOf: - format: date type: string - format: date-time type: string customClaims: oneOf: - type: object - type: 'null' id: type: integer isEnabled: type: boolean name: type: string subFormat: oneOf: - type: string - type: 'null' targetEnvVar: oneOf: - type: string - type: 'null' updatedAt: oneOf: - format: date type: string - format: date-time type: string required: - id - audienceType - audience - name - isEnabled - createdAt - updatedAt type: object OssieConversionCounts: properties: cubes: description: Cube cubes. type: integer datasets: description: Ossie datasets. type: integer fields: description: Ossie dataset fields. type: integer files: description: Cube data model files. type: integer issues: $ref: '#/components/schemas/OssieConversionIssueCounts' metrics: description: Ossie metrics. type: integer relationships: description: Ossie relationships. type: integer views: description: Cube views. type: integer required: - datasets - relationships - fields - metrics - cubes - views - files - issues type: object OssieConversionFile: properties: content: type: string path: description: >- For an export, `ossie.yaml`. For an import, the path of the generated file within the data model project. type: string required: - path - content type: object OssieConversionFilesListResponse: properties: items: description: The converted files, empty when the conversion failed. items: $ref: '#/components/schemas/OssieConversionFile' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object OssieConversionInput: properties: baseCube: description: >- Import only. The dataset the generated view is rooted at, for an Ossie model whose relationships do not determine one. oneOf: - type: string - type: 'null' dialect: description: >- Import only. The warehouse dialect whose expressions are preferred where the Ossie model has several; ANSI_SQL is always the fallback. Defaults to the dialect of the deployment's default data source, or ANSI_SQL. oneOf: - $ref: '#/components/schemas/OssieConversionInputDialect' - type: 'null' direction: $ref: '#/components/schemas/OssieConversionInputDirection' description: >- 'export' converts a Cube data model to an Ossie model; 'import' converts an Ossie model to Cube data model files. files: description: >- Export with source 'files' only. Relative `.yml`/`.yaml` paths mapped to their contents, such as a local checkout of the data model. Other files are not accepted. oneOf: - type: object additionalProperties: type: string - type: 'null' ossieYaml: description: Import only. The Ossie YAML document to convert. oneOf: - type: string - type: 'null' source: description: >- Export only. 'deployment' (the default) converts the YAML data model of the deployment's latest successful build; 'files' converts the `files` sent with the request. oneOf: - $ref: '#/components/schemas/OssieConversionInputSource' - type: 'null' strictFanout: description: >- Export only. Refuse a metric whose value join fan-out could change, instead of converting it with a warning. Defaults to false for a whole-model export and true for a view export. oneOf: - type: boolean - type: 'null' view: description: Export only. Convert just this view's public members instead of the whole model. oneOf: - type: string - type: 'null' required: - direction type: object OssieConversionInputDialect: enum: - ANSI_SQL - SNOWFLAKE - DATABRICKS - BIGQUERY type: string OssieConversionInputDirection: enum: - export - import type: string OssieConversionInputSource: enum: - deployment - files type: string OssieConversionIssue: properties: code: description: The converter issue type, such as DROPPED_MEASURE or CONVERSION_FAILED. type: string element: description: The model element the issue is about. oneOf: - type: string - type: 'null' message: type: string severity: $ref: '#/components/schemas/OssieConversionIssueSeverity' description: >- ERROR fails the conversion. WARNING marks something dropped or changed. INFO marks something kept in another form. required: - code - severity - message type: object OssieConversionIssueCounts: properties: error: type: integer info: type: integer warning: type: integer required: - error - warning - info type: object OssieConversionIssueSeverity: enum: - ERROR - WARNING - INFO type: string OssieConversionResultResponse: properties: completedAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string conversionId: type: string counts: $ref: '#/components/schemas/OssieConversionCounts' deploymentId: type: integer direction: $ref: '#/components/schemas/OssieConversionResultResponseDirection' durationMs: type: integer issues: items: $ref: '#/components/schemas/OssieConversionIssue' type: array outcome: $ref: '#/components/schemas/OssieConversionResultResponseOutcome' description: '''failed'' exactly when an issue has severity ERROR.' runtime: $ref: '#/components/schemas/OssieConversionRuntime' sourceSha256: description: SHA-256 of the converted input. type: string required: - conversionId - deploymentId - direction - outcome - completedAt - durationMs - sourceSha256 - counts - issues - runtime type: object OssieConversionResultResponseDirection: enum: - export - import type: string OssieConversionResultResponseOutcome: enum: - success - failed type: string OssieConversionRuntime: properties: cubeConverterVersion: type: string ossieCommit: description: The apache/ossie commit the converter was built from. type: string ossieCoreVersion: type: string required: - ossieCommit - ossieCoreVersion - cubeConverterVersion type: object OssieConversionStartResponse: properties: conversionId: type: string resultUrl: type: string status: $ref: '#/components/schemas/OssieConversionStartResponseStatus' statusUrl: type: string required: - conversionId - status - statusUrl - resultUrl type: object OssieConversionStartResponseStatus: enum: - QUEUED type: string OssieConversionStatusResponse: properties: conversionId: type: string deploymentId: type: integer direction: $ref: '#/components/schemas/OssieConversionStatusResponseDirection' error: description: Why the job ended without a result. oneOf: - type: string - type: 'null' startedAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string status: $ref: '#/components/schemas/OssieConversionStatusResponseStatus' description: >- One of QUEUED, RUNNING, COMPLETED, FAILED or CANCELLED. COMPLETED means a result is available, even when the conversion itself failed; read its outcome. FAILED means the job ended without a result. updatedAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string required: - conversionId - deploymentId - direction - status - startedAt - updatedAt type: object OssieConversionStatusResponseDirection: enum: - export - import type: string OssieConversionStatusResponseStatus: enum: - QUEUED - RUNNING - COMPLETED - FAILED - CANCELLED type: string PageInfo: properties: endCursor: oneOf: - type: string - type: 'null' hasNextPage: type: boolean hasPreviousPage: type: boolean startCursor: oneOf: - type: string - type: 'null' required: - hasNextPage - hasPreviousPage type: object PeriodComparison: properties: measure: type: string offset: $ref: '#/components/schemas/PeriodComparisonOffset' outputs: oneOf: - items: type: string type: array - type: 'null' timeDimension: type: string required: - measure - timeDimension - offset type: object PeriodComparisonOffset: properties: amount: type: integer unit: type: string required: - amount - unit type: object PivotItems: properties: columns: items: type: string type: array displayScale: oneOf: - $ref: '#/components/schemas/PivotItemsDisplayScale' - type: 'null' filters: items: type: string type: array measures: items: type: string type: array measuresAxis: oneOf: - $ref: '#/components/schemas/PivotItemsMeasuresAxis' - type: 'null' measuresPosition: oneOf: - $ref: '#/components/schemas/PivotItemsMeasuresPosition' - type: 'null' rows: items: type: string type: array showAppliedFilters: oneOf: - type: boolean - type: 'null' showColumnTotals: oneOf: - type: boolean - type: 'null' showRowTotals: oneOf: - type: boolean - type: 'null' required: - columns - measures - rows - filters type: object PivotItemsDisplayScale: enum: - model - absolute - thousands - millions - billions type: string PivotItemsInput: properties: columns: items: type: string type: array displayScale: oneOf: - $ref: '#/components/schemas/PivotItemsInputDisplayScale' - type: 'null' filters: items: type: string type: array measures: items: type: string type: array measuresAxis: oneOf: - $ref: '#/components/schemas/PivotItemsInputMeasuresAxis' - type: 'null' measuresPosition: oneOf: - $ref: '#/components/schemas/PivotItemsInputMeasuresPosition' - type: 'null' rows: items: type: string type: array showAppliedFilters: oneOf: - type: boolean - type: 'null' showColumnTotals: oneOf: - type: boolean - type: 'null' showRowTotals: oneOf: - type: boolean - type: 'null' required: - columns - measures - rows - filters type: object PivotItemsInputDisplayScale: enum: - model - absolute - thousands - millions - billions type: string PivotItemsInputMeasuresAxis: enum: - columns - rows type: string PivotItemsInputMeasuresPosition: enum: - before - after type: string PivotItemsMeasuresAxis: enum: - columns - rows type: string PivotItemsMeasuresPosition: enum: - before - after type: string Policy: properties: actions: items: enum: - All - DeploymentsManage - DeploymentCreate - DeploymentRead - DeploymentUpdate - DeploymentDelete - SecretsManage - DownloadData - PlaygroundRead - SchemaRead - SchemaUpdate - SchemaUpdateDevBranches - APMRead - ChatHistoryRead - PreAggregationRead - PreAggregationBuild - AlertsCreate - AlertsRead - AlertsUpdate - AlertsDelete - AuditLogManage - BillingRead - SqlRunnerRead - DataAssetsRead - DataAssetsManage - CubeNetworkConnect - ReportRead - ReportEdit - ReportManage - WorkbookManage - WorkbookRead - WorkbookEdit - ChatThreadRead - AgentManage - AgentRead - AgentSpaceManage - AgentAdmin - DeploymentAgentRead - ScheduledTasksCreate - ScheduledTaskRead - OAuthIntegrationsManage - OAuthIntegrationsIssueTokens - McpToolsManage - AIBIDevelop - AIBIExplore - AIBIView - ChartPalettesManage - DashboardThemesManage - AIBIDeveloper - AIBIUser - AIBIViewer - EmbedDeploymentRead - EmbedDashboardRead - FolderRead - FolderEdit - FolderManage type: string type: array resourceType: $ref: '#/components/schemas/PolicyResourceType' resources: items: type: string type: array required: - resourceType - actions - resources type: object PolicyResourceType: enum: - Global - Deployment - Report - ReportFolder - Agent - AgentSpace - Workbook - Dashboard - Folder - ChatThread - ScheduledTask type: string PostTokenBySessionIdInput: properties: sessionId: type: string required: - sessionId type: object PreviewWorkbookPromotionInput: properties: targetDeploymentId: minimum: 1 type: integer targetFolderId: oneOf: - minimum: 1 type: integer - type: 'null' required: - targetDeploymentId type: object PromotionActorDto: properties: apiKeyId: oneOf: - type: integer - type: 'null' authenticationMethod: $ref: '#/components/schemas/PromotionActorDtoAuthenticationMethod' displayName: type: string userId: type: integer required: - userId - displayName - authenticationMethod type: object PromotionActorDtoAuthenticationMethod: enum: - session - apiKey type: string PromotionReferenceDto: properties: availability: $ref: '#/components/schemas/PromotionReferenceDtoAvailability' deploymentId: oneOf: - type: integer - type: 'null' name: oneOf: - type: string - type: 'null' workbookId: oneOf: - type: integer - type: 'null' required: - availability type: object PromotionReferenceDtoAvailability: enum: - available - unavailable type: string ProvisionEmbedUserFailure: properties: error: $ref: '#/components/schemas/BulkActionError' externalId: description: The `externalId` of the entry that failed, normalized the same way a successful one is. type: string required: - externalId - error type: object ProvisionEmbedUserInput: properties: email: description: >- Email address, shown wherever the user is listed and searchable through `GET /embed-tenants/{embedTenantName}/users`. Must be a valid address, and is stored lowercased. Omit it and Cube derives a synthetic `{externalId}@cubecloud.dev` placeholder instead, which is what makes a user hard to recognise in a list. Supplying it again later updates the stored address. oneOf: - format: email type: string - type: 'null' externalId: description: >- The id your own system knows this user by — the same `externalId` you will pass to `generate-session`. Trimmed and lowercased before it is stored, so casing never produces a second user. minLength: 1 type: string groups: description: >- Global, account-wide groups (the `groups` field of `generate-session`) that gate data-model access. They must already exist. Supplying the field REPLACES the user’s global groups; omit it to leave them untouched, pass `[]` to clear them. oneOf: - items: type: string type: array - type: 'null' tenantGroups: description: >- Groups belonging to this embed tenant (the `tenantGroups` field of `generate-session`), which scope content sharing and organization within the tenant. Create them first via `POST /embed-tenants/{embedTenantName}/groups`. Supplying the field REPLACES the user’s tenant groups; omit it to leave them untouched, pass `[]` to clear them. oneOf: - items: type: string type: array - type: 'null' userProfile: description: >- Display name and avatar. `displayName` is the name shown wherever the user appears, including on content they author. Omitted fields keep their current value. oneOf: - $ref: '#/components/schemas/EmbedUserProfile' type: object - type: 'null' required: - externalId type: object ProvisionEmbedUsersInput: properties: users: description: Embed users to provision (1–100 per request). items: $ref: '#/components/schemas/ProvisionEmbedUserInput' maxItems: 100 minItems: 1 type: array required: - users type: object ProvisionEmbedUsersResponse: properties: failed: description: The entries that were not applied, each with the reason. items: $ref: '#/components/schemas/ProvisionEmbedUserFailure' type: array succeeded: description: The users that were provisioned, in the order they were requested. items: $ref: '#/components/schemas/EmbedUser' type: array required: - succeeded - failed type: object PublishDashboardInput: properties: allowEmbed: oneOf: - type: boolean - type: 'null' config: oneOf: - $ref: '#/components/schemas/DashboardConfigInput' - type: 'null' dashboardId: oneOf: - type: integer - type: 'null' description: oneOf: - type: string - type: 'null' title: oneOf: - type: string - type: 'null' workbookId: type: integer required: - workbookId type: object PullRequest: properties: branchName: type: string required: - branchName type: object PullResponse: properties: buildTriggered: type: boolean required: - buildTriggered type: object PythonAnalysisFilteredRun: properties: at: type: string dataRefreshedAt: oneOf: - type: string - type: 'null' executionError: oneOf: - type: string - type: 'null' inputRowCount: type: integer outputData: oneOf: - {} - type: 'null' stderr: type: string stdout: type: string required: - at - stdout - stderr - inputRowCount type: object RefreshReportInput: properties: anchorCell: oneOf: - type: string - type: 'null' externalWorkbookId: oneOf: - type: string - type: 'null' placementId: oneOf: - type: string - type: 'null' resultChecksum: oneOf: - $ref: '#/components/schemas/ReportPlacementResultChecksumInput' - type: 'null' resultLocation: oneOf: - type: string - type: 'null' sheetId: oneOf: - type: string - type: 'null' sheetName: oneOf: - type: string - type: 'null' type: object RegionResponse: properties: id: type: integer isDedicated: oneOf: - type: boolean - type: 'null' isHybrid: oneOf: - type: boolean - type: 'null' isPublic: oneOf: - type: boolean - type: 'null' name: type: string provider: oneOf: - type: string - type: 'null' title: oneOf: - type: string - type: 'null' useAiEngineer: oneOf: - type: boolean - type: 'null' required: - id - name type: object RegionsListResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/RegionResponse' type: array items: items: $ref: '#/components/schemas/RegionResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object RemoveDataModelFilesInput: properties: branchId: type: integer branchName: type: string files: items: $ref: '#/components/schemas/DataModelFilePath' type: array required: - files type: object RemoveNotificationRecipientInput: properties: embedTenantName: description: Embed tenant name (required for type=EMBED_USER; resolves the storage partition) oneOf: - type: string - type: 'null' id: description: >- Recipient id: userId (type=USER), embedUserId (type=EMBED_USER), or channelId (type=SLACK) not: type: 'null' oneOf: - type: integer - type: string type: $ref: '#/components/schemas/RemoveNotificationRecipientInputType' required: - type - id type: object RemoveNotificationRecipientInputType: enum: - USER - EMBED_USER - SLACK type: string RemoveNotificationRecipientsInput: properties: recipients: description: Recipients to unsubscribe (1–1000 per request) items: $ref: '#/components/schemas/RemoveNotificationRecipientInput' maxItems: 1000 minItems: 1 type: array required: - recipients type: object RenameDataModelFilesInput: properties: branchId: type: integer branchName: type: string files: items: $ref: '#/components/schemas/DataModelFileRename' type: array required: - files type: object ReplaceJsonConfigTextInput: properties: edits: description: >- Replacements applied in order, each to the result of the previous one. Either all apply or nothing is saved. items: $ref: '#/components/schemas/TextReplacementInput' maxItems: 50 minItems: 1 type: array expectedHash: description: >- The `hash` from your last read. When set, the request fails with 409 if the configuration changed since then. oneOf: - pattern: ^[a-f0-9]{64}$ type: string - type: 'null' required: - edits type: object Report: properties: canEdit: oneOf: - type: boolean - type: 'null' canManage: oneOf: - type: boolean - type: 'null' createdAt: oneOf: - format: date type: string - format: date-time type: string createdBy: type: integer currentQueryChecksum: oneOf: - type: string - type: 'null' deploymentId: type: integer description: oneOf: - type: string - type: 'null' endResultCell: oneOf: - type: string - type: 'null' externalWorkbookId: oneOf: - type: string - type: 'null' externalWorkbookPlacements: oneOf: - items: $ref: '#/components/schemas/ReportPlacement' type: array - type: 'null' folderId: oneOf: - type: integer - type: 'null' folderPath: items: $ref: '#/components/schemas/WorkspaceFolderPathEntry' type: array id: type: integer jsonQuery: oneOf: - type: string - type: 'null' meta: oneOf: - type: object additionalProperties: true - type: 'null' name: maxLength: 255 type: string pivotItems: oneOf: - $ref: '#/components/schemas/PivotItems' - type: 'null' publicId: maxLength: 12 minLength: 12 pattern: ^[0-9A-Za-z]+$ type: string refreshedBy: oneOf: - type: integer - type: 'null' refreshedByUser: $ref: '#/components/schemas/ResourceOwner' resultLocation: oneOf: - type: string - type: 'null' rolesWithAccess: oneOf: - items: $ref: '#/components/schemas/RoleWithAccess' type: array - type: 'null' source: oneOf: - $ref: '#/components/schemas/ReportDtoSource' - type: 'null' sqlQuery: oneOf: - type: string - type: 'null' title: oneOf: - type: string - type: 'null' type: $ref: '#/components/schemas/ReportDtoType' updatedAt: oneOf: - format: date type: string - format: date-time type: string user: $ref: '#/components/schemas/ResourceOwner' userId: type: integer version: oneOf: - type: integer - type: 'null' workbookId: oneOf: - type: integer - type: 'null' required: - publicId - userId - user - name - refreshedByUser - id - deploymentId - createdAt - updatedAt - type type: object ReportDeliveriesListResponse: properties: items: items: $ref: '#/components/schemas/ReportDeliveryResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object ReportDeliveryColumn: properties: column: oneOf: - type: string - type: 'null' header: oneOf: - type: string - type: 'null' placeholder: oneOf: - type: boolean - type: 'null' type: object ReportDeliveryColumnInput: properties: column: description: >- Name of a column the report’s query returns: its alias in the SQL. Provide this OR `placeholder` (exactly one). oneOf: - minLength: 1 type: string - type: 'null' header: description: >- Text of the header cell. Defaults to the column name; required for a placeholder, where it may be empty. oneOf: - maxLength: 1000 type: string - type: 'null' placeholder: description: >- `true` for an empty column that holds only its header. Provide this OR `column` (exactly one). oneOf: - $ref: '#/components/schemas/ReportDeliveryColumnInputPlaceholder' - type: 'null' type: object ReportDeliveryColumnInputPlaceholder: enum: - true type: boolean ReportDeliveryDestination: properties: anchorCell: description: Top-left cell of the delivered block, in A1 notation. type: string sheetId: oneOf: - type: integer - type: 'null' sheetName: oneOf: - type: string - type: 'null' spreadsheetId: type: string required: - spreadsheetId - anchorCell type: object ReportDeliveryDestinationInput: properties: anchorCell: description: Top-left cell of the delivered block, in A1 notation (e.g. `B3`). Defaults to `A1`. oneOf: - type: string - type: 'null' sheetId: description: >- Id of the tab to write into (the `gid` in the spreadsheet URL). A tab is followed by its id through a rename. Provide this OR `sheetName`; neither when `writeMode` is `new_sheet`. oneOf: - minimum: 0 type: integer - type: 'null' sheetName: description: >- Title of the tab to write into. Provide this OR `sheetId`; neither when `writeMode` is `new_sheet`. oneOf: - minLength: 1 type: string - type: 'null' spreadsheet: description: 'The Google Sheets spreadsheet: its URL or its id.' minLength: 1 type: string required: - spreadsheet type: object ReportDeliveryNotificationSettings: properties: email: type: boolean inbox: type: boolean slackChannelId: description: '`null` when nothing is posted to Slack.' oneOf: - type: string - type: 'null' slackChannelName: oneOf: - type: string - type: 'null' required: - inbox - email type: object ReportDeliveryNotificationsInput: properties: email: description: Email the owner's Cube address. type: boolean inbox: description: Notify in the owner's Cube inbox. type: boolean slackChannelId: description: Also post to this Slack channel, by id. Needs the Cube Slack app installed. oneOf: - maxLength: 255 type: string minLength: 1 - type: 'null' slackChannelName: description: The channel's name, kept for display only. oneOf: - maxLength: 255 type: string - type: 'null' required: - inbox - email type: object ReportDeliveryResponse: properties: deploymentId: type: integer destination: $ref: '#/components/schemas/ReportDeliveryDestination' id: type: integer lastRunAt: description: When the last run finished. `null` before the first. oneOf: - type: string format: date-time - type: 'null' lastSuccessAt: description: When the last successful run finished. `null` if none has succeeded. oneOf: - type: string format: date-time - type: 'null' name: type: string nextRunAt: description: When the schedule next fires. `null` when there is no schedule or it is paused. oneOf: - {} - type: 'null' notifications: $ref: '#/components/schemas/ReportDeliveryNotificationSettings' description: >- How the owner hears that the delivery failed or recovered. A delivery that runs more than once a day reports only changes in its status; a daily or rarer one reports every failed run. ownerUserId: description: >- The accountable user, whose Google account writes the sheet. `null` once that user has been deleted. oneOf: - type: integer - type: 'null' pausedAt: description: When the delivery was paused. `null` if it is not. oneOf: - {} - type: 'null' reportId: description: The delivered report. `null` once that report has been deleted. oneOf: - type: integer - type: 'null' reportName: description: Name of the delivered report. `null` once that report has been deleted. oneOf: - type: string - type: 'null' reportPublicId: description: Public id of the delivered report. `null` once that report has been deleted. oneOf: - type: string - type: 'null' reportWorkbookId: description: Workbook holding the delivered report. `null` once that report has been deleted. oneOf: - type: integer - type: 'null' runAsUserId: description: The user whose data access the query runs with. `null` once that user has been deleted. oneOf: - type: integer - type: 'null' runningSince: description: When the run still in progress started. `null` while no run is going. oneOf: - type: string format: date-time - type: 'null' schedule: description: '`null` for a delivery that runs only on request.' oneOf: - $ref: '#/components/schemas/ReportDeliverySchedule' - type: 'null' shape: description: '`null` when every column is delivered as is.' oneOf: - $ref: '#/components/schemas/ReportDeliveryShape' - type: 'null' sheetTitle: description: >- Current title of the destination tab, read from Google at most every few minutes. `null` for a `new_sheet` delivery, or before its title has been read. oneOf: - type: string - type: 'null' spreadsheetTitle: description: >- Title of the destination spreadsheet, read from Google at most every few minutes and by each run. `null` before then. oneOf: - type: string - type: 'null' status: $ref: '#/components/schemas/ReportDeliveryResponseStatus' writeMode: $ref: '#/components/schemas/ReportDeliveryResponseWriteMode' description: >- What each run does with what the previous one wrote. `overwrite` (the default) replaces the delivered block. `append` adds the whole result below it, header only on the first run and no deduplication. `new_sheet` writes each run to a new tab. required: - id - deploymentId - name - destination - writeMode - notifications - status type: object ReportDeliveryResponseStatus: enum: - active - failing - needs_reconnect - no_sheet_access - orphaned type: string ReportDeliveryResponseWriteMode: enum: - overwrite - append - new_sheet type: string ReportDeliveryRunFailure: properties: code: description: Why the run failed, e.g. `collision`, `shape-changed`, `query-failed` or `reconnect`. type: string text: description: A sentence for a person to read; never raw Google or warehouse output. type: string required: - code - text type: object ReportDeliveryRunResponse: properties: cellsWritten: description: Cells written, headers included. oneOf: - type: integer - type: 'null' deliveryId: type: integer error: description: '`null` unless the run failed.' oneOf: - $ref: '#/components/schemas/ReportDeliveryRunFailure' - type: 'null' finishedAt: description: '`null` while the run is going.' oneOf: - type: string format: date-time - type: 'null' id: type: integer rowsWritten: description: Result rows written, headers excluded. oneOf: - type: integer - type: 'null' startedAt: format: date-time type: string status: $ref: '#/components/schemas/ReportDeliveryRunResponseStatus' description: '`running` until the run finishes.' trigger: $ref: '#/components/schemas/ReportDeliveryRunResponseTrigger' required: - id - deliveryId - status - trigger - startedAt type: object ReportDeliveryRunResponseStatus: enum: - running - succeeded - unchanged - failed - skipped - missed type: string ReportDeliveryRunResponseTrigger: enum: - manual - schedule type: string ReportDeliveryRunsListResponse: properties: items: items: $ref: '#/components/schemas/ReportDeliveryRunResponse' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items type: object ReportDeliverySchedule: properties: cronExpressions: items: type: string type: array timezone: type: string required: - cronExpressions - timezone type: object ReportDeliveryScheduleInput: properties: cronExpressions: description: >- Five-field cron expressions; the delivery runs whenever any matches. Runs of one expression must be at least 15 minutes apart: `*/15 9-17 * * 1-5` is every quarter hour from 09:00 to 17:45 on weekdays. items: type: string maxItems: 24 minItems: 1 type: array timezone: description: >- IANA timezone the cron expressions are read in, e.g. `America/New_York`. Fixed offsets such as `+02:00` are rejected. Defaults to `UTC`. oneOf: - type: string - type: 'null' required: - cronExpressions type: object ReportDeliveryShape: properties: columns: items: $ref: '#/components/schemas/ReportDeliveryColumn' type: array required: - columns type: object ReportDeliveryShapeInput: properties: columns: description: >- The delivered columns, left to right. A column the query stops returning fails the run rather than shifting the ones after it. items: $ref: '#/components/schemas/ReportDeliveryColumnInput' maxItems: 500 minItems: 1 type: array required: - columns type: object ReportDtoSource: enum: - GOOGLE_SHEETS - EXCEL - PLAYGROUND - D3 type: string ReportDtoType: enum: - FOLDER - WORKBOOK - REPORT type: string ReportPlacement: properties: anchorCell: oneOf: - type: string - type: 'null' endResultCell: oneOf: - type: string - type: 'null' host: oneOf: - $ref: '#/components/schemas/ReportPlacementHost' - type: 'null' id: oneOf: - type: string - type: 'null' placedAt: oneOf: - type: string - type: 'null' placedByUserId: oneOf: - type: integer - type: 'null' queryChecksum: oneOf: - type: string - type: 'null' refreshedAt: oneOf: - type: string - type: 'null' refreshedByUserId: oneOf: - type: integer - type: 'null' resultChecksum: oneOf: - $ref: '#/components/schemas/ReportPlacementResultChecksum' - type: 'null' resultLocation: type: string sheetId: oneOf: - type: string - type: 'null' sheetName: oneOf: - type: string - type: 'null' syncStatus: oneOf: - $ref: '#/components/schemas/ReportPlacementSyncStatus' - type: 'null' workbookId: type: string workbookName: oneOf: - type: string - type: 'null' required: - workbookId - resultLocation type: object ReportPlacementHost: enum: - GOOGLE_SHEETS - EXCEL type: string ReportPlacementResultChecksum: properties: chunks: items: $ref: '#/components/schemas/ReportPlacementResultChunk' maxItems: 2000 type: array payload: oneOf: - minLength: 1 maxLength: 128 type: string - type: 'null' v: minimum: 1 type: integer required: - v - chunks type: object ReportPlacementResultChecksumInput: properties: chunks: items: $ref: '#/components/schemas/ReportPlacementResultChunkInput' maxItems: 2000 type: array payload: oneOf: - minLength: 1 maxLength: 128 type: string - type: 'null' v: minimum: 1 type: integer required: - v - chunks type: object ReportPlacementResultChunk: properties: from: minimum: 0 type: integer hash: maxLength: 64 minLength: 1 type: string to: deprecated: true oneOf: - minimum: 0 type: integer - type: 'null' required: - from - hash type: object ReportPlacementResultChunkInput: properties: from: minimum: 0 type: integer hash: maxLength: 64 minLength: 1 type: string to: deprecated: true oneOf: - minimum: 0 type: integer - type: 'null' required: - from - hash type: object ReportPlacementSyncStatus: enum: - UP_TO_DATE - CHANGED - UNKNOWN type: string ReportSnapshot: properties: description: oneOf: - type: string - type: 'null' fillMissingRows: oneOf: - $ref: '#/components/schemas/FillMissingRows' - type: 'null' id: type: integer isSourceReport: oneOf: - type: boolean - type: 'null' kind: oneOf: - $ref: '#/components/schemas/ReportSnapshotDtoKind' - type: 'null' meta: oneOf: - type: object additionalProperties: true - type: 'null' name: oneOf: - type: string - type: 'null' periodComparisons: oneOf: - items: $ref: '#/components/schemas/PeriodComparison' type: array - type: 'null' preferences: oneOf: - $ref: '#/components/schemas/ReportSnapshotPreferences' - type: 'null' publicId: oneOf: - type: string - type: 'null' pythonCode: oneOf: - type: string - type: 'null' reportId: type: integer spec: oneOf: - oneOf: - type: string - type: object - type: 'null' sqlQuery: oneOf: - type: string - type: 'null' title: oneOf: - type: string - type: 'null' versionNumber: type: integer required: - id - reportId - versionNumber type: object ReportSnapshotDtoKind: enum: - vega - table - kpi - html - map - sankey type: string ReportSnapshotPreferences: properties: columnFormats: oneOf: - type: object additionalProperties: $ref: '#/components/schemas/ColumnFormatOverride' - type: 'null' type: object ReportsListResponse: properties: count: deprecated: true description: >- Deprecated: total number of accessible reports, ignoring pagination. Kept for backward compatibility. oneOf: - minimum: 0 type: integer - type: 'null' data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/Report' type: array items: items: $ref: '#/components/schemas/Report' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object ResourceOwner: properties: email: type: string firstName: oneOf: - type: string - type: 'null' id: type: integer picture: oneOf: - type: string - type: 'null' required: - id - email type: object RevokeEmbedSessionInput: properties: sessionId: description: >- The session id returned by `POST /api/v1/embed/generate-session`. Works whether or not the session has already been exchanged for a token. pattern: ^[0-9a-f]{32}$ type: string required: - sessionId type: object Role: properties: description: oneOf: - type: string - type: 'null' id: type: integer name: type: string policies: items: $ref: '#/components/schemas/Policy' type: array required: - id - name - policies type: object RoleCreateBody: properties: description: oneOf: - maxLength: 255 type: string - type: 'null' name: description: >- Unique role name. Cannot be one of the built-in role names, which are rejected with `400`: `Admin`, `Developer`, `AIBIDeveloper`, `D3User`, `AIBIUser`, `AIBIViewer`, `Guest`, `EmbedUser`. (The console additionally refuses `None` and `All` in its own role builder; those are accepted here.) maxLength: 255 minLength: 1 type: string policies: description: >- What the role grants. Scope a policy to specific deployments by setting `resourceType` to `Deployment` and listing the deployment ids — as returned by POST /build/api/v1/deployments — in `resources`, or `["All"]` for every deployment. An empty `policies` list is accepted and creates a role that grants nothing yet; an individual policy with no actions, or none naming a resource, is rejected. items: $ref: '#/components/schemas/Policy' maxItems: 200 type: array required: - name - policies type: object RoleUpdateBody: properties: description: oneOf: - maxLength: 255 type: string - type: 'null' description: Omit to leave the description unchanged; `null` clears it. name: description: Omit to leave the name unchanged. `null` is rejected. maxLength: 255 minLength: 1 type: string policies: description: >- Replaces the role's policies outright when present — there is no per-policy merge. Omit it to leave them unchanged, or send `[]` to remove them all. `null` is rejected, so a partly-filled client object cannot strip a role's grants by accident. items: $ref: '#/components/schemas/Policy' maxItems: 200 type: array type: object RoleWithAccess: properties: actions: items: enum: - All - DeploymentsManage - DeploymentCreate - DeploymentRead - DeploymentUpdate - DeploymentDelete - SecretsManage - DownloadData - PlaygroundRead - SchemaRead - SchemaUpdate - SchemaUpdateDevBranches - APMRead - ChatHistoryRead - PreAggregationRead - PreAggregationBuild - AlertsCreate - AlertsRead - AlertsUpdate - AlertsDelete - AuditLogManage - BillingRead - SqlRunnerRead - DataAssetsRead - DataAssetsManage - CubeNetworkConnect - ReportRead - ReportEdit - ReportManage - WorkbookManage - WorkbookRead - WorkbookEdit - ChatThreadRead - AgentManage - AgentRead - AgentSpaceManage - AgentAdmin - DeploymentAgentRead - ScheduledTasksCreate - ScheduledTaskRead - OAuthIntegrationsManage - OAuthIntegrationsIssueTokens - McpToolsManage - AIBIDevelop - AIBIExplore - AIBIView - ChartPalettesManage - DashboardThemesManage - AIBIDeveloper - AIBIUser - AIBIViewer - EmbedDeploymentRead - EmbedDashboardRead - FolderRead - FolderEdit - FolderManage type: string type: array id: type: integer name: type: string required: - id - name - actions type: object RolesListResponse: properties: items: items: $ref: '#/components/schemas/Role' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object RunScheduledTaskResponse: properties: chatThreadUuid: description: The chat thread this run writes to. type: string required: - chatThreadUuid type: object SaveDatabricksMetricViewIntegrationInput: properties: deletionPolicy: $ref: '#/components/schemas/SaveDatabricksMetricViewIntegrationInputDeletionPolicy' description: >- Use retain. The delete-managed value is deprecated and currently retains obsolete Metric Views; it does not delete them. enabled: type: boolean expectedConfigurationVersion: description: Use 0 to create; otherwise pass the configurationVersion returned by GET. minimum: 0 type: integer selectionMode: $ref: '#/components/schemas/SaveDatabricksMetricViewIntegrationInputSelectionMode' sourceOverrides: additionalProperties: type: string type: object targetCatalog: maxLength: 255 type: string targetNamePrefix: maxLength: 255 type: string targetNames: additionalProperties: type: string type: object targetSchema: maxLength: 255 type: string viewNameRegex: maxLength: 128 type: string viewNames: items: type: string maxItems: 128 type: array required: - expectedConfigurationVersion - enabled - targetCatalog - targetSchema - selectionMode type: object SaveDatabricksMetricViewIntegrationInputDeletionPolicy: oneOf: - const: retain type: string - const: delete-managed type: string deprecated: true description: Managed deletion is not implemented. Use retain. SaveDatabricksMetricViewIntegrationInputSelectionMode: enum: - all - selected - pattern type: string ScheduledTaskCondition: properties: granularity: oneOf: - $ref: '#/components/schemas/ScheduledTaskConditionGranularity' - type: 'null' id: description: Changes whenever the condition does. Read-only. oneOf: - type: string - type: 'null' measure: description: Full measure name, e.g. `orders.revenue`. minLength: 1 type: string measureTitle: oneOf: - type: string - type: 'null' rule: $ref: '#/components/schemas/ScheduledTaskConditionRule' timeDimension: description: Full time dimension name, e.g. `orders.created_at`. oneOf: - type: string - type: 'null' timeDimensionTitle: oneOf: - type: string - type: 'null' required: - measure - rule type: object ScheduledTaskConditionBand: properties: high: type: number low: type: number median: type: number required: - low - high - median type: object ScheduledTaskConditionGranularity: enum: - day - week - month - quarter - year type: string ScheduledTaskConditionRule: properties: direction: description: 'For `change`: increases, decreases, or changes either way.' oneOf: - $ref: '#/components/schemas/ScheduledTaskConditionRuleDirection' - type: 'null' operator: description: 'For `threshold`: above, below or equal to.' oneOf: - $ref: '#/components/schemas/ScheduledTaskConditionRuleOperator' - type: 'null' percent: description: 'For `change`: the percentage, greater than 0, e.g. `5` for 5 %.' oneOf: - type: number - type: 'null' type: $ref: '#/components/schemas/ScheduledTaskConditionRuleType' description: >- `threshold`: the last complete period (or the total, with no time dimension) is above, below or equal to `value`. `change`: the last complete period moved by at least `percent` % from the one before it. `anomaly`: the last complete period lies outside median ± 3·MAD of the at least 8 complete periods before it. value: description: 'For `threshold`: the number compared with.' oneOf: - type: number - type: 'null' required: - type type: object ScheduledTaskConditionRuleDirection: enum: - up - down - either type: string ScheduledTaskConditionRuleOperator: enum: - gt - lt - eq type: string ScheduledTaskConditionRuleType: enum: - threshold - change - anomaly type: string ScheduledTaskLastConditionCheck: properties: at: description: When the check ran (ISO 8601). type: string band: oneOf: - $ref: '#/components/schemas/ScheduledTaskConditionBand' - type: 'null' changePercent: oneOf: - type: number - type: 'null' conditionId: type: string notifiedAt: oneOf: - type: string - type: 'null' period: description: Start of the period read, `YYYY-MM-DD`. oneOf: - type: string - type: 'null' previous: oneOf: - type: number - type: 'null' previousPeriod: oneOf: - type: string - type: 'null' reason: oneOf: - type: string - type: 'null' status: $ref: '#/components/schemas/ScheduledTaskLastConditionCheckStatus' description: >- `held-notified` ran the agent; `held-already-notified` was still holding since an earlier notification; `cannot-evaluate` carries a `reason` code; an `error` carries its text in `reason` to the task's creator only, as do the figures the check read. value: oneOf: - type: number - type: 'null' required: - at - conditionId - status type: object ScheduledTaskLastConditionCheckStatus: enum: - not-held - held-notified - held-already-notified - cannot-evaluate - error type: string ScheduledTaskListResponse: properties: items: items: $ref: '#/components/schemas/ScheduledTaskResponse' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object ScheduledTaskResponse: properties: agentId: description: The agent that runs the task; null runs the deployment default. oneOf: - type: integer - type: 'null' condition: description: >- Notify only when: on each fire the measure is read once, before the agent runs, and the agent runs only when the condition starts to hold, with the crossing facts at the top of its thread; it runs again only after the condition has stopped holding. A `change` or `anomaly` rule needs `timeDimension` and `granularity`. The creator gets an inbox row only with `notificationEnabled: true`. Null runs the agent on every fire. oneOf: - $ref: '#/components/schemas/ScheduledTaskCondition' - type: 'null' cronExpression: description: >- Standard 5-field cron (minute hour day-of-month month day-of-week), e.g. `0 9 * * 1-5` for 9:00 on weekdays. Null when the task is Manual: it runs only when started with `POST /scheduled-tasks/{taskId}/run`. oneOf: - type: string - type: 'null' deploymentId: type: integer description: oneOf: - type: string - type: 'null' id: type: integer isEnabled: description: False while the schedule is paused. type: boolean lastConditionCheck: description: The latest condition check; null before the first one. oneOf: - $ref: '#/components/schemas/ScheduledTaskLastConditionCheck' - type: 'null' name: type: string nextRunAt: description: When the schedule next fires (ISO 8601, UTC); null for a Manual or paused task. oneOf: - type: string - type: 'null' notificationEnabled: description: Whether a finished run notifies the creator in Cube's notification inbox. type: boolean prompt: description: >- What the agent is asked on every run, shown as the task's Instructions in Cube. Each run starts a new chat thread, so the prompt has to stand on its own. type: string timezone: description: IANA time zone the cron is read in, e.g. `America/New_York`. Defaults to `UTC`. type: string userId: description: >- The creator. Every run executes as this user, and only they or an admin may change, delete or run the task. type: integer required: - id - deploymentId - name - prompt - timezone - isEnabled - notificationEnabled - userId type: object ScheduledTaskRunResponse: properties: chatThreadUuid: description: The chat thread the run produced. type: string createdAt: type: string status: description: >- in-progress, completed, or failed when recorded. Treat unrecognized values as non-terminal. oneOf: - type: string - type: 'null' required: - chatThreadUuid - createdAt type: object ScheduledTaskRunsListResponse: properties: items: items: $ref: '#/components/schemas/ScheduledTaskRunResponse' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object SetBranchStagingEnvironmentRequest: properties: branchId: oneOf: - type: integer - type: 'null' branchName: oneOf: - type: string - type: 'null' enabled: type: boolean required: - enabled type: object SetBranchStagingEnvironmentResponse: properties: data: $ref: '#/components/schemas/BranchResponse' required: - data type: object SetEmbedDashboardCommentResolvedBody: properties: resolved: type: boolean required: - resolved type: object SetEnvVariablesInput: properties: env_variables: items: $ref: '#/components/schemas/EnvVariableItem' type: array required: - env_variables type: object SheetsUiSettings: properties: showAppliedFilters: oneOf: - type: boolean - type: 'null' type: object SheetsUserSettingsInput: properties: autoRunQueryOnChange: oneOf: - type: boolean - type: 'null' openExplorationFromSheet: oneOf: - type: boolean - type: 'null' revealSheetOnOpen: oneOf: - type: boolean - type: 'null' showAppliedFilters: oneOf: - type: boolean - type: 'null' suppressDuplicateValues: oneOf: - type: boolean - type: 'null' type: object SnowflakeSemanticViewGeneratedFileResponse: properties: hash: oneOf: - type: string - type: 'null' path: type: string required: - path type: object SnowflakeSemanticViewPullResultResponse: properties: completedAt: type: string durationMs: type: integer generatedFiles: items: $ref: '#/components/schemas/SnowflakeSemanticViewGeneratedFileResponse' type: array syncJobId: type: string viewCount: type: integer required: - generatedFiles - syncJobId - viewCount - completedAt - durationMs type: object SnowflakeSemanticViewPushResultResponse: properties: completedAt: type: string durationMs: type: integer syncJobId: type: string viewCount: type: integer required: - syncJobId - viewCount - completedAt - durationMs type: object SnowflakeSemanticViewSyncProgressResponse: properties: message: oneOf: - type: string - type: 'null' percentComplete: type: integer stage: type: string required: - stage - percentComplete type: object SnowflakeSemanticViewSyncStartResponse: properties: syncJobId: format: uuid type: string workflowId: type: string required: - syncJobId - workflowId type: object SnowflakeSemanticViewSyncStatusResponse: properties: error: oneOf: - type: string - type: 'null' progress: $ref: '#/components/schemas/SnowflakeSemanticViewSyncProgressResponse' status: description: COMPLETED and FAILED are terminal. Treat other values as in progress. type: string syncJobId: type: string updatedAt: type: string required: - syncJobId - status - progress - updatedAt type: object SourceTreeResponse: properties: data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: additionalProperties: true type: object type: array items: items: additionalProperties: true type: object type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object StartDashboardExportInput: properties: dashboardId: description: >- Numeric id of the dashboard to export. Provide either this or `dashboardPublicId`, not both. oneOf: - type: integer - type: 'null' dashboardPublicId: description: Public id of the dashboard to export. Provide either this or `dashboardId`, not both. oneOf: - type: string - type: 'null' filters: description: >- Dimension filters applied to the dashboard while it renders. Same shape the scheduled-notification API uses. oneOf: - items: $ref: '#/components/schemas/DashboardFilterInput' type: array - type: 'null' format: $ref: '#/components/schemas/StartDashboardExportInputFormat' description: 'Output format: `png` or `pdf`.' layout: default: screenshot description: >- How the dashboard is laid out. `screenshot` (the default) renders the board as it looks on screen. `print` renders the paginated A4 document the dashboard's 'Print version' menu item produces: one column, every table row, and the filter state as a summary line instead of filter controls. `print` is available for `format: 'pdf'` only. oneOf: - $ref: '#/components/schemas/StartDashboardExportInputLayout' - type: 'null' memberSwitchers: description: Field-switcher selections applied to the dashboard while it renders. oneOf: - items: $ref: '#/components/schemas/DashboardMemberSwitcherInput' type: array - type: 'null' renderAs: description: >- Render the dashboard as this user instead of the caller — the queries behind the image run under THEIR security context. Requires the caller to be a tenant admin. Omit to render as the API key's own user. oneOf: - $ref: '#/components/schemas/ExportSubjectInput' - type: 'null' timeGrains: description: Time-grain overrides applied to the dashboard while it renders. oneOf: - items: $ref: '#/components/schemas/DashboardTimeGrainInput' type: array - type: 'null' required: - format type: object StartDashboardExportInputFormat: enum: - png - pdf type: string StartDashboardExportInputLayout: enum: - screenshot - print type: string StartDatabricksMetricViewSyncInput: properties: configurationVersion: description: >- The configurationVersion returned by GET. A run is refused when settings changed after they were loaded, so a publish always uses the configuration the caller saw. minimum: 1 type: integer idempotencyKey: description: >- Optional idempotency key. Repeating a start with the same key returns the original run instead of publishing twice; omit it and every call starts a new run. oneOf: - format: uuid type: string - type: 'null' required: - configurationVersion type: object StartDbtSyncInput: properties: branchName: oneOf: - type: string - type: 'null' manifest: description: >- The contents of your dbt `target/manifest.json`, as JSON. Required when `source` is `manifest` and ignored otherwise. Produced by `dbt parse`, `dbt compile` or `dbt build`, so a CI job can POST the manifest it just validated and be sure Cube converts exactly that — no re-parse of a branch tip that may already have moved. oneOf: - type: object additionalProperties: true - type: 'null' output: description: >- What to do with the generated cubes. `branch` (the default) commits them to a new Cube branch for review. `files` commits nothing and creates no branch — the files are returned from `GET /dbt-sync/{syncJobId}/generated-files` instead, so your own CI can commit them to your repository through its normal review. Independent of `source`. oneOf: - $ref: '#/components/schemas/StartDbtSyncInputOutput' - type: 'null' ref: description: >- Git ref in the dbt repository to sync from — a branch or a tag, NOT a commit SHA. Overrides the branch saved on the deployment’s dbt git integration for this sync only, so CI can sync the ref under review (e.g. a pull request’s head branch) instead of the tracked branch. The generated Cube branch is named after it. oneOf: - type: string - type: 'null' source: description: >- Where the dbt metadata comes from. `git` (the default) clones the deployment’s dbt repository and runs dbt to produce a manifest. `manifest` converts a manifest you supply in `manifest` below, so Cube never needs access to the dbt repository — and the sync takes seconds rather than minutes, because no sandbox is provisioned and no dbt command runs. oneOf: - $ref: '#/components/schemas/StartDbtSyncInputSource' - type: 'null' type: object StartDbtSyncInputOutput: enum: - branch - files type: string StartDbtSyncInputSource: enum: - git - manifest type: string StartDevModeRequest: properties: branchName: oneOf: - type: string - type: 'null' type: object StartReportDeliveryRunResponse: properties: runId: description: Id of the run, which writes the sheet in the background; poll it for the outcome. type: integer required: - runId type: object StartSnowflakeSemanticViewPullInput: properties: branchName: description: Cube branch to write. Defaults to the deployment's deploy branch. oneOf: - type: string - type: 'null' commitMessage: oneOf: - type: string - type: 'null' dataSource: oneOf: - type: string - type: 'null' idempotencyKey: description: >- Optional idempotency key. Repeating a pull with the same key and inputs returns the original sync. oneOf: - format: uuid type: string - type: 'null' namePrefix: oneOf: - type: string - type: 'null' outputPath: minLength: 1 type: string schema: minLength: 1 type: string titlePrefix: oneOf: - type: string - type: 'null' viewNames: description: Semantic view names or * patterns to pull. Omit to pull every view in the schema. oneOf: - items: type: string type: array - type: 'null' required: - schema - outputPath type: object StartSnowflakeSemanticViewSyncInput: properties: branchName: description: Cube branch to publish. Defaults to the deployment's deploy branch when omitted. oneOf: - type: string - type: 'null' dataSource: oneOf: - type: string - type: 'null' idempotencyKey: description: >- Optional idempotency key. Repeating a start with the same key returns the original sync instead of pushing the views twice. oneOf: - format: uuid type: string - type: 'null' prefix: minLength: 1 type: string schema: minLength: 1 type: string schemaPath: oneOf: - type: string - type: 'null' viewNames: items: type: string minItems: 1 type: array required: - schema - prefix - viewNames type: object StartUploadResponse: properties: deploymentName: type: string transaction: $ref: '#/components/schemas/UploadTransaction' required: - transaction - deploymentName type: object TenantSettings: properties: aiTokensAutoPurchaseAmount: type: integer aiTokensAutoPurchaseEnabled: type: boolean aiTokensAutoPurchaseThreshold: type: integer auditLogEnabled: type: boolean auditLogEnabledCurrent: type: boolean auditLogEnabledTimestamp: type: integer hasSupportAccess: type: boolean maintenanceWindowDay: type: string maintenanceWindowEnabled: type: boolean maintenanceWindowTime: type: string oidcEnabled: type: boolean useAIBIUserInterface: type: boolean required: - auditLogEnabled - auditLogEnabledCurrent - auditLogEnabledTimestamp - hasSupportAccess - useAIBIUserInterface - maintenanceWindowEnabled - maintenanceWindowDay - maintenanceWindowTime - oidcEnabled - aiTokensAutoPurchaseEnabled - aiTokensAutoPurchaseThreshold - aiTokensAutoPurchaseAmount type: object TenantSettingsInput: properties: aiTokensAutoPurchaseAmount: oneOf: - type: integer - type: 'null' aiTokensAutoPurchaseEnabled: oneOf: - type: boolean - type: 'null' auditLogEnabled: oneOf: - type: boolean - type: 'null' hasSupportAccess: oneOf: - type: boolean - type: 'null' maintenanceWindowDay: oneOf: - type: string - type: 'null' maintenanceWindowEnabled: oneOf: - type: boolean - type: 'null' maintenanceWindowTime: oneOf: - type: string - type: 'null' oidcEnabled: oneOf: - type: boolean - type: 'null' useAIBIUserInterface: oneOf: - type: boolean - type: 'null' type: object TextReplacementInput: properties: newText: description: Text to put in place of `oldText`. type: string oldText: description: >- Exact text to replace, copied from `content`, including whitespace. Must occur exactly once unless `replaceAll` is set. minLength: 1 type: string replaceAll: description: Replace every occurrence of `oldText` instead of requiring one. oneOf: - type: boolean - type: 'null' required: - oldText - newText type: object ThemeFont: properties: family: oneOf: - type: string - type: 'null' format: type: string id: type: string name: oneOf: - type: string - type: 'null' url: type: string required: - id - url - format type: object TimezoneSettings: properties: allowUserOverride: oneOf: - type: boolean - type: 'null' enabled: oneOf: - type: boolean - type: 'null' timezone: oneOf: - type: string - type: 'null' type: object UpdateDashboardEmbeddingInput: properties: allowEmbed: description: >- Whether customer-signed embedding is allowed for this dashboard ("Allow signed embedding" in the UI). `true` lets embed sessions fetch the dashboard via `GET /api/v1/embed/dashboard/{publicId}`; `false` makes that fetch return `403`. Does not affect creator-mode sessions or dashboards shared with all embed users. type: boolean required: - allowEmbed type: object UpdateDataModelFilesInput: properties: branchId: type: integer branchName: type: string files: items: $ref: '#/components/schemas/DataModelFileContent' type: array required: - files type: object UpdateDeploymentInput: properties: cloudProvider: oneOf: - $ref: '#/components/schemas/UpdateDeploymentInputCloudProvider' - type: 'null' creationMethod: oneOf: - $ref: '#/components/schemas/UpdateDeploymentInputCreationMethod' - type: 'null' cspsConfig: oneOf: - $ref: '#/components/schemas/CspsConfigInput' - type: 'null' customDomain: oneOf: - type: string - type: 'null' defaultLaunchpadViewGroup: oneOf: - type: string - type: 'null' deployBranchMergeAllowed: oneOf: - type: boolean - type: 'null' deployBranchName: oneOf: - type: string - type: 'null' deployBranchReadOnly: oneOf: - type: boolean - type: 'null' deployMode: oneOf: - $ref: '#/components/schemas/UpdateDeploymentInputDeployMode' - type: 'null' deployProjectRoot: oneOf: - type: string - type: 'null' launchpadTabs: oneOf: - items: type: string type: array - type: 'null' name: oneOf: - type: string - type: 'null' region: oneOf: - type: string - type: 'null' releaseChannel: oneOf: - $ref: '#/components/schemas/UpdateDeploymentInputReleaseChannel' - type: 'null' releaseChannelVersion: oneOf: - type: string - type: 'null' releaseChannelVersionHold: oneOf: - type: boolean - type: 'null' template: oneOf: - $ref: '#/components/schemas/UpdateDeploymentInputTemplate' - type: 'null' templateVariables: oneOf: - type: object additionalProperties: true - type: 'null' type: object UpdateDeploymentInputCloudProvider: enum: - cubecloud - aws - gcp type: string UpdateDeploymentInputCreationMethod: enum: - upload - cubecloud - github - ssh type: string UpdateDeploymentInputDeployMode: enum: - git - cli type: string UpdateDeploymentInputReleaseChannel: enum: - latest - release type: string UpdateDeploymentInputTemplate: enum: - single - simpleCluster - multiCluster type: string UpdateEmbedAccessInput: properties: action: oneOf: - $ref: '#/components/schemas/UpdateEmbedAccessInputAction' - type: 'null' allEmbedUsers: oneOf: - type: boolean - type: 'null' allowEmbed: oneOf: - type: boolean - type: 'null' embedTenantName: oneOf: - type: string - type: 'null' type: object UpdateEmbedAccessInputAction: enum: - read - none type: string UpdateEmbedDashboardCommentBody: properties: body: maxLength: 10000 minLength: 1 type: string required: - body type: object UpdateEmbedGroupInput: properties: description: description: New description. Pass an empty string to clear it. Omit to leave it unchanged. oneOf: - maxLength: 500 type: string - type: 'null' type: object UpdateFolderInput: properties: name: oneOf: - maxLength: 255 type: string - type: 'null' position: oneOf: - type: integer - type: 'null' type: object UpdateNotificationInput: properties: customCron: oneOf: - type: string - type: 'null' dayOfMonth: oneOf: - type: integer - type: 'null' dayOfWeek: oneOf: - type: integer - type: 'null' filters: description: >- Dimension filters applied to the dashboard when the notification is rendered. Replaces the existing set when provided. oneOf: - items: $ref: '#/components/schemas/DashboardFilterInput' type: array - type: 'null' hour: oneOf: - type: integer - type: 'null' isEnabled: description: Enable or disable the schedule oneOf: - type: boolean - type: 'null' memberSwitchers: description: >- Field-switcher selections applied to the dashboard when the notification is rendered. Replaces the existing set when provided. oneOf: - items: $ref: '#/components/schemas/DashboardMemberSwitcherInput' type: array - type: 'null' minute: oneOf: - type: integer - type: 'null' notificationAiSummary: description: Include an AI-generated "what changed" summary in the notification body. Off by default. oneOf: - type: boolean - type: 'null' notificationEnabled: oneOf: - type: boolean - type: 'null' notificationFormat: oneOf: - $ref: '#/components/schemas/UpdateNotificationInputNotificationFormat' - type: 'null' scheduleType: description: Type of schedule oneOf: - $ref: '#/components/schemas/UpdateNotificationInputScheduleType' - type: 'null' timeGrains: description: >- Time-grain overrides applied to the dashboard when the notification is rendered. Replaces the existing set when provided. oneOf: - items: $ref: '#/components/schemas/DashboardTimeGrainInput' type: array - type: 'null' timezone: oneOf: - type: string - type: 'null' type: object UpdateNotificationInputNotificationFormat: enum: - png - pdf - pdf_print type: string UpdateNotificationInputScheduleType: enum: - HOURLY - DAILY - WEEKLY - MONTHLY - CUSTOM type: string UpdateOAuthIntegrationInput: properties: authUrl: format: url type: string clientId: type: string clientSecret: oneOf: - type: string - type: 'null' config: additionalProperties: true type: object name: type: string redirectUri: format: url type: string scopes: items: type: string type: array tokenUrl: format: url type: string type: type: string required: - name - type - authUrl - tokenUrl - clientId - redirectUri type: object UpdateOidcTokenConfigInput: properties: customAudience: oneOf: - type: string - type: 'null' customClaims: oneOf: - type: object - type: 'null' isEnabled: oneOf: - type: boolean - type: 'null' name: oneOf: - pattern: ^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$ type: string - type: 'null' subFormat: oneOf: - pattern: ^(?:[A-Za-z0-9:_-]|\{(?:deployment_id|component|region)\})+$ type: string maxLength: 200 - type: 'null' targetEnvVar: oneOf: - pattern: ^[A-Z_][A-Z0-9_]*$ type: string maxLength: 128 - type: 'null' type: object UpdatePublishedAiWidgetThreadInput: properties: checksum: oneOf: - type: string - type: 'null' threadId: type: string widgetId: type: string required: - widgetId - threadId type: object UpdateReportDeliveryInput: properties: destination: description: Replaces the whole destination. oneOf: - $ref: '#/components/schemas/ReportDeliveryDestinationInput' - type: 'null' name: oneOf: - maxLength: 255 type: string minLength: 1 - type: 'null' notifications: description: >- Replaces the whole setting; null resets it to the inbox only. How the owner hears that the delivery failed or recovered. A delivery that runs more than once a day reports only changes in its status; a daily or rarer one reports every failed run. oneOf: - $ref: '#/components/schemas/ReportDeliveryNotificationsInput' - type: 'null' ownerUserId: description: >- Transfer the delivery to this active user, who must be able to read its report. They become owner and run-as user. Admins only. oneOf: - type: integer - type: 'null' reportId: description: Deliver another report. The caller must be able to read it. oneOf: - type: integer - type: 'null' schedule: description: Replaces the whole schedule. `null` removes it, so the delivery runs only on request. oneOf: - $ref: '#/components/schemas/ReportDeliveryScheduleInput' - type: 'null' shape: description: Replaces the whole shape. `null` removes it, delivering every column. oneOf: - $ref: '#/components/schemas/ReportDeliveryShapeInput' - type: 'null' writeMode: description: >- What each run does with what the previous one wrote. `overwrite` (the default) replaces the delivered block. `append` adds the whole result below it, header only on the first run and no deduplication. `new_sheet` writes each run to a new tab. oneOf: - $ref: '#/components/schemas/UpdateReportDeliveryInputWriteMode' - type: 'null' type: object UpdateReportDeliveryInputWriteMode: enum: - overwrite - append - new_sheet type: string UpdateReportInput: properties: endResultCell: oneOf: - type: string - type: 'null' expectedVersion: oneOf: - type: integer - type: 'null' externalWorkbookId: oneOf: - type: string - type: 'null' folderId: oneOf: - type: integer - type: 'null' host: oneOf: - $ref: '#/components/schemas/UpdateReportInputHost' - type: 'null' jsonQuery: oneOf: - type: string - type: 'null' meta: oneOf: - type: object additionalProperties: true - type: 'null' name: oneOf: - maxLength: 255 type: string - type: 'null' pivotItems: oneOf: - $ref: '#/components/schemas/PivotItems' - type: 'null' placementId: oneOf: - type: string - type: 'null' publicId: oneOf: - pattern: ^[0-9A-Za-z]+$ type: string minLength: 12 maxLength: 12 - type: 'null' resultChecksum: oneOf: - $ref: '#/components/schemas/ReportPlacementResultChecksumInput' - type: 'null' resultLocation: oneOf: - type: string - type: 'null' sheetId: oneOf: - type: string - type: 'null' sqlQuery: oneOf: - type: string - type: 'null' title: oneOf: - maxLength: 255 type: string - type: 'null' workbookId: oneOf: - type: integer - type: 'null' workbookName: oneOf: - type: string - type: 'null' type: object UpdateReportInputHost: enum: - GOOGLE_SHEETS - EXCEL type: string UpdateScheduledTaskInput: properties: agentId: description: >- The agent that runs the task. Omit to leave unchanged; null resets it to the deployment default. oneOf: - type: integer - type: 'null' condition: description: >- Notify only when: on each fire the measure is read once, before the agent runs, and the agent runs only when the condition starts to hold, with the crossing facts at the top of its thread; it runs again only after the condition has stopped holding. A `change` or `anomaly` rule needs `timeDimension` and `granularity`. The creator gets an inbox row only with `notificationEnabled: true`. Omit to leave unchanged; null removes it. A changed condition starts its breach state fresh. oneOf: - $ref: '#/components/schemas/ScheduledTaskCondition' - type: 'null' cronExpression: description: >- New standard 5-field cron, at most hourly (the minute field is a single number). Omit it to keep the current schedule; send null to make the task Manual. oneOf: - maxLength: 100 type: string - type: 'null' description: description: Omit to leave unchanged. Send null to clear the description. oneOf: - type: string - type: 'null' isEnabled: description: >- `false` pauses the schedule, `true` resumes it. Omit to leave unchanged. Explicit null answers `400`. oneOf: - type: boolean - type: 'null' name: description: Omit to leave unchanged. Explicit null answers `400`. oneOf: - maxLength: 255 type: string minLength: 1 - type: 'null' notificationEnabled: description: >- Turn the inbox notification for finished runs on or off. Omit to leave unchanged. Explicit null answers `400`. oneOf: - type: boolean - type: 'null' prompt: description: >- New prompt, shown as the task's Instructions in Cube. Omit to leave unchanged. Explicit null answers `400`. oneOf: - minLength: 1 type: string - type: 'null' timezone: description: >- New IANA time zone for the cron, e.g. `America/New_York`. Omit it to keep the current one. Explicit null answers `400`. oneOf: - maxLength: 100 type: string - type: 'null' type: object UpdateWorkbookInput: properties: folderId: oneOf: - type: number - type: 'null' meta: oneOf: - type: object additionalProperties: true - type: 'null' name: oneOf: - type: string - type: 'null' slug: oneOf: - type: string - type: 'null' slugTakeover: oneOf: - type: boolean - type: 'null' type: object UploadFileBody: properties: fileName: type: string transaction: type: string required: - transaction - fileName type: object UploadTransaction: properties: id: type: string required: - id type: object UsageAnalyticsTokenResponse: properties: apiUrl: description: >- Base URL of the Usage Analytics deployment’s Cube REST API (e.g. `https:///cubejs-api/v1`). Query it with the returned token. type: string deploymentId: description: Id of the Usage Analytics deployment the token was issued for. type: integer expiresAt: description: >- When the token expires, as an ISO-8601 timestamp. Request a new token before this moment — issuing one is idempotent and cheap. oneOf: - type: string - type: 'null' token: description: >- A short-lived JWT for the Usage Analytics deployment, carrying this tenant’s security context. Send it as `Authorization: Bearer ` on requests to `apiUrl`. type: string required: - token - apiUrl - deploymentId type: object User: properties: activeRoleId: oneOf: - type: integer - type: 'null' aliases: oneOf: - items: $ref: '#/components/schemas/UserAlias' type: array - type: 'null' createdAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' defaultRoles: oneOf: - items: type: string type: array - type: 'null' email: type: string externalId: oneOf: - type: string - type: 'null' firstName: oneOf: - type: string - type: 'null' gitUser: oneOf: - type: string - type: 'null' id: type: integer impersonation: oneOf: - $ref: '#/components/schemas/UserImpersonationDTO' - type: 'null' isAdmin: type: boolean isDeactivated: oneOf: - type: boolean - type: 'null' lastLogin: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' notifications: additionalProperties: true type: object picture: oneOf: - type: string - type: 'null' samlId: oneOf: - type: string - type: 'null' settings: oneOf: - $ref: '#/components/schemas/UserSettingsInput' - type: 'null' title: oneOf: - type: string - type: 'null' tosAccepted: oneOf: - type: object - type: 'null' updatedAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' userPolicies: description: >- The caller's effective resource policies: direct grants, organization-wide grants, and grants inherited from their groups. Only populated by `GET /api/v1/users/me`. oneOf: - items: $ref: '#/components/schemas/Policy' type: array - type: 'null' username: type: string required: - id - email - username - isAdmin - notifications type: object UserAlias: properties: createdAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string id: type: integer source: $ref: '#/components/schemas/UserAliasDTOSource' updatedAt: pattern: \d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d.\d+Z? type: string userId: type: integer username: type: string required: - id - userId - username - source - createdAt - updatedAt type: object UserAliasDTOSource: enum: - ldap - saml - scim - manual type: string UserAttribute: properties: defaultValue: oneOf: - type: string - type: 'null' description: oneOf: - type: string - type: 'null' displayName: oneOf: - type: string - type: 'null' id: type: integer name: type: string type: $ref: '#/components/schemas/UserAttributeType' required: - id - name - type type: object UserAttributeCreateInput: properties: defaultValue: oneOf: - type: string - type: 'null' description: oneOf: - type: string - type: 'null' displayName: oneOf: - type: string - type: 'null' name: minLength: 1 type: string type: $ref: '#/components/schemas/UserAttributeCreateInputType' required: - name - type type: object UserAttributeCreateInputType: enum: - string - number - boolean - string_array - number_array type: string UserAttributeDefinition: properties: defaultValue: oneOf: - type: string - type: 'null' description: oneOf: - type: string - type: 'null' displayName: oneOf: - type: string - type: 'null' name: type: string type: $ref: '#/components/schemas/UserAttributeDefinitionDTOType' required: - name - type type: object UserAttributeDefinitionDTOType: enum: - string - number - boolean - string_array - number_array type: string UserAttributeInput: properties: name: type: string value: oneOf: - oneOf: - type: string - type: number - type: boolean - type: array items: type: string - type: array items: type: number - type: 'null' required: - name type: object UserAttributeType: enum: - string - number - boolean - string_array - number_array type: string UserAttributeUpdateInput: properties: defaultValue: oneOf: - type: string - type: 'null' description: oneOf: - type: string - type: 'null' displayName: oneOf: - type: string - type: 'null' type: object UserAttributeValue: properties: description: oneOf: - type: string - type: 'null' displayName: oneOf: - type: string - type: 'null' formattedValue: oneOf: - {} - type: 'null' name: type: string type: $ref: '#/components/schemas/UserAttributeValueType' userAttributeId: type: integer userId: type: integer value: oneOf: - {} - type: 'null' required: - userId - userAttributeId - name - type type: object UserAttributeValueCreateInput: properties: userAttributeId: minLength: 1 type: string userId: minLength: 1 type: string value: oneOf: - {} - type: 'null' required: - userId - userAttributeId type: object UserAttributeValueType: enum: - string - number - boolean - string_array - number_array type: string UserAttributesListResponse: properties: count: deprecated: true description: >- Deprecated: total number of user attributes, ignoring pagination. Kept for backward compatibility. minimum: 0 type: integer data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/UserAttribute' type: array items: items: $ref: '#/components/schemas/UserAttribute' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data - count type: object UserCreateInput: properties: defaultRoles: oneOf: - items: type: string type: array - type: 'null' email: type: string externalId: oneOf: - type: string - type: 'null' firstName: oneOf: - type: string - type: 'null' isAdmin: oneOf: - type: boolean - type: 'null' isExternal: oneOf: - {} - type: 'null' password: oneOf: - type: string - type: 'null' picture: oneOf: - {} - type: 'null' settings: oneOf: - type: object additionalProperties: true - type: 'null' username: type: string required: - email - username type: object UserGroupDTO: properties: description: oneOf: - type: string - type: 'null' id: type: integer name: type: string userCount: oneOf: - type: integer - type: 'null' required: - id - name type: object UserGroupsConnectionResponse: properties: items: items: $ref: '#/components/schemas/UserGroupDTO' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object UserImpersonationDTO: properties: expiresAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' impersonatedUser: oneOf: - $ref: '#/components/schemas/User' - type: 'null' startedAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' type: object UserOAuthToken: properties: accessTokenExpiresAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' createdAt: oneOf: - format: date type: string - format: date-time type: string id: type: integer integrationId: type: integer lastError: oneOf: - {} - type: 'null' refreshTokenExpiresAt: oneOf: - oneOf: - format: date type: string - format: date-time type: string - type: 'null' status: type: string updatedAt: oneOf: - format: date type: string - format: date-time type: string userId: type: integer required: - id - userId - integrationId - status - createdAt - updatedAt type: object UserSettingsInput: properties: alternatingRowColors: oneOf: - type: boolean - type: 'null' defaultDeploymentId: oneOf: - type: integer - type: 'null' lastSeenChangelogId: deprecated: true description: >- Deprecated and ignored. The changelog now arrives in the notification inbox, which carries its own read state. Accepted for backward compatibility but never read or written. oneOf: - type: integer - type: 'null' locale: oneOf: - type: string - type: 'null' sheets: oneOf: - $ref: '#/components/schemas/SheetsUserSettingsInput' - type: 'null' theme: oneOf: - type: string - type: 'null' timezone: oneOf: - type: string - type: 'null' type: object UserUpdateInput: properties: embedTheme: oneOf: - {} - type: 'null' firstName: oneOf: - type: string - type: 'null' isAdmin: oneOf: - type: boolean - type: 'null' isDeactivated: oneOf: - type: boolean - type: 'null' lastLogin: oneOf: - {} - type: 'null' notifications: oneOf: - items: type: string type: array - type: 'null' password: oneOf: - type: string - type: 'null' picture: oneOf: - {} - type: 'null' securityContext: oneOf: - {} - type: 'null' settings: oneOf: - type: object additionalProperties: true - type: 'null' title: oneOf: - type: string - type: 'null' tosAccepted: oneOf: - type: object additionalProperties: true - type: 'null' type: object WidgetThemeBorderSectionInput: properties: color: oneOf: - type: string - type: 'null' radius: oneOf: - type: string - type: 'null' style: oneOf: - type: string - type: 'null' width: oneOf: - type: string - type: 'null' type: object WidgetThemeSectionInput: properties: backgroundColor: oneOf: - type: string - type: 'null' border: oneOf: - $ref: '#/components/schemas/WidgetThemeBorderSectionInput' - type: 'null' margin: oneOf: - type: string - type: 'null' padding: oneOf: - type: string - type: 'null' text: oneOf: - $ref: '#/components/schemas/WidgetThemeTextSectionInput' - type: 'null' title: oneOf: - $ref: '#/components/schemas/WidgetThemeTitleSectionInput' - type: 'null' type: object WidgetThemeTextSectionInput: properties: codeFontFamily: oneOf: - type: string - type: 'null' color: oneOf: - type: string - type: 'null' fontFamily: oneOf: - type: string - type: 'null' secondaryColor: oneOf: - type: string - type: 'null' type: object WidgetThemeTitleSectionInput: properties: color: oneOf: - type: string - type: 'null' fontFamily: oneOf: - type: string - type: 'null' fontSize: oneOf: - type: string - type: 'null' fontWeight: oneOf: - type: string - type: 'null' type: object Workbook: properties: calculatedFields: type: object createdAt: oneOf: - format: date type: string - format: date-time type: string createdBy: type: integer dashboardDraft: oneOf: - $ref: '#/components/schemas/DashboardConfig' - type: 'null' dashboardPublished: oneOf: - $ref: '#/components/schemas/DashboardConfig' - type: 'null' deploymentId: type: integer folderId: oneOf: - type: number - type: 'null' folderPath: items: $ref: '#/components/schemas/WorkspaceFolderPathEntry' type: array id: type: integer isFavorite: oneOf: - type: boolean - type: 'null' meta: additionalProperties: true type: object name: type: string promotion: oneOf: - $ref: '#/components/schemas/WorkbookPromotionSummaryDto' - type: 'null' publishedDashboard: oneOf: - $ref: '#/components/schemas/Dashboard' - type: 'null' slug: oneOf: - type: string - type: 'null' type: $ref: '#/components/schemas/WorkbookDtoType' updatedAt: oneOf: - format: date type: string - format: date-time type: string user: oneOf: - $ref: '#/components/schemas/ResourceOwner' - type: 'null' userId: oneOf: - type: number - type: 'null' required: - name - meta - calculatedFields - id - deploymentId - createdAt - updatedAt - type type: object WorkbookDashboard: properties: dashboardDraft: oneOf: - $ref: '#/components/schemas/DashboardConfig' - type: 'null' dashboardPublished: oneOf: - $ref: '#/components/schemas/DashboardConfig' - type: 'null' type: object WorkbookDashboardInput: properties: dashboardDraft: oneOf: - $ref: '#/components/schemas/DashboardConfigDraftInput' - type: 'null' type: object WorkbookDtoType: enum: - FOLDER - WORKBOOK - REPORT type: string WorkbookPromotionDto: properties: completedAt: oneOf: - format: date type: string - format: date-time type: string destinationChangedSincePreview: type: boolean destinationWasDiverged: type: boolean id: type: integer linkId: type: integer outcome: $ref: '#/components/schemas/WorkbookPromotionDtoOutcome' overrideRequested: type: boolean performedBy: $ref: '#/components/schemas/PromotionActorDto' source: oneOf: - $ref: '#/components/schemas/PromotionReferenceDto' - type: 'null' target: oneOf: - $ref: '#/components/schemas/PromotionReferenceDto' - type: 'null' targetDashboardVersionId: type: integer required: - id - linkId - completedAt - outcome - performedBy - overrideRequested - destinationWasDiverged - destinationChangedSincePreview - targetDashboardVersionId type: object WorkbookPromotionDtoOutcome: enum: - created - updated - unchanged type: string WorkbookPromotionLinkDto: properties: id: type: integer target: $ref: '#/components/schemas/PromotionReferenceDto' required: - id - target type: object WorkbookPromotionLinksListResponse: properties: items: items: $ref: '#/components/schemas/WorkbookPromotionLinkDto' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object WorkbookPromotionPreviewDto: properties: destinationHash: oneOf: - type: string - type: 'null' destinationWasDiverged: type: boolean reportCount: type: integer sourceHash: type: string targetDeploymentId: type: integer targetWorkbookId: oneOf: - type: integer - type: 'null' required: - targetDeploymentId - destinationWasDiverged - reportCount - sourceHash type: object WorkbookPromotionSummaryDto: properties: firstPromotion: oneOf: - $ref: '#/components/schemas/WorkbookPromotionDto' - type: 'null' lastPromotion: oneOf: - $ref: '#/components/schemas/WorkbookPromotionDto' - type: 'null' linkId: type: integer origin: $ref: '#/components/schemas/PromotionReferenceDto' parent: $ref: '#/components/schemas/PromotionReferenceDto' required: - linkId - parent - origin type: object WorkbookPromotionSummaryResponse: properties: promotion: oneOf: - $ref: '#/components/schemas/WorkbookPromotionSummaryDto' - type: 'null' type: object WorkbookPromotionsListResponse: properties: items: items: $ref: '#/components/schemas/WorkbookPromotionDto' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object WorkbooksListResponse: properties: count: deprecated: true description: >- Deprecated: total number of accessible workbooks, ignoring pagination. Kept for backward compatibility. oneOf: - minimum: 0 type: integer - type: 'null' data: deprecated: true description: 'Deprecated: use `items` instead. Kept for backward compatibility.' items: $ref: '#/components/schemas/Workbook' type: array items: items: $ref: '#/components/schemas/Workbook' type: array pageInfo: oneOf: - $ref: '#/components/schemas/PageInfo' - type: 'null' required: - items - data type: object WorkspaceBulkFailure: properties: error: $ref: '#/components/schemas/BulkActionError' id: type: integer type: $ref: '#/components/schemas/WorkspaceBulkFailureType' required: - error - type - id type: object WorkspaceBulkFailureType: enum: - FOLDER - WORKBOOK - REPORT type: string WorkspaceConnectionResponse: properties: items: items: $ref: '#/components/schemas/Workbook' type: array pageInfo: $ref: '#/components/schemas/PageInfo' required: - items - pageInfo type: object WorkspaceFolderPathEntry: properties: id: type: integer name: type: string required: - id - name type: object WorkspaceItemRef: properties: id: type: integer type: $ref: '#/components/schemas/WorkspaceItemRefType' required: - type - id type: object WorkspaceItemRefInput: properties: id: type: integer type: $ref: '#/components/schemas/WorkspaceItemRefInputType' required: - type - id type: object WorkspaceItemRefInputType: enum: - FOLDER - WORKBOOK - REPORT type: string WorkspaceItemRefType: enum: - FOLDER - WORKBOOK - REPORT type: string