Share via

Microsoft Graph API for Users delta is only returning 200 or fewer records. Is there any way to get more records in a a single API call?

Kumar Sugandh 45 Reputation points
2026-04-29T07:17:57.7+00:00

Hi,

We are currently calling the Microsoft Users delta API to retrieve user updates for a specific tenant. We've observed that each API call returns 200 or fewer records, along with a @odata.nextLink if more events are available.

Although we continuously call the API using the next link, it consistently returns 200 or fewer records. We have a few questions regarding this behaviour:

  1. Is there a way to increase the number of records returned by the Microsoft Users delta API per call?
  2. Since the returned records may contain updates for users we have already pulled, is there a recommended approach to fetch all available users initially and then switch to using the delta functionality?
  3. When the delta API is called without any delta link (to initiate user tracking), how does the Microsoft API determine the starting point for returning data?

Any guidance on these issues would be greatly appreciated. Thank you!

Microsoft Security | Microsoft Entra | Microsoft Entra ID
0 comments No comments

2 answers

Sort by: Most helpful
  1. Rukmini 39,110 Reputation points Microsoft External Staff Moderator
    2026-04-30T01:44:58.4866667+00:00

    Hello Kumar Sugandh

    During the initial snapshot, unique users per page are not guaranteed by the Microsoft Graph /users/delta endpoint. The same user may appear on several pages because the snapshot is created while the directory's contents is still changing (for instance, if the object is modified while paging is underway).

    Forcing different users on each page is not a server-side option. The suggested and supported method is to use processing to handle this on the client side:

    • Keep a user-id-keyed local store.
    • Instead of presuming uniqueness, perform upsert (insert/update).
    • If necessary, overwrite existing entries and handle duplicate records as usual.

    You can also utilize a standard /users API query (non-delta) to retrieve the entire dataset first, and then switch to delta queries for tracking changes moving forward, if your goal is to tightly avoid duplicates during the initial load.

    Let me know if any further queries - feel free to reach out!


  2. Q&A Assist
    2026-04-29T07:18:18.72+00:00
    AI generated content. This question contains an answer created with AI from Q&A Assist. Learn more
    1. The page size (for example, ~200 users) in Microsoft Graph delta queries is controlled by the service and cannot be arbitrarily increased. The service returns a collection plus an @odata.nextLink when more data is available, and clients are expected to follow that link until an @odata.deltaLink is returned. For users, the pattern is:
      • Initial call: GET https://graph.microsoft.com/v1.0/users/delta
      • If the response has @odata.nextLink, call that URL repeatedly until the response contains @odata.deltaLink.
      • A page cannot contain both @odata.nextLink and @odata.deltaLink.
      This behavior is by design; there is no documented way in the provided context to increase the maximum number of users returned per page.
    2. The recommended approach is exactly what is described for delta queries:
      • First, perform a full synchronization by calling the delta function without a delta token and then following @odata.nextLink until an @odata.deltaLink is returned. That initial round returns the users that currently exist in the collection and represents the full state at that time.
      • Persist the final @odata.deltaLink.
      • For subsequent syncs, call the saved @odata.deltaLink to get only changes (additions, deletions, or updates) since the last round. If there are changes, the response includes changed user objects and either another @odata.nextLink (more pages of changes) or a new @odata.deltaLink.
      The documentation explicitly states that when there are no changes, a @odata.deltaLink is returned with an empty value array; when there are changes, the response includes the changed user objects plus either @odata.nextLink or @odata.deltaLink. The client should always follow @odata.nextLink and persist the final @odata.deltaLink for future calls.
    3. When the delta API is called without any delta token (no @odata.deltaLink or $deltatoken), that call represents the initial synchronization request. For directory objects such as users:
      • The initial delta query returns the resources that currently exist in the collection at the time of the request. Deleted objects from before that initial query are not returned, and prior updates are reflected only as the latest state of each resource.
      • The service then uses state tokens ($skipToken in @odata.nextLink, $deltatoken in @odata.deltaLink) to encode the state of the collection from that starting point forward. These tokens are opaque to the client; the client simply reuses the URLs returned.
      Additionally, for Microsoft Entra ID resources such as users, a “sync from now” scenario is supported: instead of doing a full initial read, a client can request the latest @odata.deltaLink by appending $deltatoken=latest to the delta function. In that case, the response contains only a @odata.deltaLink and no resource data, and subsequent calls using that @odata.deltaLink will return changes from that point forward. Note that delta tokens for directory objects are only valid for seven days; after that, a full synchronization must be performed again.

    References:

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.