# API changelog This page documents changes to the Zulip Server API over time. See also the [Zulip release lifecycle][release-lifecycle] for background on why this API changelog is important, and the [Zulip server changelog][server-changelog]. The API feature levels system used in this changelog is designed to make it possible to write API clients, such as the Zulip mobile and terminal apps, that work with a wide range of Zulip server versions. Every change to the Zulip API is recorded briefly here and with full details in **Changes** entries in the API documentation for the modified endpoint(s). When using an API endpoint whose behavior has changed, Zulip API clients should check the `zulip_feature_level` field, present in the [`GET /server_settings`](/api/get-server-settings) and [`POST /register`](/api/register-queue) responses, to determine the API format used by the Zulip server that they are interacting with. ## Changes in Zulip 8.0 **Feature level 209** * `PATCH /realm`, [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): Added `create_multiuse_invite_group` realm setting, which is the ID of the user group whose members can create [reusable invitation links](/help/invite-new-users#create-a-reusable-invitation-link) to an organization. Previously, only admin users could create these links. * `POST /invites/multiuse`: Non-admin users can now use this endpoint to create reusable invitation links. Previously, this endpoint was restricted to admin users only. * `GET /invites`: Endpoint response for non-admin users now includes both email invitations and reusable invitation links that they have created. Previously, non-admin users could only create email invitations, and therefore the response did not include reusable invitation links for these users. * `DELETE /invites/multiuse/{invite_id}`: Non-admin users can now revoke reusable invitation links they have created. Previously, only admin users could create and revoke reusable invitation links. **Feature level 208** * [`POST /users/me/subscriptions`](/api/subscribe), [`DELETE /users/me/subscriptions`](/api/unsubscribe): These endpoints now return an HTTP status code of 400 with `code: "BAD_REQUEST"` in the error response when a user specified in the `principals` parameter is deactivated or does not exist. Previously, these endpoints returned an HTTP status code of 403 with `code: "UNAUTHORIZED_PRINCIPAL"` in the error response for these cases. **Feature level 207** * [`POST /register`](/api/register-queue): Added `display_name` and `all_event_types` fields to the `realm_incoming_webhook_bots` object. **Feature level 206** * `POST /calls/zoom/create`: Added `is_video_call` parameter controlling whether to request a Zoom meeting that defaults to having video enabled. **Feature level 205** * [`POST /register`](/api/register-queue): `streams` field in the response now includes [web-public streams](/help/public-access-option) as well. * [`GET /events`](/api/get-events): Events for stream creation and deletion are now sent to clients when a user gains or loses access to any streams due to a change in their [role](/help/roles-and-permissions). **Feature level 204** * [`POST /register`](/api/register-queue): Added `server_typing_started_wait_period_milliseconds`, `server_typing_stopped_wait_period_milliseconds`, and `server_typing_started_expiry_period_milliseconds` fields for clients to use when implementing [typing notifications](/api/set-typing-status) protocol. **Feature level 203** * [`POST /register`](/api/register-queue): Add `realm_date_created` field to realm data. **Feature level 202** * [`PATCH /realm/linkifiers`](/api/reorder-linkifiers): Added new endpoint to support changing the order in which linkifiers will be processed. **Feature level 201** * `POST /zulip-outgoing-webhook`: Renamed the notification trigger `private_message` to `direct_message`. **Feature level 200** * [`PATCH /streams/{stream_id}`](/api/update-stream): Added `is_default_stream` parameter to change whether the stream is a default stream for new users in the organization. * [`POST /users/me/subscriptions`](/api/subscribe): Added `is_default_stream` parameter which determines whether any streams created by this request will be default streams for new users. **Feature level 199** * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events), [`GET /streams`](/api/get-streams), [`GET /streams/{stream_id}`](/api/get-stream-by-id): Stream objects now include a `stream_weekly_traffic` field indicating the stream's level of traffic. **Feature level 198** * [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue), [`GET /user_groups`](/api/get-user-groups), [`POST /user_groups/create`](/api/create-user-group), [`PATCH /user_groups/{user_group_id}`](/api/update-user-group):Renamed group setting `can_mention_group_id` to `can_mention_group`. **Feature level 197** * [`POST /users/me/subscriptions`](/api/subscribe), [`PATCH /streams/{stream_id}`](/api/update-stream), [`GET /users/me/subscriptions`](/api/get-subscriptions), [`GET /streams`](/api/get-streams), [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): Renamed stream setting `can_remove_subscribers_group_id` to `can_remove_subscribers_group`. **Feature level 196** * [`POST /realm/playgrounds`](/api/add-code-playground): `url_prefix` is replaced by `url_template`, which only accepts [RFC 6570][rfc6570] compliant URL templates. The old prefix format is no longer supported. * [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue): `url_prefix` is replaced by `url_template` in `realm_playgrounds` events. **Feature level 195** * [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue): The `default_code_block_language` realm setting is now consistently an empty string when no default pygments language code is set. Previously, the server had a bug that meant it might represent no default for this realm setting as either `null` or an empty string. Clients supporting older server versions should treat either value (`null` or `""`) as no default being set. **Feature level 194** * [`GET /messages`](/api/get-messages), [`GET /messages/matches_narrow`](/api/check-messages-match-narrow), [`POST /message/flags/narrow`](/api/update-message-flags-for-narrow), [`POST /register`](/api/register-queue): For [search/narrow filters](/api/construct-narrow) with the `id` operator, added support for encoding the message ID operand as either a string or an integer. Previously, only string encoding was supported. **Feature level 193** * [`POST /messages/{message_id}/reactions`](/api/add-reaction), [`DELETE /messages/{message_id}/reactions`](/api/remove-reaction): Endpoints return specific error responses if an emoji reaction already exists when adding a reaction (`"code": "REACTION_ALREADY_EXISTS"`) or if an emoji reaction does not exist when deleting a reaction (`"code": "REACTION_DOES_NOT_EXIST"`). Previously, these errors returned the `"BAD_REQUEST"` code. **Feature level 192** * [`GET /events`](/api/get-events): Stream creation events are now sent when guest users gain access to a public stream by being subscribed. Guest users previously only received these events when subscribed to private streams. **Feature level 191** * [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue), [`GET /user_groups`](/api/get-user-groups): Add `can_mention_group_id` to user group objects. * [`POST /user_groups/create`](/api/create-user-group): Added `can_mention_group_id` parameter to support setting the user group whose members can mention the new user group. * [`PATCH /user_groups/{user_group_id}`](/api/update-user-group): Added `can_mention_group_id` parameter to support changing the user group whose members can mention the specified user group. **Feature level 190** * [`DELETE /realm/emoji/{emoji_name}`](/api/deactivate-custom-emoji): This endpoint now returns an HTTP status code of 404 when an emoji does not exist, instead of 400. **Feature level 189** * [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults), [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings): Added new boolean user settings `enable_followed_topic_email_notifications`, `enable_followed_topic_push_notifications`, `enable_followed_topic_wildcard_mentions_notify`, `enable_followed_topic_desktop_notifications` and `enable_followed_topic_audible_notifications` to control whether a user receives email, push, wildcard mention, visual desktop and audible desktop notifications, respectively, for messages sent to followed topics. **Feature level 188** * [`POST /users/me/muted_users/{muted_user_id}`](/api/mute-user), [`DELETE /users/me/muted_users/{muted_user_id}`](/api/unmute-user): Added support to mute/unmute bot users. Feature levels 186-187 are reserved for future use in 7.x maintenance releases. ## Changes in Zulip 7.0 **Feature level 185** No changes; feature level used for Zulip 7.0 release. **Feature level 184** * [`PATCH /scheduled_messages/`](/api/update-scheduled-message): Added new endpoint for editing an existing scheduled message. * [`POST /scheduled_messages`](/api/create-scheduled-message): Removed optional `scheduled_message_id` parameter, which had been a previous way for clients to support editing an existing scheduled message. **Feature level 183** * [`POST /register`](/api/register-queue): Removed the `realm_community_topic_editing_limit_seconds` property, which was no longer in use. The time limit for editing topics is controlled by the realm setting `move_messages_within_stream_limit_seconds`, see feature level 162. * [`GET /events`](/api/get-events): Removed the `community_topic_editing_limit_seconds` property from realm `update_dict` event documentation, because it was never returned as a changed property in this event and was only ever returned in the [`POST /register`](/api/register-queue) response. **Feature level 182** * `POST /export/realm`: This endpoint now returns the ID of the data export object created by the request. **Feature level 181** * [`GET /scheduled_messages`](/api/get-scheduled-messages), [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue): Added `failed` boolean field to scheduled message objects to indicate if the server tried to send the scheduled message and was unsuccessful. Clients that support unscheduling and editing scheduled messages should use this field to indicate to the user when a scheduled message failed to send at the appointed time. **Feature level 180** * `POST /invites`: Added support for invitations specifying the empty list as the user's initial stream subscriptions. Previously, this returned an error. This change was also backported to Zulip 6.2, and is available at feature levels 157-158 as well. **Feature level 179** * [`POST /scheduled_messages`](/api/create-scheduled-message): Added new endpoint to create and edit scheduled messages. * [`GET /events`](/api/get-events): Added `scheduled_messages` events sent to clients when a user creates, edits or deletes scheduled messages. * [`POST /register`](/api/register-queue): Added an optional `scheduled_messages` field to that includes all of the undelivered scheduled messages for the current user. **Feature level 178** * `POST /users/me/presence`, [`GET /users//presence`](/api/get-user-presence), [`GET /realm/presence`](/api/get-presence), [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): The server no longer stores which client submitted presence data, and presence responses from the server will always contain the `"aggregated"` and `"website"` keys. **Feature level 177** * [`GET /messages`](/api/get-messages), [`GET /messages/matches_narrow`](/api/check-messages-match-narrow), [`POST /message/flags/narrow`](/api/update-message-flags-for-narrow), [`POST /register`](/api/register-queue): Added support for three [search/narrow filters](/api/construct-narrow) related to direct messages: `is:dm`, `dm` and `dm-including`. The `dm` operator replaces and deprecates the `pm-with` operator. The `is:dm` filter replaces and deprecates the `is:private` filter. The `dm-including` operator replaces and deprecates the `group-pm-with` operator. Because existing Zulip messages may have links with these legacy filters, they are still supported for backwards-compatibility. **Feature level 176** * [`POST /realm/filters`](/api/add-linkifier), [`PATCH /realm/filters/`](/api/update-linkifier): The `url_format_string` parameter is replaced by `url_template`. [Linkifiers](/help/add-a-custom-linkifier) now only accept [RFC 6570][rfc6570] compliant URL templates. The old URL format strings are no longer supported. * [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue): The `url_format_string` key in `realm_linkifiers` objects is replaced by `url_template`. For backwards-compatibility, clients that do not support the `linkifier_url_template` [client capability](/api/register-queue#parameter-client_capabilities) will receive an empty `realm_linkifiers` array in the `/register` response and not receive `realm_linkifiers` events. Unconditionally, the deprecated `realm_filters` event type returns an empty array in the `/register` response and these events are no longer sent to clients. **Feature level 175** * [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings), [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added new user setting `web_mark_read_on_scroll_policy`. Clients may use this to determine the user's preference on whether to mark messages as read or not when scrolling through their message feed. **Feature level 174**: * [`POST /typing`](/api/set-typing-status), [`POST /messages`](/api/send-message): Added `"direct"` as the preferred way to indicate a direct message for the `type` parameter, deprecating the original `"private"`. While `"private"` is still supported for direct messages, clients are encouraged to use the modern convention with servers that support it, because support for `"private"` may eventually be removed. **Feature level 173**: * [`GET /scheduled_messages`](/api/get-scheduled-messages), [`DELETE /scheduled_messages/`](/api/delete-scheduled-message): Added new endpoints to fetch and delete scheduled messages. **Feature level 172** * [`PATCH /messages/{message_id}`](/api/update-message): [Topic editing restrictions](/help/restrict-moving-messages) now apply to stream messages without a topic. * [`PATCH /messages/{message_id}`](/api/update-message): When users, other than organization administrators and moderators, use `"propagate_mode": "change_all"` to move messages that have passed the organization's time limit for updating a message's topic and/or stream, this endpoint now returns an error response (`"code": "MOVE_MESSAGES_TIME_LIMIT_EXCEEDED"`). **Feature level 171**: * [`POST /fetch_api_key`](/api/fetch-api-key), [`POST /dev_fetch_api_key`](/api/dev-fetch-api-key): The return values for these endpoints now include the unique ID of the user who owns the API key. **Feature level 170** * [`POST /user_topics`](/api/update-user-topic): Added a new endpoint to update a user's personal preferences for a topic, which deprecates the [`PATCH /users/me/subscriptions/muted_topics`](/api/mute-topic) endpoint. The deprecated endpoint is maintained for backwards-compatibility but may be removed in a future release. * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): Unmuted added as a visibility policy option to the objects sent in response to the `user_topic` event. **Feature level 169** * [`PATCH /users/me/subscriptions/muted_topics`](/api/mute-topic): Trying to mute a topic that is already muted or unmute a topic that was not previously muted now results in a success response rather than an error. **Feature level 168** * [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings), [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Replaced the boolean user setting `realm_name_in_notifications` with an integer `realm_name_in_email_notifications_policy`. **Feature level 167** * [All REST API endpoints](/api/rest-error-handling#ignored-parameters): Implemented `ignored_parameters_unsupported` as a possible return value in the JSON success response for all endpoints. This value is a array of any parameters that were sent in the request by the client that are not supported by the endpoint. Previously, unsupported parameters were silently ignored, except in the subset of endpoints which already supported this return value; see feature levels 111, 96 and 78. **Feature level 166** * [`POST /messages`](/api/send-message): Eliminated the undocumented `realm_str` parameter. This parameter was already redundant due to it needing to match the realm of the user making the request, otherwise returning an authorization error. With this, the parameter is removed, meaning that if provided in the API request, it will be ignored. **Feature level 165** * [`PATCH /user_groups/{user_group_id}`](/api/update-user-group): The `name` and `description` parameters are now optional. **Feature level 164** * [`POST /register`](/api/register-queue): Added the `server_presence_ping_interval_seconds` and `server_presence_offline_threshold_seconds` fields for clients to use when implementing the [presence](/api/get-presence) system. **Feature level 163** * [`GET /users`](/api/get-users), [`GET /users/{user_id}`](/api/get-user), [`GET /users/{email}`](/api/get-user-by-email), [`GET /users/me`](/api/get-own-user), [`GET /events`](/api/get-events): The `delivery_email` field is always present in user objects, including the case when a user's `email_address_visibility` is set to everyone. The value will be `null` if the requester does not have access to the user's real email. For bot users, the `delivery_email` field is always set to the bot user's real email. * [`GET /events`](/api/get-events): Event for updating a user's `delivery_email` is now sent to all users who have access to it, and is also sent when a user's `email_address_visibility` setting changes. * [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue) [`GET /users`](/api/get-users), [`GET /users/{user_id}`](/api/get-user), [`GET /users/{email}`](/api/get-user-by-email), [`GET /users/me`](/api/get-own-user), [`GET /messages`](/api/get-messages), [`GET /messages/{message_id}`](/api/get-message): Whether the `avatar_url` field in message and user objects returned by these endpoints can be `null` now depends on if the current user has access to the other user's real email address based on the other user's `email_address_visibility` policy. * [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings), [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added user setting `email_address_visibility`, to replace the realm setting `email_address_visibility`. * [`POST /register`](/api/register-queue), `PATCH /realm`: Removed realm setting `email_address_visibility`. **Feature level 162** * `PATCH /realm`, [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): Added two new realm settings `move_messages_within_stream_limit_seconds` and `move_messages_between_streams_limit_seconds` for organizations to configure time limits for editing topics and moving messages between streams. * [`PATCH /messages/{message_id}`](/api/update-message): For users other than administrators and moderators, the time limit for editing topics is now controlled via the realm setting `move_messages_within_stream_limit_seconds` and the time limit for moving messages between streams is now controlled by the realm setting `move_messages_between_streams_limit_seconds`. **Feature level 161** * [`POST /users/me/subscriptions`](/api/subscribe), [`PATCH /streams/{stream_id}`](/api/update-stream): Added `can_remove_subscribers_group_id` parameter to support setting and changing the user group whose members can remove other subscribers from the specified stream. * [`DELETE /users/me/subscriptions`](/api/unsubscribe): Expanded the situations where users can use this endpoint to unsubscribe other users from a stream to include the case where the current user has access to the stream and is a member of the user group specified by the `can_remove_subscribers_group_id` for the stream. **Feature level 160** * `POST /api/v1/jwt/fetch_api_key`: Added new endpoint to fetch API keys using JSON Web Token (JWT) authentication. * `accounts/login/jwt/`: Adjusted format of requests to undocumented, optional endpoint for JWT authentication log in support. **Feature level 159** * `PATCH /realm`, [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): Nobody added as an option for the realm settings `edit_topic_policy` and `move_messages_between_streams_policy`. * [`PATCH /messages/{message_id}`](/api/update-message): Permission to edit the stream and/or topic of messages no longer depends on the realm setting `allow_message_editing`. * [`PATCH /messages/{message_id}`](/api/update-message): The user who sent the message can no longer edit the message's topic indefinitely. Feature level 158 is reserved for future use in 6.x maintenance releases. ## Changes in Zulip 6.2 **Feature level 157** * `POST /invites`: Added support for invitations specifying the empty list as the user's initial stream subscriptions. Previously, this returned an error. This change was backported from the Zulip 7.0 branch, and thus is available at feature levels 157-158 and 180+. ## Changes in Zulip 6.0 **Feature level 156** No changes; feature level used for Zulip 6.0 release. **Feature level 155** * [`GET /messages`](/api/get-messages): The new `include_anchor` parameter controls whether a message with ID matching the specified `anchor` should be included. * The `update_message_flags` event sent by [`POST /messages/flags`](/api/update-message-flags) no longer redundantly lists messages where the flag was set to the same state it was already in. * [`POST /messages/flags/narrow`](/api/update-message-flags-for-narrow): This new endpoint allows updating message flags on a range of messages within a narrow. **Feature level 154** * [`POST /streams/{stream_id}/delete_topic`](/api/delete-topic): When the process of deleting messages times out, a success response with "partially_completed" result will now be returned by the server, analogically to the `/mark_all_as_read` endpoint. **Feature level 153** * [`POST /mark_all_as_read`](/api/mark-all-as-read): Messages are now marked as read in batches, so that progress will be made even if the request times out because of an extremely large number of unread messages to process. Upon timeout, a success response with a "partially_completed" result will be returned by the server. **Feature level 152** * [`PATCH /messages/{message_id}`](/api/update-message): The default value for `send_notification_to_old_thread` was changed from `true` to `false`. When moving a topic within a stream, the `send_notification_to_old_thread` and `send_notification_to_new_thread` parameters are now respected, and by default a notification is sent to the new thread. **Feature level 151** * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events), [`POST /realm/profile_fields`](/api/create-custom-profile-field), [`GET /realm/profile_fields`](/api/get-custom-profile-fields): Added pronouns custom profile field type. **Feature level 150** * [`GET /events`](/api/get-events): Separate events are now sent on changing `allow_message_editing`, `message_content_edit_limit_seconds` and `edit_topic_policy` settings, whereas previously one event was sent including all of these setting values irrespective of which of them were actually changed. * `PATCH /realm`: Only changed settings are included in the response data now when changing `allow_message_editing`, `edit_topic_policy` and `message_content_edit_limit_seconds` settings, instead of including all the fields even if one of these settings was changed. **Feature level 149** * [`POST /register`](/api/register-queue): The `client_gravatar` and `include_subscribers` parameters now return an error for [unauthenticated requests](/help/public-access-option) if an unsupported value is requested by the client. **Feature level 148** * [`POST /users/me/status`](/api/update-status), [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): The user status `away` field/parameter is deprecated, and as of this feature level are a legacy way to access the user's `presence_enabled` setting, with `away = !presence_enabled`. To be removed in a future release. **Feature level 147** * [`POST /streams/{stream_id}/delete_topic`](/api/delete-topic): Messages now are deleted in batches, starting from the newest, so that progress will be made even if the request times out because of an extremely large topic. **Feature level 146** * [`POST /realm/profile_fields`](/api/create-custom-profile-field), [`GET /realm/profile_fields`](/api/get-custom-profile-fields): Added a new parameter `display_in_profile_summary`, which clients use to decide whether to display the field in a small/summary section of the user's profile. **Feature level 145** * [`DELETE /users/me/subscriptions`](/api/unsubscribe): Normal users can now remove bots that they own from streams. **Feature level 144** * [`GET /messages/{message_id}/read_receipts`](/api/get-read-receipts): The `user_ids` array returned by the server no longer includes IDs of users who have been muted by or have muted the current user. **Feature level 143** * `PATCH /realm`: The `disallow_disposable_email_addresses`, `emails_restricted_to_domains`, `invite_required`, and `waiting_period_threshold` settings can no longer be changed by organization administrators who are not owners. * `PATCH /realm/domains`, `POST /realm/domains`, `DELETE /realm/domains`: Organization administrators who are not owners can no longer access these endpoints. **Feature level 142** * [`GET /users/me/subscriptions`](/api/get-subscriptions), [`GET /streams`](/api/get-streams), [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): Added `can_remove_subscribers_group_id` field to Stream and Subscription objects. **Feature level 141** * [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings), [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added new `user_list_style` display setting, which controls the layout of the right sidebar. **Feature level 140** * [`POST /register`](/api/register-queue): Added string field `server_emoji_data_url` to the response. **Feature level 139** * [`GET /get-events`](/api/get-events): When a user mutes or unmutes their subscription to a stream, a `subscription` update event is now sent for the `is_muted` property and for the deprecated `in_home_view` property to support clients fully migrating to use the `is_muted` property. Prior to this feature level, only one event was sent to clients with the deprecated `in_home_view` property. **Feature level 138** * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): `message_content_edit_limit_seconds` now represents no limit using `null`, instead of the integer 0. * `PATCH /realm`: One now sets `message_content_edit_limit_seconds` to no limit by passing the string `unlimited`, rather than the integer 0. **Feature level 137** * [`GET /messages/{message_id}/read_receipts`](/api/get-read-receipts): Added new endpoint to fetch read receipts for a message. * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events), `PATCH /realm`: Added new `enable_read_receipts` realm setting. **Feature level 136** * [`PATCH /streams/{stream_id}`](/api/update-stream): The endpoint now returns an error for a request to make a public stream with protected history which was previously ignored silently. * [`PATCH /streams/{stream_id}`](/api/update-stream): Added support to change access to history of the stream by only passing `history_public_to_subscribers` parameter without `is_private` and `is_web_public` parameters. **Feature level 135** * [`DELETE /user/{user_id}`](/api/deactivate-user): Added `deactivation_notification_comment` field controlling whether the user receives a notification email about their deactivation. **Feature level 134** * [`GET /events`](/api/get-events): Added `user_topic` event type which is sent when a topic is muted or unmuted. This generalizes and replaces the previous `muted_topics` array, which will no longer be sent if `user_topic` was included in `event_types` when registering the queue. * [`POST /register`](/api/register-queue): Added `user_topics` array to the response. This generalizes and replaces the previous `muted_topics` array, which will no longer be sent if `user_topic` is included in `fetch_event_types`. **Feature level 133** * [`POST /register`](/api/register-queue), `PATCH /realm`: Removed stream administrators option from `wildcard_mention_policy` setting. * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events), [`GET /users/me/subscriptions`](/api/get-subscriptions): Removed `role` field from subscription objects. **Feature level 132** * [`GET /streams/{stream_id}`](/api/get-stream-by-id): Added new endpoint to get a stream by ID. **Feature level 131** * [`GET /user_groups`](/api/get-user-groups),[`POST /register`](/api/register-queue): Renamed `subgroups` field in the user group objects to `direct_subgroup_ids`. * [`GET /events`](/api/get-events): Renamed `subgroup_ids` field in the group object to `direct_subgroup_ids`. **Feature level 130** * `PATCH /bots/{bot_user_id}`: Added support for changing a bot's role via this endpoint. Previously, this could only be done via [`PATCH /users/{user_id}`](/api/update-user). **Feature level 129** * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events), `PATCH /realm`: Added realm setting `want_advertise_in_communities_directory` for organizations to give permission to be advertised in the Zulip communities directory. **Feature level 128** * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events), `PATCH /realm`: Added `org_type` realm setting. **Feature level 127** * [`GET /user_groups`](/api/get-user-groups),[`POST /register`](/api/register-queue): Added `subgroups` field, which is a list of IDs of all the subgroups of the user group, to user group objects. * [`GET /events`](/api/get-events): Added new `user_group` events operations for live updates to subgroups (`add_subgroups` and `remove_subgroups`). * [`PATCH /user_groups/{user_group_id}/subgroups`](/api/update-user-group-subgroups): Added new endpoint for updating subgroups of a user group. * [`GET /user_groups/{user_group_id}/members/{user_id}`](/api/get-is-user-group-member): Added new endpoint for checking whether a given user is member of a given user group. * [`GET /user_groups/{user_group_id}/members`](/api/get-user-group-members): Added new endpoint to get members of a user group. * [`GET /user_groups/{user_group_id}/members`](/api/get-user-group-subgroups): Added new endpoint to get subgroups of a user group. **Feature level 126** * `POST /invites`, `POST /invites/multiuse`: Replaced `invite_expires_in_days` parameter with `invite_expires_in_minutes`. **Feature level 125** * [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings), [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added new `display_emoji_reaction_users` display setting, controlling whether to display the names of users with emoji reactions. Feature levels 123-124 are reserved for future use in 5.x maintenance releases. ## Changes in Zulip 5.0 **Feature level 122** No changes; feature level used for Zulip 5.0 release. **Feature level 121** * [`GET /events`](/api/get-events): Added `message_details` field appearing in message flag update events when marking previously read messages as unread. **Feature level 120** * [`GET /messages/{message_id}`](/api/get-message): This endpoint now sends the full message details. Previously, it only returned the message's raw Markdown content. **Feature level 119** * [`POST /register`](/api/register-queue): Added `other_user_id` field to the `pms` objects in the `unread_msgs` data set, deprecating the less clearly named `sender_id` field. This change was motivated by the possibility that a one-on-one direct message sent by the current user to another user could be marked as unread. The `sender_id` field is still present for backwards compatibility with older server versions. **Feature level 118** * [`GET /messages`](/api/get-messages), [`GET /events`](/api/get-events): Improved the format of the `edit_history` object within message objects. Entries for stream edits now include a both a `prev_stream` and `stream` field to indicate the previous and current stream IDs. Prior to this feature level, only the `prev_stream` field was present. Entries for topic edits now include both a `prev_topic` and `topic` field to indicate the previous and current topic, replacing the `prev_subject` field. These changes substantially simplify client complexity for processing historical message edits. * [`GET /messages/{message_id}/history`](/api/get-message-history): Added `stream` field to message history `snapshot` indicating the updated stream ID of messages moved to a new stream. **Feature level 117** * `POST /invites`, `POST /invites/multiuse`: Added support for passing `null` as the `invite_expires_in_days` parameter to request an invitation that never expires. **Feature level 116** * [`GET /server_settings`](/api/get-server-settings): Added `realm_web_public_access_enabled` as a realm-specific server setting, which can be used by clients to detect whether the realm allows and has at least one [web-public stream](/help/public-access-option). **Feature level 115** * Mobile push notifications about stream messages now include the `stream_id` field. **Feature level 114** * [`GET /events`](/api/get-events): Added `rendering_only` field to `update_message` event type to indicate if the message change only updated the rendering of the message or if it was the result of a user interaction. * [`GET /events`](/api/get-events): Updated `update_message` event type to always include `edit_timestamp` and `user_id` fields. If the event only updates the rendering of the message, then the `user_id` field will be present, but with a value of null as the update was not the result of a user interaction. **Feature level 113** * `GET /realm/emoji`, `POST /realm/emoji/{emoji_name}`, [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue): The `still_url` field for custom emoji objects is now always present, with a value of null for non-animated emoji. Previously, it only was present for animated emoji. **Feature level 112** * [`GET /events`](/api/get-events): Updated `update_message` event type to include `stream_id` field for all edits to stream messages. **Feature level 111** * [`POST /users/me/subscriptions/properties`](/api/update-subscription-settings): Removed `subscription_data` from response object, replacing it with `ignored_parameters_unsupported`. **Feature level 110** * [`POST /register`](/api/register-queue): Added `server_web_public_streams_enabled` to the response. **Feature level 109** * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events), `PATCH /realm`: Added new `enable_spectator_access` realm setting. **Feature level 108** * In the mobile application authentication flow, the authenticated user's `user_id` is now included in the parameters encoded in the final `zulip://` redirect URL. **Feature level 107** * [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings), [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added user setting `escape_navigates_to_default_view` to allow users to [disable the keyboard shortcut](/help/configure-default-view) for the `Esc` key that navigates the app to the default view. **Feature level 106** * [`PATCH /user/{user_id}`](/api/update-user): Removed unnecessary JSON-encoding of string parameter `full_name`. **Feature level 105** * [`POST /register`](/api/register-queue), [`PATCH /settings`](/api/update-settings), [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added three new privacy settings: `send_private_typing_notifications`, `send_stream_typing_notifications`, and `send_read_receipts`. **Feature level 104** * `PATCH /realm`: Added `string_id` parameter for changing an organization's subdomain. Currently, this is only allowed for changing a demo organization to a normal one. **Feature level 103** * [`POST /register`](/api/register-queue): Added `create_web_public_stream_policy` policy for which users can create web-public streams. * [`GET /events`](/api/get-events), `PATCH /realm`: Added support for updating `create_web_public_stream_policy`. * [`POST /register`](/api/register-queue): Added `can_create_web_public_streams` boolean field to the response. **Feature level 102** * [`POST /register`](/api/register-queue), `PATCH /realm`: The `create_stream_policy` setting was split into two settings for different types of streams: `create_private_stream_policy` and `create_public_stream_policy`. * [`POST /register`](/api/register-queue): The `create_stream_policy` property was deprecated in favor of the `create_private_stream_policy` and `create_public_stream_policy` properties, but it still available for backwards-compatibility. **Feature level 101** * [`POST /register`](/api/register-queue), `PATCH /realm`: Replaced the `allow_message_deleting` boolean field with an integer field `delete_own_message_policy` defining which roles can delete messages they had sent. **Feature level 100** * [`POST /register`](/api/register-queue), [`GET /events`](/api/get-events): `message_content_delete_limit_seconds` now represents no limit using `null`, instead of the integer 0, and 0 is no longer a possible value with any meaning. * `PATCH /realm`: One now sets `message_content_delete_limit_seconds` to no limit by passing the string `unlimited`, rather than the integer 0. **Feature level 99** * [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults), `PATCH /realm`: The `default_twenty_four_hour_time` parameter to `PATCH /realm` has been replaced by the `twenty_four_hour_time` parameter to `PATCH /realm/user_settings_defaults`, to match the new model for user preference defaults settings. * [`POST /register`](/api/register-queue): Removed `realm_default_twenty_four_hour_time` from the response object. This value is now available in the `twenty_four_hour_time` field of the `realm_user_settings_default` object. **Feature level 98** * [`POST /users/me/subscriptions`](/api/subscribe): Added `is_web_public` parameter for requesting the creation of a web-public stream. * [`PATCH /streams/{stream_id}`](/api/update-stream): Added `is_web_public` parameter for converting a stream into a web-public stream. **Feature level 97** * `GET /realm/emoji`, `POST /realm/emoji/{emoji_name}`, [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue): Custom emoji objects may now contain a `still_url` field, with the URL of a PNG still image version of the emoji. This field will only be present for animated emoji. **Feature level 96** * [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults): Added new endpoint to update default values of user settings in a realm. * `POST /invites`, `POST /invites/multiuse`: Added `invite_expires_in_days` parameter encoding the number days before the invitation should expire. **Feature level 95** * [`POST /register`](/api/register-queue): Added `realm_user_settings_defaults` object, containing default values of personal user settings for new users in the realm. * [`GET /events`](/api/get-events): Added `realm_user_settings_defaults` event type, which is sent when the organization's configured default settings for new users change. **Feature level 94** * [`POST /register`](/api/register-queue): Added `demo_organization_scheduled_deletion_date` field to realm data. **Feature level 93** * [`POST /register`](/api/register-queue), [`GET /user_groups`](/api/get-user-groups), [`GET /events`](/api/get-events): Added `is_system_group` field to user group objects. **Feature level 92** * [`GET /messages`](/api/get-messages), [`POST /register`](/api/register-queue), [`GET /users`](/api/get-users), [`GET /users/{user_id}`](/api/get-user), [`GET /users/{email}`](/api/get-user-by-email): The `client_gravatar` parameter now defaults to `true`. **Feature level 91** * `PATCH /realm`, [`PATCH /streams/{stream_id}`](/api/update-stream): These endpoints now accept `"unlimited"` for `message_retention_days`, replacing `"forever"` as the way to encode a retention policy where messages are not automatically deleted. **Feature level 90** * [`POST /register`](/api/register-queue): The `unread_msgs` section of the response no longer includes `sender_ids` in the `streams` dictionaries. These were removed because no clients were interested in using the data, which required substantial complexity to construct correctly. **Feature level 89** * [`GET /events`](/api/get-events): Introduced the `user_settings` event type, unifying and replacing the previous `update_display_settings` and `update_global_notifications` event types. The legacy event types are still supported for backwards compatibility, but will be removed in a future release. * [`POST /register`](/api/register-queue): Added `user_settings` field in the response, which is a dictionary containing all the user's personal settings. For backwards-compatibility, individual settings will still appear in the top-level response for clients don't support the `user_settings_object` client capability. * [`POST /register`](/api/register-queue): Added the `user_settings_object` property to supported `client_capabilities`. When enabled, the server will not include a duplicate copy of personal settings in the top-level response. * [`GET /events`](/api/get-events): `update_display_settings` and `update_global_notifications` events now only sent to clients that did not include `user_settings_object` in their `client_capabilities` when the event queue was created. **Feature level 88** * [`POST /register`](/api/register-queue): Added `zulip_merge_base` field to the response. * [`GET /events`](/api/get-events): Added new `zulip_merge_base` field to the `restart` event. * [`GET /server_settings`](/api/get-server-settings): Added `zulip_merge_base` to the responses which can be used to make "About Zulip" widgets in clients. **Feature level 87** * [`PATCH /settings`](/api/update-settings): Added a new `enable_drafts_synchronization` setting, which controls whether the syncing drafts between different clients is enabled. * [`GET /events`](/api/get-events), [`POST /register`](/api/register-queue): Added new `enable_drafts_synchronization` setting under `update_display_settings`. * [`GET /drafts`](/api/get-drafts): Added new endpoint to fetch user's synced drafts from the server. * [`POST /drafts`](/api/create-drafts): Added new endpoint to create drafts when syncing has been enabled. * [`PATCH /drafts/{draft_id}`](/api/edit-draft): Added new endpoint to edit a draft already owned by the user. * [`DELETE /drafts/{draft_id}`](/api/delete-draft): Added new endpoint to delete a draft already owned by the user. **Feature level 86** * [`GET /events`](/api/get-events): Added `emoji_name`, `emoji_code`, and `reaction_type` fields to `user_status` objects. * [`POST /register`](/api/register-queue): Added `emoji_name`, `emoji_code`, and `reaction_type` fields to `user_status` objects. * [`POST /users/me/status`](/api/update-status): Added support for new `emoji_name`, `emoji_code`, and `reaction_type` parameters. **Feature level 85** * [`POST /register`](/api/register-queue), `PATCH /realm`: Replaced `add_emoji_by_admins_only` field with an integer field `add_custom_emoji_policy`. **Feature level 84** * [`POST /register`](/api/register-queue): The `enter_sends` setting is now sent when `update_display_setting` is present in `fetch_event_types` instead of `realm_user`. **Feature level 83** * [`POST /register`](/api/register-queue): The `cross_realm_bots` section of the response now uses the `is_system_bot` flag to indicate whether the bot is a system bot. **Feature level 82** * [`PATCH /settings`](/api/update-settings) now accepts a new `email_notifications_batching_period_seconds` field for setting the time duration for which the server will collect email notifications before sending them. **Feature level 81** * `POST /users/me/enter-sends` has been removed. The `enter_sends` setting is now edited using the normal [`PATCH /settings`](/api/update-settings) endpoint. **Feature level 80** * [`PATCH /settings`](/api/update-settings): The `/settings/notifications` and `/settings/display` endpoints were merged into the main `/settings` endpoint; now all personal settings should be edited using that single endpoint. The old URLs are preserved as deprecated aliases for backwards compatibility. **Feature level 79** * [`GET /users/me/subscriptions`](/api/get-subscriptions): The `subscribers` field now returns user IDs if `include_subscribers` is passed. Previously, this endpoint returned user display email addresses in this field. * `GET /streams/{stream_id}/members`: This endpoint now returns user IDs. Previously, it returned display email addresses. **Feature level 78** * [`PATCH /settings`](/api/update-settings): Added `ignored_parameters_unsupported` field, which is a list of parameters that were ignored by the endpoint, to the response object. * [`PATCH /settings`](/api/update-settings): Removed `full_name` and `account_email` fields from the response object. **Feature level 77** * [`GET /events`](/api/get-events): Removed `recipient_id` and `sender_id` field in responses of `delete_message` event when `message_type` is `private`. **Feature level 76** * [`POST /fetch_api_key`](/api/fetch-api-key), [`POST /dev_fetch_api_key`](/api/dev-fetch-api-key): The HTTP status for authentication errors is now 401. This was previously 403. * All API endpoints now use the HTTP 401 error status for API requests involving a deactivated user or realm. This was previously 403. * Mobile push notifications now include the `mentioned_user_group_id` and `mentioned_user_group_name` fields when a user group containing the user is mentioned. Previously, these were indistinguishable from personal mentions (as both types have `trigger="mention"`). **Feature level 75** * [`POST /register`](/api/register-queue), `PATCH /realm`: Replaced `allow_community_topic_editing` field with an integer field `edit_topic_policy`. **Feature level 74** * [`POST /register`](/api/register-queue): Added `server_needs_upgrade` and `event_queue_longpoll_timeout_seconds` field when fetching realm data. **Feature level 73** * [`GET /users`](/api/get-users), [`GET /users/{user_id}`](/api/get-user), [`GET /users/{email}`](/api/get-user-by-email) and [`GET /users/me`](/api/get-own-user): Added is `user_billing_admin` field to returned user objects. * [`GET /events`](/api/get-events): Added `is_billing_admin` field to user objects sent in `realm_user` events. * [`POST /register`](/api/register-queue): Added `is_billing_admin` field in the user objects returned in the `realm_users` field. **Feature level 72** * [`POST /register`](/api/register-queue): Renamed `max_icon_file_size` to `max_icon_file_size_mib`, `realm_upload_quota` to `realm_upload_quota_mib` and `max_logo_file_size` to `max_logo_file_size_mib`. **Feature level 71** * [`GET /events`](/api/get-events): Added `is_web_public` field to `stream` events changing `invite_only`. **Feature level 70** * [`POST /register`](/api/register-queue): Added new top-level `server_timestamp` field when fetching presence data, to match the existing presence API. Feature levels 66-69 are reserved for future use in 4.x maintenance releases. ## Changes in Zulip 4.0 **Feature level 65** No changes; feature level used for Zulip 4.0 release. **Feature level 64** * `PATCH /streams/{stream_id}`: Removed unnecessary JSON-encoding of string parameters `new_name` and `description`. * `PATCH /settings/display`: Removed unnecessary JSON-encoding of string parameters `default_view`, `emojiset` and `timezone`. **Feature level 63** * `PATCH /settings/notifications`: Removed unnecessary JSON-encoding of string parameter `notification_sound`. * `PATCH /settings/display`: Removed unnecessary JSON-encoding of string parameter `default_language`. * `POST /users/me/tutorial_status`: Removed unnecessary JSON-encoding of string parameter `status`. * `POST /realm/domains`: Removed unnecessary JSON-encoding of string parameter `domain`. * `PATCH /default_stream_groups/{user_id}`: Removed unnecessary JSON-encoding of string parameters `new_group_name` and `new_description`. * `POST /users/me/hotspots`: Removed unnecessary JSON-encoding of string parameter `hotspot`. **Feature level 62** * Added `moderators only` option for `wildcard_mention_policy`. **Feature level 61** * `POST /invites`, `POST /invites/multiuse`: Added support for inviting users as moderators. **Feature level 60** * [`POST /register`](/api/register-queue): Added a new boolean field `is_moderator`, similar to the existing `is_admin`, `is_owner` and `is_guest` fields, to the response. * [`PATCH /users/{user_id}`](/api/update-user): Added support for changing a user's organization-level role to moderator. * API endpoints that return `role` values can now return `300`, the encoding of the moderator role. **Feature level 59** * [`GET /users`](/api/get-users), [`GET /users/{user_id}`](/api/get-user), [`GET /users/{email}`](/api/get-user-by-email) and [`GET /users/me`](/api/get-own-user): Added `role` field to returned user objects. * [`GET /events`](/api/get-events): Added `role` field to user objects sent in `realm_user` events. * [`POST /register`](/api/register-queue): Added `role` field in the user objects returned in the `realm_users` field. * [`GET /events`](/api/get-events): Added new `zulip_version` and `zulip_feature_level` fields to the `restart` event. **Feature level 58** * [`POST /register`](/api/register-queue): Added the new `stream_typing_notifications` property to supported `client_capabilities`. * [`GET /events`](/api/get-events): Extended format for `typing` events to support typing notifications in stream messages. These new events are only sent to clients with `client_capabilities` showing support for `stream_typing_notifications`. * [`POST /typing`](/api/set-typing-status): Added support for sending typing notifications for stream messages. **Feature level 57** * [`PATCH /realm/filters/{filter_id}`](/api/update-linkifier): New endpoint added to update a realm linkifier. **Feature level 56** * [`POST /register`](/api/register-queue): Added a new setting `move_messages_between_streams_policy` for controlling who can move messages between streams. **Feature level 55** * [`POST /register`](/api/register-queue): Added `realm_giphy_rating` and `giphy_rating_options` fields. * `PATCH /realm`: Added `giphy_rating` parameter. **Feature level 54** * `GET /realm/filters` has been removed and replace with [`GET /realm/linkifiers`](/api/get-linkifiers) which returns the data in a cleaner dictionary format. * [`GET /events`](/api/get-events): Introduced new event type `realm_linkifiers`. The previous `realm_filters` event type is still supported for backwards compatibility, but will be removed in a future release. * [`POST /register`](/api/register-queue): The response now supports a `realm_linkifiers` event type, containing the same data as the legacy `realm_filters` key, with a more extensible object format. The previous `realm_filters` event type is still supported for backwards compatibility, but will be removed in a future release. The legacy `realm_filters` key is deprecated but remains available for backwards compatibility. **Feature level 53** * [`POST /register`](/api/register-queue): Added `max_topic_length` and `max_message_length`, and renamed `max_stream_name_length` and `max_stream_description_length` to allow clients to transparently support these values changing in a future server version. **Feature level 52** * `PATCH /realm`: Removed unnecessary JSON-encoding of string parameters `name`, `description`, `default_language`, and `default_code_block_language`. **Feature level 51** * [`POST /register`](/api/register-queue): Added a new boolean field `can_invite_others_to_realm`. **Feature level 50** * [`POST /register`](/api/register-queue): Replaced `invite_by_admins_only` field with an integer field `invite_to_realm_policy`. **Feature level 49** * Added new [`POST /realm/playground`](/api/add-code-playground) and [`DELETE /realm/playground/{playground_id}`](/api/remove-code-playground) endpoints for code playgrounds. * [`GET /events`](/api/get-events): A new `realm_playgrounds` events is sent when changes are made to a set of configured code playgrounds for an organization. * [`POST /register`](/api/register-queue): Added a new `realm_playgrounds` field, which is required to fetch the set of configured code playgrounds for an organization. **Feature level 48** * [`POST /users/me/muted_users/{muted_user_id}`](/api/mute-user), [`DELETE /users/me/muted_users/{muted_user_id}`](/api/unmute-user): New endpoints added to mute/unmute users. * [`GET /events`](/api/get-events): Added new event type `muted_users` which will be sent to a user when the set of users muted by them has changed. * [`POST /register`](/api/register-queue): Added a new `muted_users` field, which identifies the set of other users the current user has muted. **Feature level 47** * [`POST /register`](/api/register-queue): Added a new `giphy_api_key` field, which is required to fetch GIFs using the GIPHY API. **Feature level 46** * [`GET /messages`](/api/get-messages) and [`GET /events`](/api/get-events): The `topic_links` field now contains a list of dictionaries, rather than a list of strings. **Feature level 45** * [`GET /events`](/api/get-events): Removed useless `op` field from `custom_profile_fields` events. These events contain the full set of configured `custom_profile_fields` for the organization regardless of what triggered the change. **Feature level 44** * [`POST /register`](/api/register-queue): extended the `unread_msgs` object to include `old_unreads_missing`, which indicates whether the server truncated the `unread_msgs` due to excessive total unread messages. **Feature level 43** * [`GET /users/{user_id_or_email}/presence`](/api/get-user-presence): Added support for passing the `user_id` to identify the target user. **Feature level 42** * `PATCH /settings/display`: Added a new `default_view` setting allowing the user to [set the default view](/help/configure-default-view). **Feature level 41** * [`GET /events`](/api/get-events): Removed `name` field from update subscription events. **Feature level 40** * [`GET /events`](/api/get-events): Removed `email` field from update subscription events. **Feature level 39** * Added new [`GET /users/{email}`](/api/get-user-by-email) endpoint. **Feature level 38** * [`POST /register`](/api/register-queue): Increased `realm_community_topic_editing_limit_seconds` time limit value to 259200s (3 days). **Feature level 37** * Consistently provide `subscribers` in stream data when clients register for subscriptions with `include_subscribers`, even if the user can't access subscribers. **Feature level 36** * [`POST /users`](/api/create-user): Restricted access to organization administrators with the `can_create_users` permission. * [Error handling](/api/rest-error-handling): The `code` property will now be present in errors due to rate limits. **Feature level 35** * [`GET /events`](/api/get-events): The `subscription` events for `peer_add` and `peer_remove` now include `user_ids` and `stream_ids` arrays. Previously, these events included singular `user_id` and `stream_id` integers. **Feature level 34** * [`POST /register`](/api/register-queue): Added a new `wildcard_mention_policy` setting for controlling who can use wildcard mentions in large streams. **Feature level 33** * Markdown code blocks now have a `data-code-language` attribute attached to the outer `div` element, recording the programming language that was selecting for syntax highlighting. This field supports the upcoming "view in playground" feature for code blocks. **Feature level 32** * [`GET /events`](/api/get-events): Added `op` field to `update_message_flags` events, deprecating the `operation` field (which has the same value). This removes an unintentional anomaly in the format of this event type. **Feature level 31** * [`GET /users/me/subscriptions`](/api/get-subscriptions): Added a `role` field to Subscription objects representing whether the user is a stream administrator. * [`GET /events`](/api/get-events): Added `role` field to Subscription objects sent in `subscriptions` events. Note that as of this feature level, stream administrators are a partially completed feature. In particular, it is impossible for a user to be a stream administrator at this feature level. **Feature level 30** * [`GET /users/me/subscriptions`](/api/get-subscriptions), [`GET /streams`](/api/get-streams): Added `date_created` to Stream objects. * [`POST /users`](/api/create-user), `POST /bots`: The ID of the newly created user is now returned in the response. Feature levels 28 and 29 are reserved for future use in 3.x bug fix releases. ## Changes in Zulip 3.1 **Feature level 27** * [`POST /users`](/api/create-user): Removed `short_name` field from `display_recipient` array objects. **Feature level 26** * [`GET /messages`](/api/get-messages), [`GET /events`](/api/get-events): The `sender_short_name` field is no longer included in message objects returned by these endpoints. * [`GET /messages`](/api/get-messages) : Removed `short_name` field from `display_recipient` array objects. ## Changes in Zulip 3.0 **Feature level 25** No changes; feature level used for Zulip 3.0 release. **Feature level 24** * The `!avatar()` and `!gravatar()` Markdown syntax, which was never documented, had inconsistent syntax, and was rarely used, was removed. **Feature level 23** * `GET/PUT/POST /users/me/pointer`: Removed. Zulip 3.0 removes the `pointer` concept from Zulip; this legacy data structure was replaced by tracking unread messages and loading views centered on the first unread message. **Feature level 22** * [`GET /attachments`](/api/get-attachments): The date when a message using the attachment was sent is now correctly encoded as `date_sent`, replacing the confusingly named `name` field. The `date_sent` and `create_time` fields of attachment objects are now encoded as integers; (previously the implementation could send floats incorrectly suggesting that microsecond precision is relevant). * `GET /invites`: Now encodes the user ID of the person who created the invitation as `invited_by_user_id`, replacing the previous `ref` field (which had that user's Zulip display email address). * [`POST /register`](/api/register-queue): The encoding of an unlimited `realm_message_retention_days` in the response was changed from `null` to `-1`. **Feature level 21** * `PATCH /settings/display`: Replaced the `night_mode` boolean with `color_scheme` as part of supporting automatic night theme detection. **Feature level 20** * Added support for inviting users as organization owners to the invitation endpoints. **Feature level 19** * [`GET /events`](/api/get-events): The `subscription` events for `peer_add` and `peer_remove` now identify the modified stream by the `stream_id` field, replacing the old `name` field. **Feature level 18** * [`POST /register`](/api/register-queue): Added `user_avatar_url_field_optional` to supported `client_capabilities`. **Feature level 17** * [`GET /users/me/subscriptions`](/api/get-subscriptions), [`GET /streams`](/api/get-streams): Added `message_retention_days` to Stream objects. * [`POST /users/me/subscriptions`](/api/subscribe), [`PATCH /streams/{stream_id}`](/api/update-stream): Added `message_retention_days` parameter. **Feature level 16** * [`GET /users/me`](/api/get-own-user): Removed `pointer` from the response, as the "pointer" concept is being removed in Zulip. * Changed the rendered HTML markup for mentioning a time to use the `