From 4ee72e89fff533d434436351dfe1f5cb24634ffb Mon Sep 17 00:00:00 2001
From: Corina Gum <>
Date: Tue, 17 Mar 2026 15:45:28 -0700
Subject: [PATCH 1/3] Add documentation for quoted replies
---
.../sending-messages/csharp.incl.md | 80 ++++++++++++++++++
.../sending-messages/python.incl.md | 80 ++++++++++++++++++
.../sending-messages/typescript.incl.md | 82 +++++++++++++++++++
.../essentials/sending-messages/README.mdx | 36 +++++++-
4 files changed, 276 insertions(+), 2 deletions(-)
diff --git a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
index 9bc4775a6..9ce344c63 100644
--- a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
@@ -86,3 +86,83 @@ In .NET, reaction APIs are marked with `[Experimental("ExperimentalTeamsReaction
```
:::
+
+
+
+
+`GetQuotedMessages()`
+
+
+
+`Reply()`
+
+
+
+`QuoteReply()`
+
+
+
+`app.Send()`
+
+
+
+`AddQuotedReply()`
+
+
+
+```csharp
+app.OnMessage(async context =>
+{
+ var quotes = context.Activity.GetQuotedMessages();
+
+ if (quotes.Count > 0)
+ {
+ var quote = quotes[0].QuotedReply;
+ await context.Reply(
+ $"You quoted message {quote.MessageId} from {quote.SenderName}: \"{quote.Preview}\"");
+ }
+});
+```
+
+
+
+```csharp
+app.OnMessage(async context =>
+{
+ // Reply() automatically quotes the inbound message
+ await context.Reply("Got it!");
+});
+```
+
+
+
+```csharp
+app.OnMessage(async context =>
+{
+ // Quote a specific message by its ID
+ await context.QuoteReply("1772050244572", "Referencing an earlier message");
+});
+```
+
+
+
+```csharp
+// Single quote with response below it
+var msg = new MessageActivity()
+ .AddQuotedReply("1772050244572", "Here is my response");
+await app.Send(conversationId, msg);
+
+// Multiple quotes with interleaved responses
+var msg = new MessageActivity()
+ .AddQuotedReply("msg-1", "response to first")
+ .AddQuotedReply("msg-2", "response to second");
+await app.Send(conversationId, msg);
+
+// Grouped quotes — omit response to group quotes together
+var msg = new MessageActivity("see below for previous messages")
+ .AddQuotedReply("msg-1")
+ .AddQuotedReply("msg-2", "response to both");
+await app.Send(conversationId, msg);
+```
+
+
\ No newline at end of file
diff --git a/teams.md/src/components/include/essentials/sending-messages/python.incl.md b/teams.md/src/components/include/essentials/sending-messages/python.incl.md
index ddfb14fd8..9348b4fe2 100644
--- a/teams.md/src/components/include/essentials/sending-messages/python.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/python.incl.md
@@ -67,5 +67,85 @@ async def handle_message(ctx: ActivityContext[MessageActivity]):
```
+N/A
+N/A
+
+
+
+`get_quoted_messages()`
+
+
+
+`reply()`
+
+
+
+`quote_reply()`
+
+
+
+`app.send()`
+
+
+
+`add_quoted_reply()`
+
+
+
+```python
+@app.on_message
+async def handle_message(ctx: ActivityContext[MessageActivity]):
+ quotes = ctx.activity.get_quoted_messages()
+
+ if quotes:
+ quote = quotes[0].quoted_reply
+ await ctx.reply(
+ f"You quoted message {quote.message_id} from {quote.sender_name}: \"{quote.preview}\""
+ )
+```
+
+
+
+```python
+@app.on_message
+async def handle_message(ctx: ActivityContext[MessageActivity]):
+ # reply() automatically quotes the inbound message
+ await ctx.reply("Got it!")
+```
+
+
+
+```python
+@app.on_message
+async def handle_message(ctx: ActivityContext[MessageActivity]):
+ # Quote a specific message by its ID
+ await ctx.quote_reply("1772050244572", "Referencing an earlier message")
+```
+
+
+
+```python
+from microsoft_teams.api.activities.message import MessageActivityInput
+
+# Single quote with response below it
+msg = (MessageActivityInput()
+ .add_quoted_reply("1772050244572", "Here is my response"))
+await app.send(conversation_id, msg)
+
+# Multiple quotes with interleaved responses
+msg = (MessageActivityInput()
+ .add_quoted_reply("msg-1", "response to first")
+ .add_quoted_reply("msg-2", "response to second"))
+await app.send(conversation_id, msg)
+
+# Grouped quotes — omit response to group quotes together
+msg = (MessageActivityInput(text="see below for previous messages")
+ .add_quoted_reply("msg-1")
+ .add_quoted_reply("msg-2", "response to both"))
+await app.send(conversation_id, msg)
+```
+
+
+N/A
diff --git a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
index 920a47873..26c0f4bd0 100644
--- a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
@@ -61,5 +61,87 @@ app.on('message', async ({ send, activity }) => {
```
+N/A
+N/A
+
+
+
+
+`getQuotedMessages()`
+
+
+
+`reply()`
+
+
+
+`quoteReply()`
+
+
+
+`app.send()`
+
+
+
+`addQuotedReply()`
+
+
+
+```typescript
+app.on('message', async ({ activity, reply }) => {
+ const quotes = activity.getQuotedMessages();
+
+ if (quotes.length > 0) {
+ const quote = quotes[0].quotedReply;
+ await reply(
+ `You quoted message ${quote.messageId} from ${quote.senderName}: "${quote.preview}"`
+ );
+ }
+});
+```
+
+
+
+```typescript
+app.on('message', async ({ reply }) => {
+ // reply() automatically quotes the inbound message
+ await reply('Got it!');
+});
+```
+
+
+
+```typescript
+app.on('message', async ({ quoteReply }) => {
+ // Quote a specific message by its ID
+ await quoteReply('1772050244572', 'Referencing an earlier message');
+});
+```
+
+
+
+```typescript
+import { MessageActivity } from '@microsoft/teams.api';
+
+// Single quote with response below it
+const msg = new MessageActivity()
+ .addQuotedReply('1772050244572', 'Here is my response');
+await app.send(conversationId, msg);
+
+// Multiple quotes with interleaved responses
+const msg = new MessageActivity()
+ .addQuotedReply('msg-1', 'response to first')
+ .addQuotedReply('msg-2', 'response to second');
+await app.send(conversationId, msg);
+
+// Grouped quotes — omit response to group quotes together
+const msg = new MessageActivity('see below for previous messages')
+ .addQuotedReply('msg-1')
+ .addQuotedReply('msg-2', 'response to both');
+await app.send(conversationId, msg);
+```
+
+
+N/A
\ No newline at end of file
diff --git a/teams.md/src/pages/templates/essentials/sending-messages/README.mdx b/teams.md/src/pages/templates/essentials/sending-messages/README.mdx
index 5ffbf4058..4db938c6c 100644
--- a/teams.md/src/pages/templates/essentials/sending-messages/README.mdx
+++ b/teams.md/src/pages/templates/essentials/sending-messages/README.mdx
@@ -50,7 +50,6 @@ To send a targeted message when responding to an incoming activity, use the
-### Targeted messages in preview
## Reactions
@@ -61,6 +60,39 @@ Reactions are currently in preview.
Reactions allow your agent to add or remove emoji reactions on messages in a conversation. The reactions client is available via the API client.
-### Reactions in preview
+
+## Quoted Replies
+
+:::info[Preview]
+Quoted replies are currently in preview.
+:::
+
+Quoted replies let your agent reference a previous message in the conversation. When a user sends a message that quotes another message, your agent receives structured metadata about the quoted content. Your agent can also send messages that quote previous messages.
+
+### Receiving Quoted Replies
+
+When a user quotes a message and sends it to your agent, the quoted reply metadata is available on the inbound activity. Use the method to access all quoted reply entities.
+
+
+
+Each quoted reply entity contains the quoted message's ID, sender information, a preview of the quoted text, and whether the quoted message has been deleted.
+
+### Sending a Quoted Reply
+
+When your agent calls , the SDK automatically stamps a quoted reply entity referencing the inbound message. No extra code is needed — the reply will appear as a quoted reply in Teams.
+
+
+
+To quote a different message in the same conversation (not the inbound message), use the method with the message ID you want to quote.
+
+
+
+### Building Quoted Replies for Proactive Send
+
+For proactive scenarios (using ) or when quoting multiple messages, use the method on a message activity. Pass the message ID and an optional response text.
+
+
+
+
\ No newline at end of file
From b4dc892f3f9e6de1c58a444082e3df9ecc2f0d76 Mon Sep 17 00:00:00 2001
From: Corina Gum <>
Date: Mon, 23 Mar 2026 16:44:15 -0700
Subject: [PATCH 2/3] Fix quoted replies doc examples
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Fix variable redeclaration in builder examples (TS: const→let, C#: drop duplicate var)
- Add .NET ExperimentalTeamsQuotedReplies preview note matching targeted/reactions pattern
Co-Authored-By: Claude Opus 4.6 (1M context)
---
.../essentials/sending-messages/csharp.incl.md | 16 +++++++++++++---
.../sending-messages/typescript.incl.md | 6 +++---
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
index 9ce344c63..7c9a471cf 100644
--- a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
@@ -153,16 +153,26 @@ var msg = new MessageActivity()
await app.Send(conversationId, msg);
// Multiple quotes with interleaved responses
-var msg = new MessageActivity()
+msg = new MessageActivity()
.AddQuotedReply("msg-1", "response to first")
.AddQuotedReply("msg-2", "response to second");
await app.Send(conversationId, msg);
// Grouped quotes — omit response to group quotes together
-var msg = new MessageActivity("see below for previous messages")
+msg = new MessageActivity("see below for previous messages")
.AddQuotedReply("msg-1")
.AddQuotedReply("msg-2", "response to both");
await app.Send(conversationId, msg);
```
-
\ No newline at end of file
+
+
+:::tip[.NET]
+In .NET, quoted reply APIs are marked with `[Experimental("ExperimentalTeamsQuotedReplies")]` and will produce a compiler error until you opt in. Suppress the diagnostic inline with `#pragma warning disable ExperimentalTeamsQuotedReplies` or project-wide in your `.csproj`:
+
+```xml
+
+ $(NoWarn);ExperimentalTeamsQuotedReplies
+
+```
+:::
\ No newline at end of file
diff --git a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
index 26c0f4bd0..6f9777760 100644
--- a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
@@ -126,18 +126,18 @@ app.on('message', async ({ quoteReply }) => {
import { MessageActivity } from '@microsoft/teams.api';
// Single quote with response below it
-const msg = new MessageActivity()
+let msg = new MessageActivity()
.addQuotedReply('1772050244572', 'Here is my response');
await app.send(conversationId, msg);
// Multiple quotes with interleaved responses
-const msg = new MessageActivity()
+msg = new MessageActivity()
.addQuotedReply('msg-1', 'response to first')
.addQuotedReply('msg-2', 'response to second');
await app.send(conversationId, msg);
// Grouped quotes — omit response to group quotes together
-const msg = new MessageActivity('see below for previous messages')
+msg = new MessageActivity('see below for previous messages')
.addQuotedReply('msg-1')
.addQuotedReply('msg-2', 'response to both');
await app.send(conversationId, msg);
From 9323eabdbbb6a149b734434b80b9aa32f125978a Mon Sep 17 00:00:00 2001
From: Corina Gum <14900841+corinagum@users.noreply.github.com>
Date: Thu, 26 Mar 2026 16:43:02 -0700
Subject: [PATCH 3/3] Update docs to reflect renamed quote methods
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
quoteReply → quote, addQuotedReply → addQuote across all three languages.
Co-Authored-By: Claude Opus 4.6 (1M context)
---
.../essentials/sending-messages/csharp.incl.md | 16 ++++++++--------
.../essentials/sending-messages/python.incl.md | 16 ++++++++--------
.../sending-messages/typescript.incl.md | 18 +++++++++---------
3 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
index 7c9a471cf..c8fade896 100644
--- a/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/csharp.incl.md
@@ -98,7 +98,7 @@ In .NET, reaction APIs are marked with `[Experimental("ExperimentalTeamsReaction
-`QuoteReply()`
+`Quote()`
@@ -106,7 +106,7 @@ In .NET, reaction APIs are marked with `[Experimental("ExperimentalTeamsReaction
-`AddQuotedReply()`
+`AddQuote()`
@@ -140,7 +140,7 @@ app.OnMessage(async context =>
app.OnMessage(async context =>
{
// Quote a specific message by its ID
- await context.QuoteReply("1772050244572", "Referencing an earlier message");
+ await context.Quote("1772050244572", "Referencing an earlier message");
});
```
@@ -149,19 +149,19 @@ app.OnMessage(async context =>
```csharp
// Single quote with response below it
var msg = new MessageActivity()
- .AddQuotedReply("1772050244572", "Here is my response");
+ .AddQuote("1772050244572", "Here is my response");
await app.Send(conversationId, msg);
// Multiple quotes with interleaved responses
msg = new MessageActivity()
- .AddQuotedReply("msg-1", "response to first")
- .AddQuotedReply("msg-2", "response to second");
+ .AddQuote("msg-1", "response to first")
+ .AddQuote("msg-2", "response to second");
await app.Send(conversationId, msg);
// Grouped quotes — omit response to group quotes together
msg = new MessageActivity("see below for previous messages")
- .AddQuotedReply("msg-1")
- .AddQuotedReply("msg-2", "response to both");
+ .AddQuote("msg-1")
+ .AddQuote("msg-2", "response to both");
await app.Send(conversationId, msg);
```
diff --git a/teams.md/src/components/include/essentials/sending-messages/python.incl.md b/teams.md/src/components/include/essentials/sending-messages/python.incl.md
index 9348b4fe2..d8c0fa790 100644
--- a/teams.md/src/components/include/essentials/sending-messages/python.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/python.incl.md
@@ -82,7 +82,7 @@ N/A
-`quote_reply()`
+`quote()`
@@ -90,7 +90,7 @@ N/A
-`add_quoted_reply()`
+`add_quote()`
@@ -121,7 +121,7 @@ async def handle_message(ctx: ActivityContext[MessageActivity]):
@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
# Quote a specific message by its ID
- await ctx.quote_reply("1772050244572", "Referencing an earlier message")
+ await ctx.quote("1772050244572", "Referencing an earlier message")
```
@@ -131,19 +131,19 @@ from microsoft_teams.api.activities.message import MessageActivityInput
# Single quote with response below it
msg = (MessageActivityInput()
- .add_quoted_reply("1772050244572", "Here is my response"))
+ .add_quote("1772050244572", "Here is my response"))
await app.send(conversation_id, msg)
# Multiple quotes with interleaved responses
msg = (MessageActivityInput()
- .add_quoted_reply("msg-1", "response to first")
- .add_quoted_reply("msg-2", "response to second"))
+ .add_quote("msg-1", "response to first")
+ .add_quote("msg-2", "response to second"))
await app.send(conversation_id, msg)
# Grouped quotes — omit response to group quotes together
msg = (MessageActivityInput(text="see below for previous messages")
- .add_quoted_reply("msg-1")
- .add_quoted_reply("msg-2", "response to both"))
+ .add_quote("msg-1")
+ .add_quote("msg-2", "response to both"))
await app.send(conversation_id, msg)
```
diff --git a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
index 6f9777760..53c019cca 100644
--- a/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
+++ b/teams.md/src/components/include/essentials/sending-messages/typescript.incl.md
@@ -77,7 +77,7 @@ N/A
-`quoteReply()`
+`quote()`
@@ -85,7 +85,7 @@ N/A
-`addQuotedReply()`
+`addQuote()`
@@ -114,9 +114,9 @@ app.on('message', async ({ reply }) => {
```typescript
-app.on('message', async ({ quoteReply }) => {
+app.on('message', async ({ quote }) => {
// Quote a specific message by its ID
- await quoteReply('1772050244572', 'Referencing an earlier message');
+ await quote('1772050244572', 'Referencing an earlier message');
});
```
@@ -127,19 +127,19 @@ import { MessageActivity } from '@microsoft/teams.api';
// Single quote with response below it
let msg = new MessageActivity()
- .addQuotedReply('1772050244572', 'Here is my response');
+ .addQuote('1772050244572', 'Here is my response');
await app.send(conversationId, msg);
// Multiple quotes with interleaved responses
msg = new MessageActivity()
- .addQuotedReply('msg-1', 'response to first')
- .addQuotedReply('msg-2', 'response to second');
+ .addQuote('msg-1', 'response to first')
+ .addQuote('msg-2', 'response to second');
await app.send(conversationId, msg);
// Grouped quotes — omit response to group quotes together
msg = new MessageActivity('see below for previous messages')
- .addQuotedReply('msg-1')
- .addQuotedReply('msg-2', 'response to both');
+ .addQuote('msg-1')
+ .addQuote('msg-2', 'response to both');
await app.send(conversationId, msg);
```