From 251eac18ce8a7154a5d90e02e25bbe6778239068 Mon Sep 17 00:00:00 2001 From: "mintlify[bot]" <109931778+mintlify[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:26:05 +0200 Subject: [PATCH 1/2] docs: Audit log export API endpoint (#10659) * docs: add audit log export API endpoint to Control Plane API reference Generated-By: mintlify-agent * docs: fix audit log export endpoint based on actual source code - Correct endpoint path: GET /api/v1/audit-logs/export - Document actual query params: start, end, search, eventName, userEmail - Clarify response is a streamed CSV file, not JSON Generated-By: mintlify-agent * fix: remove stray backticks and correct anchor hash for audit-log link Generated-By: mintlify-agent --------- Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com> --- docs-mintlify/admin/monitoring/audit-log.mdx | 10 ++++ docs-mintlify/reference/control-plane-api.mdx | 54 +++++++++++++++++-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/docs-mintlify/admin/monitoring/audit-log.mdx b/docs-mintlify/admin/monitoring/audit-log.mdx index 33cbe26783652..404537335cb12 100644 --- a/docs-mintlify/admin/monitoring/audit-log.mdx +++ b/docs-mintlify/admin/monitoring/audit-log.mdx @@ -92,6 +92,13 @@ current view: +## Exporting events via API + +You can also export audit log events as a CSV file programmatically using the +[`/api/v1/audit-logs/export`][ref-audit-log-api] endpoint of the +[Control Plane API][ref-control-plane-api]. This is useful for integrating +with external log aggregation or SIEM tools. + ## Event types Audit Log collects the following types of events: @@ -107,3 +114,6 @@ Audit Log collects the following types of events: | Branches and [dev mode](/docs/data-modeling/dev-mode) | `Created Git branch`
`Deleted Git branch`
`Entered dev mode`
`Exited dev mode`
`Pulled changes to data model`
`Committed and merged changes to data model`
`Merged changes to data model`
`Reverted changes to data model in branch` | | [Continuous deployment](/docs/deployment/cloud/continuous-deployment) | `Requested connection of GitHub account`
`Connected deployment to GitHub repository`
`Generated SSH key for deployment`
`Connected deployment to Git upstream`
`Generated Git credentials for Cube Cloud repository`
`Generated webhook token for Git repository`
`Received a Git hook`
`Started uploading files`
`Finished uploading files`
`Triggered new build` | | [Budgets](/admin/account-billing/budgets) | `Created budget`
`Deleted budget`
`Updated budget` | + +[ref-control-plane-api]: /reference/control-plane-api +[ref-audit-log-api]: /reference/control-plane-api#%2Fapi%2Fv1%2Faudit-logs%2Fexport diff --git a/docs-mintlify/reference/control-plane-api.mdx b/docs-mintlify/reference/control-plane-api.mdx index b0efdb8671559..73e253134b335 100644 --- a/docs-mintlify/reference/control-plane-api.mdx +++ b/docs-mintlify/reference/control-plane-api.mdx @@ -1,12 +1,12 @@ --- title: Control Plane API -description: REST surface for automating Cube Cloud deployments, environments, and JWT issuance for Core Data API access. +description: REST surface for automating Cube Cloud deployments, environments, JWT issuance, and audit log export. --- Control Plane API enables programmatic management of [deployments][ref-deployments] and [environments][ref-environments] in Cube Cloud. You can use it to list -deployments, manage environments, and generate JWT tokens for accessing -[Core Data APIs][ref-core-data-apis]. +deployments, manage environments, generate JWT tokens for accessing +[Core Data APIs][ref-core-data-apis], and export [audit log][ref-audit-log] events. @@ -212,10 +212,56 @@ Example response: ``` +### `/api/v1/audit-logs/export` + +Send a `GET` request to export [audit log][ref-audit-log] events as a CSV +file. This endpoint allows you to programmatically retrieve security-related +events for compliance reviews, external log aggregation, or integration with +SIEM tools. + + + +Requires [Audit Log][ref-audit-log] to be enabled on the +[Enterprise Premier plan](https://cube.dev/pricing). The authenticated user +must have the `AuditLogManage` permission. + + + +Query parameters: + +| Parameter | Description | Required | +| --- | --- | --- | +| `start` | Start of the date range (ISO 8601 format, e.g., `2024-01-01`) | No | +| `end` | End of the date range (ISO 8601 format, e.g., `2024-01-31`) | No | +| `search` | Full-text search across event data | No | +| `eventName` | Filter by event type (e.g., `Logged in`) | No | +| `userEmail` | Filter by user email | No | + +The response is a CSV file streamed as an attachment. + +Example request: + +```bash +curl \ + -H "Authorization: Api-Key YOUR_API_KEY" \ + -o audit_log.csv \ + "https://YOUR_CUBE_CLOUD_HOST/api/v1/audit-logs/export?start=2024-01-01&end=2024-01-31" +``` + +Example request with filters: + +```bash +curl \ + -H "Authorization: Api-Key YOUR_API_KEY" \ + -o audit_log.csv \ + "https://YOUR_CUBE_CLOUD_HOST/api/v1/audit-logs/export?start=2024-01-01&end=2024-01-31&eventName=Logged+in&userEmail=user@example.com" +``` + [ref-core-data-apis]: /reference/core-data-apis [ref-rest-api]: /reference/core-data-apis/rest-api [ref-metadata-api]: /reference/core-data-apis/rest-api/reference#metadata-api [ref-deployments]: /admin/deployment/deployments [ref-environments]: /admin/workspace/environments [ref-api-keys]: /admin/account-billing/api-keys -[ref-security-context]: /docs/data-modeling/access-control/context \ No newline at end of file +[ref-security-context]: /docs/data-modeling/access-control/context +[ref-audit-log]: /admin/monitoring/audit-log \ No newline at end of file From 6f798204219bbb975fd3d7123f35e182f55fd9bb Mon Sep 17 00:00:00 2001 From: Hank Ditton <157509033+hank-sq@users.noreply.github.com> Date: Thu, 9 Apr 2026 06:51:27 -0600 Subject: [PATCH 2/2] fix(playground): Multiple percent-formatted values by 100 before display, thanks @hank-sq (#10624) The Playground was displaying format: percent values with a raw % suffix (e.g. 0.273%) instead of multiplying by 100 first (27.3%). This contradicts the documented behavior where presentation tools should apply the multiplication implicitly. Fixes #10623 Made-with: Cursor --- .../src/QueryBuilderV2/QueryBuilderResults.tsx | 2 +- .../src/QueryBuilderV2/components/ChartRenderer.tsx | 4 ++++ .../src/components/DrilldownModal/TableQueryRenderer.tsx | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/cubejs-playground/src/QueryBuilderV2/QueryBuilderResults.tsx b/packages/cubejs-playground/src/QueryBuilderV2/QueryBuilderResults.tsx index 12e751c60f790..7132118232ec2 100644 --- a/packages/cubejs-playground/src/QueryBuilderV2/QueryBuilderResults.tsx +++ b/packages/cubejs-playground/src/QueryBuilderV2/QueryBuilderResults.tsx @@ -786,7 +786,7 @@ export function QueryBuilderResults({ forceMinHeight }: { forceMinHeight?: boole ]; case 'percent': return [ - `${formatNumber(typeof value === 'string' ? parseFloat(value) : value)}%`, + `${formatNumber((typeof value === 'string' ? parseFloat(value) : value) * 100)}%`, 'percent', ]; default: diff --git a/packages/cubejs-playground/src/QueryBuilderV2/components/ChartRenderer.tsx b/packages/cubejs-playground/src/QueryBuilderV2/components/ChartRenderer.tsx index e1d60a2d1f441..0ddcc908128a5 100644 --- a/packages/cubejs-playground/src/QueryBuilderV2/components/ChartRenderer.tsx +++ b/packages/cubejs-playground/src/QueryBuilderV2/components/ChartRenderer.tsx @@ -466,6 +466,10 @@ const TypeToChartComponent = { return text && text !== '0' ? 'true' : 'false'; } + if (c.format === 'percent' && text != null) { + return `${(parseFloat(text) * 100).toFixed(2)}%`; + } + return text; } }, diff --git a/packages/cubejs-playground/src/components/DrilldownModal/TableQueryRenderer.tsx b/packages/cubejs-playground/src/components/DrilldownModal/TableQueryRenderer.tsx index 0d25849f94143..95efeb73af520 100644 --- a/packages/cubejs-playground/src/components/DrilldownModal/TableQueryRenderer.tsx +++ b/packages/cubejs-playground/src/components/DrilldownModal/TableQueryRenderer.tsx @@ -36,7 +36,7 @@ const formatTableData = (columns, data) => { } if (type === 'number' && format === 'percent') { - return [parseFloat(value).toFixed(2), '%'].join(''); + return [(parseFloat(value) * 100).toFixed(2), '%'].join(''); } return value.toString();