Microsoft

Outlook mail, Outlook calendar, and OneDrive and Excel, connected with one Microsoft sign-in.

Connects by
Signing in with Microsoft
Category
Spreadsheets and databases, Email, Calendars and meetings, Files and docs, Chat, Projects and tasks, Developer tools
Services
14
Tools
9,499
ServiceKeyWebsite
OneDrive and Excelonedriveonedrive.live.com
Outlookoutlookoutlook.com
Microsoft Bookingsmicrosoft-bookingsmicrosoft.com
Outlook calendaroutlook-calendaroutlook.com
OneNoteonenoteonenote.com
SharePointsharepointsharepoint.com
Microsoft Teamsteamsteams.microsoft.com
Microsoft 365 Educationmicrosoft-365-educationmicrosoft.com
Microsoft Plannermicrosoft-plannermicrosoft.com
Microsoft To Domicrosoft-todoto-do.office.com
Microsoft 365 adminmicrosoft-365-adminmicrosoft.com
Microsoft Defender XDRmicrosoft-defendermicrosoft.com
Microsoft Entra IDmicrosoft-entramicrosoft.com
Microsoft Intuneintunemicrosoft.com

Connecting

Your client presses Connect, signs in with a work, school or personal Microsoft account, and accepts the permissions for every service you asked for on one screen.

Microsoft also asks for two basic permissions: User.Read, to sign your client in and read their profile, and offline_access, so access can be renewed without them signing in again.

Check they're connected
curl https://api.operate.as/v1/me/clients \  -H "Authorization: Bearer $OPERATE_AS_API_KEY"
Response
[  {    "id": "6f1c2a7e-...",    "name": "Miller Dental",    "services": [      "onedrive",      "outlook",      "microsoft-bookings",      "outlook-calendar",      "onenote",      "sharepoint",      "teams",      "microsoft-365-education",      "microsoft-planner",      "microsoft-todo",      "microsoft-365-admin",      "microsoft-defender",      "microsoft-entra",      "intune"    ]  }]

Good to know

An admin may need to approve the app

In a company's Microsoft 365, an admin decides whether people can approve apps themselves. If that's turned off or limited, Microsoft tells your client they need an admin's approval, and they can't finish connecting. Their IT admin either grants consent for the whole organization, or approves your client's request if the company uses Microsoft's admin consent workflow. Then your client connects again from their link.

Any kind of Microsoft account

Your client can sign in with a work or school account from their organization's Microsoft 365, or a personal account such as Outlook.com.

One address, many services

Every Microsoft service uses Microsoft Graph, https://graph.microsoft.com/v1.0. The service key in your request decides which service you're calling, and so which permissions and API key scopes apply.

Each call carries access with only that service's permissions, so Microsoft itself enforces the boundary. An outlook call can read the client's mail, but Microsoft refuses it if it tries to reach their files or notes. A call to a service your client didn't approve on Microsoft's screen gets 409 with … hasn't approved …: send them their link to connect again.

A few paths reach another service's data. A call to one of them, whether from a tool or a pass-through request, needs a key that can use both services, and carries both services' permissions:

ThroughAlso needs
A SharePoint site's onenote, by path or $expandonenote
A Teams channel's filesFoldersharepoint

OneDrive reaches the client's own drive, /me/drive. Use sharepoint for document libraries.

Permissions

OneDrive and Excel

What the client readsPermission it asks for
See, add and edit your files and workbooksFiles.ReadWrite

Outlook

What the client readsPermission it asks for
Read and organise your emailMail.ReadWrite
Send email as youMail.Send
See, add and change your contactsContacts.ReadWrite

Microsoft Bookings

What the client readsPermission it asks for
See and change your booking pages, services, staff and appointmentsBookings.ReadWrite.All

Outlook calendar

What the client readsPermission it asks for
See, add and change your calendar eventsCalendars.ReadWrite
See your organization's rooms and buildingsPlace.Read.All

OneNote

What the client readsPermission it asks for
See, add and change your notebooksNotes.ReadWrite

SharePoint

What the client readsPermission it asks for
See and edit files and lists in the sites you can openSites.ReadWrite.All

Microsoft Teams

What the client readsPermission it asks for
See the teams you're inTeam.ReadBasic.All
See the channels in those teamsChannel.ReadBasic.All
Post messages to channelsChannelMessage.Send
Read and send your chat messagesChat.ReadWrite
See and schedule your Teams meetingsOnlineMeetings.ReadWrite
See transcripts of your Teams meetingsOnlineMeetingTranscript.Read.All
See recordings of your Teams meetingsOnlineMeetingRecording.Read.All

Microsoft 365 Education

What the client readsPermission it asks for
See your classes and schoolsEduRoster.ReadBasic
See and change your assignments and submissionsEduAssignments.ReadWrite

Microsoft Planner

What the client readsPermission it asks for
See, add and change your plans and their tasksTasks.ReadWrite

Microsoft To Do

What the client readsPermission it asks for
See, add and change your tasksTasks.ReadWrite

Microsoft 365 admin

What the client readsPermission it asks for
See your organization's Microsoft 365 usage reportsReports.Read.All
See Microsoft 365 service healthServiceHealth.Read.All
See Microsoft 365 message center postsServiceMessage.Read.All
Create and manage your connectionsExternalConnection.ReadWrite.OwnedBy
Add and change items in your connectionsExternalItem.ReadWrite.OwnedBy
See your organization's printersPrinter.Read.All
See and send your print jobsPrintJob.ReadWrite

Microsoft Defender XDR

What the client readsPermission it asks for
See your organization's security alertsSecurityAlert.Read.All
See your organization's security incidentsSecurityIncident.Read.All
See your organization's secure scores and security eventsSecurityEvents.Read.All

Microsoft Entra ID

What the client readsPermission it asks for
See the people in your organizationUser.Read.All
See your organization's groups and their membersGroup.Read.All
See your directory's roles and licensesDirectory.Read.All
See and change your organization's app registrationsApplication.ReadWrite.All
See your organization's sign-in and audit logsAuditLog.Read.All
See your organization's sign-in policiesPolicy.Read.All
Change your Conditional Access policiesPolicy.ReadWrite.ConditionalAccess
See and run your access reviewsAccessReview.ReadWrite.All
See and change your access packagesEntitlementManagement.ReadWrite.All
See and dismiss risky usersIdentityRiskyUser.ReadWrite.All
See risk detectionsIdentityRiskEvent.Read.All

Microsoft Intune

What the client readsPermission it asks for
See your organization's managed devicesDeviceManagementManagedDevices.Read.All
See your device compliance and configuration policiesDeviceManagementConfiguration.Read.All

Tools

OneDrive and Excel

Install OneDrive and Excel's typed package for your language:

pip install operate-as-onedrive
Run onedrive.drives_create_items
curl -X POST https://api.operate.as/v1/actions/onedrive.drives_create_items \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {}  }'

Every input, with its JSON Schema: GET /v1/actions/onedrive.drives_create_items

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Outlook

Install Outlook's typed package for your language:

pip install operate-as-outlook
Run outlook.send_email
curl -X POST https://api.operate.as/v1/actions/outlook.send_email \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "to": "<to>",      "subject": "<subject>",      "body": "<body>"    }  }'
InputTypeWhat it is
torequiredstringWho to send it to
subjectrequiredstringSubject
bodyrequiredstringText
Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft Bookings

Install Microsoft Bookings's typed package for your language:

pip install operate-as-microsoft-bookings
Run microsoft-bookings.get_count_appointments_205a
curl -X POST https://api.operate.as/v1/actions/microsoft-bookings.get_count_appointments_205a \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "booking_business_id": "<booking_business_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/microsoft-bookings.get_count_appointments_205a

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Outlook calendar

Install Outlook calendar's typed package for your language:

pip install operate-as-outlook-calendar
Run outlook-calendar.get_count_attachments_1985
curl -X POST https://api.operate.as/v1/actions/outlook-calendar.get_count_attachments_1985 \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "event_id": "<event_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/outlook-calendar.get_count_attachments_1985

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

OneNote

Install OneNote's typed package for your language:

pip install operate-as-onenote
Run onenote.get_count_notebooks_6c1a
curl -X POST https://api.operate.as/v1/actions/onenote.get_count_notebooks_6c1a \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {}  }'

Every input, with its JSON Schema: GET /v1/actions/onenote.get_count_notebooks_6c1a

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

SharePoint

Install SharePoint's typed package for your language:

pip install operate-as-sharepoint
Run sharepoint.get_count_base_types_6b07
curl -X POST https://api.operate.as/v1/actions/sharepoint.get_count_base_types_6b07 \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "site_id": "<site_id>",      "content_type_id": "<content_type_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/sharepoint.get_count_base_types_6b07

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft Teams

Install Microsoft Teams's typed package for your language:

pip install operate-as-teams
Run teams.chats_chat_create_chat
curl -X POST https://api.operate.as/v1/actions/teams.chats_chat_create_chat \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {}  }'

Every input, with its JSON Schema: GET /v1/actions/teams.chats_chat_create_chat

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft 365 Education

Install Microsoft 365 Education's typed package for your language:

pip install operate-as-microsoft-365-education
Run microsoft-365-education.education_classes_assignments_create_cat
curl -X POST https://api.operate.as/v1/actions/microsoft-365-education.education_classes_assignments_create_cat \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "education_class_id": "<education_class_id>",      "education_assignment_id": "<education_assignment_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/microsoft-365-education.education_classes_assignments_create_cat

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft Planner

Install Microsoft Planner's typed package for your language:

pip install operate-as-microsoft-planner
Run microsoft-planner.get_count_buckets_240a
curl -X POST https://api.operate.as/v1/actions/microsoft-planner.get_count_buckets_240a \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "planner_plan_id": "<planner_plan_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/microsoft-planner.get_count_buckets_240a

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft To Do

Install Microsoft To Do's typed package for your language:

pip install operate-as-microsoft-todo
Run microsoft-todo.get_count_attachment_sessions_958a
curl -X POST https://api.operate.as/v1/actions/microsoft-todo.get_count_attachment_sessions_958a \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "todo_task_list_id": "<todo_task_list_id>",      "todo_task_id": "<todo_task_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/microsoft-todo.get_count_attachment_sessions_958a

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft 365 admin

Install Microsoft 365 admin's typed package for your language:

pip install operate-as-microsoft-365-admin
Run microsoft-365-admin.admin_admin_get_admin
curl -X POST https://api.operate.as/v1/actions/microsoft-365-admin.admin_admin_get_admin \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {}  }'

Every input, with its JSON Schema: GET /v1/actions/microsoft-365-admin.admin_admin_get_admin

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft Defender XDR

Install Microsoft Defender XDR's typed package for your language:

pip install operate-as-microsoft-defender
Run microsoft-defender.get_count_additional_sources_f0d1
curl -X POST https://api.operate.as/v1/actions/microsoft-defender.get_count_additional_sources_f0d1 \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "ediscovery_case_id": "<ediscovery_case_id>",      "ediscovery_search_id": "<ediscovery_search_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/microsoft-defender.get_count_additional_sources_f0d1

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft Entra ID

Install Microsoft Entra ID's typed package for your language:

pip install operate-as-microsoft-entra
Run microsoft-entra.applications_application_add_key
curl -X POST https://api.operate.as/v1/actions/microsoft-entra.applications_application_add_key \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {      "application_id": "<application_id>"    }  }'

Shows the required inputs. Every input, with its JSON Schema: GET /v1/actions/microsoft-entra.applications_application_add_key

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Microsoft Intune

Install Microsoft Intune's typed package for your language:

pip install operate-as-intune
Run intune.device_management_apple_push_notification_certificate_dow
curl -X POST https://api.operate.as/v1/actions/intune.device_management_apple_push_notification_certificate_dow \  -H "Authorization: Bearer $OPERATE_AS_API_KEY" \  -H "Content-Type: application/json" \  -d '{    "clientId": "6f1c2a7e-...",    "input": {}  }'

Every input, with its JSON Schema: GET /v1/actions/intune.device_management_apple_push_notification_certificate_dow

Response
{  "status": 200,  "data": {    "…": "the service's own response"  },  "encoding": "json"}

Pass-through

Paths continue from https://graph.microsoft.com/v1.0. me is the signed-in client.

See Pass-through requests for the full request and response format.

Call any endpoint
GET /v1/clients/{clientId}/outlook/me/messages?$top=10
GET /v1/clients/{clientId}/outlook-calendar/me/events?$top=10
GET /v1/clients/{clientId}/onedrive/me/drive/root/children
GET /v1/clients/{clientId}/outlook/me/messages?$top=10
Authorization: Bearer oa_...

When access ends

How long access lasts60 to 90 minutes at a time. Operate As renews it before it runs out and checks every connection daily.
RenewalThe renewal key stops working after 90 days unused. Daily renewal keeps it in use.
What ends itYour client removes the app from their account or their organization's app list, or an admin revokes their sessions or resets their password.
When it's removedMicrosoft has no way for an app to cancel its own access, so we delete our copy. Your client removes the app in their Microsoft account's app permissions.

See Keeping access alive and Removing access.

Calls answer
HTTP/1.1 409 ConflictContent-Type: application/json{  "detail": "Miller Dental's Microsoft access ended. Send them their link to reconnect."}
Your webhook receives
{  "id": "evt_3f9a1c…",  "type": "connection.expired",  "createdAt": "2026-10-16T08:00:00+00:00",  "data": {    "clientId": "6f1c2a7e-...",    "clientName": "Miller Dental",    "provider": "microsoft",    "services": [      "onedrive",      "outlook",      "microsoft-bookings",      "outlook-calendar",      "onenote",      "sharepoint",      "teams",      "microsoft-365-education",      "microsoft-planner",      "microsoft-todo",      "microsoft-365-admin",      "microsoft-defender",      "microsoft-entra",      "intune"    ],    "reconnectUrl": "https://…"  }}