Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
5 years ago
Solved

Can't refresh data because "API Key was expected to be provided in the header for this call"

I've created a dahsboard, of which the source is Lead Forensics' API (they identify businesses veiwing our wensite). 
In desktop I connect without any issues like this:

 

let
Source = Json.Document(Web.Contents("https://interact.leadforensics.com/WebApi_v2/Visit/GetAllVisits?datefrom=01-01-2020 00:00:00&dateto=31-12-2030 23:59:59&pagesize=999999&pageno=1", [Headers=[#"Authorization-Token"="XXXXXXXXXXXXXX", #"ClientID"="XXXXX"]])),
visits1 = Source[SiteVisitList],
#"Converted to Table" = Table.FromList(visits1, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
#"Converted to Table"

 

 

The problem starts when I try to set up a data refresh. In Data Source credentials I get the "Your data source can't be refreshed because the credentials are invalid. Please update your credentials and try again." notification as presented below:


When I get to changing the credentials I wanted to use the standard "Annonymous" and "none" settings like I always do with APIs, but I get this error:
"Failed to update data source credentials: Web.Contents failed to get contents from 'https://interact.leadforensics.com/WebApi_v2/Business/GetAllBusinesses?datefrom=01-01-2010%2000:00:00&dateto=31-01-2025%2023:59:59&pagesize=10000&pageno=1' (400): The Lead Forensics API Key was expected to be provided in the header for this call." 


What am I doing wrong?

  • Anonymous's avatar
    Anonymous
    5 years ago

    I have finally managed to solve the problem witrh a little bit of help from blopez11 which he posted here

     

    let
    vBaseUrl = "https://interact.leadforensics.com",
    vPath = "WebApi_v2/Visit/GetAllVisits?datefrom=01-01-2020 00:00:00&dateto=31-12-2030 23:59:59&pagesize=999999&pageno=1",
    vHeaders = [#"Authorization-Token"="THIS IS WHERE I PUT THE AUTH TOKEN", #"ClientID"="THIS IS WHERE I PUT THE ID"],
    Source = Web.Contents ( vBaseUrl, [RelativePath=vPath, Headers=vHeaders] ),
    Json = Json.Document ( Source ), SiteVisitList = Json[SiteVisitList],
    #"Converted to Table" = Table.FromList(SiteVisitList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    in
    #"Converted to Table"

     

     Awesome thanks, you're amazing man!

7 Replies

  • Anonymous's avatar
    Anonymous
    Not applicable

    I have finally managed to solve the problem witrh a little bit of help from blopez11 which he posted here

     

    let
    vBaseUrl = "https://interact.leadforensics.com",
    vPath = "WebApi_v2/Visit/GetAllVisits?datefrom=01-01-2020 00:00:00&dateto=31-12-2030 23:59:59&pagesize=999999&pageno=1",
    vHeaders = [#"Authorization-Token"="THIS IS WHERE I PUT THE AUTH TOKEN", #"ClientID"="THIS IS WHERE I PUT THE ID"],
    Source = Web.Contents ( vBaseUrl, [RelativePath=vPath, Headers=vHeaders] ),
    Json = Json.Document ( Source ), SiteVisitList = Json[SiteVisitList],
    #"Converted to Table" = Table.FromList(SiteVisitList, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    in
    #"Converted to Table"

     

     Awesome thanks, you're amazing man!

  • Web.Contents has an option specifically for the API Key. use it.

    • Anonymous's avatar
      Anonymous
      Not applicable

      can you elaborate? Am I supposed to make changes in M in desktop ?

    • Anonymous's avatar
      Anonymous
      Not applicable

      Thanks. Do you mean I should add the api key (which is the same as authorization token) like this:

      " Source = Json.Document(Web.Contents("https://interact.leadforensics.com/WebApi_v2/Visit/GetAllVisits?datefrom=01-01-2020 00:00:00&dateto=31-12-2030 23:59:59&pagesize=999999&pageno=1", [Headers=[#"Authorization-Token"="XXXXXXXXXXXX", #"ClientID"="XXXXX", #"x-api-key"="XXXXXXXXXXXX"]])),"
      ?


      Or add the "api key's name" (which I don't know) ?

    • Anonymous's avatar
      Anonymous
      Not applicable

      I took a guess, cause that's the API Key Name I've seen somewhere else. Sadly it didn't work. Neither did "'Authorization-Token" as a name.