← Blog

Claude Integration with Power BI: A Practical Guide

2026-09-09 · 5 min read · SubToAPI Team

Is there a native Claude connector for Power BI?

No. Power BI does not ship a built-in Claude connector, and Microsoft's connector gallery doesn't list one either. If you want Claude to summarize a dashboard, explain a spike in a KPI, or generate a written narrative alongside your visuals, you have to call Claude's API yourself from inside a Power Query step, a Power Automate flow, or a Python/R visual — and handle authentication, retries, and response parsing on your own.

That's not a dead end. Power BI's data model is built around calling external HTTP sources through Web.Contents, and Anthropic's Messages API is a plain REST endpoint. The real friction isn't Power BI — it's making Claude's API behave like something a BI tool can consume reliably: consistent JSON, predictable auth headers, and usage you can actually track when a dataset refreshes on a schedule and fires the same request 200 times a day.

Where Claude actually adds value inside Power BI

Before wiring anything up, be clear about the use case, because Power BI reports and Claude serve different jobs:

None of these require streaming or long conversations. They're single-shot or short-lived requests, which is exactly the shape Power Query and Power Automate handle well.

Option 1: Call Claude from Power Query (M language)

Power Query's Web.Contents function can hit any HTTPS endpoint, including Claude's Messages API or a gateway in front of it. This runs at refresh time, so keep prompts short and cache results where possible — refreshing a dataset shouldn't mean re-generating the same summary from scratch every time.

let
    apiKey = "sub_live_xxxxxxxxxxxxxxxx",
    body = Json.FromValue([
        model = "claude-3-5-sonnet-latest",
        max_tokens = 300,
        messages = {[
            role = "user",
            content = "Summarize this month's revenue trend in two sentences: " & summaryText
        ]}
    ]),
    response = Web.Contents(
        "https://api.subtoapi.app/v1/messages",
        [
            Headers = [
                #"Authorization" = "Bearer " & apiKey,
                #"Content-Type" = "application/json"
            ],
            Content = body
        ]
    ),
    json = Json.Document(response),
    text = json[content]{0}[text]
in
    text

This pattern works whether you call Anthropic's API directly with your own key or route through a gateway. The advantage of a gateway like SubToAPI is that sub_live_... keys are scoped per application, so a Power BI dataset can have its own key with its own usage visibility, separate from a key used by a backend service. See the quickstart and messages docs for the full request format.

Option 2: Power Automate + HTTP action

If you don't want Claude calls embedded in your data model, trigger them from a Power Automate flow instead — bound to a Power BI button, a scheduled trigger, or a Teams message. This keeps the AI call out of the refresh path entirely.

A basic HTTP action in Power Automate:

{
  "method": "POST",
  "uri": "https://api.subtoapi.app/v1/messages",
  "headers": {
    "Authorization": "Bearer @{variables('SUBTOAPI_KEY')}",
    "Content-Type": "application/json"
  },
  "body": {
    "model": "claude-3-5-sonnet-latest",
    "max_tokens": 400,
    "messages": [
      { "role": "user", "content": "@{variables('promptText')}" }
    ]
  }
}

Store the response text in a SharePoint list or a Dataverse table, then bring it into Power BI as a normal data source. This decouples the AI call from dataset refresh timing, which matters if your refresh schedule runs multiple times a day and you don't want to burn tokens repeatedly on unchanged data.

Option 3: Python or R visual

Power BI's Python/R visual can also make HTTP requests, but it runs inside a sandboxed, limited execution environment — no persistent state, restricted package list, and it re-executes on every interaction with the visual. This is fine for a one-off demo but gets expensive fast in production, since a slicer click can trigger a fresh API call. Use this only for prototyping.

Handling authentication cleanly

The part most people underestimate is key management. Anthropic's own API key gives you full account access with no per-application scoping — if that key ends up hardcoded in a Power Query step and the .pbix file gets shared, you've shared your API access too.

A practical setup:

  1. Create a dedicated application key for the Power BI use case.
  2. Store it as a Power BI parameter or a Power Automate environment variable, not inline in the query.
  3. Route requests through a gateway that gives you per-key usage data, so you can see exactly how many tokens a scheduled refresh is consuming.

SubToAPI issues sub_live_... keys per application from your existing Claude access, with usage metadata visible in one dashboard — useful when a Power BI dataset shares Claude access with other tools and you need to know which one is driving cost. Plans start at €9/month with a free trial. Check pricing and docs for details.

Practical limits to plan around

Questions

Does Microsoft plan a native Claude connector for Power BI? There's no public roadmap indicating one. Power BI's AI-adjacent features are built around Copilot and Azure OpenAI, so a native Claude connector would have to come from a third party or a custom connector you build yourself.

Can I use Claude's tool-use feature from Power BI? Not meaningfully — tool use is designed for multi-turn agentic workflows, which doesn't fit a dataset refresh model. Stick to single-shot prompts for summaries and explanations.

Is it cheaper to call Claude directly or through a gateway? Cost per token is the same either way since Anthropic sets pricing. A gateway adds value through per-application key scoping and usage visibility, not discounted rates — worth it if multiple tools share the same Claude access and you need to see which one is spending tokens.

Turn your Claude access into an HTTPS API

SubToAPI gives you application API keys, streaming, tool use and usage insights on top of your existing Claude access — set up in minutes.

Start free  Read the quickstart →