Thank you so much for your help @Sridhar M ,
But I did not find any email id for my BOT in Teams admin portal.For work around I have created a user for this bot. But I am not getting how to correlate the user to the bot.
This browser is no longer supported.
Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.
Hi everyone,
I've created an Azure Bot and successfully published it to Microsoft Teams via the Teams channel. My primary objective is for this bot to join scheduled meetings and provide real-time meeting insights, such as:
Camera (video) status
Microphone (mute/unmute) status
So far, I’ve:
Enabled the calling features for the bot
Added all the necessary Graph API permissions (e.g., Calls.AccessMedia.All, Calls.JoinGroupCall.All, etc.)
Currently, the bot is able to join 1:1 calls successfully. However, I’m unable to get the bot to appear or join in scheduled Teams meetings.
Has anyone implemented this successfully or could guide me on how to allow the bot to join scheduled meetings automatically (or via Graph APIs)?
Any help would be greatly appreciated!Hi everyone,
I've created an Azure Bot and successfully published it to Microsoft Teams via the Teams channel.
My primary objective is for this bot to join scheduled meetings and provide real-time meeting insights, such as:
Participant count
Camera (video) status
Microphone (mute/unmute) status
So far, I’ve:
Enabled the calling features for the bot
Added all the necessary Graph API permissions (e.g., Calls.AccessMedia.All, Calls.JoinGroupCall.All, etc.)
Currently, the bot is able to join 1:1 calls successfully.
However, I’m unable to get the bot to appear or join in scheduled Teams meetings.
Has anyone implemented this successfully or could guide me on how to allow the bot to join scheduled meetings automatically (or via Graph APIs)?
Any help would be greatly appreciated!
Hi Suprita Biswas,
Welcome to Microsoft Q&A and Thank you for reaching out.
Setting up your Azure Bot and publishing it to Microsoft Teams and trying to take the next step and making the bot automatically join scheduled Teams meetings to provide Realtime insights such as how many people are in the meeting, whether their cameras are on, and whether they're muted or unmuted.
Your bot can join 1:1 calls, which means the calling features are working and added all the necessary Microsoft Graph API permissions, including Calls.AccessMedia.All, Calls.JoinGroupCall.All, Calls.InitiateGroupCall.All, OnlineMeetings.Read.All. These are all required to enable calling and media access features.
Scheduled meetings are considered group calls, and bots can’t join them unless they’re explicitly invited or are told exactly when and how to join. That’s why your bot might not appear in scheduled meetings yet.
Step 1: Invite the Bot to the Meeting
First step is to make sure your bot is invited to the meeting. You can invite the bot in two ways:
Manually: Add the bot’s email when you create the meeting in Outlook or Teams.
Programmatically: Use Microsoft Graph’s createEvent or updateEvent API to include the bot’s email or service account as an attendee.
Step 2: Use Microsoft Graph to Join the Meeting
Once your bot has been invited, you can use the Microsoft Graph API to have it join the meeting. First need to retrieve the Join URL (or onlineMeetingId) of the meeting. Then, your bot can call the /communications/calls endpoint to join the call as a participant.
Step 3: Automatically Join Meetings on Time
To make the bot join meetings automatically, you’ll need to add some logic to your bot’s code. You can do this in two main ways:
This way, the bot can join meetings on time without manual input.
After the bot joins a meeting, you want it to monitor what’s happening in real time. To do this, it needs to listen to events like:
Who joins or leaves the meeting
Whether their microphone is muted or unmuted
Whether their camera is on or off
You can use the Bot Framework Calling SDK or Microsoft Graph Communications SDK to handle events such as participantUpdated, mediaStateChanged, and callStateChanged.
For the References:
https://learn.microsoft.com/en-us/graph/api/user-post-events?view=graph-rest-1.0&tabs=http
I Hope this helps. Do let me know if you have any further queries.
Thank you!
Hi @Sridhar M ,
I am now able to add the bot as an application into team scheduled meeting.
My main objective is to get the bot added into meetings and get the meeting details like participant details, camera status, mic status.
But I observed for that it should join the call.
Failed to join meeting: 403
ERROR:bot45:Response: {"error":{"code":"7505","message":"Request authorization tenant mismatch.","innerError":{"date":"2025-10-08T07:23:12","request-id":"513bc14e-9a39-4bda-9e42-e9f610d229f2","client-request-id":"513bc14e-9a39-4bda-9e42-e9f610d229f2"}}}
Thank you so much for your help @Sridhar M ,
But I did not find any email id for my BOT in Teams admin portal.For work around I have created a user for this bot. But I am not getting how to correlate the user to the bot.
Hi Suprita Biswas,
When a bot is created and registered for Microsoft Teams (using Azure Bot Service or Teams App Studio), it is treated as an application identity. bot does not appear in the Microsoft Teams admin center under "Users", nor is it assigned an email address by default. It will appear under "Enterprise Applications" in the Azure Active Directory portal.
Teams bots do not have a mailbox or email ID because they are intended to communicate within Teams using the Bot Framework, not through email. If you require your bot to send or receive emails, or perform user-based actions, an additional setup is required such as associating the bot with a user identity that has a mailbox.
To enable email or user-level operations, create a dedicated Microsoft 365 user account (Like ******@yourdomain.com). This user account can be assigned the necessary licenses and permissions to use Microsoft services like Exchange Online. please note that this account is not automatically linked to your Teams bot. It is a separate identity.
you will need to manually correlate the bot and the user within your application logic.
This is done by storing a reference in your backend (mapping the bot’s App ID to the user’s UPN or Object ID). This mapping allows your bot to act on behalf of the user via APIs such as Microsoft Graph, depending on the permissions granted.
Teams bots do not have email IDs because they are application identities. If email functionality or other user-specific actions are needed, create a separate user account is a valid workaround. However, linking this user to your bot requires custom implementation.
I Hope this helps. Do let me know if you have any further queries.
Thank you!
Hi @Sridhar M ,
Thank you for the detailed explanation. I completely agree that when an Azure bot is created, it acts as an application.
In Step 1, you mentioned two different methods: manual and programmatic. You also referenced email — could you please clarify what you meant by "email" in that context?
Hi Suprita Biswas,
where Email is the bot’s service account email/UPN registered in Azure AD.
Inviting this email is how you get the bot into the attendee list, then allows it to join the meeting and participate with calling capabilities.
Thank you!
Hi @Sridhar M ,
I tried mapping this, but it didn’t resolve the issue.
In my backend code, where I fetch the calendar event for the user I created, I updated the object ID to the bot's App ID. However, after this change, not only is the user no longer receiving the invite, but the code is also unable to fetch the calendar event.
In the code snippet below, the user_id parameter refers to the Azure AD user ID. I replaced it with the bot's App ID, but that resulted in an error.
Failed to fetch calendar events
[ERROR] Error getting calendar events: 404 [ERROR] Response: {"error":{"code":"ErrorInvalidUser","message":"The requested user 'c5529f37-fe40-476d-9bca-a539a6c41f65' is invalid."}}
async def _get_calendar_events(self, access_token: str, start_time: datetime, end_time: datetime):
try:
user_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
calendar_url = f"{self.graph_call_handler.graph_api_base}/users/{user_id}/calendar/calendarView"
params = {
"startDateTime": start_time.isoformat() + "Z",
"endDateTime": end_time.isoformat() + "Z",
"$select": "id,subject,start,end,attendees,onlineMeeting,organizer"
}
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json"
}
logger.debug(f"[GRAPH] Requesting calendar events from {calendar_url} with params {params}")
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.get(calendar_url, headers=headers, params=params)
logger.debug(f"[GRAPH] Calendar API responded with status {response.status_code}")
if response.status_code == 200:
all_events = response.json().get("value", [])
filtered_events = [e for e in all_events if e.get("onlineMeeting", {}).get("joinUrl")]
logger.debug(f"[GRAPH] Filtered {len(filtered_events)} online meetings from {len(all_events)} total events")
return filtered_events
else:
logger.error(f"[GRAPH] Calendar API returned {response.status_code}: {response.text}")
return []
except Exception as e:
logger.exception(f"[GRAPH] Failed to fetch calendar events: {e}")
return []
Hi Suprita Biswas,
The Microsoft Graph API endpoint /users/{user_id}/calendar/calendarView is specifically designed to retrieve calendar events for a valid Azure Active Directory (Azure AD) user. The {user_id} in this endpoint must refer to a real user account that has a mailbox associated with it typically identified by either their UserPrincipalName or Azure AD object ID.
In your implementation, you replaced the user_id with the bot's App ID (Client ID). App ID represents an application registration, not a user account. Application identities in Azure AD do not have mailboxes, calendars, or user profiles. Microsoft Graph cannot resolve the App ID as a valid user, and the request fails with the error: ErrorInvalidUser.
To correct this issue, you must use a valid user identifier in the API call one that belongs to an actual Azure AD user account with a mailbox. This could be the user’s email (UserPrincipalName) or their Azure AD object ID.
Ensure that your application has the appropriate permissions to access users’ calendars. If you're using delegated permissions, a signed-in user is required, and their token must include scopes like Calendars.Read
bot to manage its own calendar, you cannot use the App ID directly. Instead, you should assign the bot a shared mailbox, a resource calendar or even create a dedicated service user account like ******@yourtenant.com.
Error occurs because the App ID is not a valid user identifier for Microsoft Graph’s user-specific endpoints. You should always use a user ID that represents a real mailbox when calling calendar APIs.
Thank you!
Hi Suprita Biswas,
We haven’t heard from you on the last response and was just checking back to see if you have a resolution yet. In case if you have any resolution please do share that same with the community as it can be helpful to others. Otherwise, will respond with more details and we will try to help.
Thank you!
Hi @Sridhar M ,
The user which we created in Azure AD is different from service user account.
Is my understanding correct?
Hi Suprita Biswas,
yes,The user which we created in Azure AD is different from service user account.
Thank you!
Hi @Sridhar M ,
Thank you for your constant support.
I'm currently working on the approach you suggested. In parallel, I'm also exploring another approach where I add the bot as a meeting application. Once the meeting starts, we can see the option to add an app, and I'm leveraging that to integrate the bot into the meeting experience.
Please find the below screenshot:
but here also I get an error if I select one meeting it gives below error:
Is this approach correct? And also, why I am getting this error any idea about this?
Hi Suprita Biswas,
The error message “Something went wrong” typically occurs when the app being added doesn’t fully support the meeting context in Microsoft Teams. In this case, the problem is likely due to the current version of the bot not having the proper configuration in its app manifest to support being added to meetings.
Implement a fix by updating the app manifest to include the required meetingExtensionDefinition, which is necessary for the bot to be recognized as a valid meeting extension. This update will ensure that the bot can be added and used within scheduled Teams meetings.
once the updated version is available, and you should then be able to add the bot to meetings without encountering this error.
Thank you!
I am sharing my manifest file. Can you please check and let me know what is wrong in it.
{
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.16/MicrosoftTeams.schema.json",
"version": "1.0.4",
"manifestVersion": "1.16",
"id": "xxxxxxxxxxxxxxxxxxxx",
"name": {
"short": "Meghana-Development",
"full": "Meghana-Development AI Agent"
},
"developer": {
"name": "YYY Technology",
"mpnId": "1234",
"websiteUrl": "https://www.yyy.com/",
"privacyUrl": "https://www.yyy.com/",
"termsOfUseUrl": "https://www.yyy.com/"
},
"description": {
"short": "Task tracking and monitoring agent",
"full": "Help managers and department to track and monitor the task follow ups"
},
"icons": {
"outline": "outline.png",
"color": "color.png"
},
"accentColor": "#4B53BC",
"bots": [
{
"botId": "xxxxxxxxxxxxxxx",
"scopes": [
"personal",
"team",
"groupChat"
],
"commandLists": [
{
"commands": [
{
"title": "meeting",
"description": "Join the scheduled meetings"
}
],
"scopes": [
"team"
]
}
],
"isNotificationOnly": true,
"supportsCalling": true,
"supportsVideo": true,
"supportsFiles": true
}
],
"validDomains": [
"https://xxx.ngrok-free.app"
],
"webApplicationInfo": {
"id": "xxxxxxxxxxxxxxxxxxxx",
"resource": "https://graph.microsoft.com"
},
"devicePermissions": [
"media",
"notifications",
"midi",
"openExternal",
"geolocation"
],
"meetingExtensionDefinition": {
"scenes": [],
"supportsStreaming": true,
"supportsAnonymousGuestUsers": true
},
"authorization": {
"permissions": {
"resourceSpecific": [
{
"name": "Calls.AccessMedia.All",
"type": "Application"
},
{
"name": "Calls.JoinGroupCalls.All",
"type": "Application"
},
{
"name": "Calls.JoinGroupCallsAsGuest.All",
"type": "Application"
},
{
"name": "Calls.AccessMedia.Chat",
"type": "Application"
},
{
"name": "Calls.JoinGroupCalls.Chat",
"type": "Application"
},
{
"name": "OnlineMeeting.ReadBasic.Chat",
"type": "Application"
},
{
"name": "ChannelMessage.Read.Group",
"type": "Application"
},
{
"name": "OnlineMeetingParticipant.Read.Chat",
"type": "Delegated"
},
{
"name": "MeetingParticipantReaction.Read.User",
"type": "Delegated"
}
]
}
}
}
Hi Suprita Biswas,
The manifest should be corrected by addressing several key issues. The validDomains entry was updated to remove the URL scheme (https://) and now correctly includes only the domain (xxx.ngrok-free.app). The isNotificationOnly property was set to false because the bot includes features like calling, video, and file support, which are not allowed when isNotificationOnly is true. bot’s commandLists were originally limited to the "team" scope, so "personal" and "groupChat" were added to ensure the commands are available in all declared bot scopes. These changes bring the manifest in line with Microsoft Teams schema requirements
{
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.16/MicrosoftTeams.schema.json",
"version": "1.0.4",
"manifestVersion": "1.16",
"id": "xxxxxxxxxxxxxxxxxxxx",
"name": {
"short": "Meghana-Development",
"full": "Meghana-Development AI Agent"
},
"developer": {
"name": "YYY Technology",
"mpnId": "1234",
"websiteUrl": "https://www.yyy.com/",
"privacyUrl": "https://www.yyy.com/",
"termsOfUseUrl": "https://www.yyy.com/"
},
"description": {
"short": "Task tracking and monitoring agent",
"full": "Help managers and department to track and monitor the task follow ups"
},
"icons": {
"outline": "outline.png",
"color": "color.png"
},
"accentColor": "#4B53BC",
"bots": [
{
"botId": "xxxxxxxxxxxxxxx",
"scopes": [
"personal",
"team",
"groupChat"
],
"commandLists": [
{
"commands": [
{
"title": "meeting",
"description": "Join the scheduled meetings"
}
],
"scopes": [
"team",
"personal",
"groupChat"
]
}
],
"isNotificationOnly": false,
"supportsCalling": true,
"supportsVideo": true,
"supportsFiles": true
}
],
"validDomains": [
"xxx.ngrok-free.app"
],
"webApplicationInfo": {
"id": "xxxxxxxxxxxxxxxxxxxx",
"resource": "https://graph.microsoft.com"
},
"devicePermissions": [
"media",
"notifications",
"midi",
"openExternal",
"geolocation"
],
"meetingExtensionDefinition": {
"scenes": [],
"supportsStreaming": true,
"supportsAnonymousGuestUsers": true
},
"authorization": {
"permissions": {
"resourceSpecific": [
{
"name": "Calls.AccessMedia.All",
"type": "Application"
},
{
"name": "Calls.JoinGroupCalls.All",
"type": "Application"
},
{
"name": "Calls.JoinGroupCallsAsGuest.All",
"type": "Application"
},
{
"name": "Calls.AccessMedia.Chat",
"type": "Application"
},
{
"name": "Calls.JoinGroupCalls.Chat",
"type": "Application"
},
{
"name": "OnlineMeeting.ReadBasic.Chat",
"type": "Application"
},
{
"name": "ChannelMessage.Read.Group",
"type": "Application"
},
{
"name": "OnlineMeetingParticipant.Read.Chat",
"type": "Delegated"
},
{
"name": "MeetingParticipantReaction.Read.User",
"type": "Delegated"
}
]
}
}
}
Thank you!
Thank you for correction Sridhar.
Now will be my error go away with these changes or anything else is needed to do.
Hi @Sridhar M ,
I did the changes and updated the app package.
And now I can see there update now. But when I click on update now it gives me Something went wrong error.
I don't know why so.
Hi @Sridhar M ,
Also, about the service account user.
I have created the user with name meghana_ai with upn: ******@xxx.com.
And in additional license I can see this: Microsoft 365 Business Basic
Active
31/31
Direct
Can this user be called as service account user?
Hi Suprita Biswas,
YES, this user can be considered a service account, if you're using in Joining meetings to capture or transcribe audio using bots and sending automated messages or emails.
Hi Suprita Biswas,
Before updating your Microsoft Teams app, make sure to double-check your manifest.json file. Ensure that the version number is incremented for (example from 1.0.0 to 1.0.1), and confirm that the id remains the same as the original app to allow a proper update rather than being treated as a new app. After making these changes, recreate the .zip package carefully include only the manifest.json, color.png, and outline.png files at the root level of the ZIP, without nesting them inside a folder. Finally, upload the updated .zip file by navigating to Teams > Apps > Manage your app.
hi,
so, using this user account how I can proceed further.
Can you please give me a detailed step by step process for this approach
I did change the version number and followed the step you mentioned. Like creating zip and uploading it again.
but just few hours ago I did these changes but now also I am getting same error.
hi @Sridhar M ,
so, using this user account how I can proceed further. Can you please give me a detailed step by step process for this approach
I did change the version number and followed the step you mentioned. Like creating zip and uploading it again.
but just few hours ago I did these changes but now also I am getting same error.
Hi Suprita Biswas,
please Open Developer Tools in (Teams Web)
Go to https://teams.microsoft.com in Google Chrome (not the desktop app).
F12 or right-click → Inspect. Go to the Console and Network tabs. Now click "Update now" again.
Hi @Sridhar M ,
I can see 400 bad request error.
with response:
{"errorCode":"InvalidResourceSpecificPermission"}
Hi Suprita Biswas,
This error typically happens when:
Your Teams app manifest includes Resource-Specific Consent (RSC) permissions.
But one or more of the permissions are invalid, misspelled, or not supported for the resource type (like team, chat, or meeting).
Check the webApplicationInfo.resourceSpecific section in your manifest.json file. It should look something like this:
"webApplicationInfo": {
"id": "your-app-id",
"resource": "https://graph.microsoft.com",
"applicationPermissions": [],
"resourceSpecific": [
{
"name": "ChannelMessage.Read.Group",
"type": "Team"
},
{
"name": "TeamMember.Read.Group",
"type": "Team"
}
]
}
Reference:
https://learn.microsoft.com/en-us/microsoftteams/platform/graph-api/rsc/resource-specific-consent
"webApplicationInfo": {
"id": "xxxxx",
"resource": "https://graph.microsoft.com"
},
"devicePermissions": [
"media",
"notifications",
"midi",
"openExternal",
"geolocation"
],
"meetingExtensionDefinition": {
"scenes": [],
"supportsStreaming": true,
"supportsAnonymousGuestUsers": true
},
"authorization": {
"permissions": {
"resourceSpecific": [
{
"name": "Calls.JoinGroupCalls.All",
"type": "Application"
},
{
"name": "Calls.JoinGroupCallsAsGuest.All",
"type": "Application"
},
{
"name": "Calls.AccessMedia.Chat",
"type": "Application"
},
{
"name": "Calls.JoinGroupCalls.Chat",
"type": "Application"
},
{
"name": "OnlineMeeting.ReadBasic.Chat",
"type": "Application"
},
{
"name": "ChannelMessage.Read.Group",
"type": "Application"
},
{
"name": "OnlineMeetingParticipant.Read.Chat",
"type": "Delegated"
},
{
"name": "MeetingParticipantReaction.Read.User",
"type": "Delegated"
}
]
}
}
}
Hi Suprita Biswas,
The manifest currently includes the following permissions under resourceSpecific:
Calls.JoinGroupCalls.All
Calls.JoinGroupCallsAsGuest.All
Calls.AccessMedia.Chat
Calls.JoinGroupCalls.Chat
OnlineMeeting.ReadBasic.Chat
OnlineMeetingParticipant.Read.Chat
MeetingParticipantReaction.Read.User
These are Not valid RSC permissions.
Hi @Sridhar M ,
I am getting confused.
I will share my current manifest.
Can you help me in updating that.
That would be a great help.
Please find my manifest.json:
{
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.16/MicrosoftTeams.schema.json",
"version": "1.0.4",
"manifestVersion": "1.16",
"id": "xxx",
"name": {
"short": "Meghana-Development",
"full": "Meghana-Development AI Agent"
},
"developer": {
"name": "xxx xxx",
"mpnId": "1234",
"websiteUrl": "https://www.xxx.com/",
"privacyUrl": "https://www.xxx.com/",
"termsOfUseUrl": "https://www.xxx.com/"
},
"description": {
"short": "Task tracking and monitoring agent",
"full": "Help managers and department to track and monitor the task follow ups"
},
"icons": {
"outline": "outline.png",
"color": "color.png"
},
"accentColor": "#4B53BC",
"bots": [
{
"botId": "xxxx",
"scopes": [
"personal",
"team",
"groupChat"
],
"commandLists": [
{
"commands": [
{
"title": "meeting",
"description": "Join the scheduled meetings"
}
],
"scopes": [
"personal"
]
},
{
"commands": [
{
"title": "meeting",
"description": "Join the scheduled meetings"
},
{
"title": "meeting",
"description": "Join the scheduled meetings"
}
],
"scopes": [
"team"
]
}
],
"isNotificationOnly": false,
"supportsCalling": true,
"supportsVideo": true,
"supportsFiles": true
}
],
"validDomains": [
"xxx.ngrok-free.app",
"*"
],
"webApplicationInfo": {
"id": "xxxx",
"resource": "https://graph.microsoft.com"
},
"devicePermissions": [
"media",
"notifications",
"midi",
"openExternal",
"geolocation"
],
"meetingExtensionDefinition": {
"scenes": [],
"supportsStreaming": true,
"supportsAnonymousGuestUsers": true
},
"authorization": {
"permissions": {
"resourceSpecific": [
{
"name": "Calls.JoinGroupCalls.All",
"type": "Application"
},
{
"name": "Calls.JoinGroupCallsAsGuest.All",
"type": "Application"
},
{
"name": "Calls.AccessMedia.Chat",
"type": "Application"
},
{
"name": "Calls.JoinGroupCalls.Chat",
"type": "Application"
},
{
"name": "OnlineMeeting.ReadBasic.Chat",
"type": "Application"
},
{
"name": "ChannelMessage.Read.Group",
"type": "Application"
},
{
"name": "OnlineMeetingParticipant.Read.Chat",
"type": "Delegated"
},
{
"name": "MeetingParticipantReaction.Read.User",
"type": "Delegated"
}
]
}
}
}
Hey @Suprita Biswas
Did you get the solution of your issue? As am also facing the same issue and did all the possible changes into the code, settings and permission but it still throwing the same mismatch error.
If you are able to resolve this then please help me out as well.
Also, most of the AI tools suggested me to have the Enterprise licence of Microsoft 365 to have bot joined the scheduled meetings. Please confirm me if that is also something you did to make it work. Thanks in advance and waiting for your response.