# 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 2.2 **Feature level 2**: * [`POST /messages/{message_id}/reactions`](/api/add-emoji-reaction): The `emoji_type` parameter is optional; the server will guess the emoji_type if it is not specified (checking custom emoji, then unicode emoji for any with the provided name). * `reactions` objects returned by the API (both in `GET /messages` and in `GET /events`) now include the user who reacted in a top-level `user_id` field. The legacy `user` dictionary (which had inconsistent format between those two endpoints) is deprecated. **Feature level 1**: * [`GET /server_settings`](/api/server-settings): Added `zulip_feature_level`, which can be used by clients to detect which of the features described in this changelog are supported. * [`POST /register`](/api/register-queue): Added `zulip_feature_level` to the response if `zulip_version` is among the requested `event_types`. * [`GET /users`](/api/get-all-users): User objects for bots now contain a `bot_owner_id`, replacing the previous `bot_owner` field (which had the email address of the bot owner). * [`GET /users/{user_id}`](/api/get-user): Endpoint added. * [`GET /messages`](/api/get-messages): Add support for string-format values for the `anchor` parameter, deprecating and replacing the `use_first_unread_anchor` parameter. * [`GET /messages`](/api/get-messages) and [`GET /events`](/api/get-events-from-queue): Message objects now use `topic_links` rather than `subject_links` to indicate links either present in the topic or generated by Linkifiers applied to the topic. * [`POST /users/me/subscriptions`](/api/add-subscriptions): Replaced `is_announcement_only` boolean with `stream_post_policy` enum for specifying who can post to a stream. * [`PATCH /streams/{stream_id}`](/api/update-stream): Replaced `is_announcement_only` boolean with `stream_post_policy` enum for specifying who can post to a stream. * [`GET /streams`](/api/get-all-streams): Replaced `is_announcement_only` boolean with `stream_post_policy` enum for specifying who can post to a stream. * `GET /api/v1/user_uploads`: Added new endpoint for requesting a temporary URL for an uploaded file that does not require authentication to access (e.g. for passing from a Zulip desktop, mobile, or terminal app to the user's default browser). * Added `EMAIL_ADDRESS_VISIBILITY_NOBODY` possible value for `email_address_visibility`. * Added `private_message_policy` realm setting. * `muted_topic` objects now are a 3-item tuple: (`stream_id`, `topic`, `date_muted`). Previously, they were a 2-item tuple. * `GitLab` authentication is now available. * Added `None` as a video call provider option. ## Changes in Zulip 2.1 * [`GET /users`](/api/get-all-users): Added `include_custom_profile_fields` to request custom profile field data. * [`GET /users/me`](/api/get-profile): Added `avatar_url` field, containing the user's avatar URL, to the response. * [`GET /users/me/subscriptions`](/api/get-subscribed-streams): Added `include_subscribers` parameter controlling whether data on the other subscribers is included. Previous behavior was to always send subscriber data. * [`GET /users/me/subscriptions`](/api/get-subscribed-streams): Stream-level notification settings like `push_notifications` were changed to be nullable boolean fields (true/false/null), with `null` meaning that the stream inherits the organization-level default. Previously, the only values were true/false. A client communicates support for this feature using `client_capabilities`. * [`GET /users/me/subscriptions`](/api/get-subscribed-streams): Added `wildcard_mentions_notify` notification setting, with the same global-plus-stream-level-override model as other notification settings. * [`GET /server_settings`](/api/server-settings): Added `external_authentication_methods` structure, used to display login buttons nicely in the mobile apps. * Added `first_message_id` field to Stream objects. This is helpful for determining whether the stream has any messages older than a window cached in a client. * Added `is_web_public` field to Stream objects. This field is intended to support web-public streams. * Added `/export/realm` endpoints for triggering a data export. * `PATCH /realm`: Added `invite_to_stream_policy`, `create_stream_policy`, `digest_emails_enabled`, `digest_weekday`, `user_group_edit_policy`, and `avatar_changes_disabled` organization settings. * Added `fluid_layout_width`, `desktop_icon_count_display`, and `demote_inactive_streams` display settings. * `enable_stream_sounds` was renamed to `enable_stream_audible_notifications`. * Deprecated `is_home_view`, replacing it with the more readable `is_muted` (with the opposite meaning). * Custom profile fields: Added `EXTERNAL_ACCOUNT` field type. ## Changes in Zulip 2.0 * [`POST /messages`](/api/send-message): Added support for using user IDs and stream IDs for specifying the recipients of a message. * [`POST /typing`](/api/typing): Added support for specifying the recipients with user IDs, deprecating the original API of specifying them using email addresses. ------------------ ## Changes not yet stabilized * [`POST /register`](/api/register-queue): Added `slim_presence` parameter. Changes the format of presence events, but is still being changed and should not be used by clients. * `message_retention_days` field in stream objects.