Hi everyone,
I'm working on a notification system that sends interactive Adaptive Cards to Microsoft Teams 1:1 chats using the Microsoft Graph API. I've got the authentication and message delivery working, but I'm stuck on handling button clicks.
What I have working
- I'm authenticating using username/password credentials and obtaining a delegated Microsoft Graph access token.
- Using that token, I'm able to create a 1:1 Teams chat and send an Adaptive Card to it.
- The card renders correctly in Teams.
- The message is sent through Microsoft Graph using a normal user account, not a Teams bot.
What I want to achieve
My Adaptive Card contains actions such as:
- Approve
- Reject
- Trigger an external API
When a user clicks one of these buttons, I want to make a POST request to my backend API immediately, ideally in the background, without opening a browser, webview, or another page.
What I've discovered so far
- "Action.OpenUrl" works, but it opens a URL. I could use this to redirect users to a confirmation page that triggers my backend, but I want to avoid this extra step.
- "Action.Submit" and "Action.Execute" don't appear to work for my scenario because the card was sent through Graph API by a user account rather than a bot. There is no bot endpoint to receive the interaction.
- Adaptive Cards don't appear to provide a standard "Action.Http" mechanism that lets a card sent through Teams invoke an arbitrary REST API directly.
From what I've read, the supported approach for handling these interactions seems to require a Teams bot.
My questions
Is there any supported way to trigger a backend REST API directly from an Adaptive Card button click without registering a Teams bot?
Is there any alternative mechanism in Microsoft Teams, Microsoft Graph, or Adaptive Cards that allows a silent/background API call from a card sent by a normal user account?
Has anyone implemented a similar approval workflow without a bot, while keeping the interaction entirely inside Teams?
If a bot is unavoidable, is there a lightweight approach that can handle only card interactions while leaving message delivery and the existing Graph API integration unchanged?
I'm specifically looking for a solution that doesn't open an external page when the user clicks Approve or Reject.
Any technical insights, documented alternatives, or real-world implementation examples would be greatly appreciated.
Thanks!