An API that connects multiple Microsoft services, enabling data access and automation across platforms
-
communications/onlineMeetings(joinWebUrl='{joinWebUrl}')/meetingCallEventsrequires an application-only token.
The change notifications for online meeting call events explicitly support only application permissions:
- Supported permission type: Application only
- Required permissions:
OnlineMeetings.Read.AllorOnlineMeetings.ReadWrite.All - Delegated (work or school) and delegated (personal) are not supported for this resource.
Therefore, attempts with a delegated user token will fail, regardless of scopes.
From the documentation: for meeting call events, only application permissions are supported, and the supported permissions are
OnlineMeetings.Read.AllandOnlineMeetings.ReadWrite.All.
- No additional permissions beyond
OnlineMeetings.ReadWrite.Allare documented formeetingCallEvents.
For subscriptions to online meeting call events, the documented minimum permissions are:
- Application:
OnlineMeetings.Read.AllorOnlineMeetings.ReadWrite.All
No other permissions are listed as required for /communications/onlineMeetings(joinWebUrl='{joinWebUrl}')/meetingCallEvents.
- The supported way to get notified when a Teams online meeting ends is via meeting call event change notifications.
The online meeting call events change notifications are designed to notify on:
- Call started
- Call ended
- Roster updated
To use this for “meeting ended” detection:
- Obtain the meeting
joinWebUrl(from theonlineMeetingresource or Teams client). - URL-encode it as described in the documentation.
- Create a subscription with an application token to:
-
resource:/communications/onlineMeetings(joinWebUrl='{encodedJoinUrl}')/meetingCallEvents -
changeType:updated -
expirationDateTime: within the allowed maximum (3 days; renew as needed).
-
- Listen for the call-ended event in the notification payload and trigger the pipeline advancement when that event is received.
The documentation also notes:
- Maximum subscription expiry is 3 days; renew using
PATCH /subscriptions/{id}to keep it active. - This resource supports notifications with resource data, so the event details can be obtained directly from the notification.
There is no simpler, separate Teams signal documented for “meeting ended” beyond these call event notifications and post-meeting artifacts (recordings/transcripts). Recordings and transcripts are covered by separate change notifications (callRecording, callTranscript), but as noted, they are not guaranteed to exist for every meeting.
- About the 400 Bad Request with empty body and how to get more detail.
From the provided context, there is no additional guidance on empty-body 400 responses for POST /subscriptions. However, the behavior observed (400 with delegated tokens) is consistent with using an unsupported permission type for this resource:
- Meeting call events support only application permissions.
- Delegated tokens are not supported and will cause subscription creation to fail.
To move forward and get meaningful responses:
- Switch to an app-only token with
OnlineMeetings.Read.AllorOnlineMeetings.ReadWrite.All. - Ensure the
resourceis correctly formed with the properly URL-encodedjoinWebUrlas shown in the documentation example. - Respect the maximum
expirationDateTimeof 3 days for meeting call events subscriptions.
Once using the correct permission model and resource format, the API should return standard error payloads if there are other issues (for example, malformed resource string or invalid URL encoding).
References: