Forum Discussion
API authentication error on scheduled refresh
- 3 months ago
Hi Rabi , Your M query looks correct, so the issue is probably no longer the Web.Contents syntax itself. Since the error still occurs when creating the connection in the Service, Power BI is likely failing the datasource validation against the API endpoint rather than the refresh query.
Many APIs require the custom headers (X-Api-Key and X-Tenant) on every request, but Power BI Service test connection does not always include those headers during validation. Check whether the API root URL can be accessed without headers, if there are any firewall/IP restrictions blocking Power BI Service and whether Skip test connection can be enabled in your tenant/gateway settings. If the API only works when those headers are present, you may ultimately need a custom connector or gateway-based approach because some header-authenticated APIs do not validate cleanly with anonymous web connections in the Service.
Skip Test Connection for On-premises and Cloud Dat... - Microsoft Fabric Community
Hi Rabi,
Hope you're doing well!
Root Cause:
The issue is a known Power BI Service limitation: when using Web.Contents with hardcoded headers containing credentials, the gateway/refresh engine blocks or strips custom headers for security reasons, even with Anonymous authentication.
Solution:
Use the RelativePath + Query pattern with Web.Contents
Power BI Service requires Web.Contents to have a static base URL (evaluated at authoring time) with dynamic parts passed via RelativePath or Query. This is what allows the refresh to work correctly.
Rewrite your M query like this:
let
BaseUrl = "https://api.csassurance.com",
Source = Json.Document(
Web.Contents(
BaseUrl,
[
RelativePath = "api/v2/reports/ReportUUIDHere/snapshot",
Headers = [
#"X-Api-Key" = "APIKeyHere",
#"X-Tenant" = "ABC"
]
]
)
)
in
Source
Additional Steps in Power BI Service:
Go to Dataset Settings → Data Source Credentials
Set authentication to Anonymous
Set Privacy Level to None or Organizational (avoid "Private" as it can block requests)
Untick "Skip test connection" if it's ticked
If It Still Fails → Use a Custom Connector or Parameter-based approach
If headers are still being stripped, consider storing credentials in Power BI Parameters and referencing them — though for API keys the RelativePath fix above resolves it in the vast majority of cases.
Hope this helps! If OK don't forget to mark as solution and thumbs up, that's motivate me to keep helping 🙂