Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/metabase/metabase/llms.txt

Use this file to discover all available pages before exploring further.

The Metabase Embedding SDK is written in TypeScript and exports comprehensive type definitions for all components and APIs.

Importing types

import type {
  // Components
  InteractiveQuestionProps,
  StaticQuestionProps,
  InteractiveDashboardProps,
  StaticDashboardProps,
  CollectionBrowserProps,
  MetabaseProviderProps,
  
  // Data types
  MetabaseQuestion,
  MetabaseDashboard,
  MetabaseCollectionItem,
  MetabaseUser,
  
  // Configuration
  MetabaseAuthConfig,
  MetabaseTheme,
  MetabasePluginsConfig,
  SdkEventHandlersConfig,
  
  // IDs and tokens
  SdkQuestionId,
  SdkDashboardId,
  SdkCollectionId,
  SdkEntityToken,
} from '@metabase/embedding-sdk-react';

Component props

InteractiveQuestionProps

import type { InteractiveQuestionProps } from '@metabase/embedding-sdk-react';

const props: InteractiveQuestionProps = {
  questionId: 1,
  height: 400,
  withChartTypeSelector: true,
  isSaveEnabled: true,
  onRun: (question) => console.log(question),
  onSave: (question) => console.log(question),
};

StaticQuestionProps

import type { StaticQuestionProps } from '@metabase/embedding-sdk-react';

const props: StaticQuestionProps = {
  questionId: 1,
  height: 400,
  token: 'abc123...',
  withDownloads: true,
  initialSqlParameters: {
    user_id: '123',
  },
};

InteractiveDashboardProps

import type { InteractiveDashboardProps } from '@metabase/embedding-sdk-react';

const props: InteractiveDashboardProps = {
  dashboardId: 1,
  initialParameters: {
    region: 'North America',
  },
  withTitle: true,
  autoRefreshInterval: 300,
  onLoad: (dashboard) => console.log(dashboard),
};

StaticDashboardProps

import type { StaticDashboardProps } from '@metabase/embedding-sdk-react';

const props: StaticDashboardProps = {
  dashboardId: 1,
  token: 'abc123...',
  withTitle: false,
  withCardTitle: true,
};

CollectionBrowserProps

import type { CollectionBrowserProps } from '@metabase/embedding-sdk-react';

const props: CollectionBrowserProps = {
  collectionId: 'root',
  pageSize: 25,
  visibleEntityTypes: ['dashboard', 'question'],
  onClick: (item) => console.log(item),
};

MetabaseProviderProps

import type { MetabaseProviderProps } from '@metabase/embedding-sdk-react';

const props: MetabaseProviderProps = {
  children: <div>App</div>,
  authConfig: {
    metabaseInstanceUrl: 'https://metabase.example.com',
    jwtProviderUri: 'https://api.example.com/sso/metabase',
  },
  theme: {
    colors: {
      brand: '#9333EA',
    },
  },
  locale: 'en',
};

Authentication types

MetabaseAuthConfig

import type { 
  MetabaseAuthConfig,
  MetabaseAuthConfigWithJwt,
  MetabaseAuthConfigWithApiKey,
  MetabaseAuthConfigWithSaml,
  MetabaseIsGuestAuthConfig,
} from '@metabase/embedding-sdk-react';

// JWT authentication
const jwtAuth: MetabaseAuthConfigWithJwt = {
  metabaseInstanceUrl: 'https://metabase.example.com',
  jwtProviderUri: 'https://api.example.com/sso/metabase',
  preferredAuthMethod: 'jwt',
};

// API key (development only)
const apiKeyAuth: MetabaseAuthConfigWithApiKey = {
  metabaseInstanceUrl: 'http://localhost:3000',
  apiKey: 'dev-api-key',
};

// SAML authentication
const samlAuth: MetabaseAuthConfigWithSaml = {
  metabaseInstanceUrl: 'https://metabase.example.com',
  preferredAuthMethod: 'saml',
};

// Guest mode
const guestAuth: MetabaseIsGuestAuthConfig = {
  metabaseInstanceUrl: 'https://metabase.example.com',
  isGuest: true,
};

Theme types

MetabaseTheme

import type { 
  MetabaseTheme,
  MetabaseColors,
  MetabaseComponentTheme,
  MetabaseThemePreset,
} from '@metabase/embedding-sdk-react';

const theme: MetabaseTheme = {
  preset: 'light',
  fontFamily: 'Inter',
  fontSize: '14px',
  lineHeight: 1.5,
  colors: {
    brand: '#9333EA',
    'text-primary': '#1F2937',
  },
  components: {
    dashboard: {
      backgroundColor: '#F9FAFB',
      card: {
        backgroundColor: '#FFFFFF',
        border: '1px solid #E5E7EB',
      },
    },
  },
};

MetabaseColors

import type { MetabaseColors } from '@metabase/embedding-sdk-react';

const colors: MetabaseColors = {
  brand: '#9333EA',
  'brand-hover': '#7C3AED',
  'text-primary': '#1F2937',
  'text-secondary': '#6B7280',
  background: '#FFFFFF',
  border: '#E5E7EB',
  positive: '#10B981',
  negative: '#EF4444',
  charts: ['#9333EA', '#3B82F6', '#10B981'],
};

Data types

MetabaseQuestion

import type { MetabaseQuestion } from '@metabase/embedding-sdk-react';

function handleQuestion(question: MetabaseQuestion) {
  const id = question.id();
  const name = question.displayName();
  const display = question.display();
  const query = question.query();
  
  console.log({ id, name, display, query });
}

MetabaseDashboard

import type { MetabaseDashboard } from '@metabase/embedding-sdk-react';

function handleDashboard(dashboard: MetabaseDashboard | null) {
  if (!dashboard) return;
  
  console.log('ID:', dashboard.id);
  console.log('Name:', dashboard.name);
  console.log('Description:', dashboard.description);
  console.log('Cards:', dashboard.dashcards?.length);
  console.log('Tabs:', dashboard.tabs?.length);
}

MetabaseCollectionItem

import type { MetabaseCollectionItem } from '@metabase/embedding-sdk-react';

function handleCollectionItem(item: MetabaseCollectionItem) {
  console.log('ID:', item.id);
  console.log('Name:', item.name);
  console.log('Type:', item.model); // 'dashboard' | 'card' | 'dataset' | 'collection'
  console.log('Description:', item.description);
  console.log('Entity ID:', item.entity_id);
}

MetabaseUser

import type { MetabaseUser } from '@metabase/embedding-sdk-react';
import { useCurrentUser } from '@metabase/embedding-sdk-react';

function UserProfile() {
  const user: MetabaseUser | null = useCurrentUser();
  
  if (!user) return null;
  
  return (
    <div>
      <p>Email: {user.email}</p>
      <p>Name: {user.first_name} {user.last_name}</p>
      <p>Admin: {user.is_superuser ? 'Yes' : 'No'}</p>
    </div>
  );
}

Plugin types

MetabasePluginsConfig

import type { 
  MetabasePluginsConfig,
  MetabaseClickAction,
  MetabaseDataPointObject,
} from '@metabase/embedding-sdk-react';

const plugins: MetabasePluginsConfig = {
  mapQuestionClickActions: (
    clickActions: MetabaseClickAction[],
    clickedDataPoint: MetabaseDataPointObject
  ) => {
    return clickActions.filter(action => 
      action.name !== 'automatic-insights'
    );
  },
  dashboard: {
    dashboardCardMenu: ({ dashcard, result }) => [
      {
        name: 'Custom Action',
        onClick: () => console.log('Clicked'),
      },
    ],
  },
};

Event handler types

SdkEventHandlersConfig

import type { 
  SdkEventHandlersConfig,
  MetabaseDashboard,
} from '@metabase/embedding-sdk-react';

const eventHandlers: SdkEventHandlersConfig = {
  onDashboardLoad: (dashboard: MetabaseDashboard | null) => {
    console.log('Dashboard loaded:', dashboard);
  },
  onDashboardLoadWithoutCards: (dashboard: MetabaseDashboard | null) => {
    console.log('Dashboard structure loaded');
  },
};

ID types

SdkQuestionId

import type { SdkQuestionId } from '@metabase/embedding-sdk-react';

// Can be a number, string, or special values
const questionIds: SdkQuestionId[] = [
  1,                    // Numeric ID
  'abc123',             // Entity ID
  'new',                // New query builder question
  'new-native',         // New SQL question
];

SdkDashboardId

import type { SdkDashboardId } from '@metabase/embedding-sdk-react';

const dashboardId: SdkDashboardId = 1;           // Numeric ID
const entityId: SdkDashboardId = 'abc123';       // Entity ID

SdkCollectionId

import type { SdkCollectionId } from '@metabase/embedding-sdk-react';

const collectionIds: SdkCollectionId[] = [
  1,            // Numeric ID
  'personal',   // User's personal collection
  'root',       // Root collection
  'tenant',     // Tenant collection
];

Parameter types

ParameterValues

import type { ParameterValues } from '@metabase/embedding-sdk-react';

const parameters: ParameterValues = {
  region: 'North America',
  date_range: '2024-01-01~2024-12-31',
  status: 'active',
};

SqlParameterValues

import type { SqlParameterValues } from '@metabase/embedding-sdk-react';

const sqlParams: SqlParameterValues = {
  user_id: '123',
  start_date: '2024-01-01',
  category: 'sales',
};

Utility types

SdkErrorComponent

import type { 
  SdkErrorComponent,
  SdkErrorComponentProps,
} from '@metabase/embedding-sdk-react';

const ErrorComponent: SdkErrorComponent = ({ message }: SdkErrorComponentProps) => (
  <div>
    <h2>Error</h2>
    <p>{message}</p>
  </div>
);

Hook return types

useCurrentUser

import { useCurrentUser } from '@metabase/embedding-sdk-react';
import type { MetabaseUser } from '@metabase/embedding-sdk-react';

function Component() {
  const user: MetabaseUser | null = useCurrentUser();
  // ...
}

useMetabaseAuthStatus

import { useMetabaseAuthStatus } from '@metabase/embedding-sdk-react';
import type { LoginStatus } from '@metabase/embedding-sdk-react';

function Component() {
  const status: LoginStatus = useMetabaseAuthStatus();
  
  if (status.status === 'success') {
    console.log('Authenticated');
  }
}

Type guards

Create type guards for runtime type checking:
import type { MetabaseCollectionItem } from '@metabase/embedding-sdk-react';

function isDashboard(item: MetabaseCollectionItem): boolean {
  return item.model === 'dashboard';
}

function isQuestion(item: MetabaseCollectionItem): boolean {
  return item.model === 'card';
}

function isCollection(item: MetabaseCollectionItem): boolean {
  return item.model === 'collection';
}

// Usage
const item: MetabaseCollectionItem = /* ... */;

if (isDashboard(item)) {
  console.log('Dashboard:', item.name);
}

Generic component props

import type { FC } from 'react';
import type { InteractiveQuestionProps } from '@metabase/embedding-sdk-react';
import { InteractiveQuestion } from '@metabase/embedding-sdk-react';

type QuestionWrapperProps = {
  title: string;
} & InteractiveQuestionProps;

const QuestionWrapper: FC<QuestionWrapperProps> = ({ title, ...questionProps }) => (
  <div>
    <h2>{title}</h2>
    <InteractiveQuestion {...questionProps} />
  </div>
);

Extending types

import type { MetabaseTheme } from '@metabase/embedding-sdk-react';

interface ExtendedTheme extends MetabaseTheme {
  customProperty?: string;
}

const theme: ExtendedTheme = {
  preset: 'light',
  customProperty: 'value',
};