Share via

How does a delegated 3rd-party AAD app set a custom-emoji reaction on a Teams chatMessage via Graph?

Goncalo Luiz 0 Reputation points
2026-05-03T15:48:16.1533333+00:00

Summary

Microsoft Graph stores custom-emoji reactions on a chatMessage with the shape {reactionType: "custom", displayName, reactionContentUrl} — confirmed by GET /v1.0/teams/{teamId}/channels/{channelId}/messages/{messageId} (sample below). Microsoft documentation explicitly notes "Custom reactions are only available on the /beta endpoint" in the Teams messaging overview.

However, I cannot find any documented Graph API call that a delegated 3rd-party AAD app can make to WRITE such a reaction. Every body shape I have tried against POST /setReaction returns 400 with "Unicode '<value>' in the payload is not supported". The setReaction reference page (both v1.0 and beta) only documents Unicode reactionType and shows only Unicode examples — but the same docs site documents the custom-reaction storage shape, so there must be a write path. What is it?

Environment

  • Tenant ID: 096cd05e-4e07-4332-9016-90c48d0779c4
  • 3rd-party AAD app (delegated): d8a11c96-307d-4e8f-aa5e-9aff35500e59 ("tlack")
  • Permissions granted (delegated): ChannelMessage.Send, Chat.ReadWrite, ChannelMessage.Read.All, Channel.ReadBasic.All, Team.ReadBasic.All, plus standard sign-in scopes.
  • Token audience used in the failing requests: https://graph.microsoft.com (the standard Graph audience).
  • Token claims include xms_cc=CP1 (CAE-capable), idtyp=user, appidacr=0, scp=...ChannelMessage.Send Chat.ReadWrite....

What Graph stores when Teams web sets the reaction (canonical READ shape)

GET /v1.0/teams/{teamId}/channels/{channelId}/messages/{messageId} for a message reacted to via Teams web client returns:


{

  "reactions": [{

    "reactionType": "custom",

    "displayName": "tsignal",

    "reactionContentUrl": "https://graph.microsoft.com/v1.0/teams/{teamId}/channels/{channelId}/messages/{messageId}/hostedContents/aWQ9MC13dWstZDItZjM4MjU3YzBmYmEyZDI5ODFlYzJhMzY4YzVjZjE4NTMsdHlwZT0xLHVybD0=/$value",

    "createdDateTime": "2026-05-03T14:37:23.278Z",

    "user": { "...": "aadUser" }

  }]

}

The base64 in reactionContentUrl decodes to id=0-wuk-d2-f38257c0fba2d2981ec2a368c5cf1853,type=1,url= — the Teams hostedContents reaction-format envelope.

All write attempts (direct curl, with Microsoft request-ids for log lookup)

All 13 attempts use the same delegated bearer token described above. DataCenter on every response was "UK South" per x-ms-ags-diagnostic.

| # | Verb | URL | Body | Response | Microsoft request-id |

|---|---|---|---|---|---|

| 1 | POST | /v1.0/teams/.../setReaction | {"reactionType":"custom"} | 400 Unicode 'custom' in the payload is not supported | 6b16fb49-4393-4532-9cf1-9ac4069a86c1 |

| 2 | POST | /beta/teams/.../setReaction | {"reactionType":"custom"} | 400 same | 3889e920-240c-4b11-a259-87c32c02a918 |

| 3 | POST | /beta/teams/.../setReaction | {"reactionType":"custom","customEmoji":{"id":"<GUID>","alt":"tsignal"}} | 400 same | 3d0dc00d-3cf4-47f8-bd89-4b14de664b62 |

| 4 | POST | /v1.0/teams/.../setReaction | {"reactionType":"custom","displayName":"tsignal","reactionContentUrl":"<canonical /v1.0 URL>"} | 400 same | 0ec706ff-7678-4c89-a3a1-f3068d34d1d4 |

| 5 | POST | /beta/teams/.../setReaction | same body, canonical URL pointing to /beta | 400 same | 2eef3453-84c0-40c7-b594-7b6f1c7bae56 |

| 6 | POST | /v1.0/teams/.../setReaction | {"reactionType":"emoji","reactionContent":"<GUID>"} | 400 Unicode 'emoji' in the payload is not supported | befa3d68-c71f-4a7f-af44-253197af6748 |

| 7 | POST | /beta/teams/.../setReaction | same emoji-shape body | 400 Unicode 'emoji' | 7a55e52f-a24e-4a0f-99d6-ae9f5038060a |

| 8 | PATCH | /beta/teams/.../messages/{id} | {"reactions":[...]} | 400 Missing body content | 71bbb90a-2458-466b-82f7-6abe2f39b4cb |

| 9 | POST | /beta/teams/.../messages/{id}/reactions | (anything) | 405 Method Not Allowed | 5e18e4b5-df66-45ad-a9c2-9971e4fd38cb |

| 10 | GET | /beta/teams/.../messages/{id}/reactions | — | 404 Requested API is not supported | afb67ea1-b22c-44b5-8ce4-5df5c4415c5b |

| 11 | PUT | /beta/teams/.../messages/{id}/reactions | bare array | 400 JSON payload is expected to have a top-level property 'value' which should be an array | fa4cd694-f74c-4fd5-9533-b0f4081359e4 |

| 12 | PATCH | /beta/teams/.../messages/{id} | {"body": <unchanged>, "reactions":[...]} | 400 Unicode 'custom' in the payload is not supported | cb7a4ce9-c7c4-46f1-bf0b-18a84f312cad |

| 13 | PUT | /beta/teams/.../messages/{id}/reactions | {"value":[...]} (per error in #11) | 405 Method Not Allowed | bb75d491-d42e-4bcd-88c4-8ec8a97426c4 |

Specific questions

  1. What is the canonical Graph API request (verb, URL, headers, body) that a delegated 3rd-party AAD app should make to set a custom-emoji reaction (reactionType: "custom") on a chatMessage, when the user has ChannelMessage.Send / Chat.ReadWrite consent?
  2. The setReaction reference (both v1.0 and beta) only documents Unicode reactionType. Are custom reactions writable through this action at all, or is the write path elsewhere?
  3. The /beta/.../messages/{messageId}/reactions URL responds (405 to POST/PUT, 400 to PUT-with-value-wrapper, 404 to GET), implying the path is recognised. What method/body is it expecting?
  4. If the answer is "this is not currently writable for delegated 3rd-party apps", please confirm , and if so, is it on the roadmap?

Thanks!

Microsoft Teams | Microsoft Teams for business | Chats | Other
0 comments No comments

2 answers

Sort by: Most helpful
  1. Vy Nguyen 10,400 Reputation points Microsoft External Staff Moderator
    2026-05-03T22:36:34.09+00:00

    Hi @Goncalo Luiz

    I hope you are doing well today. 

    Thank you for the thorough details regarding adding a custom emoji reaction to a Teams chatMessage through Microsoft Graph using a delegated third party Entra ID application. 

    Based on the behavior and the error responses you shared, the setReaction action currently accepts only a Unicode emoji value in the reactionType field, and the service will reject non Unicode values such as custom or emoji. Custom reactions can be returned in the reactions collection after they are created by Teams clients, but Microsoft Graph does not currently provide a documented or supported write operation for third party delegated apps to create that same custom reaction shape. 

    Below are some practical workarounds that will suit your situation, with clear steps for each. 

    1/ Use Unicode reactions through setReaction as the supported write path 

    • Choose the Unicode emoji character you want to set, for example 💘 or 👍, and ensure the request body contains the actual Unicode character or a valid Unicode escape sequence. 
    • Send the request to the supported endpoint for your message location. 
    For a channel message: POST https://graph.microsoft.com/v1.0/teams/{teamId}/channels/{channelId}/messages/{messageId}/setReaction  For a chat message: POST https://graph.microsoft.com/v1.0/chats/{chatId}/messages/{messageId}/setReaction 
    
    • Use this JSON body and include Content Type: application/json; charset=utf-8 in headers.  Example body: { "reactionType": "💘" } 
    • Validate by calling GET on the message and confirming the reactions array now includes the Unicode reaction entry created by the calling user. 
    • Reference: chatMessage: setReaction - Microsoft Graph v1.0 | Microsoft Learn 

    2/ Provide a custom emoji experience by placing the custom emoji in the message body instead of a reaction 

    • Post a short follow up message or reply that contains the custom emoji rendered in the HTML body, using the Teams supported <customemoji> element that Graph can represent when reading messages. 
    • Host the image that will be referenced by the message content using Teams hosted content for the message, then reference that hosted content URL in the source attribute of the <customemoji> tag. 
    • Send the message with HTML content that includes the <customemoji> element so the user sees the custom emoji inline, achieving the same visual intent as a reaction even though it is not stored as a reaction. 
    • Confirm in Teams client that the emoji renders, then verify via GET that the message body includes the <customemoji> markup and the hosted content reference. 
    • Reference: Working with Microsoft Teams messaging APIs in Microsoft Graph - Microsoft Graph | Microsoft Learn 

    Regarding your four specific questions, please find the answers below. 

    • There is currently no canonical Graph API request that allows a delegated third-party AAD app to set a custom emoji reaction. The API enforces Unicode validation on the reactionType field, and since "custom" does not meet that requirement, no body shape or additional properties will produce a successful response at this time. 
    • Custom reactions are not writable through setReaction or any other currently published Microsoft Graph endpoint. The read shape visible in GET responses is populated solely by the Teams client through internal APIs, and there is no alternative external write path available today. 
    • Based on the response pattern observed across all 13 attempts, the reactions sub-resource path appears to be a registered routing stub that does not yet have an active backend handler. This is why different methods return different error codes without any successful outcome, regardless of the request body provided. 
    • Writing a custom emoji reaction through Microsoft Graph is not supported for any caller type at this time. While this feature does not yet appear as a published item on the Microsoft 365 Roadmap, the presence of the recognized routing stub suggests development may be underway.  

    Alternatively, as a forum moderator, I hope you understand that I don’t have the ability to modify or escalate product issues directly. The "New Outlook" is still very much a work in progress, and Microsoft frequently adds back legacy features based on user feedback. However, I strongly recommend submitting your feedback through the Microsoft Teams · Community.This is the most effective way to ensure your voice reaches the product team and can be considered about how company-only contacts are handled in search results, with potential improvements being considered  for future improvements.        

    You've clearly identified a real-world challenge, and your suggestion reflects a deep understanding of user needs - feedback like yours is truly valuable and helps shape the future of Microsoft team.    

    User's imageOnce you’ve submitted your feedback, feel free to share the link here. I’d be happy to upvote it to help increase its visibility.  Moreover, if you are unable to submit feedback, please inform me at your convenience. In that case, I will gladly assist by submitting it on your behalf to ensure your request is properly captured.           

    Additionally, as other users have raised similar concerns and may not be aware of where to share their feedback, I hope this response helps clarify the situation and suggests a potential next step. Highlighting this information can make it more visible to others in the community who may be facing the same issue, making it easier for them to find guidance and contribute their feedback as well.     

    Thank you again for your time and for raising this important usability concern. If you have any further questions or need additional assistance, please don’t hesitate to reach out.     

    Wishing you a smooth rest of your day. 


    If the answer is helpful, please click "Accept Answer" and kindly upvote it. If you have any extra questions about this answer, please click "Comment".              

    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread. 

    0 comments No comments

  2. Q&A Assist
    2026-05-03T15:48:39.49+00:00
    AI generated content. This question contains an answer created with AI from Q&A Assist. Learn more

    Custom emoji reactions on Teams chatMessage resources are currently not writable via Microsoft Graph for delegated third‑party apps.

    From the available documentation:

    • The chatMessage: setReaction action (both v1.0 and beta) only accepts a Unicode reactionType value in the request body. The documented request body is a single property:
        POST /teams/{teamId}/channels/{channelId}/messages/{messageId}/setReaction
        POST /teams/{teamId}/channels/{channelId}/messages/{messageId}/replies/{replyId}/setReaction
        POST /chats/{chatId}/messages/{chatMessageId}/setReaction
      
        {
          "reactionType": "<unicode emoji>"
        }
      
      and the docs explicitly state: “In the request body, supply the reactionType as unicode.”
    • The corresponding chatMessage: unsetReaction action has the same constraint: the request body is only reactionType as Unicode.
    • The Teams messaging overview describes the reactions property on chatMessage, including an example that mentions custom reactions and notes:

      Custom reactions are only available on the /beta endpoint.

    • There is no documented Graph action or collection on chatMessage (including /messages/{id}/reactions) that accepts a payload with reactionType: "custom", displayName, or reactionContentUrl, nor any alternative write API for reactions beyond setReaction/unsetReaction with Unicode values.
    • The only other reaction-related write API in the context is plannerTaskChatMessage: setReaction (beta), which also only accepts a simple reactionType string such as "like" and does not expose custom emoji semantics.

    Given this, the questions map to what is documented as follows:

    1. Canonical Graph request for reactionType: "custom" on chatMessage with delegated permissions No canonical or supported Graph request is documented that allows setting a reactionType: "custom" reaction on a Teams chatMessage for a delegated third‑party app. The only supported shape for chatMessage setReaction is a Unicode reactionType value, and the examples show only standard emoji.
    2. Whether custom reactions are writable via setReaction or elsewhere Based on the documented contract for chatMessage: setReaction and chatMessage: unsetReaction, custom reactions are not exposed as a writable surface. The actions only accept Unicode reactionType values, and there is no alternative documented write path (no supported reactions collection or PATCH semantics for reactions on chatMessage).
    3. Expected method/body for /beta/.../messages/{messageId}/reactions The context does not document any reactions subresource or methods (GET/POST/PUT/PATCH) on /messages/{messageId}/reactions for Teams chatMessage. As such, no supported method or body shape can be provided from the documentation.
    4. Confirmation and roadmap From the available documentation, custom reactions are readable (as part of the reactions property on chatMessage on the /beta endpoint) but not writable via any documented Microsoft Graph API for delegated third‑party apps. No roadmap or future support statement for writing custom reactions is provided in the referenced materials.

    References:

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.