When working with Outlook Calendar's API or building integrations, you might encounter recurring events displaying a strikethrough through the recurrence symbol (↻). This isn't a UI bug - it's actually an important status indicator that affects how you should handle the event programmatically.
The line through the recurrence symbol indicates that this particular instance of a recurring series has been modified or canceled while remaining part of the series. From a developer's perspective, this translates to specific properties being set in the underlying event object:
// Example of a modified recurring event in Outlook REST API response
{
"id": "AAMkAG...",
"subject": "Modified Team Standup",
"start": {"dateTime": "2023-06-15T09:00:00", "timeZone": "Pacific Standard Time"},
"isCancelled": false,
"type": "exception", // Key property
"seriesMasterId": "AAMkAG...",
"originalStartTime": "2023-06-15T09:00:00"
}
When processing calendar events programmatically, you need to handle these exceptions differently:
- API Behavior: The Outlook Graph API returns these as separate events with type="exception"
- Data Integrity: Modifying one instance doesn't affect the entire series
- Sync Challenges: These require special handling in synchronization scenarios
Here's how to properly handle recurring event exceptions when working with the Outlook API:
// C# example using Microsoft Graph SDK
var events = await graphClient.Me.Calendar.Events
.Request()
.Header("Prefer", "outlook.timezone=\"Pacific Standard Time\"")
.GetAsync();
foreach (var calendarEvent in events)
{
if (calendarEvent.Type == EventType.Occurrence ||
calendarEvent.Type == EventType.Exception)
{
// Handle modified/canceled recurring instances
var masterId = calendarEvent.SeriesMasterId;
var originalStart = calendarEvent.OriginalStartTime;
Console.WriteLine($"Modified instance of series {masterId} at {originalStart}");
}
}
- Assuming all events in a series have identical properties
- Not checking the OriginalStartTime when processing exceptions
- Forgetting to handle deleted instances (where isCancelled=true)
For applications that need to track changes to calendar events, you can use delta queries with special handling for recurring series:
// JavaScript example using delta queries
const response = await client
.api('/me/calendarview/delta')
.query({
startDateTime: '2023-06-01T00:00:00',
endDateTime: '2023-06-30T23:59:59'
})
.get();
response.value.forEach(event => {
if (event.type === 'exception') {
// Process modified recurring instance
trackSeriesModification(event.seriesMasterId, event.originalStartTime);
}
});
When working with Outlook Calendar's API or automating calendar events, you might encounter the recurring event symbol (↻) with a strikethrough. This occurs in three specific scenarios:
// Example in Outlook REST API response
{
"eventId": "AAMkADk0...",
"subject": "Weekly Sync",
"isRecurring": true,
"exceptionDetails": {
"isCancelled": true,
"originalStart": "2023-07-15T10:00:00"
}
}
The strikethrough indicates a modification to the recurrence pattern at the API level:
- Single Instance Cancellation: When using EWS (Exchange Web Services), the ResponseType property shows "Declined" for that instance
- Modified Occurrence: The ModifiedPropertyList contains changes to that specific recurrence
- Series Termination: The Recurrence property's EndDate is set to before this occurrence
When processing calendar events programmatically, check these properties:
// PowerShell example using EWS
$service = New-WebServiceProxy -Uri "https://outlook.office365.com/EWS/Exchange.asmx"
$events = $service.FindItem(
[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar,
[Microsoft.Exchange.WebServices.Data.ItemView]::new(100)
)
foreach ($event in $items) {
if ($event.Appointment.IsRecurring -and $event.Appointment.IsCancelled) {
Write-Host "Found cancelled recurrence instance:" $event.Subject
}
}
When building calendar integration:
- Always check the 'type' field in Graph API responses - "exception" indicates modified occurrences
- In EWS, examine the AppointmentState bitmask for the sfException flag (value 1)
- For sync operations, track the originalStartDateTime field to properly map modifications
Here's how to handle modified recurrences using Microsoft Graph:
// JavaScript example
const options = {
headers: {
Authorization: Bearer ${accessToken}
}
};
const response = await fetch(
'https://graph.microsoft.com/v1.0/me/events?$filter=isRecurring eq true',
options
);
const events = await response.json();
events.value.forEach(event => {
if (event.type === 'exception') {
console.log('Modified recurrence:', event.subject);
console.log('Original date:', event.originalStart);
}
});
Remember that the strikethrough is just UI representation - the underlying data structure contains all necessary flags to programmatically identify these special cases.