zulip/api_docs/changelog.md

61 KiB

API changelog

This page documents changes to the Zulip Server API over time. See also the Zulip release lifecycle for background on why this API changelog is important, and the Zulip 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 and POST /register responses, to determine the API format used by the Zulip server that they are interacting with.

Changes in Zulip 7.0

Feature level 179:

  • POST /scheduled_messages: Added new endpoint to create and edit scheduled messages.
  • GET /events Added scheduled_messages events sent to clients when a user creates, edits or deletes scheduled messages.
  • POST /register: 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, POST /register, GET /events, GET /realm/presence, GET /users/<user_id_or_email>/presence: 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, GET /messages/matches_narrow, POST /message/flags/narrow, POST /register: Added support for three search/narrow filters 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, realm/filters/<int:filter_id>: The parameter url_format_string is replaced by url_template. The linkifiers now accept only RFC 6570 compliant URL Templates. The old URL format strings are no longer supported.
  • GET /events, POST /register: The key url_format_string is replaced by url_template for the realm_linkifiers event type. For backwards-compatibility, clients that do not support the linkifier_url_template client capability will get an empty list in the response of /register and not receive realm_linkifiers events. Unconditionally, the deprecated event type realm_filters gives an empty list in the response of /register and is no longer sent the clients otherwise.

Feature level 175

Feature level 174:

  • POST /typing, POST /messages: 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:

Feature level 172

  • PATCH /messages/{message_id}: Topic editing restrictions now apply to messages without a topic as well.
  • PATCH /messages/{message_id}: The endpoint now returns an error when users, other than organization administrators and moderators, try to move messages that have passed the time limit using change_all value for propagate_mode parameter.

Feature level 171:

Feature level 170

  • POST /user_topics: Added a new endpoint to update the personal preferences for a topic.

Feature level 169

Feature level 168

Feature level 167

  • All REST API endpoints: 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: 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

Feature level 164

  • POST /register: Added the server_presence_ping_interval_seconds and server_presence_offline_threshold_seconds attributes.

Feature level 163

  • GET /users, GET /users/{user_id}, GET /users/{email}, GET /users/me and GET /events: The delivery_email field is always present in user objects, including the case when email_address_visibility is set to EMAIL_ADDRESS_VISIBILITY_EVERYONE, with the value being None if the requestor does not have access to the user's real email. For bot users, the delivery_email field is always set to the real email.
  • GET /events: Event for updating delivery_email is now sent to all users who have access to it and is also sent when email_address_visibility setting changes.
  • POST /register, PATCH /settings, PATCH /realm/user_settings_defaults: Added user setting email_address_visibility which will replace the existing realm setting email_address_visibility.
  • POST /register, PATCH /realm: Removed realm-level email_address_visibility setting.

Feature level 162

  • POST /register, GET /events, PATCH /realm: Added new move_messages_within_stream_limit_seconds setting.
  • POST /register, GET /events, PATCH /realm: Added new move_messages_between_streams_limit_seconds setting.
  • PATCH /messages/{message_id}: Time limit to edit topics, for users other than administrators and moderators, can now be configured using move_messages_within_stream_limit_seconds setting.
  • PATCH /messages/{message_id}: Time limit to move messages between streams, for users other than administrators and moderators, can now be configured using move_messages_between_streams_limit_seconds setting.

Feature level 161

  • PATCH /streams/{stream_id}: Added can_remove_subscribers_group_id parameter to support changing can_remove_subscribers_group setting.
  • POST /users/me/subscriptions: Added can_remove_subscribers_group_id parameter to set can_remove_subscribers_group setting while creating streams.

Feature level 160

  • POST /api/v1/jwt/fetch_api_key: New API endpoint to fetch API keys using JSON Web Token (JWT) authentication.
  • accounts/login/jwt/: Adjusted format of requests to this previously undocumented, optional endpoint for JWT authentication log in support.

Feature level 159

Feature levels 157-158 are reserved for future use in 6.x maintenance releases.

Changes in Zulip 6.0

Feature level 156

No changes; feature level used for Zulip 6.0 release.

Feature level 155

  • 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 no longer redundantly lists messages where the flag was set to the same state it was already in.
  • POST /messages/flags/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: 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: 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}: The send_notification_to_old_thread and send_notification_to_new_thread parameters are now respected when moving a topic within a stream. The default value for send_notification_to_old_thread was changed from true to false.

Feature level 151

Feature level 150

  • 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

Feature level 148

  • POST /users/me/status, POST /register, 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: 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

Feature level 145

Feature level 144

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

Feature level 141

Feature level 140

  • POST /register: Added string field server_emoji_data_url to the response.

Feature level 139

  • GET /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, 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

Feature level 136

  • PATCH /streams/{stream_id}: 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}: 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}: Added deactivation_notification_comment field controlling whether the user receives a notification email about their deactivation.

Feature level 134

  • 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: 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

Feature level 132

Feature level 131

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}.

Feature level 129

  • POST /register, 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

Feature level 127

Feature level 126

  • POST /invites, POST /invites/multiuse: Replaced invite_expires_in_days parameter with invite_expires_in_minutes.

Feature level 125

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: Added message_details field appearing in message flag update events when marking previously read messages as unread.

Feature level 120

  • GET /messages/{message_id}: This endpoint now sends the full message details. Previously, it only returned the message's raw Markdown content.

Feature level 119

  • POST /register: The unread_msgs section of the response now prefers other_user_id over the poorly named sender_id field in the pms dictionaries. This change is motivated by the possibility that a message you yourself sent to another user could be marked as unread.

Feature level 118

  • GET /messages, 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. 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: 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: 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.

Feature level 115

  • Mobile push notifications about stream messages now include the stream_id field.

Feature level 114

  • 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: 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, POST /register: 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: Updated update_message event type to include stream_id field for all edits to stream messages.

Feature level 111

Feature level 110

  • POST /register: Added server_web_public_streams_enabled to the response.

Feature level 109

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

Feature level 106

Feature level 105

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: Added create_web_public_stream_policy policy for which users can create web-public streams.
  • GET /events, PATCH /realm: Added support for updating create_web_public_stream_policy.
  • POST /register: Added can_create_web_public_streams boolean field to the response.

Feature level 102

  • POST /register, 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: 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, 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, 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, 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: 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 /subscribe: Added is_web_public parameter for requesting the creation of a web-public stream.
  • PATCH /streams/{stream_id}: 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, POST /register: 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: 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: Added realm_user_settings_defaults object, containing default values of personal user settings for new users in the realm.

  • 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: Added demo_organization_scheduled_deletion_date field to realm data.

Feature level 93

Feature level 92

Feature level 91

  • PATCH /realm, PATCH /streams/{stream_id}: 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: 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: 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: 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: 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: 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: Added zulip_merge_base field to the response.
  • GET /events: Added new zulip_merge_base field to the restart event.
  • 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: Added a new enable_drafts_synchronization setting, which controls whether the syncing drafts between different clients is enabled.

  • GET /events, POST /register: Added new enable_drafts_synchronization setting under update_display_settings.

  • GET /drafts: Added new endpoint to fetch user's synced drafts from the server.

  • POST /drafts: Added new endpoint to create drafts when syncing has been enabled.

  • PATCH /drafts/{draft_id}: Added new endpoint to edit a draft already owned by the user.

  • DELETE /drafts/{draft_id}: Added new endpoint to delete a draft already owned by the user.

Feature level 86

  • GET /events: Added emoji_name, emoji_code, and reaction_type fields to user_status objects.
  • POST /register: Added emoji_name, emoji_code, and reaction_type fields to user_status objects.
  • POST /users/me/status: Added support for new emoji_name, emoji_code, and reaction_type parameters.

Feature level 85

  • POST /register, PATCH /realm: Replaced add_emoji_by_admins_only field with an integer field add_custom_emoji_policy.

Feature level 84

  • POST /register: 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: 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 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 endpoint.

Feature level 80

  • PATCH /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: 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: Added ignored_parameters_unsupported field, which is a list of parameters that were ignored by the endpoint, to the response object.

  • PATCH /settings: Removed full_name and account_email fields from the response object.

Feature level 77

  • 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, POST /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, PATCH /realm: Replaced allow_community_topic_editing field with an integer field edit_topic_policy.

Feature level 74

  • POST /register: Added server_needs_upgrade and event_queue_longpoll_timeout_seconds field when fetching realm data.

Feature level 73

Feature level 72

  • POST /register: 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: Added is_web_public field to stream events changing invite_only.

Feature level 70

  • POST /register: 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: 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}: 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

Feature level 58

  • POST /register: Added the new stream_typing_notifications property to supported client_capabilities.
  • 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 /set-typing-status: Added support for sending typing notifications for stream messages.

Feature level 57

Feature level 56

  • POST /register: Added a new setting move_messages_between_streams_policy for controlling who can move messages between streams.

Feature level 55

  • POST /register: 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 which returns the data in a cleaner dictionary format.
  • 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: 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: 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: Added a new boolean field can_invite_others_to_realm.

Feature level 50

  • POST /register: Replaced invite_by_admins_only field with an integer field invite_to_realm_policy.

Feature level 49

Feature level 48

Feature level 47

  • POST /register: Added a new giphy_api_key field, which is required to fetch GIFs using the GIPHY API.

Feature level 46

  • GET /messages and GET /events: The topic_links field now contains a list of dictionaries, rather than a list of strings.

Feature level 45

  • 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: 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

Feature level 42

  • PATCH /settings/display: Added a new default_view setting allowing the user to set the default view.

Feature level 41

  • GET /events: Removed name field from update subscription events.

Feature level 40

  • GET /events: Removed email field from update subscription events.

Feature level 39

Feature level 38

  • POST /register: 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: Restricted access to organization administrators with the can_create_users permission.
  • Error handling: The code property will now be present in errors due to rate limits.

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: 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: 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: Added a role field to Subscription objects representing whether the user is a stream administrator.

  • 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

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: Removed short_name field from display_recipient array objects.

Feature level 26

  • GET /messages: sender_short_name field is no longer included in return values for this endpoint.
  • 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: 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: 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: 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: Added user_avatar_url_field_optional to supported client_capabilities.

Feature level 17

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 <time> HTML tag. It is OK for clients to ignore the previous time mention markup, as the feature was not advertised before this change.

Feature level 15

  • Added spoilers to supported Markdown features.

Feature level 14

  • GET users/me/subscriptions: Removed the is_old_stream field from Stream objects. This field was always equivalent to stream_weekly_traffic != null on the same object.

Feature level 13

  • POST /register: Added bulk_message_deletion to supported client_capabilities.
  • GET /events: delete_message events have new behavior. The sender and sender_id fields were removed, and the message_id field was replaced by a message_ids list for clients with the bulk_message_deletion client capability. All clients should upgrade; we expect bulk_message_deletion to be required in the future.

Feature level 12

Feature level 11

  • POST /register: Added realm_community_topic_editing_limit_seconds to the response, the time limit before community topic editing is forbidden. A null value means no limit. This was previously hard-coded in the server as 86400 seconds (1 day).
  • POST /register: The response now contains a is_owner, similar to the existing is_admin and is_guest fields.
  • POST /set-typing-status: Removed legacy support for sending email addresses, rather than user IDs, to encode private message recipients.

Feature level 10

  • GET users/me: Added avatar_version, is_guest, is_active, timezone, and date_joined fields to the User objects.
  • GET users/me: Removed client_id and short_name from the response to this endpoint. These fields had no purpose and were inconsistent with other API responses describing users.

Feature level 9

Feature level 8

Feature level 7

  • GET /events: realm_user and realm_bot events no longer contain an email field to identify the user; use the user_id field instead. Previously, some (but not all) events of these types contained an email key in addition to to user_id) for identifying the modified user.
  • PATCH /users/{user_id}: The is_admin and is_guest parameters were removed in favor of the more general role parameter for specifying a change in user role.
  • GET /events: realm_user events sent when a user's role changes now include role property, instead of the previous is_guest or is_admin booleans.
  • GET /realm/emoji: The user who uploaded a given custom emoji is now indicated by an author_id field, replacing a previous author object that had unnecessary additional data.

Feature level 6

  • GET /events: realm_user events to update a user's avatar now include the avatar_version field, which is important for correctly refetching medium-size avatar images when the user's avatar changes.
  • GET /users and GET /users/{user_id}: User objects now contain the avatar_version field as well.

Feature level 5

  • GET /events: realm_bot events, sent when changes are made to bot users, now contain an integer-format owner_id field, replacing the owner field (which was an email address).

Feature level 4

  • jitsi_server_url, development_environment, server_generation, password_min_length, password_min_guesses, max_file_upload_size_mib, max_avatar_file_size_mib, server_inline_image_preview, server_inline_url_embed_preview, server_avatar_changes_disabled and server_name_changes_disabled fields are now available via POST /register to make them accessible to all the clients; they were only internally available to Zulip's web app prior to this.

Feature level 3:

  • zulip_version and zulip_feature_level are always returned in POST /register; previously they were only returned if event_types included zulip_version.
  • Added new presence_enabled user notification setting; previously presence was always enabled.

Feature level 2:

  • POST /messages/{message_id}/reactions: The reaction_type parameter is optional; the server will guess the reaction_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: Added zulip_feature_level, which can be used by clients to detect which of the features described in this changelog are supported.
  • POST /register: Added zulip_feature_level to the response if zulip_version is among the requested event_types.
  • GET /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}: New endpoint added to get a single user's details by the user's ID.
  • GET /messages: Add support for string-format values for the anchor parameter, deprecating and replacing the use_first_unread_anchor parameter.
  • GET /messages, GET /events: 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.
  • GET /streams, POST /users/me/subscriptions, PATCH /streams/{stream_id}: Stream objects now have stream_post_policy enum for specifying who can post to the stream, deprecating and replacing the is_announcement_only boolean.
  • GET /user_uploads/{realm_id_str}/{filename}: New endpoint added 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).
  • POST /register, GET /events, PATCH /realm: Nobody added as an option for the realm setting email_address_visibility.
  • POST /register, GET /events, PATCH /realm: Added realm setting private_message_policy.
  • POST /register, GET /events: muted_topics array objects now are 3-item tuples that include the stream name, the topic name, and the time when the topic was muted. Previously, they were 2-item tuples and did not include the time when the topic was muted.
  • GET /server_settings: Added gitlab boolean to deprecated authentication_methods object.
  • POST /register, GET /events, PATCH /realm: None added as an option for the realm setting video_chat_provider to disable video call UI.

Changes in Zulip 2.1

  • GET /messages: Added support for search/narrow options that use stream/user IDs to specify a message's sender, its stream, and/or its recipient(s).
  • GET /users: Added include_custom_profile_fields to request custom profile field data.
  • GET /users/me: Added avatar_url field, containing the user's avatar URL, to the response.
  • GET /users/me/subscriptions: 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: 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: Added wildcard_mentions_notify notification setting, with the same global-plus-stream-level-override model as other notification settings.
  • GET /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.
  • POST /users/me/subscriptions/properties: Deprecated in_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

  • PATCH /users/me/subscriptions/muted_topics: Added support for using stream IDs to specify the stream in which to mute/unmute a topic.
  • POST /messages: Added support for using user IDs and stream IDs for specifying the recipients of a message.
  • POST /messages, POST /messages/{message_id}: Added support for encoding topics using the topic parameter name. The previous subject parameter name was deprecated but is still supported for backwards-compatibility.
  • POST /set-typing-status: 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: Added slim_presence parameter. Changes the format of presence events, but is still being changed and should not be used by clients.