Skip to main content
Embedded surfaces can be trimmed down to the feature set you want each of your users to see: hide the AI chat, drop a duplicate back button, take sharing away from a single-tenant deployment, allow chart downloads. Those switches live in three configuration layers, and which layer a switch belongs to is not arbitrary — it follows from what the switch answers: A fourth channel, host messages, changes a few of the same values at runtime (language, time zone, theme) after the iframe has already loaded.

Which layer to use

The rule. A session setting answers what is this customer entitled to. A URL parameter answers what should this particular placement look like. An account setting is the default behind both.
That is why the layers are not interchangeable, and why a given switch usually exists in exactly one of them:
  • Session settings are per-viewer, and the switches are tamper-proof. Your backend decides them when it mints the session, and they are signed into the session token, so a viewer cannot switch on something you withheld. (The two value settings, locale and timezone, are deliberately softer: a URL parameter overrides them, because neither grants anything.) Everything that differs per customer — whether sharing exists, whether the AI agent may write to the workspace, whether raw member names may be revealed — is a session setting. Some of them are enforced on the server, not merely hidden in the UI (see What hiding does and does not do).
  • URL parameters are per-placement and cheap. The same session can be rendered in two places in your product that need different chrome — a full page with its own header, and a compact card in a sidebar. Changing a query string needs no new session, but the viewer can also edit it, so nothing that must hold against a determined viewer is expressed this way.
  • Account settings are the default. Use them when the answer is the same for every customer you embed for.
Two consequences worth internalising:
  • Private embedding has no session layer. A private embed carries no session token, so session settings do not exist there; only account settings and URL parameters apply, and the viewer’s own Cube permissions decide the rest.
  • Outside an embed, none of this applies. On the Cube console itself every control is governed by the user’s role, not by these switches.

Session settings

Pass settings to the Generate Session API. Every key inherits the layer below it when you omit it — the account setting where one exists, otherwise the built-in default. The switches are tri-state: true / false pins the behavior for every embed opened with that session. Two keys (locale, timezone) carry a value instead, and an unusable one falls through to the layer below rather than failing the session.

AI

All but the last inherit an account-wide default from Embed → Settings, so a session value there is an override of what the account already says; allowChatWorkspaceAuthoring has no account-wide counterpart.

Language and time zone

These two carry a value rather than a switch, and they are the answer for a viewer rather than for a placement: set them once when you mint the session and every iframe that session opens uses them. A runtime host message and the per-iframe ?locale= / ?timezone= parameters both still win where a host sends one, and the account-wide default applies where none does. Neither setting grants anything, which is why a viewer-editable URL parameter is allowed to override them.

Creator Mode controls

These have no account-wide counterpart: what they answer is a per-customer question, so the session is the only place to answer it. All default to shown.
The Chat API’s own session exchange accepts allowChatWorkspaceAuthoring as a top-level field of the request body rather than inside a settings object. It means exactly the same thing.

URL parameters

Add these to the iframe src. They are read from the URL the host loaded the embed with and stay pinned for the life of the embed, so they survive in-app navigation — opening a dashboard from the home page, or publishing a draft — and they are ignored outside /embed/*. The dashboard header switches exist because a host that already frames the embed in its own chrome otherwise ends up with two of everything — most visibly two back buttons that navigate to different places. Each control is its own switch because which of them duplicate yours is your decision; showDashboardHeader=false is the shortcut for all of them, and hiding the last remaining control collapses the bar for you.

How values are parsed

Every parameter falls back to whatever the embed would have done without it, so a typo never buys something you did not ask for. Which direction that is depends on what the parameter does:
  • A parameter that grants (allowExport) requires the exact literal string true. allowExport=1, allowExport=TRUE, and a bare ?allowExport all leave downloads hidden.
  • A parameter that hides (every show…) requires the exact literal string false. =0, =False, =FALSE, and a bare ?showDashboardTitle all leave the control visible.
  • A parameter that selects a value (locale, timezone) falls through to the next source in the ladder when the value is one Cube cannot use — the session setting first, then (for timezone) a zone the dashboard’s author pinned, then the account default.
Note that the two boolean conventions are inverses of each other: allowExport must be turned on, show… must be turned off.

Account settings

Embed → Settings in the Cube console holds the account-wide defaults. They apply to every embed, including private embeds, and the AI ones are what a session’s own AI keys override. The same page carries the account-wide Creator Mode settings: the workspace header title (with per-language overrides) and whether that header is shown at all, plus whether embed users may see Semantic SQL (shown by default) and Generated SQL (hidden by default, because it exposes physical table and schema names).

Analytics Chat parameters

The standalone Analytics Chat embed has three URL parameters of its own. They follow the same rule as every other show… parameter: only the literal false hides. Each also has an older hide… spelling that still works — see Analytics Chat → Customize the chat. Whether the chat surface is available at all is a session question, not a URL one: settings.allowAi: false withholds it.

What hiding does and does not do

Most of these switches take an entry point out of the UI. They are how you shape the product your users see; they are not a replacement for permissions.
  • Permissions still apply underneath. None of these switches widens what a session may do. showDashboardEditButton cannot give edit rights; showWorkbookShare: true cannot share content the user may not share; allowChatWorkspaceAuthoring: true grants nothing the user’s role withholds.
  • Two of them are enforced on the server, not merely hidden. allowAi: false stops the session obtaining AI credentials at all. allowChatWorkspaceAuthoring: false changes the tools and instructions the agent is given.
  • Two more reset state as well as hiding a control, in the browser rather than on the server: showMemberNames: false and showGroupByCube: false pin the data pane so a user who had already switched cannot stay switched. That keeps the pane consistent for every viewer of the session; it is not a server-side guarantee about what the data model reveals.
  • URL parameters are visible to the viewer. They are chrome and layout decisions, made per placement. Anything a viewer must not be able to turn back on belongs in the session settings.
  • Export is client-side. A widget’s CSV is serialized in the browser from data the widget has already loaded, so allowExport decides whether the action is offered, not whether the viewer’s browser holds the rows. The account-wide Allow data downloads switch outranks it — see Restricting data downloads, which also notes that the per-user Download data role action is bypassed by anonymous embed viewers.

Recipes

A dashboard inside your own chrome. Your page already has a header and a back link:
A customer whose plan has no AI. Decide it on your backend, so it holds wherever the embed is rendered:
A single-tenant deployment with no sharing UI, and a data pane pinned to titles rather than the model’s raw identifiers:
A chat integration that renders answers in your own UI, with no Cube workspace behind it:
Downloads for one placement only. Grant export on the iframe that should have it, and leave it off the others: