> ## Documentation Index
> Fetch the complete documentation index at: https://docs.open-metadata.org/llms.txt
> Use this file to discover all available pages before exploring further.

# PowerBI Connector | OpenMetadata Integration Documentation

> Connect Power BI to OpenMetadata with our comprehensive dashboard connector guide. Setup instructions, configuration tips, and metadata extraction made simple.

export const MetadataIngestionUi = ({connector, selectServicePath, addNewServicePath, serviceConnectionPath}) => {
  return <>
    <p>
      To ingest metadata from your sources, you need to create a service connection.
      The service connects your source system with OpenMetadata. Once you create
      a service, you can use it to configure your ingestion workflows.<br />
      <br />
      To create a service connection and ingest your metadata, follow the steps below:
    </p>
      <Steps>
      <Step title="Select the Service">
        <ol>
          <li>
            On the left navigation bar, click <strong>Settings</strong>.
          </li>
          <li>
            On the next page, click <strong>Services</strong>, and then select the service.
            <img src="/public/images/connectors/visit-services-page.png" alt="Visit Services Page" />
          </li>
        </ol>
      </Step>

      <Step title="Create a New Service">
        To add a new service connection, click <strong>Add New Service</strong>.
        <img src="/public/images/connectors/create-new-service.png" alt="Create a new Service" />
      </Step>

      <Step title="Select the Connector">
        Select <strong>{connector}</strong> as the service type and click <strong>Next</strong>.

        {selectServicePath && <img src={selectServicePath} alt="Select Service" />}
      </Step>

      <Step title="Name and Describe the Service">
        Enter a unique <strong>Service Name</strong> and <strong>Description</strong>.
        <ul>
         <li><strong>Service Name</strong>: OpenMetadata identifies services by their service name. Enter a name that distinguishes this deployment from other services, including other {connector} services you are ingesting metadata from.</li>
        </ul>

        <Note>
          The service name cannot be changed after it is set.
       </Note>

        {addNewServicePath && <img src={addNewServicePath} alt="Add New Service" />}
      </Step>

      <Step title="Configure the Service Connection">
        Set up the connection settings required for {connector} to set up the service and start ingesting metadata from your sources. The right-hand panel displays help documentation for the selected connection type in the product UI.
        {serviceConnectionPath && <img src={serviceConnectionPath} alt="Configure Service connection" />}
      </Step>
    </Steps>
  </>;
};

export const ConnectorDetailsHeader = ({name, icon, stage, availableFeatures, unavailableFeatures = [], availableFeaturesCollate = []}) => {
  const showSubHeading = availableFeatures?.length > 0 || unavailableFeatures?.length > 0 || availableFeaturesCollate?.length > 0;
  const totalAvailableFeatures = [...availableFeatures || [], ...availableFeaturesCollate || []];
  return <div className="container">
      <div className="Heading">
        <div className="flex items-center gap-3">
          {icon && <div className="IconContainer">
              <img src={icon} alt={name} noZoom className="ConnectorIcon" />
            </div>}
          <h1 className="ConnectorName">{name}</h1>
          <span className={`StageBadge ${stage === 'PROD' ? 'prod' : 'beta'}`}>
            {stage}
          </span>
        </div>
      </div>
      {showSubHeading && <div className="SubHeading">
          <div className="FeaturesHeading">Feature List</div>
          <div className="FeaturesList">
            {totalAvailableFeatures.map(feature => <div className="FeatureTag AvailableFeature" key={feature}>
                ✓ {feature}
              </div>)}
            {unavailableFeatures.map(feature => <div className="FeatureTag UnavailableFeature" key={feature}>
                ✕ {feature}
              </div>)}
          </div>
        </div>}
    </div>;
};

<ConnectorDetailsHeader icon="/public/images/connectors/power-bi.webp" name="PowerBI" stage="PROD" availableFeatures={["Dashboards", "Charts", "Datamodels", "Projects", "Lineage", "Column Lineage", "Owners"]} unavailableFeatures={[]} />

In this section, we provide guides and references to use the PowerBI connector.

<Info>
  **Supported Authentication Types:**

  * **OAuth 2.0 Service Principal** — Azure AD application authentication using Client ID, Client Secret, and Tenant ID
</Info>

Configure and schedule PowerBI metadata and profiler workflows from the OpenMetadata UI:

* [Requirements](#requirements)
* [Metadata Ingestion](#metadata-ingestion)
* [Lineage](#lineage)
* [Troubleshooting](/v1.12.x/connectors/dashboard/powerbi/troubleshooting)

## Requirements

<Warning>
  To access the PowerBI APIs and import dashboards, charts, and datasets from PowerBI into OpenMetadata, a `PowerBI Pro` license is necessary.
</Warning>

<Tip>
  PowerBI dataflows are not yet supported.
</Tip>

<Tip>
  OpenMetadata does not support Power BI usage ingestion because the Power BI Usage API does not support Service Principal authentication.
</Tip>

<Tip>
  When configuring Azure Authentication, ensure that "Allow public client flows" is enabled. This setting is required to support authentication for public client applications.
</Tip>

### PowerBI Admin and Non-Admin APIs:

While configuring the PowerBI ingestion you can choose whether to use the PowerBI Admin APIs to retrieve the metadata or use the PowerBI Non-Admin APIs. Please check below for the the difference in their functionality:

* Enabled (Use PowerBI Admin APIs)
  Using the admin APIs will fetch the dashboard and chart metadata from all the workspaces available in the PowerBI instance.

<Tip>
  When using the PowerBI Admin APIs, the table and dataset information used to generate lineage is gathered using the PowerBI [Scan Result](https://learn.microsoft.com/en-us/rest/api/power-bi/admin/workspace-info-get-scan-result) API. This API has no limitations and hence does not restrict getting the necessary data for generating lineage.
</Tip>

* Disabled (Use Non-Admin PowerBI APIs)
  Using the non-admin APIs will only fetch the dashboard and chart metadata from the workspaces that have the security group of the service principal assigned to them.

<Tip>
  When using the PowerBI Non-Admin APIs, the table and dataset information used to generate lineage is gathered using the PowerBI [Get Dataset Tables](https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-get-tables) API. This API only retrieves the table information if the dataset is a [Push Dataset](https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets).
  Hence the lineage can only be created for push datasets in this case.
  For more information please visit the PowerBI official documentation [here](https://learn.microsoft.com/en-us/rest/api/power-bi/push-datasets/datasets-get-tables#limitations).
</Tip>

### PowerBI Account Setup

Follow the steps below to configure the account setup for PowerBI connector:

### Step 1: Enable API permissions from the PowerBI Admin console

We extract the information from PowerBI using APIs, this is a manual step a PowerBI Admin needs to do to ensure we can get the right information.
Login to the [Power BI](https://app.powerbi.com/) as Admin and from `Tenant` settings allow below permissions.

* Allow service principles to use Power BI APIs
* Allow service principals to use read-only Power BI admin APIs
* Enhance admin APIs responses with detailed metadata

### Step 2: Create the App in Azure AD

Please follow the steps mentioned [here](https://docs.microsoft.com/en-us/power-bi/developer/embedded/embed-service-principal) for setting up the Azure AD application service principle.

### Step 3: Provide necessary API permissions to the Azure AD app

Go to the `Azure Ad app registrations` page, select your app and add the dashboard permissions to the app for PowerBI service and grant admin consent for the same:
The required permissions are:

* `Dashboard.Read.All`
  Optional Permissions: (Without granting these permissions, the dataset information cannot be retrieved and the datamodel and lineage processing will be skipped)
* `Dataset.Read.All`

<Warning>
  Make sure that in the API permissions section **Tenant** related permissions are not being given to the app
  Please refer [here](https://stackoverflow.com/questions/71001110/power-bi-rest-api-requests-not-authorizing-as-expected) for detailed explanation
</Warning>

### Step 4: PowerBI Workspaces

The service principal does not take into account the default user workspaces e.g `My Workspace`.
Create new workspaces in PowerBI by following the document [here](https://docs.microsoft.com/en-us/power-bi/collaborate-share/service-create-the-new-workspaces)
For reference here is a [thread](https://community.powerbi.com/t5/Service/Error-while-executing-Get-dataset-call-quot-API-is-not/m-p/912360#M85711) referring to the same

## Metadata Ingestion

<MetadataIngestionUi connector={"PowerBI"} selectServicePath={"/public/images/connectors/powerbi/select-service.png"} addNewServicePath={"/public/images/connectors/powerbi/add-new-service.png"} serviceConnectionPath={"/public/images/connectors/powerbi/service-connection.png"} />

# Connection Details

<Steps>
  <Step title="Connection Details">
    <Tip>
      When using a **Hybrid Ingestion Runner**, any sensitive credential fields—such as passwords, API keys, or private keys—must reference secrets using the following format:

      ```
      password: secret:/my/database/password
      ```

      This applies **only to fields marked as secrets** in the connection form (these typically mask input and show a visibility toggle icon).
      For a complete guide on managing secrets in hybrid setups, see the [Hybrid Ingestion Runner Secret Management Guide](https://docs.getcollate.io/getting-started/day-1/hybrid-saas/hybrid-ingestion-runner#3.-manage-secrets-securely).
    </Tip>

    **clientId**: PowerBI Client ID.
    To get the client ID (also known as application ID), follow these steps:

    * Log into [Microsoft Azure](https://ms.portal.azure.com/#allservices).
    * Search for App registrations and select the App registrations link.
    * Select the Azure AD app you're using for embedding your Power BI content.
    * From the Overview section, copy the Application (client) ID.
      **clientSecret**: PowerBI Client Secret.
      To get the client secret, follow these steps:
    * Log into [Microsoft Azure](https://ms.portal.azure.com/#allservices).
    * Search for App registrations and select the App registrations link.
    * Select the Azure AD app you're using for embedding your Power BI content.
    * Under Manage, select Certificates & secrets.
    * Under Client secrets, select New client secret.
    * In the Add a client secret pop-up window, provide a description for your application secret, select when the application secret expires, and select Add.
    * From the Client secrets section, copy the string in the Value column of the newly created application secret.
      **tenantId**: PowerBI Tenant ID.
      To get the tenant ID, follow these steps:
    * Log into [Microsoft Azure](https://ms.portal.azure.com/#allservices).
    * Search for App registrations and select the App registrations link.
    * Select the Azure AD app you're using for Power BI.
    * From the Overview section, copy the Directory (tenant) ID.
      **scope**: Service scope.
      To let OM use the Power BI APIs using your Azure AD app, you'll need to add the following scopes:
    * [https://analysis.windows.net/powerbi/api/.default](https://analysis.windows.net/powerbi/api/.default)
      Instructions for adding these scopes to your app can be found by following this link: [https://analysis.windows.net/powerbi/api/.default](https://analysis.windows.net/powerbi/api/.default).
      **authorityUri**: Authority URI for the service.
      To identify a token authority, you can provide a URL that points to the authority in question.
      If you don't specify a URL for the token authority, we'll use the default value of [https://login.microsoftonline.com/](https://login.microsoftonline.com/).
      **hostPort**: URL to the PowerBI instance.
      To connect with your Power BI instance, you'll need to provide the host URL. If you're using an on-premise installation of Power BI, this will be the domain name associated with your instance.
      If you don't specify a host URL, we'll use the default value of [https://app.powerbi.com](https://app.powerbi.com) to connect with your Power BI instance.
      **Pagination Entity Per Page**:
      The pagination limit for Power BI APIs can be set using this parameter. The limit determines the number of records to be displayed per page.
      By default, the pagination limit is set to 100 records, which is also the maximum value allowed.
      **Use Admin APIs**:
      Option for using the PowerBI admin APIs:
      Refer to the section [here](/v1.12.x/connectors/dashboard/powerbi#powerbi-admin-and-nonadmin-apis) to get more information.
    * Enabled (Use PowerBI Admin APIs)
    * Disabled (Use Non-Admin PowerBI APIs)
  </Step>

  <Step title="Test the Connection">
    Once the credentials have been added, click on *Test Connection* and *Save* the changes.

    <img src="https://mintcdn.com/openmetadata/9G75p72jJKYgvFUQ/public/images/connectors/test-connection.png?fit=max&auto=format&n=9G75p72jJKYgvFUQ&q=85&s=4ac71a56e30fa3dd1be86f82c1f07068" alt="Test Connection" width="1494" height="310" data-path="public/images/connectors/test-connection.png" />
  </Step>

  <Step title="Configure Metadata Ingestion">
    In this step we will configure the metadata ingestion pipeline,
    Please follow the instructions below

    <img src="https://mintcdn.com/openmetadata/9SXjaLbGROaofLQU/public/images/connectors/configure-metadata-ingestion-dashboard.png?fit=max&auto=format&n=9SXjaLbGROaofLQU&q=85&s=3dc1805cdb65fa215d2de69382538b7c" alt="Configure Metadata Ingestion" width="1504" height="1756" data-path="public/images/connectors/configure-metadata-ingestion-dashboard.png" />

    #### Metadata Ingestion Options

    * **Name**: This field refers to the name of ingestion pipeline, you can customize the name or use the generated name.
    * **Dashboard Filter Pattern (Optional)**: Use it to control whether to include dashboard as part of metadata ingestion.
      * **Include**: Explicitly include dashboards by adding a list of comma-separated regular expressions to the 'Include' field. OpenMetadata will include all dashboards with names matching one or more of the supplied regular expressions. All other dashboards will be excluded.
      * **Exclude**: Explicitly exclude dashboards by adding a list of comma-separated regular expressions to the 'Exclude' field. OpenMetadata will exclude all dashboards with names matching one or more of the supplied regular expressions. All other dashboards will be included.
    * **projectFilterPattern**: Filter the dashboards, charts and data sources by projects. Note that all of them support regex as include or exclude. E.g., "My project, My proj.\*, .\*Project".

    <Tip>
      We filter the projects by concatenating the entire project hierarchy using dot notation
      (e.g., `Project1.NestedProjectA.OtherProject`).
      Make sure the regex filter pattern accounts for this fully-qualified format.
    </Tip>

    * **Chart Pattern (Optional)**: Use it to control whether to include charts as part of metadata ingestion.
      * **Include**: Explicitly include charts by adding a list of comma-separated regular expressions to the 'Include' field. OpenMetadata will include all charts with names matching one or more of the supplied regular expressions. All other charts will be excluded.
      * **Exclude**: Explicitly exclude charts by adding a list of comma-separated regular expressions to the 'Exclude' field. OpenMetadata will exclude all charts with names matching one or more of the supplied regular expressions. All other charts will be included.
    * **Data Model Pattern (Optional)**: Use it to control whether to include data modes as part of metadata ingestion.
      * **Include**: Explicitly include data models by adding a list of comma-separated regular expressions to the 'Include' field. OpenMetadata will include all data models with names matching one or more of the supplied regular expressions. All other data models will be excluded.
      * **Exclude**: Explicitly exclude data models by adding a list of comma-separated regular expressions to the 'Exclude' field. OpenMetadata will exclude all data models with names matching one or more of the supplied regular expressions. All other data models will be included.
    * **Database Service Name (Optional)**: Enter the name of Database Service which is already ingested in OpenMetadata to create lineage between dashboards and database tables.
    * **Enable Debug Log (toggle)**: Set the 'Enable Debug Log' toggle to set the default log level to debug.
    * **Include Owners (toggle)**: Set the 'Include Owners' toggle to control whether to include owners to the ingested entity if the owner email matches with a user stored in the OM server as part of metadata ingestion. If the ingested entity already exists and has an owner, the owner will not be overwritten.
    * **Include Tags (toggle)**: Set the 'Include Tags' toggle to control whether to include tags in metadata ingestion.
    * **Include Data Models (toggle)**: Set the 'Include Data Models' toggle to control whether to include tags as part of metadata ingestion.
    * **Mark Deleted Dashboards (toggle)**: Set the 'Mark Deleted Dashboards' toggle to flag dashboards as soft-deleted if they are not present anymore in the source system.
    * **Include Draft Dashboard (toogle)**: Set the 'Include Draft Dashboard' toggle to include draft dashboards. By default it will include draft dashboards.
  </Step>

  <Step title="Schedule the Ingestion and Deploy">
    Scheduling can be set up at an hourly, daily, weekly, or manual cadence. The
    timezone is in UTC. Select a Start Date to schedule for ingestion. It is
    optional to add an End Date.

    Review your configuration settings. If they match what you intended,
    click Deploy to create the service and schedule metadata ingestion.

    If something doesn't look right, click the Back button to return to the
    appropriate step and change the settings as needed.

    After configuring the workflow, you can click on Deploy to create the
    pipeline.

    <img src="https://mintcdn.com/openmetadata/j50Bw6ZBiFbbFFnF/public/images/connectors/schedule.png?fit=max&auto=format&n=j50Bw6ZBiFbbFFnF&q=85&s=24b0c2f55f803efde5fb3b3bc24ed3ae" alt="Schedule the Workflow" width="2733" height="1083" data-path="public/images/connectors/schedule.png" />
  </Step>

  <Step title="View the Ingestion Pipeline">
    Once the workflow has been successfully deployed, you can view the
    Ingestion Pipeline running from the Service Page.

    <img src="https://mintcdn.com/openmetadata/9G75p72jJKYgvFUQ/public/images/connectors/view-ingestion-pipeline.png?fit=max&auto=format&n=9G75p72jJKYgvFUQ&q=85&s=7c4e411977371617cb1312efb9f9bfee" alt="View Ingestion Pipeline" width="2733" height="1271" data-path="public/images/connectors/view-ingestion-pipeline.png" />

    <Tip>
      If AutoPilot is enabled, workflows like usage tracking, data lineage, and similar tasks will be handled automatically. Users don’t need to set up or manage them - AutoPilot takes care of everything in the system.
    </Tip>
  </Step>
</Steps>

## Lineage

To establish lineage from your **database tables to dashboards**, you must add the corresponding **database service name**.

<img src="https://mintcdn.com/openmetadata/9SXjaLbGROaofLQU/public/images/connectors/dashboard-lineage.png?fit=max&auto=format&n=9SXjaLbGROaofLQU&q=85&s=e41db6665a46398ff36ff571ce7d5b06" alt="lineage in dashboard" width="2599" height="893" data-path="public/images/connectors/dashboard-lineage.png" />
