Home Documentation Playground Pricing API Status Blog About FAQ Support

Best Currency API for Power BI and Excel (2026)

Reviewed by Madhushan, Fintech Developer — May 2026
Data analytics dashboard on screen

Data analysts and financial modelers live in Power BI and Excel. Whether you are building a multi-currency revenue dashboard, a treasury report, or a procurement cost tracker, you need exchange rate data that flows cleanly into your existing workflows — without requiring Python scripts, custom connectors, or a data engineering team.

The challenge: most currency APIs were designed for software developers, not data analysts. They return nested JSON that breaks Power Query, require OAuth flows that Excel cannot handle, or lock historical data behind enterprise pricing tiers that blow your department budget. Some do not even support HTTPS on their free plan, which means Power BI's Web connector refuses to connect at all.

This article compares the 5 most relevant currency APIs for Power BI and Excel users in 2026. We test each one with real Power Query M code and Excel formulas so you can see exactly what works. Spoiler: AllRatesToday wins for data analysts because it returns flat, clean JSON that Power Query parses natively, supports historical time-series on the free tier, and updates every 60 seconds.

Side-by-Side Comparison

Here is how the top 5 currency APIs compare for Power BI and Excel use cases:

API Power BI Compatible Excel Add-in Free Tier Historical Data Update Speed
AllRatesToday Yes (native Web connector) WEBSERVICE formula Free, no CC Yes (free tier) Every 60s
Open Exchange Rates Yes No 1,000 req/mo Paid only Hourly
Fixer.io HTTP only (free) No 100 req/mo Paid only Daily
ExchangeRate-API Yes No 1,500 req/mo Paid only Daily
Frankfurter Yes No Unlimited Yes (ECB only) Daily (16:00 CET)

Key takeaway: AllRatesToday is the only API on this list that combines Power BI compatibility, real-time 60-second updates, historical data on the free tier, and no credit card requirement. For data analysts who need more than daily ECB rates, it is the clear choice.

1. AllRatesToday — Best Overall for Power BI and Excel

AllRatesToday returns clean, flat JSON that Power Query parses without any transformation gymnastics. The API uses simple Bearer token authentication, which both Power BI Desktop and Excel's Power Query support natively. Historical data is available on the free tier, so you can build time-series dashboards without upgrading to a paid plan.

Power Query M — Get Latest Rates

Open Power BI Desktop, click Get Data > Web, choose Advanced, and paste the following Power Query M code into a blank query:

let
    ApiKey = "YOUR_API_KEY",
    Source = Json.Document(
        Web.Contents(
            "https://allratestoday.com/api/v1/rates",
            [
                Query = [source = "USD"],
                Headers = [Authorization = "Bearer " & ApiKey]
            ]
        )
    ),
    Rates = Record.ToTable(Source[rates]),
    RenamedColumns = Table.RenameColumns(Rates, {{"Name", "Currency"}, {"Value", "Rate"}}),
    TypedColumns = Table.TransformColumnTypes(RenamedColumns, {{"Currency", type text}, {"Rate", type number}})
in
    TypedColumns

This returns a clean two-column table (Currency, Rate) that you can immediately use in relationships, measures, and visuals.

Power Query M — Get Historical Rates for a Date Range

let
    ApiKey = "YOUR_API_KEY",
    Source = Json.Document(
        Web.Contents(
            "https://allratestoday.com/api/v1/historical-rates",
            [
                Query = [
                    source = "USD",
                    target = "EUR",
                    from = "2026-01-01",
                    to = "2026-05-24"
                ],
                Headers = [Authorization = "Bearer " & ApiKey]
            ]
        )
    ),
    RatesList = Source[rates],
    ToTable = Table.FromList(RatesList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    ExpandedColumns = Table.ExpandRecordColumn(ToTable, "Column1", {"time", "rate"}, {"Date", "Rate"}),
    TypedColumns = Table.TransformColumnTypes(ExpandedColumns, {{"Date", type date}, {"Rate", type number}})
in
    TypedColumns

This query pulls daily USD/EUR rates for an entire date range into a table you can plot as a line chart. Combine it with your revenue data to calculate localized totals over time.

Power Query M — Convert an Amount

let
    ApiKey = "YOUR_API_KEY",
    Amount = 50000,
    Source = Json.Document(
        Web.Contents(
            "https://allratestoday.com/api/v1/convert",
            [
                Query = [
                    source = "USD",
                    target = "GBP",
                    amount = Number.ToText(Amount)
                ],
                Headers = [Authorization = "Bearer " & ApiKey]
            ]
        )
    ),
    Result = Source[result],
    RateUsed = Source[rate]
in
    [ConvertedAmount = Result, ExchangeRate = RateUsed, OriginalAmount = Amount]

Excel — WEBSERVICE Formula

If you are working in Excel (Microsoft 365 or Excel 2019+), you can pull exchange rates directly into cells without Power Query:

=VALUE(MID(
    WEBSERVICE("https://allratestoday.com/api/v1/rates?source=USD&target=EUR&apikey=YOUR_API_KEY"),
    FIND("""rate"":",
        WEBSERVICE("https://allratestoday.com/api/v1/rates?source=USD&target=EUR&apikey=YOUR_API_KEY")
    ) + 7,
    10
))

For a cleaner approach, use Excel's built-in Data > From Web feature which leverages Power Query under the hood and returns structured data.

Excel — Power Query (Get & Transform)

In Excel, go to Data > Get Data > From Other Sources > From Web, then enter:

https://allratestoday.com/api/v1/rates?source=USD&apikey=YOUR_API_KEY

Excel will open the Power Query Editor. Click Into Table, expand the rates record, and you will get a two-column table of currency codes and exchange rates that refreshes on demand or on a schedule.

Pro tip: In Power BI Service, you can schedule automatic refreshes up to 8 times per day. Combined with AllRatesToday's 60-second update frequency, your dashboards will always show near-real-time exchange rates without manual intervention.

2. Open Exchange Rates

Open Exchange Rates works with Power BI's Web connector but has two limitations that frustrate data analysts. First, the free tier locks you to USD as the base currency, which means you need to calculate cross-rates manually in DAX if your reporting currency is EUR or GBP. Second, historical data requires a paid plan starting at $12/month.

Power Query M

let
    AppId = "YOUR_APP_ID",
    Source = Json.Document(
        Web.Contents(
            "https://openexchangerates.org/api/latest.json",
            [Query = [app_id = AppId, base = "USD"]]
        )
    ),
    Rates = Record.ToTable(Source[rates]),
    RenamedColumns = Table.RenameColumns(Rates, {{"Name", "Currency"}, {"Value", "Rate"}})
in
    RenamedColumns

3. Fixer.io

Fixer has a critical problem for Power BI users: the free tier serves data over HTTP, not HTTPS. Power BI's Web connector and Excel's WEBSERVICE function both require HTTPS by default, which means Fixer's free plan does not work with Power BI or Excel out of the box. You need the paid plan ($10/month minimum) just to get HTTPS access.

Power Query M (Paid Plan Only)

let
    ApiKey = "YOUR_API_KEY",
    Source = Json.Document(
        Web.Contents(
            "https://data.fixer.io/api/latest",
            [Query = [access_key = ApiKey, base = "EUR", symbols = "USD,GBP,JPY"]]
        )
    ),
    Rates = Record.ToTable(Source[rates])
in
    Rates

4. ExchangeRate-API

ExchangeRate-API offers a straightforward REST endpoint that works with Power BI. The JSON response is clean and easy to parse. However, rates update only once per day, and historical data requires a paid plan.

Power Query M

let
    ApiKey = "YOUR_API_KEY",
    Source = Json.Document(
        Web.Contents(
            "https://v6.exchangerate-api.com/v6/" & ApiKey & "/latest/USD"
        )
    ),
    Rates = Record.ToTable(Source[conversion_rates]),
    RenamedColumns = Table.RenameColumns(Rates, {{"Name", "Currency"}, {"Value", "Rate"}})
in
    RenamedColumns

5. Frankfurter

Frankfurter is open source and free with no API key required. This makes it the easiest API to set up in Power BI — just paste a URL and go. The catch: it only provides European Central Bank reference rates, which cover about 30 currencies, update once per business day, and do not include weekends or holidays.

Power Query M

let
    Source = Json.Document(
        Web.Contents(
            "https://api.frankfurter.app/latest",
            [Query = [from = "USD", to = "EUR,GBP,JPY,CAD,AUD"]]
        )
    ),
    Rates = Record.ToTable(Source[rates]),
    RenamedColumns = Table.RenameColumns(Rates, {{"Name", "Currency"}, {"Value", "Rate"}})
in
    RenamedColumns

Building a Multi-Currency Dashboard in Power BI

Here is a practical example of how to build a revenue dashboard that converts sales from multiple currencies into a single reporting currency using AllRatesToday.

Step 1: Create the Exchange Rate Query

In Power BI Desktop, open the Power Query Editor and create a new blank query with the AllRatesToday M code shown above. Name this query ExchangeRates.

Step 2: Create a DAX Measure for Converted Revenue

Converted Revenue (USD) =
VAR CurrentCurrency = SELECTEDVALUE(Sales[Currency])
VAR ExchangeRate =
    LOOKUPVALUE(
        ExchangeRates[Rate],
        ExchangeRates[Currency],
        CurrentCurrency
    )
RETURN
    IF(
        CurrentCurrency = "USD",
        SUM(Sales[Amount]),
        DIVIDE(SUM(Sales[Amount]), ExchangeRate, 0)
    )

Step 3: Schedule Automatic Refresh

After publishing to Power BI Service, configure a scheduled refresh under Dataset Settings > Scheduled Refresh. Set it to refresh every 3 hours during business hours to keep your exchange rates current throughout the trading day.

Important: When using Power BI Service scheduled refresh with API calls, you need to configure the data source credentials. Go to Settings > Data source credentials > Edit credentials and set the authentication type to Anonymous (the API key is passed in the query header).

Excel Multi-Currency Pricing Sheet

Data analysts often need a simple spreadsheet that pulls live rates and converts a list of prices. Here is how to set this up in Excel using Power Query.

Step 1: Load Exchange Rates via Power Query

Go to Data > Get Data > From Web and paste your AllRatesToday API URL. Load the resulting table to a worksheet named Rates.

Step 2: Use XLOOKUP for Conversion

=B2 * XLOOKUP(C2, Rates[Currency], Rates[Rate], 0)

Where B2 is your amount, C2 is the target currency code, and the Rates table contains the exchange rates loaded from AllRatesToday.

Step 3: Refresh on Open

Right-click the Rates query in the Queries & Connections pane, select Properties, and check Refresh data when opening the file. Every time you open the workbook, Excel will pull the latest exchange rates automatically.

Why AllRatesToday Wins for Data Analysts

After testing all five APIs with Power BI Desktop and Excel, here is why AllRatesToday is the best choice for data analysts:

Quick Reference

Power Your Dashboards with Real-Time Exchange Rates

Get your free API key in 30 seconds. Connect Power BI or Excel to 160+ real-time mid-market exchange rates — no credit card, no enterprise sales call. Compare all options on our Exchange Rate API page.

Get Your Free API Key