Microsoft Graph delta: recurring calendar events returning incorrect start/end - microsoft-graph-api

I have an app that loads calendar items into a database, and needs to stay in sync with the given user's calendar. Unfortunately, when querying Microsoft Graph for a given date range using Delta tokens, the original event's data is being returned. However, if the Delta call is removed from the query, recurring events are returned as expected.
The call without Delta:
https://graph.microsoft.com/v1.0/me/calendarView?startDateTime=2018-06-26T00:00:00&endDateTime=2018-06-27T00:00:00&$select=id,subject,start,end
Returns:
{
"#odata.etag": "W/\"vDPrV1TQYUmam8nxPycXGwABJbtmSQ==\"",
"id": "AAMkADZhMjA2YTNmLTM0NDktNDYyNy05Njk2LTRjNThhMDZkZDBmOQFRAAgI1dr3wqKAAEYAAAAAY_l4isQ6OkOWdkEvK3rrDQcAvDPrV1TQYUmam8nxPycXGwAAAAABDQAAvDPrV1TQYUmam8nxPycXGwAAAtcOVAAAEA==",
"subject": "Daily recurring event",
"start": {
"dateTime": "2018-06-26T14:30:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2018-06-26T14:45:00.0000000",
"timeZone": "UTC"
}
}
However, when trying to add the "delta" call to the request using the same start/end dates, the event's ORIGINAL dates (and Id) are returned. Additionally, the SELECT columns are ignored, entirely.
The call with Delta:
https://graph.microsoft.com/v1.0/me/calendarView/delta?startDateTime=2018-06-26T00:00:00&endDateTime=2018-06-27T00:00:00&$select=id,subject,start,end
Returns:
{
"#odata.type": "#microsoft.graph.event",
"#odata.etag": "W/\"vDPrV1TQYUmam8nxPycXGwABJbtmSQ==\"",
"createdDateTime": "2017-04-19T15:02:38.8680605Z",
"lastModifiedDateTime": "2018-06-25T14:15:14.2194888Z",
"changeKey": "vDPrV1TQYUmam8nxPycXGwABJbtmSQ==",
"categories": [],
"originalStartTimeZone": "Eastern Standard Time",
"originalEndTimeZone": "Eastern Standard Time",
"iCalUId": "040000008200E00074C5B7101A82E0080000000050B9E76D2CF2D001000000000000000010000000831C6E0657580F44A0799E55EB5F2E49",
"reminderMinutesBeforeStart": 15,
"isReminderOn": true,
"hasAttachments": false,
"subject": "Daily recurring event",
"bodyPreview": "",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": false,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "busy",
"type": "seriesMaster",
...
"id": "AAMkADZhMjA2YTNmLTM0NDktNDYyNy05Njk2LTRjNThhMDZkZDBmOQBGAAAAAABj6XiKxDo6Q5Z2QS8reusNBwC8M_tXVNBhSZqbyfE-JxcbAAAAAAENAAC8M_tXVNBhSZqbyfE-JxcbAAAC1w5UAAA=",
"responseStatus": {
"response": "accepted",
"time": "2017-04-19T15:02:00Z"
},
"body": {
"contentType": "html",
"content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n<meta name=\"Generator\" content=\"Microsoft Exchange Server\">\r\n<!-- converted from rtf -->\r\n<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style>\r\n</head>\r\n<body>\r\n<font face=\"Calibri\" size=\"2\"><span style=\"font-size:11pt;\">\r\n<div> </div>\r\n<div> </div>\r\n</span></font>\r\n</body>\r\n</html>\r\n"
},
"start": {
"dateTime": "2015-09-22T14:30:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2015-09-22T14:45:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "on your feet",
"locationType": "default",
"uniqueId": "on your feet",
"uniqueIdType": "private"
},
"locations": [
{
"displayName": "on your feet",
"locationType": "default",
"uniqueId": "on your feet",
"uniqueIdType": "private"
}
],
"recurrence": {
"pattern": {
"type": "weekly",
"interval": 1,
"month": 0,
"dayOfMonth": 0,
"daysOfWeek": [
"monday",
"tuesday",
"wednesday",
"thursday",
"friday"
],
"firstDayOfWeek": "sunday",
"index": "first"
},
"range": {
"type": "noEnd",
"startDate": "2015-09-22",
"endDate": "0001-01-01",
"recurrenceTimeZone": "Eastern Standard Time",
"numberOfOccurrences": 0
}
},
"attendees": [
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Nunya Biz",
"address": "biz#markie.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Nunya Biz",
"address": "biz#markie.com"
}
}
},
Can anyone tell me how can I get the Delta query to return the recurring event's instance, as opposed to the "seriesMaster"?

Ah, I figured it out! The delta returns the seriesMaster, but also returns the instance details (occurrence) at the end. My bad for leaving it out of the results in the original post.
The missing link:
{
"#odata.type": "#microsoft.graph.event",
"#odata.etag": "W/\"DwAAABYAAAC8M+tXVNBhSZqbyfE/JxcbAAElu2ZJ\"",
"seriesMasterId": "AAMkADZhMjA2YTNmLTM0NDktNDYyNy05Njk2LTRjNThhMDZkZDBmOQBGAAAAAABj6XiKxDo6Q5Z2QS8reusNBwC8M_tXVNBhSZqbyfE-JxcbAAAAAAENAAC8M_tXVNBhSZqbyfE-JxcbAAAC1w5UAAA=",
"type": "occurrence",
"id": "AAMkADZhMjA2YTNmLTM0NDktNDYyNy05Njk2LTRjNThhMDZkZDBmOQFRAAgI1dr3wqKAAEYAAAAAY_l4isQ6OkOWdkEvK3rrDQcAvDPrV1TQYUmam8nxPycXGwAAAAABDQAAvDPrV1TQYUmam8nxPycXGwAAAtcOVAAAEA==",
"start": {
"dateTime": "2018-06-26T14:30:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2018-06-26T14:45:00.0000000",
"timeZone": "UTC"
}
},
Note that the "type" = "occurrence", and the "seriesMasterId" points back to the seriesMaster's Id field. This contains the correct start/end information for the event.

Related

Graph: Attendee automatically accepts event invitation

not sure what I'm doing wrong here. I wish to add a meeting with attendees into the organizer's calendar, then have the Exchange automatically send meeting invites to attendees. I want the attendees to be able to accept, decline, etc the invite as per the behaviour in Outlook, but my requests currently have the attendee automatically accept the invitation upon adding the event. Any idea what I'm doing wrong?
Request:
POST /users/{organizer#email.com}/events
{
"subject": "My Subject",
"start": {
"dateTime": "2021-10-10T12:00:00",
"timeZone": "Singapore Standard Time"
},
"end": {
"dateTime": "2021-10-10T14:00:00",
"timeZone": "Singapore Standard Time"
},
"responseRequested": true,
"attendees": [
{
"emailAddress": {
"address": "attendee#email.com",
"name": "Attendee"
},
"type": "required"
}
]
}
Response:
{
"#odata.context": "https://graph.microsoft.com/v1.0/$metadata#users(...)/events/$entity",
"#odata.etag": "..."",
"id": "AAMk...",
"createdDateTime": "...",
"lastModifiedDateTime": "...",
"changeKey": "...",
"categories": [],
"transactionId": null,
"originalStartTimeZone": "Singapore Standard Time",
"originalEndTimeZone": "Singapore Standard Time",
"iCalUId": "040000008200E00074C5B7101A82E008...",
"reminderMinutesBeforeStart": 15,
"isReminderOn": true,
"hasAttachments": false,
"subject": "My Subject",
"bodyPreview": "",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": true,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "busy",
"type": "singleInstance",
"webLink": "...",
"onlineMeetingUrl": null,
"isOnlineMeeting": false,
"onlineMeetingProvider": "unknown",
"allowNewTimeProposals": true,
"isDraft": false,
"hideAttendees": false,
"recurrence": null,
"onlineMeeting": null,
"responseStatus": {
"response": "organizer",
"time": "0001-01-01T00:00:00Z"
},
"body": {
"contentType": "html",
"content": "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta name=\"Generator\" content=\"Microsoft Exchange Server\"><!-- converted from text --><style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style></head><body><font size=\"2\"><span style=\"font-size:11pt;\"><div class=\"PlainText\"> </div></span></font></body></html>"
},
"start": {
"dateTime": "...",
"timeZone": "Singapore Standard Time"
},
"end": {
"dateTime": "...",
"timeZone": "Singapore Standard Time"
},
"location": {
"displayName": "",
"locationType": "default",
"uniqueIdType": "unknown",
"address": {},
"coordinates": {}
},
"locations": [],
"attendees": [
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Attendee",
"address": "attendee#email.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Organizer",
"address": "organizer#email.com"
}
}
}
It can happen in two cases.
Outlook automatically accepts all meeting requests on behalf of groups. You can accept, tentatively accept, or decline meeting requests for user calendars only.
The second case is that user set up Outlook to automatically accept meetings.
Check Outlook->File->Options->Calendar->Automatic accept or decline

Can't update the names of event attendees using the Microsoft Graph API

The following has been tried using the Microsoft Graph API Graph Explorer to eliminate any third-party causes. There is an existing event in an Outlook calendar:
{
"#odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('WWWW')/calendars('XXXX')/events/$entity",
"#odata.etag": "W/\"wIqdPsepnEOtI+GbtqRT1gAAElvUsQ==\"",
"id": "YYYY",
"createdDateTime": "2020-06-18T05:19:22.5766648Z",
"lastModifiedDateTime": "2020-06-18T17:17:23.3143899Z",
"changeKey": "wIqdPsepnEOtI+GbtqRT1gAAElvUsQ==",
"categories": [],
"originalStartTimeZone": "UTC",
"originalEndTimeZone": "UTC",
"iCalUId": "ZZZZ",
"reminderMinutesBeforeStart": 15,
"isReminderOn": false,
"hasAttachments": false,
"subject": "Review proposal",
"bodyPreview": "",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": true,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "busy",
"type": "singleInstance",
"webLink": "https://outlook.office365.com/owa/?itemid=YYY&exvsurl=1&path=/calendar/item",
"onlineMeetingUrl": null,
"isOnlineMeeting": false,
"onlineMeetingProvider": "unknown",
"allowNewTimeProposals": true,
"recurrence": null,
"onlineMeeting": null,
"responseStatus": {
"response": "organizer",
"time": "0001-01-01T00:00:00Z"
},
"body": {
"contentType": "text",
"content": ""
},
"start": {
"dateTime": "2020-06-26T14:30:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2020-06-26T15:00:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "",
"locationType": "default",
"uniqueIdType": "unknown",
"address": {},
"coordinates": {}
},
"locations": [],
"attendees": [
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "attendee#example.com",
"address": "attendee#example.com"
}
},
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Bob Smith",
"address": "organizer#example.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Bob Smith",
"address": "organizer#example.com"
}
}
}
The attendee's name was not known at the time the event was created. attendee#example.com was given which produced an attendee whose name and email address were both attendee#example.com. Later, the attendee's name became known. A patch request is sent to the organizer's calendar through Microsoft Graph API to update the event with the goal of overwriting the attendee's name, but leaving the email address as is.
{
"#odata.type": "#microsoft.graph.event",
"attendees": [{
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"type": "required",
"emailAddress": {
"address": "attendee#example.com",
"name": "Julie Williams"
}
}, {
"status": {
"response": "none"
},
"type": "required",
"emailAddress": {
"address": "organizer#example.com",
"name": "Bob Smith"
}
}],
"createdDateTime": "2020-06-18T05:19:22.5766648Z",
"end": {
"dateTime": "2020-06-26T15:00:00",
"timeZone": "UTC"
},
"iCalUId": "ZZZZ",
"id": "YYYY",
"importance": "normal",
"isOrganizer": true,
"lastModifiedDateTime": "2020-06-18T05:19:23.7881324Z",
"location": {},
"organizer": {
"emailAddress": {
"address": "organizer#example.com",
"name": "Bob Smith"
}
},
"originalEndTimeZone": "Eastern Standard Time",
"originalStartTimeZone": "Eastern Standard Time",
"reminderMinutesBeforeStart": 15,
"responseRequested": true,
"responseStatus": {
"response": "organizer",
"time": "0001-01-01T00:00:00Z"
},
"sensitivity": "normal",
"showAs": "busy",
"start": {
"dateTime": "2020-06-26T14:30:00",
"timeZone": "UTC"
},
"subject": "Review proposal",
"type": "singleInstance",
"webLink": "https://outlook.office365.com/owa/?itemid=YYYY&exvsurl=1&path=/calendar/item"
}
The response shows that the attendee's name did not change.
{
"#odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('WWWW')/calendars('XXXX')/events/$entity",
"#odata.etag": "W/\"wIqdPsepnEOtI+GbtqRT1gAAElvUsQ==\"",
"id": "YYYY",
"createdDateTime": "2020-06-18T05:19:22.5766648Z",
"lastModifiedDateTime": "2020-06-18T17:17:23.3143899Z",
"changeKey": "wIqdPsepnEOtI+GbtqRT1gAAElvUsQ==",
"categories": [],
"originalStartTimeZone": "UTC",
"originalEndTimeZone": "UTC",
"iCalUId": "ZZZZ",
"reminderMinutesBeforeStart": 15,
"isReminderOn": false,
"hasAttachments": false,
"subject": "Review proposal",
"bodyPreview": "",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": true,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "busy",
"type": "singleInstance",
"webLink": "https://outlook.office365.com/owa/?itemid=YYYY&exvsurl=1&path=/calendar/item",
"onlineMeetingUrl": null,
"isOnlineMeeting": false,
"onlineMeetingProvider": "unknown",
"allowNewTimeProposals": true,
"recurrence": null,
"onlineMeeting": null,
"responseStatus": {
"response": "organizer",
"time": "0001-01-01T00:00:00Z"
},
"body": {
"contentType": "text",
"content": ""
},
"start": {
"dateTime": "2020-06-26T14:30:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2020-06-26T15:00:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "",
"locationType": "default",
"uniqueIdType": "unknown",
"address": {},
"coordinates": {}
},
"locations": [],
"attendees": [
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "attendee#example.com",
"address": "attendee#example.com"
}
},
{
"type": "required",
"status": {
"response": "none",
"time": "0001-01-01T00:00:00Z"
},
"emailAddress": {
"name": "Bob Smith",
"address": "organizer#example.com"
}
}
],
"organizer": {
"emailAddress": {
"name": "Bob Smith",
"address": "organizer#example.com"
}
}
}
Should I expect the attendee's name to be updated? Is there another way to do it?

Getting specific event version via Event Message

We are trying to show all the event details about an event message, we are tracking multiple messages, some are eventMessage.
When trying to access the event relationship on the eventMessage we always get the same event for all messages in the conversation.
Therefore, the original event message shows the latest event properties (start and end time, location, etc.)
I've tried to use the Microsoft Graph Explorer to see if there is any way to get a specific event item by using the changeKey of the item itself.
Sadly, with no success.
For example, when trying to access all messages within a conversation by filtering with the conversation id and expanding the event relationship
GET https://graph.microsoft.com/v1.0/me/messages/?$filter=conversationId eq '<ConversationId>='&$expand=Microsoft.Graph.EventMessage/Event
We always get the same event for all messages.
{
"value": [
{
"#odata.type": "#microsoft.graph.eventMessage",
"#odata.etag": "W/\"<CHANGEKEY1>\"",
"id": "<MSGID1>",
"createdDateTime": "2019-05-26T15:48:46Z",
"lastModifiedDateTime": "2019-06-09T23:34:48Z",
"changeKey": "<CHANGEKEY1>",
"receivedDateTime": "2019-05-26T15:48:46Z",
"sentDateTime": "2019-05-26T15:48:44Z",
"event": {
"#odata.etag": "W/\"<EVENTCHANGEKEY>\"",
"id": "<EVENTID>",
"createdDateTime": "2019-05-26T15:48:46.2276944Z",
"lastModifiedDateTime": "2019-06-16T11:42:26.1599832Z",
"changeKey": "<EVENTCHANGEKEY>",
"categories": [],
"originalStartTimeZone": "Israel Standard Time",
"originalEndTimeZone": "Israel Standard Time",
"iCalUId": "<ICALUID>",
"reminderMinutesBeforeStart": 15,
"isReminderOn": false,
"hasAttachments": false,
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": false,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "tentative",
"type": "singleInstance",
"onlineMeetingUrl": null,
"recurrence": null,
"responseStatus": {
"response": "notResponded",
"time": "0001-01-01T00:00:00Z"
},
"start": {
"dateTime": "2019-06-11T09:00:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2019-06-11T09:30:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "טלפוני / במשרד",
"locationType": "default",
"uniqueId": "ff8323c6-c525-415a-be80-88de9c1bd53d",
"uniqueIdType": "locationStore"
},
"locations": [
{
"displayName": "טלפוני / במשרד",
"locationType": "default",
"uniqueId": "ff8323c6-c525-415a-be80-88de9c1bd53d",
"uniqueIdType": "locationStore"
}
]
}
},
{
"#odata.type": "#microsoft.graph.eventMessage",
"#odata.etag": "W/\"<CHANGEKEY2>\"",
"id": "<MSGID2>",
"createdDateTime": "2019-06-09T23:34:46Z",
"lastModifiedDateTime": "2019-06-17T10:00:07Z",
"changeKey": "<CHANGEKEY2>",
"receivedDateTime": "2019-06-09T23:34:47Z",
"sentDateTime": "2019-06-09T23:34:45Z",
"event": {
"#odata.etag": "W/\"<EVENTCHANGEKEY>\"",
"id": "<EVENTID>",
"createdDateTime": "2019-05-26T15:48:46.2276944Z",
"lastModifiedDateTime": "2019-06-16T11:42:26.1599832Z",
"changeKey": "<EVENTCHANGEKEY>",
"categories": [],
"originalStartTimeZone": "Israel Standard Time",
"originalEndTimeZone": "Israel Standard Time",
"iCalUId": "<ICALUID>",
"reminderMinutesBeforeStart": 15,
"isReminderOn": false,
"hasAttachments": false,
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": false,
"responseRequested": true,
"seriesMasterId": null,
"showAs": "tentative",
"type": "singleInstance",
"onlineMeetingUrl": null,
"recurrence": null,
"responseStatus": {
"response": "notResponded",
"time": "0001-01-01T00:00:00Z"
},
"start": {
"dateTime": "2019-06-11T09:00:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2019-06-11T09:30:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "טלפוני / במשרד",
"locationType": "default",
"uniqueId": "ff8323c6-c525-415a-be80-88de9c1bd53d",
"uniqueIdType": "locationStore"
},
"locations": [
{
"displayName": "טלפוני / במשרד",
"locationType": "default",
"uniqueId": "ff8323c6-c525-415a-be80-88de9c1bd53d",
"uniqueIdType": "locationStore"
}
]
}
}
"#odata.etag": "W/\"CQAAABQAAAC5VJWM6fuTTIIUqGiAHWMQAAEwug==\"",
"id": "AAMkADliYjE5MWViLWNlMGQtNDliYy05YThkLWM4YWZiNzY2ODdlNwBGAAAAAAA5_Z03NIx3SqoeFwQnhSEiBwDt8lpmQG0nRYbMU6WI2FVeAAAAAAEPAADt8lpmQG0nRYbMU6WI2FVeAAFkUv4FAAA=",
"createdDateTime": "2019-06-17T10:31:28Z",
"lastModifiedDateTime": "2019-06-17T10:28:24Z",
"changeKey": "CQAAABQAAAC5VJWM6fuTTIIUqGiAHWMQAAEwug==",
"categories": [],
"receivedDateTime": "2019-06-17T10:31:26Z",
"sentDateTime": "2019-06-17T10:31:30Z",
"hasAttachments": true,
"internetMessageId": "<DB7PR03MB39784FB9DE2927C185428518CFEB0#DB7PR03MB3978.eurprd03.prod.outlook.com>",
"subject": "FW: Recruitment briefing before 8200 conference ",
"bodyPreview": "",
"importance": "normal",
"parentFolderId": "AAMkADliYjE5MWViLWNlMGQtNDliYy05YThkLWM4YWZiNzY2ODdlNwAuAAAAAAA5_Z03NIx3SqoeFwQnhSEiAQDt8lpmQG0nRYbMU6WI2FVeAAAAAAEPAAA=",
"conversationId": "<ConversationId>=",
"isDeliveryReceiptRequested": false,
"isReadReceiptRequested": false,
"isRead": false,
"isDraft": true,
"webLink": "https://outlook.office365.com/owa/?ItemID=AAMkADliYjE5MWViLWNlMGQtNDliYy05YThkLWM4YWZiNzY2ODdlNwBGAAAAAAA5%2BZ03NIx3SqoeFwQnhSEiBwDt8lpmQG0nRYbMU6WI2FVeAAAAAAEPAADt8lpmQG0nRYbMU6WI2FVeAAFkUv4FAAA%3D&exvsurl=1&viewmodel=ReadMessageItem",
"inferenceClassification": "focused",
"toRecipients": [],
"ccRecipients": [],
"bccRecipients": [],
"replyTo": [],
"flag": {
"flagStatus": "notFlagged"
}
}
]
}
We expected to get each eventMessage with its own "version" of the event itself.
In the provided case, the start and end time should have been changed.
When accessing the webUrl property, we get the expected result.
As shown in the web url:
Original Message
Updated Message

Fail to use Graph API to create events which is imported from Google

I import some events to my Outlook Calendar via an ics file which were created in Google Calendar. The import is a success, but I find these event objects are different from the other events I create via Outlook UI.
Using Graph Explorer I see that originalStartTimeZone and originalEndTimeZone in imported event are tzone://Microsoft/Custom and recurrenceTimeZone is an empty string.
{
"#odata.etag": "W/\"jQw3WvygBke/Eeuel/y+PAACnR0HFQ==\"",
"id": "AAMkADU2MzY5ODJlLWI2YjgtNDM5YS1iMWQzLTkxNWFlOTk3MjA3MABGAAAAAAAZitkJ2449ToBFAe4BGzZIBwCNDDda-KAGR78R656X-L48AAKczwuSAACNDDda-KAGR78R656X-L48AAKcz0NjAAA=",
"createdDateTime": "2019-03-11T12:58:33.1040062Z",
"lastModifiedDateTime": "2019-03-11T12:58:33.2340999Z",
"changeKey": "jQw3WvygBke/Eeuel/y+PAACnR0HFQ==",
"categories": [],
"originalStartTimeZone": "tzone://Microsoft/Custom",
"originalEndTimeZone": "tzone://Microsoft/Custom",
"iCalUId": "040000008200E00074C5B7101A82E0080000000000000000000000000000000000000000320000007643616C2D55696401000000336A6C61316A6773666C6B766D70666F766D6D7365686439647240676F6F676C652E636F6D00",
"reminderMinutesBeforeStart": 0,
"isReminderOn": false,
"hasAttachments": false,
"subject": "Every Tue.",
"bodyPreview": "",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": false,
"isCancelled": false,
"isOrganizer": true,
"responseRequested": false,
"seriesMasterId": null,
"showAs": "busy",
"type": "seriesMaster",
"webLink": "https://outlook.office365.com/owa/?itemid=AAMkADU2MzY5ODJlLWI2YjgtNDM5YS1iMWQzLTkxNWFlOTk3MjA3MABGAAAAAAAZitkJ2449ToBFAe4BGzZIBwCNDDda%2FKAGR78R656X%2FL48AAKczwuSAACNDDda%2FKAGR78R656X%2FL48AAKcz0NjAAA%3D&exvsurl=1&path=/calendar/item",
"onlineMeetingUrl": null,
"responseStatus": {
"response": "organizer",
"time": "0001-01-01T00:00:00Z"
},
"body": {
"contentType": "html",
"content": "<html><head><meta name=\"Generator\" content=\"Microsoft Exchange Server\">\r\n<!-- converted from text -->\r\n<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style></head>\r\n<body>\r\n<font size=\"2\"><span style=\"font-size:11pt;\"><div class=\"PlainText\"> </div></span></font>\r\n</body>\r\n</html>\r\n"
},
"start": {
"dateTime": "2018-08-13T22:00:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2018-08-14T00:00:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "",
"locationType": "default",
"uniqueIdType": "unknown",
"address": {},
"coordinates": {}
},
"locations": [],
"recurrence": {
"pattern": {
"type": "weekly",
"interval": 1,
"month": 0,
"dayOfMonth": 0,
"daysOfWeek": ["tuesday"],
"firstDayOfWeek": "monday",
"index": "first"
},
"range": {
"type": "endDate",
"startDate": "2018-08-14",
"endDate": "2018-09-18",
"recurrenceTimeZone": "",
"numberOfOccurrences": 0
}
},
"attendees": [],
"organizer": {
"emailAddress": {
"name": "my#gsuite.com",
"address": "my#gsuite.com"
}
}
}
Besides, when I use this event object as the request body of Create Event API, it returns this error:
{
"error": {
"code": "TimeZoneNotSupportedException",
"message": "A valid TimeZone value must be specified. The following TimeZone value is not supported: ''.",
"innerError": {
"request-id": "69f1a5de-1dbe-4caa-a996-15dc9190380c",
"date": "2019-03-13T13:37:24"
}
}
}
Is this a bug with importing .ics files or is it a limitation of the API?
The answer is the same as I provided to your question Can't create a all-day repeated via Graph API:
You're posting the entire object, including several read-only properties. This will always result in a failure of some kind.
When working with Microsoft Graph (most any REST API actually), you should only submit the properties you want to set.
For the event above, you'd send something like this:
POST https://graph.microsoft.com/v1.0/me/events
{
"isReminderOn": false,
"subject": "Every Tue.",
"importance": "normal",
"sensitivity": "normal",
"showAs": "busy",
"body": {
"contentType": "html",
"content": "<html><head><meta name=\"Generator\" content=\"Microsoft Exchange Server\">\r\n<!-- converted from text -->\r\n<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; } --></style></head>\r\n<body>\r\n<font size=\"2\"><span style=\"font-size:11pt;\"><div class=\"PlainText\"> </div></span></font>\r\n</body>\r\n</html>\r\n"
},
"start": {
"dateTime": "2018-08-13T22:00:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2018-08-14T00:00:00.0000000",
"timeZone": "UTC"
},
"recurrence": {
"pattern": {
"type": "weekly",
"interval": 1,
"daysOfWeek": ["Tuesday"]
},
"range": {
"type": "endDate",
"startDate": "2018-08-14",
"endDate": "2018-09-18"
}
}
}
For future reference, there is also a published list supported time zones in the documentation.

Can't create a all-day repeated via Graph API

According to the document, I try to use Graph API to create a all-day repeated event on my calendar, but the server always responses 400: TimeZoneNotSupportedException.
Is there any wrong in my request?
Here is my request and server response.
POST /me/calendars/${one_of_my_calendar_id}/events
Request body:
{
"#odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('6cb879ad-1d01-4aed-bcc5-763e3f51c535')/events/$entity",
"#odata.etag": "W/\"BfXylo4WykyAenTZICXL5AABk4B1gA==\"",
"id": "AAMkADVmMzE2MjY0LTZkOGYtNGI4MS1iNWMxLTljYzg3MWY5MWQxMQBGAAAAAABZMfR36TVMQ6yunaqZPvVRBwAF9fKWjhbKTIB6dNkgJcvkAACB0WDVAAAF9fKWjhbKTIB6dNkgJcvkAAGTapeDAAA=",
"createdDateTime": "2019-03-07T10:25:29.5732546Z",
"lastModifiedDateTime": "2019-03-07T10:25:29.6573241Z",
"changeKey": "BfXylo4WykyAenTZICXL5AABk4B1gA==",
"categories": [],
"originalStartTimeZone": "UTC",
"originalEndTimeZone": "UTC",
"iCalUId": "040000008200E00074C5B7101A82E00800000000FB7128DC464BD4010000000000000000100000006176917542798940B4FDBBFBA5B474A6",
"reminderMinutesBeforeStart": 0,
"isReminderOn": false,
"hasAttachments": false,
"subject": "Repeat-",
"bodyPreview": "",
"importance": "normal",
"sensitivity": "normal",
"isAllDay": true,
"isCancelled": false,
"isOrganizer": true,
"responseRequested": false,
"seriesMasterId": null,
"showAs": "free",
"type": "seriesMaster",
"webLink": "https://outlook.office365.com/owa/?itemid=AAMkADVmMzE2MjY0LTZkOGYtNGI4MS1iNWMxLTljYzg3MWY5MWQxMQBGAAAAAABZMfR36TVMQ6yunaqZPvVRBwAF9fKWjhbKTIB6dNkgJcvkAACB0WDVAAAF9fKWjhbKTIB6dNkgJcvkAAGTapeDAAA%3D&exvsurl=1&path=/calendar/item",
"onlineMeetingUrl": null,
"responseStatus": {
"response": "organizer",
"time": "0001-01-01T00:00:00Z"
},
"body": {
"contentType": "html",
"content": "<html><head><meta name=\"Generator\" content=\"Microsoft Exchange Server\">\r\n<!-- converted from text
-->\r\n<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; }
--></style></head>\r\n<body>\r\n<font size=\"2\"><span style=\"font-size:11pt;\"><div class=\"PlainText\"> </div></span></font>\r\n</body>\r\n</html>\r\n"
},
"start": {
"dateTime": "2018-09-25T00:00:00.0000000",
"timeZone": "UTC"
},
"end": {
"dateTime": "2018-09-26T00:00:00.0000000",
"timeZone": "UTC"
},
"location": {
"displayName": "",
"locationType": "default",
"uniqueIdType": "unknown",
"address": {},
"coordinates": {}
},
"locations": [],
"recurrence": {
"pattern": {
"type": "weekly",
"interval": 1,
"month": 0,
"dayOfMonth": 0,
"daysOfWeek": [
"tuesday"
],
"firstDayOfWeek": "monday",
"index": "first"
},
"range": {
"type": "endDate",
"startDate": "2018-09-25",
"endDate": "2019-03-12",
"recurrenceTimeZone": "",
"numberOfOccurrences": 0
}
},
"attendees": [],
"organizer": {
"emailAddress": {
"name": "MYNAME",
"address": "MYNAME#MYMAIL.com"
}
} }
Server response:
http code: 400
{
"error": {
"code": "TimeZoneNotSupportedException",
"message": "A valid TimeZone value must be specified. The following TimeZone value is not supported: ''.",
"innerError": {
"request-id": "4833ea1a-3371-4d3e-b28e-193fec18f723",
"date": "2019-03-07T11:01:36"
}
}
}
You're posting the entire object, including several read-only properties. This will always result in a failure of some kind.
When working with Microsoft Graph (most any REST API actually), you should only submit the properties you want to set:
{
"subject": "Repeat-",
"isAllDay": true,
"isReminderOn": false,
"showAs": "free",
"body": {
"contentType": "html",
"content": "<html><head><meta name=\"Generator\" content=\"Microsoft Exchange Server\">\r\n<!-- converted from text\r\n<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px solid; }</style></head>\r\n<body>\r\n<font size=\"2\"><span style=\"font-size:11pt;\"><div class=\"PlainText\"> </div></span></font>\r\n</body>\r\n</html>\r\n"
},
"recurrence": {
"pattern": {
"type": "weekly",
"interval": 1,
"daysOfWeek": ["Tuesday"]
},
"range": {
"type": "endDate",
"startDate": "2018-09-25",
"endDate": "2019-03-12"
}
}
}
After I remove the 'recurrenceTimeZone' from the recurrence/range value, the server responses 200 OK and the new event is be created successfully.
It seems that the recurrenceTimeZone shouldn't be an invalid timezone value.

Resources