omni-embed

Nhúng bảng điều khiển Omni Analytics vào ứng dụng bên ngoài — ký URL, chủ đề tùy chỉnh, sự kiện iframe, không gian làm việc thực thể và nội dung nhận biết quyền — sử dụng…

npx skills add https://github.com/exploreomni/omni-cursor-plugin --skill omni-embed

Omni Embed

Embed Omni dashboards in external applications using signed iframe URLs. The @omni-co/embed SDK handles URL signing and theme customization. Omni's postMessage events enable two-way communication between the parent app and embedded iframe.

Tip: Use omni-content-explorer to find dashboards to embed, and omni-admin to manage embed user permissions and user attributes for row-level security.

Prerequisites

npm install @omni-co/embed
export OMNI_BASE_URL="https://yourorg.embed-omniapp.co"   # Embed domain
export OMNI_EMBED_SECRET="your-embed-secret"               # Admin → Embed
export OMNI_API_KEY="your-api-key"                         # For user/content API calls

The embed secret is found in Admin → Embed in your Omni instance. The OMNI_BASE_URL for embedding uses the .embed-omniapp.co domain, not the standard .omniapp.co domain.

API Discovery

When unsure whether an endpoint or parameter exists, fetch the OpenAPI spec:

curl -L "$OMNI_BASE_URL/openapi.json" \
  -H "Authorization: Bearer $OMNI_API_KEY"

Use this to verify endpoints, available parameters, and request/response schemas before making calls.

Signing Embed URLs

Use embedSsoDashboard() from the @omni-co/embed SDK to generate a signed URL server-side, then load it in an iframe client-side.

import { embedSsoDashboard, EmbedSessionMode } from "@omni-co/embed";

const embedUrl = await embedSsoDashboard({
  contentId: "dashboard-uuid",
  secret: process.env.OMNI_EMBED_SECRET,
  host: "yourorg.embed-omniapp.co",       // Hostname only, no https://
  externalId: "[email protected]",
  name: "Jane Doe",
  userAttributes: { brand: ["Acme"] },     // For row-level security
  mode: EmbedSessionMode.SingleContent,
  prefersDark: "false",
});

Parameters

ParameterRequiredDescription
contentIdYesDashboard UUID (from URL or Admin → Dashboards)
secretYesEmbed secret from Admin → Embed
hostYesEmbed hostname only — no protocol, no port
externalIdYesUnique user identifier (typically email)
nameYesDisplay name for the user
userAttributesNoRecord<string, string[]> for row-level security
modeNoSingleContent (default) or Application (enables create)
prefersDarkNo"true" or "false" — controls light/dark mode
customThemeNoTheme object (see Custom Themes below)
entityNoEntity name for workspaces (see Entity Workspaces below)

Gotcha: The host parameter must be a bare hostname (e.g., yourorg.embed-omniapp.co). Including a protocol (https://) or port (:3000) causes Omni to return 400.

Custom Themes

Pass a customTheme object to embedSsoDashboard() to style the embedded dashboard content (tile backgrounds, text colors, controls, buttons). This controls what's inside the iframe — parent app styling is separate.

const embedUrl = await embedSsoDashboard({
  // ...signing params
  prefersDark: "false",
  customTheme: {
    "dashboard-background": "#FEF2F2",
    "dashboard-tile-background": "#FFF5F5",
    "dashboard-key-color": "#E60000",
    "dashboard-key-text-color": "#ffffff",
    // ...
  },
});

Property Reference

Page:

PropertyDescription
dashboard-backgroundDashboard page background
dashboard-page-paddingDashboard page padding

Tiles:

PropertyDescription
dashboard-tile-marginSpacing around tiles
dashboard-tile-backgroundTile background color
dashboard-tile-shadowTile box shadow
dashboard-tile-text-body-colorPrimary text color in tiles
dashboard-tile-text-secondary-colorSecondary text color in tiles
dashboard-tile-border-colorTile border color
dashboard-tile-border-radiusTile border radius
dashboard-tile-border-styleTile border style
dashboard-tile-border-widthTile border width
dashboard-tile-title-font-sizeTitle font size
dashboard-tile-title-font-weightTitle font weight
dashboard-tile-title-text-colorTitle text color
dashboard-tile-title-font-familyCustom title font (woff2 URL)
dashboard-tile-text-body-font-familyCustom body font
dashboard-tile-text-code-font-familyCustom code font

Controls (filter dropdowns):

PropertyDescription
dashboard-control-backgroundFilter control background
dashboard-control-radiusFilter control border radius
dashboard-control-border-colorFilter control border color
dashboard-control-text-colorFilter control text color
dashboard-control-placeholder-colorPlaceholder text color
dashboard-control-label-colorLabel text above controls
dashboard-control-outline-colorFocus outline color

Control Popovers (dropdown menus):

PropertyDescription
dashboard-control-popover-backgroundPopover background
dashboard-control-popover-text-colorPopover text color
dashboard-control-popover-secondary-text-colorSecondary text in popovers
dashboard-control-popover-link-colorLink color in popovers
dashboard-control-popover-divider-colorDivider color
dashboard-control-popover-radiusPopover border radius
dashboard-control-popover-border-colorPopover border color
dashboard-filter-input-backgroundFilter input background
dashboard-filter-input-radiusFilter input border radius
dashboard-filter-input-border-colorFilter input border color
dashboard-filter-input-text-colorFilter input text color
dashboard-filter-input-placeholder-colorPlaceholder text
dashboard-filter-input-icon-colorIcon color in filter inputs
dashboard-filter-input-outline-colorFocus outline for filter inputs
dashboard-filter-input-accent-colorCheckbox, radio, and toggle color
dashboard-filter-input-accent-invert-colorCheckmark/dot color inside inputs
dashboard-filter-input-token-colorMulti-select token background
dashboard-filter-input-token-text-colorMulti-select token text color

Buttons:

PropertyDescription
dashboard-key-colorPrimary action color (Update buttons)
dashboard-key-text-colorText color on primary buttons
dashboard-button-radiusButton border radius
dashboard-button-transparent-text-colorTransparent button text color
dashboard-button-transparent-interactive-colorTransparent button hover color
dashboard-menu-item-interactive-colorMenu item hover background

Supported CSS Values

  • Hex colors: "#FEF2F2", "#E60000"
  • Box shadows with rgba: "0 2px 8px rgba(230, 0, 0, 0.1)"
  • Custom fonts via URL: "url(https://fonts.gstatic.com/...) format('woff2')"
  • Empty strings to clear defaults: ""
  • linear-gradient() and rgba() for backgrounds work in Omni's UI theme editor but may fail when passed via the SDK — use solid hex colors for reliability

Theming Tips

For effective branding, tint backgrounds throughout rather than only coloring buttons:

  • dashboard-background → light brand tint (like Tailwind's color-50)
  • dashboard-tile-background → slightly lighter than page background
  • dashboard-tile-title-text-color → brand primary (titles in brand color)
  • dashboard-control-label-color → brand primary (labels in brand color)
  • dashboard-tile-border-color → medium-light brand tint (like color-200)
  • dashboard-key-color → brand primary
  • dashboard-filter-input-accent-color → brand primary (checkboxes, toggles)

Embed Events

Omni communicates with the parent app via postMessage. All Omni events have source: "omni".

Listening for Events

window.addEventListener("message", (event) => {
  if (event.data?.source !== "omni") return;

  switch (event.data.name) {
    case "dashboard:loaded":
      // Dashboard ready
      break;
    case "error":
      // Handle error
      break;
    case "dashboard:tile-drill":
      // Handle drill action
      break;
  }
});

Event Reference

dashboard:loaded — Fired when the embedded dashboard finishes loading.

{ "source": "omni", "name": "dashboard:loaded" }

dashboard:filters — Fired when filter state changes inside the embedded dashboard.

{
  "source": "omni",
  "name": "dashboard:filters",
  "payload": { /* filter state */ }
}

error — Fired when a detectable error occurs on the embedded page.

{
  "source": "omni",
  "name": "error",
  "payload": {
    "href": "https://...",
    "message": "Error description"
  }
}

dashboard:tile-drill — Fired when a user drills on any dashboard tile (charts, tables, maps). No Omni-side configuration required.

{
  "source": "omni",
  "name": "dashboard:tile-drill",
  "payload": {
    "userId": "string",
    "dashboard": {
      "filters": {
        "filterName": {
          "filter": {},
          "asJsonUrlSearchParam": "string"
        }
      },
      "href": "string",
      "urlId": "string",
      "path": "string",
      "title": "string"
    },
    "tile": {
      "id": "string",
      "title": "string",
      "appliedFilters": {
        "filterName": {
          "filter": {},
          "asJsonUrlSearchParam": "string"
        }
      }
    },
    "drill": {
      "field": "string",
      "fieldLabel": "string",
      "drillQueryLabel": "string",
      "rowToDrill": { "field_name": "value" }
    }
  }
}

Use drill.rowToDrill for the data from the drilled row. Use asJsonUrlSearchParam from tile.appliedFilters or dashboard.filters to sign and embed a different dashboard with those filters applied.

page:changed — Fired when the URL changes inside the iframe (including after saving a new dashboard).

{
  "source": "omni",
  "name": "page:changed",
  "payload": {
    "pathname": "string",
    "type": "string"
  }
}

Custom visualization events — Fired when a user clicks a configured table row or markdown link. Requires setup in Omni: set the table column's Display to LinkEmbed event and enter an event name. For markdown, use <omni-message> tags.

{
  "source": "omni",
  "name": "<your-event-name>",
  "payload": {
    "data": "comma-separated values"
  }
}

Table setup: field dropdown → Display tab → Display as: Link → URL: Embed event → enter event name.

Markdown setup:

<omni-message event-name="product-click" event-data="{{products.name.raw}},{{products.retail_price.raw}}">
  Click here
</omni-message>

Sending Events to the Iframe

dashboard:filter-change-by-url-parameter — Push a filter from the parent app into the embedded dashboard.

iframe.contentWindow.postMessage({
  source: "omni",
  name: "dashboard:filter-change-by-url-parameter",
  payload: {
    filterUrlParameter: 'f--<filter_id>={"values":["value1","value2"]}'
  }
}, iframeOrigin);

Get the filterUrlParameter string by opening the dashboard in Omni, changing filter values, and copying the f-- parameter from the URL.

Entity Workspaces

Entity workspaces let embed users create and save their own dashboards within a scoped folder.

import {
  embedSsoDashboard,
  EmbedSessionMode,
  EmbedEntityFolderContentRoles,
  EmbedUiSettings,
  EmbedConnectionRoles,
} from "@omni-co/embed";

const embedUrl = await embedSsoDashboard({
  // ...standard signing params
  entity: "acme",
  entityFolderContentRole: EmbedEntityFolderContentRoles.EDITOR,
  mode: EmbedSessionMode.Application,
  uiSettings: {
    [EmbedUiSettings.SHOW_NAVIGATION]: false,
  },
  connectionRoles: {
    "connection-uuid": EmbedConnectionRoles.RESTRICTED_QUERIER,
  },
});
ParameterDescription
entityEntity name — scopes the user's folder (e.g., derived from email domain)
entityFolderContentRoleEDITOR lets users create/edit dashboards in their entity folder
modeMust be Application to enable create features
uiSettingsControl Omni's built-in UI (e.g., hide Omni's sidebar if you provide your own)
connectionRolesGrant query access: RESTRICTED_QUERIER for data exploration

Embed Users and Permissions

When building permission-aware experiences (e.g., a sidebar that only shows dashboards a user can access), use these REST API calls. Note: API calls use the .omniapp.co domain, not the .embed-omniapp.co embed domain.

Look Up an Embed User

curl -L "$OMNI_API_BASE/api/scim/v2/embed/users?filter=embedExternalId%20eq%20%[email protected]%22" \
  -H "Authorization: Bearer $OMNI_API_KEY"

Returns the Omni user ID for the given externalId. If no user is found, the user hasn't accessed any embedded dashboards yet.

List Documents by User Permission

curl -L "$OMNI_API_BASE/api/v1/documents?userId={omniUserId}" \
  -H "Authorization: Bearer $OMNI_API_KEY"

Response uses records array (not documents):

{
  "pageInfo": {
    "hasNextPage": false,
    "nextCursor": null,
    "pageSize": 20,
    "totalRecords": 5
  },
  "records": [
    {
      "identifier": "fb007aa3",
      "name": "Sales Dashboard",
      "hasDashboard": true,
      "folder": {
        "id": "...",
        "name": "Sales",
        "path": "sales/regional"
      }
    }
  ]
}

Use identifier as the contentId for embed signing. Filter for hasDashboard: true to get embeddable dashboards only.

List Folders for Friendly Names

Entity folders have technical paths like omni-system-sso-embed-entity-folder-poc. Map paths to display names:

curl -L "$OMNI_API_BASE/api/v1/folders" \
  -H "Authorization: Bearer $OMNI_API_KEY"

Build a path → name mapping from the response to display user-friendly folder names.

Domain Mapping

The embed domain (.embed-omniapp.co) and API domain (.omniapp.co) are different:

Embed: yourorg.embed-omniapp.co  →  used for iframe URLs
API:   yourorg.omniapp.co        →  used for REST API calls

When your app stores the embed domain, convert it for API calls by replacing .embed-omniapp.co with .omniapp.co.

Docs Reference

Related Skills

  • omni-content-explorer — find dashboards to embed
  • omni-content-builder — create dashboards before embedding them
  • omni-admin — manage embed user permissions, user attributes for RLS, and connections
  • omni-model-explorer — understand available fields for embed event data

Thêm skills từ exploreomni

omni-admin
exploreomni
Quản trị một phiên bản Omni Analytics — quản lý kết nối, người dùng, nhóm, thuộc tính người dùng, quyền, lịch trình và làm mới lược đồ thông qua Omni CLI. Sử dụng…
official
omni-ai-eval
exploreomni
Đánh giá độ chính xác của việc tạo truy vấn Omni AI bằng cách chạy các prompt thử nghiệm qua Omni CLI, so sánh JSON truy vấn được tạo với kết quả mong đợi và chấm điểm…
official
omni-ai-optimizer
exploreomni
Tối ưu hóa mô hình Omni Analytics của bạn cho Blobby, Omni Agent — cấu hình ai_context, ai_fields, sample_queries và tạo các phần mở rộng chủ đề dành riêng cho AI. Sử dụng…
official
omni-content-builder
exploreomni
Tạo, cập nhật và quản lý tài liệu và bảng điều khiển Omni Analytics theo cách lập trình — vòng đời tài liệu, ô, trực quan hóa, bộ lọc và bố cục — sử dụng…
official
omni-content-explorer
exploreomni
Tìm, duyệt và sắp xếp nội dung trong Omni Analytics — bảng điều khiển, sổ làm việc, thư mục và nhãn — bằng cách sử dụng Omni CLI. Sử dụng kỹ năng này bất cứ khi nào ai đó muốn…
official
omni-embed
exploreomni
Nhúng bảng điều khiển Omni Analytics vào ứng dụng bên ngoài — ký URL, chủ đề tùy chỉnh, sự kiện iframe, không gian làm việc thực thể và nội dung nhận biết quyền — sử dụng…
official
omni-model-builder
exploreomni
Tạo và chỉnh sửa các định nghĩa mô hình ngữ nghĩa Omni Analytics — view, chủ đề, chiều, thước đo, mối quan hệ và query view — sử dụng YAML thông qua Omni…
official
omni-model-explorer
exploreomni
Khám phá và kiểm tra các mô hình, chủ đề, chế độ xem, trường, chiều, thước đo và mối quan hệ của Omni Analytics bằng Omni CLI. Sử dụng kỹ năng này bất cứ khi nào ai đó…
official