Load exchange rates into Power BI with Power Query
Paste a Power Query M query into Power BI Desktop, turn the JSON response into a currency table, and keep scheduled refresh working after publication.
Power BI already has the connector you need. Create a blank query, call exchangerate.dev with Web.Contents, and split the stable host from the RelativePath. That last detail is easy to miss: it gives the Power BI service a fixed data source it can recognize when the semantic model refreshes.
https://api.exchangerate.dev fixed and put the endpoint in RelativePath.currency / rate table plus source and update-time columns.Create a key and open a blank query
Create a free key at exchangerate.dev/signup. In Power BI Desktop, choose Get data → Blank query, then open View → Advanced Editor in Power Query Editor. The published report will use this query as its web data source.
Paste the Power Query M script
Replace the placeholder key, select Done, and name the query FxRates. The preview should show one row per requested currency.
Set the data types before loading
Confirm that currency, base, and source are Text; rate is Decimal number; and data_updated_at is Date/Time/Timezone. Then select Close & Apply. One row per currency is easier to relate to a Currency dimension than a record with one column per code.
Publish and configure scheduled refresh
Publish the report, open the semantic model settings in the Power BI service, and edit the credentials for https://api.exchangerate.dev. Choose Anonymous because the M query already sends the key in the Authorization header. Set a refresh schedule that fits the report.
Web.Contents and moving the endpoint into RelativePath avoids the common “dynamic data source” failure after publication.Do not treat an M parameter as a secret vault
A parameter is convenient, but anyone trusted to edit the PBIX or query may be able to see the key. That is acceptable for a small internal workspace. If the report file is distributed widely, put exchangerate.dev behind your own server-side endpoint and let Power BI call that endpoint instead.