Embed payload reference
This reference covers every parameter you can use when embedding. The embed payload is the signed JSON your backend turns into a token. It describes what to show, who is viewing, and what they can see and do. A handful of unsigned URL parameters adjust the UI on top of that.
If you're embedding for the first time, start with the Quickstart. Come back here when you need the full list.
How parameters work:
- 1. Build the embed payload
- payload-code
- 2. Generate embed token
- JWT.sign(payload, EMBED_SECRET) — Sign the payload with the Secret from your shared embed credential.
- JWT.sign(
- payload
- , EMBED_SECRET)
- eyJ0eXAiOiJKV1QiLCJhbGc...
- eyJ0eXAiOiJKV1QiLCJhbGc... — The signed embed token
- Embed token
- 3. Use token in embed URL
- https://secure.holistics.io/embed/{embed_key_id}/objects/sales_overview?_token=eyJ0eXAi...&left_panel_state=expanded
- https://secure.holistics.io/embed/{embed_key_id}/
- objects/sales_overview — URL path: open this dashboard first
- ?
- _token=eyJ0eXAi... — The signed embed token from step 2
- &
- left_panel_state=expanded — Query parameter: expand the navigation panel
- Payload params (JWT signed) Controls content, identity, permissions, and data access (signed into the token)
- URL params (not signed) Controls UI and navigation without regenerating the token (safe to change)
- payload-code → jwt-sign-payload
- jwt-sign → embed-token-value
- embed-token-value → embed-url-token
- embed-url-token → payload-params
- embed-url-path → url-params
- embed-url-panel → url-params
| Payload parameters | URL parameters | |
|---|---|---|
| Location | Signed JWT token | Appended to the embed URL |
| Purpose | Content, security, permissions, data access (which dashboards to show, row-level rules, export rights) | UI, navigation, display preferences (expand the navigation panel, deep-link to a dashboard, pre-fill a filter) |
| User modifiable | No | Yes |
Payload parameters (JWT-signed)
Payload parameters are included in the JWT your backend signs with your embed Secret. Because they're cryptographically signed, viewers can't change them, which makes them the right place for anything that affects content, identity, or data access.
Embedded objects
Every payload says what to embed: either a list of dashboards and datasets, or the name of a persisted Embed Portal. It also sets when the token expires.
| Parameter | Type | Description | Required |
|---|---|---|---|
objects.dashboards | array | Dashboards to embed, as a list of unique names. | Yes, unless using embed_portal |
objects.datasets | array | Datasets to embed, by unique name. Adding a dataset unlocks exploration, drill-down, and view underlying data on it, and lets Ask AI query it. | No |
embed_portal | string | Name of a persisted Embed Portal. Use instead of objects when your embedded content is defined as code in Holistics. | Yes, unless using objects |
exp | number | Token expiration as a Unix timestamp (e.g., 1769502969). The token is rejected after this time. | Recommended |
Example: inline objects
const payload = {
objects: {
dashboards: ["sales_overview", "revenue_trends"],
datasets: ["ecommerce"],
},
exp: Math.floor(Date.now() / 1000) + 3600, // Expires in 1 hour
};
Example: persisted Embed Portal
const payload = {
embed_portal: "customer_portal",
exp: Math.floor(Date.now() / 1000) + 3600,
};
Use either embed_portal or objects, not both. A payload that sets both is rejected, so it's always clear where the embedded content comes from.
Dashboards and datasets are referenced by the unique name declared in AML (the name after Dashboard or Dataset), not by their display title. The Embedded Analytics Sandbox on the Embedded Analytics page shows the exact names and generates a payload for you.
User identity
These parameters identify who's viewing. They unlock personal features like saving dashboards, email subscriptions, and organization workspaces, and they let Holistics attribute activity to a user in logs.
| Parameter | Type | Description | Required |
|---|---|---|---|
embed_user_id | string | Unique identifier for the user in your system. See Identity & Workspace. | For user-built dashboards and email subscriptions |
embed_org_id | string | Unique identifier for the user's organization. See Identity & Workspace. | For organization workspaces |
embed_user_email | string | User's email address for email subscriptions | For email subscriptions |
Example:
const payload = {
// ... embedded objects
embed_user_id: "user_123",
embed_org_id: "org_456",
};
Data access
Control which rows each viewer can see. There are two ways to express row-level permissions, and you can use both at once. When both apply, they are combined with AND, so the payload can only narrow access, never widen it.
| Parameter | Type | Description | Required |
|---|---|---|---|
permissions.row_based | array | Direct row-level permissions written in the payload. Each rule has a path (dataset, model, field), an operator, values, and an optional modifier. See Direct permissions. | If restricting data without dataset rules |
user_attributes | object | Key-value pairs matched by attribute-based row-level permissions defined in your datasets. Values must be arrays (e.g., region: ['US']). Also used by dynamic data sources, localization, and as Ask AI context. | If using dataset rules, dynamic data sources, or Ask AI |
Example:
const payload = {
// ... embedded objects and user identity
permissions: {
row_based: [
{
path: { dataset: "ecommerce", model: "companies", field: "id" },
operator: "is",
values: [42],
},
],
},
user_attributes: {
region: ["US", "EU"],
company_id: [42],
},
};
Settings
Configure what viewers can do with the data and how dashboards are displayed. Settings apply to every dashboard in the embed.
| Parameter | Type | Description | Default |
|---|---|---|---|
settings.allow_dashboard_export | boolean | Allow users to export dashboards (PDF, PNG) | false |
settings.allow_raw_data_export | boolean | Allow raw data export (CSV, Excel) | false |
settings.allow_data_subscribe | boolean | Enable email subscriptions. Requires embed_user_id, embed_user_email, and allow_dashboard_export. | false |
settings.ai.enabled | boolean | Enable Ask AI. Requires at least one dataset in objects.datasets or the portal. | false |
settings.default_timezone | string | Timezone for data display (e.g., "UTC", "America/New_York"). See Timezone settings. | Workspace default |
settings.allow_dashboard_timezone_change | boolean | Allow users to change the current dashboard's timezone | true |
settings.hide_header_panel | boolean | Hide the dashboard header panel (title and actions), for example when your app already shows a heading | false |
settings.hide_dashboard_filters_controls_panel | boolean | Hide the dashboard filter and control panel. Combine with default filter values or embed events if your app drives the filters itself. | false |
settings.dashboard_autorun_on_changes | boolean | Re-run the dashboard automatically whenever filters or controls change, without clicking Apply. Overrides the dashboard's own auto-run on changes setting. Every change fires queries, so leave it off for heavy dashboards. | false |
Example:
const payload = {
// ... embedded objects and user identity
settings: {
default_timezone: "America/New_York",
ai: { enabled: true },
allow_dashboard_export: true,
allow_raw_data_export: false,
allow_data_subscribe: true,
allow_dashboard_timezone_change: true,
hide_header_panel: false,
hide_dashboard_filters_controls_panel: false,
dashboard_autorun_on_changes: true,
},
};
Workspace permissions
Define whether the viewer can save their own dashboards and collaborate with their organization. These require embed_user_id (and embed_org_id for the organization workspace).
| Parameter | Type | Description | Default |
|---|---|---|---|
permissions.enable_personal_workspace | boolean | Allow the user to save dashboards to a personal workspace | false |
permissions.org_workspace_role | string | The user's role in the organization workspace: 'no_access', 'viewer', 'editor' | 'no_access' |
Example:
const payload = {
// ... embedded objects and user identity
permissions: {
enable_personal_workspace: true,
org_workspace_role: "editor", // Options: 'no_access', 'viewer', 'editor'
},
};
Full payload example
Here's a complete example combining every section:
const payload = {
// What to embed
objects: {
dashboards: ["sales_overview", "revenue_trends"],
datasets: ["ecommerce"],
},
// Who is viewing
embed_user_id: "user_123",
embed_org_id: "org_456",
// What data they can see
user_attributes: {
region: ["US", "EU"],
company_id: [42],
},
// What they can do
permissions: {
enable_personal_workspace: true,
org_workspace_role: "editor",
},
settings: {
default_timezone: "America/New_York",
ai: { enabled: true },
allow_dashboard_export: true,
allow_raw_data_export: false,
allow_data_subscribe: true,
dashboard_autorun_on_changes: true,
},
// Token expiration (Unix timestamp)
exp: Math.floor(Date.now() / 1000) + 3600, // Expires in 1 hour
};
// Generate JWT token
const embedSecret = "YOUR_EMBED_SECRET"; // Replace with your Secret from Holistics
const token = jwt.sign(payload, embedSecret, { algorithm: "HS256" });
Production checklist
The payload structure is standard, but some values must match your Holistics setup and your own user model. Check these before signing the token and building the embed URL:
objects.dashboardsandobjects.datasetsuse unique names from AML, not display titles. If you useembed_portal, the name must match a published Embed Portal.- Every payload that serves more than one customer carries row-level permissions, through
permissions.row_based,user_attributes, or both. user_attributeskeys match the attributes used by your dataset permission rules. You can manage user attributes programmatically with the User Attributes API and User Attribute Entries API.embed_user_idandembed_org_idare stable identifiers from your own application.- The embed URL uses the correct regional or custom domain and your Key ID.
- Feature flags such as AI, subscriptions, exports, and workspace permissions match your product and security policy.
expis set, ideally 24 hours or less.
URL parameters (not signed)
URL parameters customize the UI without regenerating tokens. Use them to control navigation panel state, deep-link to a specific dashboard, or pre-fill a filter. They don't affect security or data access, so viewers can safely change them (which also makes them good for bookmarks and shared links).
URL structure
Your embed URL must use the domain of your Holistics data center. Holistics has three regional app domains: APAC uses secure.holistics.io, US uses us.holistics.io, and EU uses eu.holistics.io. If you're not sure which one your account uses, see Data Centers. If you use a custom domain, replace the full host with it.
App domain
https://secure.holistics.io/embed/{embed_key_id}/{initial_object}?_token={token}&{query_params}
└──────┬─────┘ └──────┬───────┘ └──┬──┘ └─────┬─────┘
Key ID Path (optional) Token Query params
https://us.holistics.io/embed/{embed_key_id}/{initial_object}?_token={token}&{query_params}
└──────┬─────┘ └──────┬───────┘ └──┬──┘ └─────┬─────┘
Key ID Path (optional) Token Query params
https://eu.holistics.io/embed/{embed_key_id}/{initial_object}?_token={token}&{query_params}
└──────┬─────┘ └──────┬───────┘ └──┬──┘ └─────┬─────┘
Key ID Path (optional) Token Query params
| Component | Description |
|---|---|
{embed_key_id} | Your Key ID from the Embedded Analytics page. The same one for every embed. |
{initial_object} | Optional path to control which page opens first |
{query_params} | Optional query parameters for UI customization (see Query parameters) |
Initial object (URL path)
Deep-link viewers straight to the content they need: a specific dashboard, a dataset, or the Ask AI page. This lets you build targeted links from emails, notifications, or your own navigation.
Supported paths:
/objects/<object_name>: open a specific dashboard or dataset/ai: open the Ask AI page (requiressettings.ai.enabled: true)- (empty): use the default (see resolution order below)
Examples:
- Dashboard:
https://{region_domain}.holistics.io/embed/abc123/objects/sales_dashboard?_token=... - Ask AI:
https://{region_domain}.holistics.io/embed/abc123/ai?_token=...
Replace {region_domain} with secure, us, or eu.
Resolution order:
- URL path, if specified and the object is in the payload
initial_objectin the Embed Portal definition, if you're using one- The first dashboard in
objects.dashboards(or in the portal'sobjects)
Query parameters
Fine-tune the UI with query parameters appended to the embed URL.
| Parameter | Values | Default | Description |
|---|---|---|---|
left_panel_state | expanded, collapsed | collapsed | Controls the left navigation panel's expand/collapse state. The panel only appears when the embed has more than one dashboard, dataset, or workspace. |
{filter_block_uname} | Any valid filter value | none | Pre-fill a filter on the dashboard the URL opens to, using is / equal to / matches-style conditions. See Default filter values below, and Passing filter parameters via URL for syntax and Supported operators. |
Default filter values
Default filter values set the filters a dashboard opens with. They're useful for showing contextual data on load: a user clicks "Europe" in your app, so the region filter starts on Europe. You set them through URL query parameters, not in the signed payload.
Add each filter's unique name as a query parameter on the embed URL, with the value to apply:
https://{region_domain}.holistics.io/embed/{embed_key_id}/objects/sales_dashboard?_token=...®ion_filter=Europe
The values apply to the dashboard the URL opens to. Query parameters support is, equal to, and matches-style conditions only: relative dates (such as "last 6 months") and other custom operators aren't supported. For those, change the filter with embed events once the dashboard loads. See Passing filter parameters via URL for the full syntax and Supported operators.
Default filter values only set the starting state. URL parameters aren't signed, so viewers can change them, and they can change the filter in the dashboard too. To restrict what data a viewer can see, use row-level permissions. See Enforcing data access control for the difference.
URL examples
Common ways to combine paths and query parameters:
| Use case | URL |
|---|---|
| Basic embed | https://{region_domain}.holistics.io/embed/abc123?_token=... |
| Open a specific dashboard | https://{region_domain}.holistics.io/embed/abc123/objects/sales_dashboard?_token=... |
| Open the Ask AI page | https://{region_domain}.holistics.io/embed/abc123/ai?_token=... |
| Expanded navigation panel | https://{region_domain}.holistics.io/embed/abc123?_token=...&left_panel_state=expanded |
| Open a dashboard pre-filtered | https://{region_domain}.holistics.io/embed/abc123/objects/sales_dashboard?_token=...®ion=US |
Legacy per-dashboard embed links
If you embedded a dashboard before the new embed payload, your setup uses a per-dashboard embed code and secret, with filters, permissions, settings, and drillthroughs at the top level of the payload. Those links keep working, and Legacy single-dashboard embedding documents them. To adopt the parameters on this page (multiple dashboards, datasets, identity, Ask AI), switch to your shared embed credentials and move the dashboard into objects.dashboards. The migration guide covers this step by step.
Related documentation
- Quickstart: embed your first dashboard end to end
- Row-level permissions: restrict data per viewer
- Identity & Workspace: user and organization setup
- Embed Portal: persist embedded objects as code
- Ask AI: enable AI features
- Email subscriptions: schedule email reports