INC OData Server-Driven Pagination

Paging with @Odata.nextLink

OData Server-driven pagination

Starting February 2026 the Nimbus OData API handles large dataset requests with pagination using @odata.nextLink. Paginated results with a maximum of 100'000 entities per response are enforced.

Impacts to customers may not be obvious (non breaking change), but if the interface consuming the OData is not ready to handle pagination, partial results may be “silently" shown. 


✅Actions required: 

  • If you are using the Nimbus Power BI Template version 1.122 or above, you can expect it to handle @odata.nextLink out of box. 
    → Unless your template has been modified, there is no need to take action. In principle, older templates should also handle this automatically, however in case of problems, we recommend to always check if you can reproduce the issue with the most recent template listed in the Nimbus BI Template Release Notes.
  • In case you need to refresh and view large sets of data regularly, we still recommend looking into setting up Incremental Refresh using Power BI Online services. This will automate and schedule the refresh procedures, decreasing the amount of data loaded for each ongoing time increment.
  • When using custom or 3rd-party solutions to consume OData you must familiarize yourself with the specifics of the tools and interfaces you use to ingest data from our OData API.

🔎@Odata.nextLink is…:

  • … a property used in OData responses to support pagination. Its presence indicates that the response is larger than what can be fit in a single response. 
  • … an indication that there are more results to be fetched, before the request is fully satisfied.
  • … URL that can be used to call and retrieve the next page of results. The URL is server-generated (never modify it).
  • … an OData standard. Typically returned by OData services including Nimbus, Microsoft Graph, and any OData v4-compliant API.
  • … essential for consuming large datasets.
  • … handled out of the box by most mainstream data platforms that claim native OData ingestion support and have native OData connectors (e.g. Power BI, Excel, Azure Data Factory, etc.).

🔎Things to be aware of: 

  • A system that sources data from the OData relying on a non-paged behavior may quietly end up with partial query results. 
  • Systems that rely on custom logic to extract OData may not handle pagination automatically and may need manual intervention to handle it. E.g.: 
    • Raw HTTP clients (curl, Postman, custom scripts)
    • Generic REST connectors without OData awareness
    • Older OData v2-only connectors (some legacy tools)
  • 10,000 is the maximum set – not a guarantee. Some pages may contain fewer records.

🔎 @odata.nextLink works as follows:

  1. The data client generates a request to the OData service.
  2. The OData service responds.
  3. The presence of @odata.nextLink in the response indicates that the server has more data available.
  4. Clients must continue issuing requests using the provided URL until no @odata.nextLink is returned.
 
 

🤔How does it work in the BI Template?

💡Good to know: The default official Nimbus Power BI Template does not need to be updated in order to handle the introduction of "@OData.nextLink". Power BI expects this behavior and handles it automatically.

☝If you customized the template, ensure that you are familiar with your code and how this could interfere with the standard @Odata.nextLink behavior. If unsure, update the default template to the newest version.

🔎How does Odata.nextLink improve stability of the OData service with Power BI?

✅ With server paging Power BI ❌ Without server paging Power BI
  • Reads the page
  • Follows @odata.nextLink
  • Repeats until no link exists
  • Avoids performance-related timeouts from large datasets and “race conditions”
  • Would request huge result sets
  • Assumes pagination is the server’s responsibility
  • APIs run out of memory
  • SQL queries lock tables
  • Refreshes may fail or timeout
 
 

🤔Which Nimbus data is affected?

Impacted OData entities from the Nimbus Reporting Model and Data Aggregation are as follows: 

  • ServiceSessionsAggregates
  • UserSessionsAggregates
  • UserStatesAggregates
  • ServiceSessions
  • UserSessions
  • UnifiedSessions
  • TransferSessions
  • Callers
 
 

🤔Why does the data refresh take longer after this change?

🔎There are two reasons to this: 

  • Equal load distribution: OData pagination is a change that we have implemented to improve stability of the architecture, serving concurrent requests from multiple tenants simultaneously. This is to ensure a fair and equal load distribution of available server resources amongst all Nimbus customers.
  • Consistent performance: Compared to the previous setup, OData pagination could in some cases make the refresh times appear inconsistent, even on an seemingly identical data scope. The reason – particularly with very large datasets – was that multiple sequential requests to retrieve all data were required.

 💡For these reason we recommend to implement Incremental Refresh and be mindful of the size of the query when hitting the OData Feed.

 
 
 

Table of Contents