rest-api-automation について
Power BI の自動化と管理に使う REST API スキルです。認証、セマンティックモデルやレポートの操作、埋め込み、テナント管理の例をまとめています。
主な機能
- 01サービスプリンシパル認証の解説
- 02モデル更新とパラメーター管理
- 03PBIX のインポートとレポートのエクスポート
- 04埋め込みトークン生成例
- 05ワークスペースのスキャンとアクティビティ監査
活用シーン
- 01モデルの更新を自動化して履歴を確認する
- 02PBIX をワークスペースにインポートする
- 03レポートの埋め込みトークンを生成する
- 04ワークスペース資産をスキャンして操作を監査する
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ josiahsiegel/ claude-plugin-marketplace --skill rest-api-automationインストール後、Claude Code で/rest-api-automationを入力して読み込まれたか確認します。
同梱ファイルreferences/api-endpoints-complete.md
詳細
Power BI REST API と自動化
概要
Power BI REST API を使用すると、埋め込み、管理、データセット管理、自動化をプログラムから実行できます。ベース URL は、ユーザーコンテキストの場合は https://api.powerbi.com/v1.0/myorg/、ワークスペースコンテキストの場合は https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/ です。
認証
サービスプリンシパル(自動化に推奨)
- Azure AD にアプリを登録します: Azure Portal > App registrations > New registration
- クライアントシークレットを作成します: Certificates & secrets > New client secret
- Power BI のアクセス許可を付与します: API permissions > Add > Power BI Service
- Power BI 管理者で有効にします: Tenant settings > Allow service principals to use APIs > セキュリティグループを追加
- ワークスペースに SP を追加します: Workspace > Access > アプリをメンバーまたは共同作成者として追加
アクセストークンを取得:
curl -X POST "https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id={clientId}&client_secret={secret}&scope=https://analysis.windows.net/powerbi/api/.default"
PowerShell:
$body = @{
grant_type = "client_credentials"
client_id = $clientId
client_secret = $clientSecret
scope = "https://analysis.windows.net/powerbi/api/.default"
}
$token = (Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" `
-Method Post -Body $body).access_token
マスターユーザー(レガシー、非推奨)
ユーザー名とパスワードのグラントを使用して、実際のユーザーアカウントで認証します。Pro/PPU ライセンスが必要です。MFA や条件付きアクセスに関する問題の影響を受けます。本番環境では使用しないでください。
API の操作グループ
| グループ | ベースパス | 用途 |
|---|---|---|
| データセット | /datasets | セマンティックモデルの管理、更新、パラメーターの管理 |
| レポート | /reports | レポートの取得、複製、エクスポート、再バインド |
| ダッシュボード | /dashboards | ダッシュボードとタイルの取得 |
| グループ(ワークスペース) | /groups | ワークスペースの CRUD、メンバーシップ |
| インポート | /imports | PBIX/XLSX ファイルのアップロード |
| パイプライン | /pipelines | デプロイパイプラインの自動化 |
| 管理者 | /admin | テナント全体の操作(スキャナー、アクティビティ) |
| 埋め込みトークン | /GenerateToken | 埋め込みトークンの作成 |
| ゲートウェイ | /gateways | ゲートウェイとデータソースの管理 |
| データフロー | /dataflows | データフローの管理 |
| アプリ | /apps | アプリの管理 |
| 容量 | /capacities | 容量の管理 |
| 目標 | /goals | スコアカードと目標 |
一般的な API 操作
セマンティックモデルを更新する
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/refreshes
Authorization: Bearer {token}
Content-Type: application/json
{
"notifyOption": "MailOnFailure",
"retryCount": 2,
"type": "Full",
"commitMode": "transactional",
"applyRefreshPolicy": true
}
拡張更新(テーブル/パーティションの選択):
{
"type": "Full",
"commitMode": "transactional",
"objects": [
{ "table": "Sales", "partition": "Sales_Current" },
{ "table": "Products" }
]
}
更新履歴を取得する
GET https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/refreshes?$top=10
PBIX ファイルをインポートする
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/imports?datasetDisplayName=SalesReport&nameConflict=CreateOrOverwrite
Authorization: Bearer {token}
Content-Type: multipart/form-data
[PBIX file as form data]
Python:
import requests
url = f"https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/imports"
params = {"datasetDisplayName": "SalesReport", "nameConflict": "CreateOrOverwrite"}
headers = {"Authorization": f"Bearer {token}"}
with open("SalesReport.pbix", "rb") as f:
response = requests.post(url, params=params, headers=headers,
files={"file": ("SalesReport.pbix", f, "application/octet-stream")})
レポートをファイルにエクスポートする
# Initiate export
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/ExportTo
{
"format": "PDF",
"powerBIReportConfiguration": {
"pages": [
{ "pageName": "ReportSection1" }
],
"defaultBookmark": { "name": "BookmarkName" }
}
}
# Poll for completion
GET https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/exports/{exportId}
# Download when status is "Succeeded"
GET https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/exports/{exportId}/file
対応形式: PDF、PPTX、PNG、XLSX、CSV、XML、MHTML、IMAGE、ACCESSIBLEPDF
データセットのパラメーターを更新する
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/Default.UpdateParameters
{
"updateDetails": [
{ "name": "ServerName", "newValue": "prod-server.database.windows.net" },
{ "name": "DatabaseName", "newValue": "ProdDB" }
]
}
データセットの所有権を引き継ぐ
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/Default.TakeOver
データソースの資格情報を更新する
PATCH https://api.powerbi.com/v1.0/myorg/gateways/{gatewayId}/datasources/{datasourceId}
{
"credentialDetails": {
"credentialType": "OAuth2",
"credentials": "{\"credentialData\":[{\"name\":\"accessToken\",\"value\":\"...\"}]}",
"encryptedConnection": "Encrypted",
"encryptionAlgorithm": "None",
"privacyLevel": "Organizational"
}
}
プッシュデータセット(リアルタイム)
リアルタイムダッシュボード向けに、API 経由でデータセットを作成し、データをプッシュします:
# Create push dataset
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets
{
"name": "RealTimeMetrics",
"defaultMode": "Push",
"tables": [
{
"name": "Metrics",
"columns": [
{ "name": "Timestamp", "dataType": "DateTime" },
{ "name": "Sensor", "dataType": "String" },
{ "name": "Value", "dataType": "Double" },
{ "name": "Status", "dataType": "String" }
]
}
]
}
# Push rows
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/tables/Metrics/rows
{
"rows": [
{ "Timestamp": "2026-04-03T10:30:00Z", "Sensor": "Temp-01", "Value": 23.5, "Status": "Normal" },
{ "Timestamp": "2026-04-03T10:30:00Z", "Sensor": "Temp-02", "Value": 45.2, "Status": "Warning" }
]
}
# Clear table
DELETE https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/tables/Metrics/rows
埋め込みトークン(Power BI Embedded)
レポートの埋め込みトークンを生成する
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/GenerateToken
{
"accessLevel": "View",
"identities": [
{
"username": "[email protected]",
"roles": ["RegionManager"],
"datasets": ["{datasetId}"]
}
]
}
複数の項目のトークンを生成する
POST https://api.powerbi.com/v1.0/myorg/GenerateToken
{
"datasets": [
{ "id": "{datasetId}" }
],
"reports": [
{ "id": "{reportId}", "allowEdit": false }
],
"targetWorkspaces": [
{ "id": "{workspaceId}" }
],
"identities": [
{
"username": "[email protected]",
"roles": ["ViewerRole"],
"datasets": ["{datasetId}"]
}
]
}
JavaScript SDK による埋め込み
<div id="reportContainer" style="height:600px;"></div>
<script src="https://cdn.jsdelivr.net/npm/powerbi-client/dist/powerbi.min.js"></script>
<script>
const embedConfig = {
type: 'report',
id: reportId,
embedUrl: embedUrl,
accessToken: embedToken,
tokenType: models.TokenType.Embed, // Use Embed for app-owns-data
settings: {
panes: {
filters: { visible: false },
pageNavigation: { visible: true }
},
bars: { statusBar: { visible: false } }
}
};
const container = document.getElementById('reportContainer');
const report = powerbi.embed(container, embedConfig);
// Token refresh handler
report.on('tokenExpired', async () => {
const newToken = await fetchNewToken(); // Call your backend
await report.setAccessToken(newToken);
});
// Event handlers
report.on('loaded', () => console.log('Report loaded'));
report.on('rendered', () => console.log('Report rendered'));
report.on('error', (event) => console.error(event.detail));
</script>
管理者 API
ワークスペースをスキャンする(インベントリ)
# Initiate scan
POST https://api.powerbi.com/v1.0/myorg/admin/workspaces/getInfo
{
"workspaces": ["{workspaceId1}", "{workspaceId2}"],
"datasetExpressions": true,
"datasetSchema": true,
"datasourceDetails": true,
"getArtifactUsers": true
}
# Get scan results
GET https://api.powerbi.com/v1.0/myorg/admin/workspaces/scanResult/{scanId}
アクティビティイベント(監査)
GET https://api.powerbi.com/v1.0/myorg/admin/activityevents?startDateTime='2026-04-01T00:00:00Z'&endDateTime='2026-04-02T00:00:00Z'&$filter=Activity eq 'ViewReport'
テナント内のすべてのデータセットを一覧表示する
GET https://api.powerbi.com/v1.0/myorg/admin/datasets?$top=100
その他のリソース
参照ファイル
references/api-endpoints-complete.md-- すべてのパラメーター、レスポンススキーマ、エラーコードを含む API エンドポイントの完全なリファレンス
コメント
Markdown 対応