An API that connects multiple Microsoft services, enabling data access and automation across platforms
For calendarView/delta, the behavior is governed by the general delta-query rules in Microsoft Graph:
- Delta query always returns either:
- An
@odata.nextLinkcontaining a$skiptokenwhen there are more pages in the current round of change tracking, or - An
@odata.deltaLinkcontaining a$deltatokenwhen the round is complete.
- An
- The
$skiptokenand$deltatokenare opaque state tokens that encode:- The current snapshot of the resource set for that round.
- Any query parameters used in the initial request (for calendarView,
startDateTimeandendDateTime). - The server’s internal paging state.
- For calendarView/delta specifically:
- The method does not support
$expand,$filter,$orderby, or$search. -
$selectis also not supported; the response shape is fixed to whatGET /calendarViewreturns. - Query parameters other than
$deltatokenand$skiptokenmust be specified only in the initial request; subsequent calls must reuse the@odata.nextLinkor@odata.deltaLinkURL as-is.
- The method does not support
Given the context, the questions can be answered only at the protocol/behavior level, not per-tenant or per-user.
- Server-side condition for rotating
$skiptokenwith identical pages and no@odata.deltaLink
From the documented behavior:
- A
@odata.nextLinkwith$skiptokenmeans the server believes there are more changes to enumerate in the current round. - A
@odata.deltaLinkwith$deltatokenmeans the server believes the round is complete.
The only documented, supported interpretation is that the server’s state tokens represent snapshots and paging state, and that the client must treat them as opaque. The documentation does not describe or expose any server-side condition that would intentionally produce an infinite sequence of @odata.nextLink values with identical content and no @odata.deltaLink. That pattern is not a documented or expected state.
- Resetting the delta cursor for a specific user
For delta query in general, the documented way to “reset” is to start a new round by discarding the previous @odata.deltaLink/@odata.nextLink and issuing a fresh initial delta request:
- For calendarView/delta, that means calling:
GET /me/calendarView/delta?startDateTime=...&endDateTime=...again as a new round, without$deltatokenor$skiptoken.
The documentation does not describe any additional server-side mechanism or API to reset or clear per-user delta state beyond starting a new round by omitting the state tokens.
- Client-side mitigations and usage constraints
From the delta-query overview and the calendarView/delta documentation, the following client-side rules and mitigations are supported:
- Always:
- Specify
startDateTimeandendDateTimeonly on the initial calendarView/delta request. - For subsequent calls, copy and use the
@odata.nextLinkor@odata.deltaLinkURL verbatim, without adding or changing query parameters.
- Specify
- Do not use unsupported OData parameters with calendarView/delta:
-
$selectis not supported for calendarView/delta. -
$expand,$filter,$orderby, and$searchare not supported.
-
-
Prefer: odata.maxpagesize={x}is allowed and can be used to control page size, but it does not change the semantics of when@odata.deltaLinkis emitted. - For all delta queries:
-
$deltatokenand$skiptokenmust be treated as opaque; do not attempt to interpret or modify them. - Any query parameters used in the initial request are encoded into the tokens and automatically carried forward; do not repeat or alter them in subsequent requests.
-
The documentation does not provide a specific mitigation for a state where the server continually returns identical pages with rotating $skiptoken and never emits @odata.deltaLink. The only documented recovery pattern is to start a new delta round by discarding the existing state token and issuing a fresh initial delta request for the desired time window.
References: