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();