Control Plane API is only available in Cube Cloud.
Prerequisites
Authentication
Control Plane API uses API key authentication. Include your API key in theAuthorization header with the Bearer prefix:
Error handling
In case of an error, Control Plane API returns a JSON object with anerror property:
Pagination
Endpoints that return lists support pagination usingoffset and limit query
parameters:
Paginated responses include a
pagination object:
Reference
/api/v1/deployments
Send a GET request to list all deployments accessible to the authenticated user.
Query parameters:
Example request:
/api/v1/deployments/{deployment_id}/environments
Send a GET request to list environments for a specific deployment.
Path parameters:
Query parameters:
Example request:
/api/v1/deployments/{deployment_id}/environments/{environment_id}/tokens-for-meta-sync
Send a POST request to create a JWT token for accessing the
Metadata API. The generated token is scoped specifically
to metadata endpoints (e.g., /v1/data-sources, /v1/entities) and cannot
be used to query data via the REST (JSON) API. This makes it suitable
for integrations such as data catalogs and lineage tools that only need to
read data model metadata.
The security context you provide is embedded in the
token and controls which parts of the data model are visible, following the
same multi-tenancy rules as regular API tokens.
Path parameters:
Request body:
Example request:
/build/api/v1/deployments/{deployment_id}/branches/staging-environment
Send a PUT request to enable or disable a branch, i.e. to control whether its
staging environment stays always active. Disabled
(the default), a staging environment is only active while the branch is viewed
in the Cube UI; enabled, it remains active and accessible regardless of user
activity, and it is reported by
/api/v1/deployments/{deployment_id}/environments
as a staging environment.
Only shared branches can be enabled — personal development branches and the
production branch are rejected.
Note the
/build prefix: data model and branch endpoints are served by the
build API.
Body parameters:
Example request:
cube data-model enable-branch / cube data-model disable-branch.
/api/v1/deployments/{deployment_id}/versions
Send a GET request to list the Cube versions a deployment can be switched
to — the same set the Cube Cloud UI’s version picker offers: the head of each
update channel, plus the older versions your account has
run before.
Example request:
releaseChannelVersion to
PUT /api/v1/deployments/{deployment_id}. Any of 1.7.20, v1.7.20 or
cubejs/cube:v1.7.20 is accepted; a version that is not on the list is
rejected with a 400. The container image is resolved from the version
server-side and cannot be set directly.
Leaving
releaseChannelVersion out and sending only releaseChannel moves the
deployment to that channel’s latest version.cube deployments versions, with cube deployments update ID --release-channel-version 1.7.20 to apply one.
/api/v1/audit-logs/export
Send a GET request to export 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 to be enabled on the
Enterprise plan. The authenticated user
must have the
AuditLogManage permission.
The response is a CSV file streamed as an attachment.
Example request:
/api/v1/deployments/{deployment_id}/dashboard-exports
Request a server-rendered snapshot of a whole published dashboard as PNG or
PDF — the same rendering the Download as PNG or PDF
action uses — without driving a browser through the console. A draft that has
never been published can’t be exported. Identify the dashboard with either
dashboardId (numeric) or dashboardPublicId (string) — exactly one, not
both. Requires manage access to the dashboard’s workbook, the same
permission the console’s whole-dashboard download requires.
Rendering happens asynchronously, since a capture waits for every widget on
the dashboard to finish querying: submit a job, poll it until status is
completed — or failed, whose error says why — then download the file.
The job and its file are dropped at the expiresAt the submit returns —
5 minutes out — so download before then or submit again. Only the identity
that submitted a job can poll or download it.
renderAs a console user or an embed user — so the file
reflects that person’s own row-level security. An embed subject that doesn’t
exist yet is provisioned by the call; the groups/userAttributes/
securityContext passed with it apply to that render only, never to the
user’s stored context. This is meant for scheduled, per-recipient reports:
one API key produces a correctly-scoped file per person, instead of one key
per person.
Submitting returns 400 for a request that supplies both ids or neither,
404 for a dashboard that doesn’t belong to the deployment or a deactivated
console subject, and 403 when the account has
data downloads restricted (not bypassed for an on-behalf-of export, unlike a
built-in scheduled notification) or when an embed subject’s tenant doesn’t
have the dashboard’s workbook shared with it. It returns 429 when too many
exports are already in flight for the identity being rendered as, so fan out
per-recipient reports with a bounded number of jobs open at a time. See the
API reference for the full request and response
schema.