Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now! Learn more

Reply
Yodaswhiskers
Frequent Visitor

API calls with pagination (non odata)

Hi,

 

I am really new to API's and am struggling to get some looping code to work to ensure all records are pulled, currently it is capped at 1000. 

 

I have used the example from https://community.powerbi.com/t5/Desktop/REST-API-Pagination-converting-records-to-text/td-p/681809 but am getting the following error:

 

Expression.Error: We cannot apply field access to the type List.
Details:
Value=[List]

 

The code is as follows:

 

let
BaseUrl = "https://api.rotacloud.com/v1/shifts?start=1569888000&end=1755875832",
Token = "SecretToken",
EntitiesPerPage = 1000,
Options = [Headers=[ #"Authorization" = "Bearer " & Token ]],
Url = BaseUrl,

GetJson = (Url) =>
let
RawData = Web.Contents(Url, Options),
Json = Json.Document(RawData)
in
Json,

GetTotalCount = () =>
let
Json = GetJson(Url),
Entities = Json[object.count]
in
Entities,

EntityCount = GetTotalCount(),
PageCount = Number.RoundUp(EntityCount / EntitiesPerPage),
PageIndex = { 1 .. PageCount},

GetPage = (PageIndex) =>
let
PageUrl = BaseUrl & "page=" & Text.From(PageIndex) & Options,
Json = GetJson(PageUrl),
Value = Json[data]
in
Value,

GetUrl = (PageIndex) =>
let
PageNum = "page=" & Text.From(PageIndex),
PageUrl = BaseUrl & PageNum
in
PageUrl,

Urls = List.Transform(PageIndex, each GetUrl(_)),
Pages = List.Transform(PageIndex, each GetPage(_)),
DataList = List.Union(Pages)
in
DataList

 

 

The below is from the API documentation, not sure if it helps or not:

 

In order to keep our servers happy, requests which return multiple items may be paginated. Paginated requests will include two extra response headers; 'X-Total-Count' (the total number of results), and 'Link' (containing one or more hypermedia link relations).

The possible values for the link relations are; 'next' (the link relation for the immediate next page of results), 'last' (the link relation for the last page of results), 'first' (the link relation for the first page of results), and 'prev' (the link relation for the immediate previous page of results).

You can optionally specify a 'limit' parameter to change how many results are served per page (hard limits will apply), and you can navigate through paginated results using the 'offset' parameter which lets you specify which result should be returned first, e.g. ?limit=10&offset=30 (this would return 10 results starting with record 30).

 

Any help would be grately appreciated, thanks in advance!

2 REPLIES 2
dax
Community Support
Community Support

Hi @Yodaswhiskers , 

It seems to be related to the type, you could try too convert List value to table to see whether it work or not. Add this part to see whetehr it work or not.

DataList = List.Union(Pages),

    TableFromList = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    TableFromList

 

Best Regards,
Zoe Zhi

If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

Hi Zoe,

 

Thank you so much for your suggestion. I have amended it as perscribed:

let 
    Source = Json.Document(Web.Contents("https://api.rotacloud.com/v1/shifts?start=1569888000&end=1755875832", [Headers=[Authorization="SecretToken"]])),
    BaseUrl = "https://api.rotacloud.com/v1/shifts?start=1569888000&end=1755875832",
    Token = "SecretToken",
    EntitiesPerPage = 1000,
    Options = [Headers=[ #"Authorization" = "Bearer " & Token ]],
    Url = BaseUrl,

    GetJson = (Url) =>
        let
            RawData = Web.Contents(Url, Options),
            Json = Json.Document(RawData)
        in
            Json,

    GetTotalCount = () =>
        let
            Json = GetJson(Url),
            Entities = Json[object.count]
        in
            Entities,

    EntityCount = GetTotalCount(),
    PageCount = Number.RoundUp(EntityCount / EntitiesPerPage),
    PageIndex = { 1 .. PageCount},

    GetPage = (PageIndex) =>
        let
            PageUrl = BaseUrl & "page=" & Text.From(PageIndex) & Options,
            Json = GetJson(PageUrl),
            Value = Json[data]
        in
            Value,

    GetUrl = (PageIndex) =>
        let
            PageNum = "page=" & Text.From(PageIndex),
            PageUrl = BaseUrl & PageNum
        in
            PageUrl,

    Urls = List.Transform(PageIndex, each GetUrl(_)),
    Pages = List.Transform(PageIndex, each GetPage(_)),
    DataList = List.Union(Pages),

    TableFromList = Table.FromList(Source, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    TableFromList

 

It has removed the error which is good but is still only pulling 1k records across. There should be around 80k. Any ideas?

 

Thanks again for your help it's greatly appreciated

Helpful resources

Announcements
Power BI DataViz World Championships

Power BI Dataviz World Championships

The Power BI Data Visualization World Championships is back! Get ahead of the game and start preparing now!

November Power BI Update Carousel

Power BI Monthly Update - November 2025

Check out the November 2025 Power BI update to learn about new features.

FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.