Sapilon becomes publicly available on 1 December 2026: 42 days to go. The core goes open source the same day →

Outlook Calendar integration

In short

Read and create events, and find free meeting times. Connect it on the Integrations page; your app then calls Outlook Calendar through Sapilon without ever holding a Microsoft credential.

Lets your app read the connected account’s Microsoft 365 or Outlook.com calendars, create, update and cancel events, and find times when attendees are free.

Connecting

On the Integrations page choose Connect on Outlook Calendar, sign in to Microsoft and allow access. Under Advanced you can use your own Microsoft OAuth app instead of Sapilon’s.

  • Many Microsoft 365 organisations only let an admin approve new apps: if you see “Need admin approval”, ask your Microsoft 365 admin to consent once for the whole organisation.
  • Sapilon’s Microsoft app is being registered. Until it is, Advanced → Bring your own OAuth app (an Entra app registration) connects today.

What your app can do

Only these requests are available; anything else is refused.

  • GET /me/calendars
  • GET|POST /me/events
  • GET|PATCH|DELETE /me/events/*
  • GET /me/calendarView
  • POST /me/findMeetingTimes

How the agent uses it

Use integrations.request('outlook-calendar', …); paths are relative to https://graph.microsoft.com/v1.0.

  • GET /me/calendars.
  • GET /me/calendarView — events in a window, recurring ones expanded. Example: { method: 'GET', path: '/me/calendarView', query: { startDateTime: '2026-10-20T00:00:00Z', endDateTime: '2026-10-27T00:00:00Z' } }.
  • GET|POST /me/events — Example: { method: 'POST', path: '/me/events', body: { subject: 'Intro call', start: { dateTime: '2026-10-21T10:00:00', timeZone: 'Europe/Amsterdam' }, end: { dateTime: '2026-10-21T10:30:00', timeZone: 'Europe/Amsterdam' }, attendees: [{ emailAddress: { address: 'sara@acme.com' }, type: 'required' }], isOnlineMeeting: true } }.
  • GET|PATCH|DELETE /me/events/{id} — read, move or cancel (attendees are told).
  • POST /me/findMeetingTimes — body: { attendees: [...], timeConstraint: {...}, meetingDuration: 'PT30M' }.

Send headers: { Prefer: 'outlook.timezone="Europe/Amsterdam"' } to get times in a zone.

More from Microsoft: https://learn.microsoft.com/graph/api/resources/calendar

Last updated .

Was this page helpful?