Skip to main content
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',
};