# Team Chat API and webhook privacy updates ## Team Chat API and Webhook privacy updates On March 18th, 2023, Zoom changed the behavior of the Zoom Team Chat API and Webhooks. From now on, the IDs of external users are empty. Identifiers only have values if they are users under your account. We recommend that developers leverage the new `member_id` field in the response. ## Affected user level APIs **GET `/chat/users/{userId}/messages`** Added `sender_member_id` and `at_items.at_contact_member_id` fields. These fields have a `memberID` as value in the response. The return `at_items.at_contact` returns an empty response for external users. **GET `/chat/users/{userId}/messages/{messageId}`** Added `reactions.member_ids` and `sender_member_id` fields to the response. `Reactions.member_ids` are an array of memberIDs, while `sender_member_id` is a single `memberID`. The `at_items.at_contact` returns an empty string for external users. The `at_items.at_contact_member_id` has `memberID` as a value. **GET `/chat/channels/{channelId}/members`** Added `members.member_id` field to the response with `memberID` as the value. When the member is not from the same account as the channel owner, the `members.id` field returns an empty string. **GET `/chat/users/me/contacts/{contactId}`** Added `member_id` field to the response with `memberID` as the value. When the `memberID` is a path parameter, the member’s contact details are returned in the response. **GET `/chat/users/{userId}/channels/{channelId}/admins`** Added `admins.member_id` field to the response with `memberID` as the value. When the admin is not from the same account as the channel owner, the `admins.id` field returns an empty string. **DELETE `/chat/channels/{channelId}/members/{memberId}`** When you remove a member or batch remove members and the `memberID` is the path parameter and the caller has required permissions, then that channel member should be removed. **PATCH `/chat/users/{userId}/messages/{messageId}/status`** When you mark a message read or unread, the `to_contact` field supports `memberID` as input. **PUT `/chat/users/{userId}/messages/{messageId}`** When you update a message, the `to_contact` field supports `memberID` as input. **POST `/chat/channels/{channelId}/members`** When you invite channel members, the `new member_ids` field is returned with the `memberID` array as the value in the response. **POST `/chat/channels/{channelId}/members/me`** When you join a channel, the new `member_id` field is returned with the `memberID` as the value in the response. **GET `/contacts`** When you search company contacts, the `new member_ids` field returns with the `memberID` as the value in the response. **GET `/chat/users/me/contacts`** When you list a user’s contacts, the `new member_ids` field returns with the `memberID` as value in the response. **GET `/chat/users/me/contacts/{contactId}`** Added the `member_id` field with `memberID` as the value in the response. When called with `memberID` as path parameter, the member’s contact details return in the response. **GET `/chat/users/{userId}/messages`** When you list a user's chat messages, the `to_contact` field should support `memberID` as input. **GET `/chat/users/{userId}/messages/{messageId}`** When you get a message, the `to_contact` field should support `memberID` as input. ## Affected account level APIs **GET `/report/chat/sessions/{sessionId}`** When you get chat messages reports, the new `sender_member_id` field returns with `memberID` as the value in the response. **GET `/chat/users/{userId}/channels/{channelId}/admins`** When you list channel administrators and the admin is not from the same account as the channel owner, the `admins.id` field should return an empty string. **GET `/chat/users/{userId}/channels/{channelId}/admins`** When you list channel administrators, the new `admins.member_id` field returns with `memberID` as value in the response. **GET `/chat/users/{userId}/channels/{channelId}/members`** Added `members.member_id` field with `memberID` as the value in the response. When the member is not from the same account as the channel owner, the `members.id` field should return an empty string. **DELETE `/chat/users/{userId}/channels/{channelId}/members/{memberId}`** When you remove a member with the `memberID` as path parameter, and the caller has required permissions, the channel member should be removed. **DELETE `/chat/users/{userId}/channels/{channelId}/admins`** When you batch demote channel administrators with the administrators’ `memberID` in the `adminIds` parameter, and the caller has the required permissions, those channel administrators should be demoted to channel members. **POST `/chat/users/{userId}/channels/{channelId}/admins`** When you promote channel members to administrators, the new `member_ids` field returns with the `memberID` array as the value in the response. **POST `/chat/users/{userId}/channels/{channelId}/members`** When you invite channel members, the new `member_ids` field returns with the `memberID` array as the value in the response. ## Webhooks chat_channel webhook - A new field `payload.object.members.member_id`\_ is added to [chat_channel.created](/docs/api/team-chat/events/#tag/chat_channel/POSTchat_channel.created), [chat_channel.member_invited](/docs/api/team-chat/events/#tag/chat_channel/POSTchat_channel.member_invited), and [chat_channel.member_removed](/docs/api/team-chat/events/#tag/chat_channel/POSTchat_channel.member_removed) event payloads. The value of the field is `memberID`. - If the member is not from the same account as the operator or initiator of the action, then [chat_channel.created](/docs/api/team-chat/events/#tag/chat_channel/POSTchat_channel.created), [chat_channel.member_invited](/docs/api/team-chat/events/#tag/chat_channel/POSTchat_channel.member_invited), and [chat_channel.member_removed](/docs/api/team-chat/events/#tag/chat_channel/POSTchat_channel.member_removed) event payloads return an empty string for `payload.object.members.id`. chat_message webhook - A new field `payload.object.contact_member_id`\_ (only present for direct messages) is added to [chat_message.sent](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.sent), [chat_message.replied](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.replied), [chat_message.deleted](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.deleted), and [chat_message.updated](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.updated) event payloads. The value of the field is `memberID`. - If the contact or receiver is not from the same account as the operator or initiator of the action, then [chat_message.sent](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.sent), [chat_message.replied](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.replied), [chat_message.deleted](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.deleted), and [chat_message.updated](/docs/api/team-chat/events/#tag/chat_message/POSTchat_message.updated) event payloads return an empty string for `payload.object.contact_id` in direct messages only.