The process of building custom applications and tools that interact with Microsoft SharePoint, including SharePoint Online in Microsoft 365.
Thank you for reaching out to Microsoft Q&A forum
Based on your description, I understand that when you run a Microsoft Graph delta query against a SharePoint drive using a delta token, the API response shows @odata.nextLink: false and @odata.deltaLink: false, even though there are still items in the site. This seems incorrect because these properties should normally contain URLs for paging or delta tracking.
As far as I know, Microsoft Graph does not return false for @odata.nextLink or @odata.deltaLink. These fields are either present as opaque string URLs or absent. That said if you see false, it usually means the client code or SDK is coercing missing properties into boolean values during logging or serialization.
The correct behavior is: intermediate pages include @odata.nextLink, the final page includes @odata.deltaLink, and if there are no changes, you still get a @odata.deltaLink with an empty value array. Missing tokens, skipped pages, or incorrect deserialization often cause incomplete results and confusion.
However, based on the current information you’ve provided, I’m unable to give a precise diagnosis of the issue. So, to better identify the root cause, could you please share some additional details as outlined below?
- Do we receive a
@odata.deltaLinkstring on the final page of the initial/deltarun, and are we persisting and reusing that exact opaque URL without changes? - Are
@odata.nextLinkand@odata.deltaLinktreated as nullable strings in our code, or are we coercing missing properties to booleans (e.g.,|| false)? - When calling the persisted
@odata.deltaLink, do we paginate through any@odata.nextLinkresponses until a new@odata.deltaLinkappears, and do we persist that new one? - Are we accidentally using a
$skiptokenlink instead of a$deltatokenlink for subsequent syncs? - Have we verified the raw Graph response (e.g., via Graph Explorer) to confirm whether the service returns these properties correctly before client-side processing?
In the meantime, you may try the following workaround methods to see if they help resolve the issue:
- Start with
GET /sites/{site-id}/drives/{drive-id}/root/delta. - Follow every
@odata.nextLinkuntil you reach a page with@odata.deltaLink. - Persist the exact
@odata.deltaLinkfor future incremental syncs. - On subsequent runs, call the persisted delta link without modification and repeat the paging loop.
I am looking forward to hearing from you to better support, thank you for your patience