Outlook Calendar API, without learning Microsoft Graph
Read and write events on Outlook.com and Microsoft 365 calendars, add Teams links and check free time, with the same calls you use for Google Calendar. Times come back with IANA zones, so America/New_York, never Eastern Standard Time.
{
"provider": "microsoft",
"title": "Quarterly review",
"startsAt": "2026-11-03T15:00:00Z",
"startsAtLocal": "2026-11-03T10:00:00-05:00",
"timezone": "America/New_York",
"conferencing": { "provider": "teams" }
}Where Outlook surprises people
Each of these is something we hit while testing on real Outlook.com and Microsoft 365 mailboxes, or in Microsoft's documentation. The left column is what Graph does. The right is what you get from Pyas.
Time zone names
Returns Windows names such as "Pacific Standard Time", and some mailboxes use names no IANA list contains, such as "Customized Time Zone".
Pyas: Every event comes back with an IANA zone and a local time. Canadian zones like British Columbia and Alberta map to the right city.
All-day events
Can store an all-day event at midnight UTC. Read as UTC, a Tuesday holiday starts on Monday evening in New York.
Pyas: All-day events are read in the mailbox's own zone, so Tuesday stays Tuesday in events and in free/busy.
Updating a description
Replacing the body of a Teams meeting replaces the join link with it, and attendees lose the way in.
Pyas: The Teams join block is kept when you change the description, unless you remove the meeting yourself.
Version conflicts
A change made in Outlook between your read and your write can reject the write with 412 Precondition Failed.
Pyas: Writes go through unless you ask for a conflict check by sending If-Match with the event's version.
Change notifications
Subscriptions last seven days at most, one day if they carry the event's data, and stop without warning if they are not renewed.
Pyas: Subscriptions are renewed for you. You get signed webhooks that name the exact event that changed.
Your own data on events
Open extensions use up a mailbox's limited named properties and can't be filtered; extended properties need a GUID and their own $filter syntax.
Pyas: Save up to 50 values as metadata on any event, searchable across your app, the same way on Google.
Teams on personal accounts
Outlook.com calendars do not allow Teams meetings, and a request for one does not get you a Teams link.
Pyas: The request is refused with an error that says why, so you can offer Zoom instead.
Personal and work accounts
Microsoft has two kinds of account, and they do not behave the same. Your users connect either kind through the same PyasConnect button.
- Outlook.com, Hotmail and Live
- Personal accounts. Events, free/busy and webhooks work. There are no meeting rooms, and Teams meetings cannot be created on them, so add a Zoom link instead.
- Microsoft 365
- Work and school accounts. Everything works, Teams links and rooms included. Microsoft's default consent policy now lets only an administrator approve calendar access for any app, so in many organizations the person connecting sees Microsoft's request-approval screen and their IT team approves Pyas once for everyone.