# Changelog This page documents changes to the Zulip Server API over time. The recommended way for a client like the Zulip mobile or desktop apps that needs to support interaction with a wide range of different Zulip server versions is to check the `zulip_feature_level` parameter in the `/register` and `/server_settings` responses to determine which of the below features are supported. ## Changes in Zulip 4.0 **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-playground) and [`DELETE /realm/playground/{playground_id}`](/api/remove-playground) endpoints for realm playgrounds. * [`GET /events`](/api/get-events): A new `realm_playgrounds` events is sent when changes are made to a set of configured playgrounds for an organization. * [`POST /register`](/api/register-queue): Added a new `realm_playgrounds` field, which is required to fetch the set of configured 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. **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`]: 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/change-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. **Feature level 35** * The peer_add and peer_remove subscription events now have plural versions of `user_ids` and `stream_ids`. **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** * The `short_name` field is removed from `display_recipients` in `POST /users`. **Feature level 26** * The `sender_short_name` field is no longer included in `GET /messages`. * The `short_name` field is removed from `display_recipients` in `GET /messages`. ## 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). **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): `subscriptions` event with `op="peer_add"` and `op="peer_remove"` now identify the modified stream by a `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`]: 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 `