Personal Outlook.com calendar returns 401 with Calendars.ReadBasic after fresh consent

Tim F 0 Reputation points
2026-09-13T23:37:56.8333333+00:00

I’m building a local, read-only calendar connector for my personal Outlook.com account. My calendar works normally at outlook.live.com, but Microsoft Graph calendar requests consistently return HTTP 401.

Configuration:

  • Windows with Node.js 24.19.0

Microsoft Authentication Library: @azure/msal-node

App registration supports personal Microsoft accounts only

Authority: https://login.microsoftonline.com/consumers

Interactive desktop sign-in with localhost redirect

Requested scope: https://graph.microsoft.com/Calendars.ReadBasic

No client secret

No calendar-write permissions requested

What succeeds:

Browser sign-in and permission consent complete successfully.

The sign-in cache is saved locally using Windows user encryption.

MSAL finds exactly one saved account.

Both cached and force-refreshed token results report an unexpired token and include Calendars.ReadBasic.

What fails:

GET https://graph.microsoft.com/v1.0/me/calendars returns HTTP 401.

A separate minimal Node.js fetch test reproduces the failure, outside the connector’s request code.

That test sends the MSAL access token in the Authorization: Bearer header.

Both cached and freshly refreshed tokens return 401.

A request to /v1.0/me/calendarView for the default calendar also returns 401.

The diagnostic could not extract a standard Graph error code from the responses.

Troubleshooting already completed:

Repeated interactive sign-in with explicit consent.

Forced token refresh.

Confirmed my business email and Outlook.com alias are listed on the same personal Microsoft account.

Allowed browser cookies and repeated authorization. This fixed a separate support sign-in problem but did not resolve the Graph error.

Microsoft response request IDs from the minimal calendar-list test:

Cached token: 95b314ee-34c4-43d7-981f-64077bc771a2

Refreshed token: d15d3091-aad0-496e-8f2c-0c66ca8c9d05

Exact UTC request timestamps were not captured. Token audience was not independently verified.

Microsoft’s documentation lists delegated Calendars.ReadBasic as supported for personal accounts for both listing calendars and reading calendarView.

What could cause this result, and what additional non-sensitive diagnostics would distinguish an account/mailbox issue from an authentication or request-configuration issue?

I want to retain the minimum necessary read-only permissions. No tokens, passwords, or calendar contents are included in this post.I’m building a local, read-only calendar connector for my personal Outlook.com account. My calendar works normally at outlook.live.com, but Microsoft Graph calendar requests consistently return HTTP 401.

Configuration:

Windows with Node.js 24.19.0

Microsoft Authentication Library: @azure/msal-node

App registration supports personal Microsoft accounts only

Authority: https://login.microsoftonline.com/consumers

Interactive desktop sign-in with localhost redirect

Requested scope: https://graph.microsoft.com/Calendars.ReadBasic

No client secret

No calendar-write permissions requested

What succeeds:

Browser sign-in and permission consent complete successfully.

The sign-in cache is saved locally using Windows user encryption.

MSAL finds exactly one saved account.

Both cached and force-refreshed token results report an unexpired token and include Calendars.ReadBasic.

What fails:

GET https://graph.microsoft.com/v1.0/me/calendars returns HTTP 401.

A separate minimal Node.js fetch test reproduces the failure, outside the connector’s request code.

That test sends the MSAL access token in the Authorization: Bearer header.

Both cached and freshly refreshed tokens return 401.

A request to /v1.0/me/calendarView for the default calendar also returns 401.

The diagnostic could not extract a standard Graph error code from the responses.

Troubleshooting already completed:

Repeated interactive sign-in with explicit consent.

Forced token refresh.

Confirmed my business email and Outlook.com alias are listed on the same personal Microsoft account.

Allowed browser cookies and repeated authorization. This fixed a separate support sign-in problem but did not resolve the Graph error.

Microsoft response request IDs from the minimal calendar-list test:

Cached token: 95b314ee-34c4-43d7-981f-64077bc771a2

Refreshed token: d15d3091-aad0-496e-8f2c-0c66ca8c9d05

Exact UTC request timestamps were not captured. Token audience was not independently verified.

Microsoft’s documentation lists delegated Calendars.ReadBasic as supported for personal accounts for both listing calendars and reading calendarView.

What could cause this result, and what additional non-sensitive diagnostics would distinguish an account/mailbox issue from an authentication or request-configuration issue?

I want to retain the minimum necessary read-only permissions. No tokens, passwords, or calendar contents are included in this post.

Microsoft Security | Microsoft Graph
0 comments No comments

1 answer

Sort by: Most helpful
  1. AI answer

    2026-09-13T23:38:24.5066667+00:00

    The documented permission model supports this scenario:

    • Calendars.ReadBasic delegated permission is available for consent in personal Microsoft accounts.
    • Listing events from a user calendar is supported for delegated personal Microsoft accounts with Calendars.ReadBasic, Calendars.Read, or Calendars.ReadWrite.
    • MSAL requires requesting the Graph scope explicitly when acquiring tokens.

    Given the reported setup, the most likely causes are:

    1. The access token is not actually a Microsoft Graph token
      • A successful sign-in and a cached token do not by themselves prove the token is valid for Graph.
      • The supported pattern is to request Graph scopes such as https://graph.microsoft.com/User.Read and https://graph.microsoft.com/Calendar.Read when acquiring the token.
      • Since token audience was not independently verified, the first diagnostic is to confirm the token is for Microsoft Graph.
    2. The request is authenticated correctly but the mailbox/account path is the failing component
      • The Graph permission reference says Calendars.ReadBasic is supported for personal Microsoft accounts.
      • The calendar API documentation says delegated personal Microsoft accounts can call calendar event APIs with Calendars.ReadBasic.
      • If the token is confirmed as a Graph token and the scope is present, repeated 401 responses on /me/calendars and calendar endpoints point more toward an account or mailbox-side issue than a consent-flow issue.
    3. Scope selection may be too narrow for diagnosis
      • The context shows examples of requesting both User.Read and a calendar scope.
      • Adding User.Read as a diagnostic does not increase calendar access and helps verify that the same token can call a basic Graph endpoint such as /me.
      • If /me succeeds with the same token while calendar endpoints return 401, that separates general token validity from calendar/mailbox access.

    Useful non-sensitive diagnostics:

    1. Verify the token is a Graph token
      • Confirm the token audience is Microsoft Graph.
      • Confirm the granted delegated scope includes Calendars.ReadBasic.
    2. Add User.Read temporarily for diagnosis
      • Request https://graph.microsoft.com/User.Read together with the calendar scope.
      • Acquire a fresh delegated token.
      • Test a basic Graph call such as /me.
      • Expected result:
        • /me succeeds, calendar calls fail: token acquisition is broadly correct; focus shifts to calendar/mailbox-specific behavior.
        • /me also fails with 401: focus shifts to token audience, scope request, or authorization configuration.
    3. Keep using delegated permissions only
      • For personal Microsoft accounts, the accepted guidance in similar cases is to use delegated permissions.
      • Personal Microsoft account scenarios that try to use app-only/application permission patterns can produce 401 behavior.
      • The current no-client-secret interactive delegated setup is aligned with that guidance.
    4. Confirm the authority and account type remain aligned
      • For personal Microsoft accounts, accepted guidance is to use the consumers endpoint or common for sign-in compatibility.
      • The current consumers authority matches the personal-account-only app registration.
    5. Capture full HTTP response metadata on the failing Graph calls
      • Preserve the Graph response status, headers, request ID, and UTC timestamp.
      • The existing request IDs are useful, but exact UTC timestamps are also important for correlation.
      • This is the safest next diagnostic if the token audience and /me test do not explain the issue.
    6. Compare with a broader read permission only if needed
      • If minimum-permission diagnosis stalls, test once with delegated Calendars.Read.
      • If Calendars.Read works and Calendars.ReadBasic does not, that isolates the issue to permission handling rather than general authentication.
      • If both fail with a confirmed Graph token, that strengthens the mailbox/account-issue hypothesis.

    What the current evidence already rules out:

    • It does not look like a basic-auth issue.
    • It does not look like an application-permission design issue, because the flow described is delegated and interactive.
    • It does not suggest that personal Microsoft accounts are unsupported for Calendars.ReadBasic; the documentation explicitly says they are supported.

    Most effective decision tree:

    1. Confirm token audience is Graph.
    2. Request User.Read + Calendars.ReadBasic and test /me.
    3. If /me succeeds but calendar endpoints still return 401, treat it as likely mailbox/account-specific and collect exact UTC timestamps with the request IDs.
    4. If needed, test once with delegated Calendars.Read to determine whether the failure is specific to ReadBasic or affects calendar access generally.

    AI-generated content may be incorrect. Read our transparency notes for more information.

    Was this answer helpful?

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.