Como Acessar Power BI Rest API Parte 2

Publicado em 1 de agosto de 2025

14 min. de Leitura

No post anterior, fizermos a configuração inicial para que nossa aplicação consiga consumir as rotas do power bi rest API para renderizar os dashboards em nossa própria aplicação.

Leia também a parte 1

Leia também a parte 3

Nesse artigo iremos programar o mínimo necessário para que a aplicação funcione.

IMPORTANTE: Configuração dos Workspace

Uma licença PRO tem 400 requisições de token permitidas que não são renovadas, que deverá ser usadas apenas para teste. Para usar em produção é necessário que os workspace seja incorporado em alguma licença do power bi (A para embedded ou F para Fabric).

image.png

Para efetuar a incorporação acesse as configurações do workspace, em seguida acesse informações da licença e altere de Pró para Inserido e escolha no campo Capacidade de licença, a sua licença adquirida.

6.png

O passo seguinte é ir em usuários permitidos do workspace e adicionar nossa aplicação criada como administrador do workspace, dando acesso a ele ler as informações no workspace.

7.png

Com isso podemos obter o acesso token e começar a programar nosso backend.

Obtendo Access Token e IDs necessário

Em nosso aplicativo (no post parte 1 mostro como criar e acessar o aplicativo) iremos gerar nossa secret que usaremos para acessar programaticamente o power bi. No menu administração (Manage) clique na aba client secrets e depois New client secret, de uma descrição e a validade do token. Lembrando que não é possível gerar um token sem validade, sendo necessário estar renovando periodicamente.

image.png

Fonte Imagem: Própria.

Quando salva o token será mostrado apenas uma vez, salve em um lugar seguro, caso esqueça será necessário gerar outro.

image.png

Fonte Imagem: Própria.

Na aba Overview obtemos o ID do tenant e o ID do aplicativo que usaremos para programar nossa aplicação.

image.png

Fonte Imagem: Própria.

Programando o Backend

Para nosso exemplo irei utilizar Python, mas qualquer outra linguagem de sua preferência pode ser usada para criar o backend, a lógica de autenticação e obteção do embedded token é a mesma.

Primeiramente devemos configurar nosso projeto, criamos um ambiente virtual com o comando abaixo e ativamos o ambiente.

# Criar o ambiente virtual
python -m venv meu_venv

# Ativar no Windows
.\meu_venv\Scripts\activate

# Ativar no macOS/Linux
source meu_venv/bin/activate

# Se desejar Desativar o ambiente
deactivate

Criamos logo em seguida nosso arquivo .env e main.py.

image.png

Em nosso arquivo .env criaremos as seguintes variáveis e vamos atribuir os IDs e o Secret que obtemos do aplicativo nele. No CLIENT_ID informe o ID do aplicativo, CLIENT_SECRET a chave gerada e onde estar seu-tenant-id-aqui em AUTHORITY_URL o valor do tenant id.

CLIENT_ID=seu-client-id-aqui
CLIENT_SECRET=seu-client-secret-aqui
RESOURCE_URL=https://analysis.windows.net/powerbi/api
AUTHORITY_URL=https://login.microsoftonline.com/seu-tenant-id-aqui/oauth2/token
GRANT_TYPE="client_credentials"

Fazermos a instalação dos pacotes necessário que iremos utilizar, com o comando abaixo e com ambiente virtual ativo.

pip install requests fastapi[standard] python-dotenv uvicorn

Nosso código no arquivo main.py ficará assim:

# Imports dotenv para carregar as variáveis de ambiente
# fastapi para disponibilizar nosso servidor e também configurar o CORS para liberar acesso
from dotenv import load_dotenv
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

# Requests para fazer nossa requisição à API do Power BI.
import requests
# Json para podermos acessar as chaves retornadas na requisição REST.
import json
# A lib os para acessar variáveis de ambiente e configurações do sistema
import os

# Instancia o aplicativo FastAPI
app = FastAPI()

# Middleware para permitir CORS (Cross-Origin Resource Sharing)
# Isso libera o acesso da aplicação React (localhost:3000) à API FastAPI
app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:3000"],  # URL do frontend que pode consumir essa API
    allow_credentials=True,
    allow_methods=["*"],                     # Permite todos os métodos (GET, POST, etc.)
    allow_headers=["*"],                     # Permite todos os headers
)

# Carrega as variáveis do arquivo .env para o ambiente
load_dotenv()

# Endpoint para gerar e retornar o token de incorporação do Power BI
# Recebemos na URL qual workspace ID e qual o Report ID (relatório) que queremos visualizar
@app.get("/api/powerbi/embedded-token/{workspace_id}/{report_id}")
def get_embedded(workspace_id: str, report_id: str):
    # Cabeçalhos da requisição para obter token de acesso da API do Azure
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    # Corpo da requisição com dados sensíveis (segredo, client_id, etc.)
    body = {
        'grant_type': os.getenv('GRANT_TYPE'),                # Geralmente "client_credentials"
        'client_id': os.getenv('CLIENT_ID'),                  # ID do aplicativo registrado no Azure
        'client_secret': os.getenv('CLIENT_SECRET'),          # Segredo do aplicativo
        'resource': os.getenv('RESOURCE_URL')                 # Recurso alvo (Power BI)
    }

    # Faz a requisição para obter o token de acesso (OAuth2)
    response = requests.post(os.getenv('AUTHORITY_URL'), headers=headers, data=body)

    # Monta o token de autenticação com o prefixo "Bearer"
    token_api = 'Bearer ' + response.json().get('access_token', '')

    # Cabeçalhos para solicitar o token de incorporação ao Power BI
    headers = {
        "Authorization": token_api,
        "Content-Type": "application/json"
    }

    # URL para gerar o token de incorporação para o relatório específico
    embed_url = f"https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id}/GenerateToken"

    # Corpo da requisição: nível de acesso que será concedido (View)
    body = {
        "accessLevel": "View"
    }

    # Requisição para gerar o embedded token do relatório
    token_response = requests.post(embed_url, headers=headers, json=body)

    # Extrai o token gerado da resposta
    embed_token = token_response.json().get("token")

    # Retorna os dados para o frontend React:
    # - accessToken: token de incorporação
    # - embedUrl: URL para embutir o relatório
    # - reportId: ID do relatório
    return {
        "accessToken": embed_token,
        "embedUrl": f"https://app.powerbi.com/reportEmbed?reportId={report_id}&groupId={workspace_id}",
        "reportId": report_id
    }

Com isso temos nossa aplicação backend e podemos colocar para rodar através do comando:

uvicorn main:app --reload

image.png

Fonte Imagem: Própria.

Com nosso backend rodando podemos criar nosso frontend. Na parte 3 desenvolveremos nosso front end.

Referência:

https://www.sqlshack.com/how-to-access-power-bi-rest-apis-programmatically/

https://learn.microsoft.com/pt-br/rest/api/power-bi/