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 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: 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: 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: message_deleted 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.
  • 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 reponse 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 with 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}: Endpoint added.
  • GET /messages: Add support for string-format values for the anchor parameter, deprecating and replacing the use_first_unread_anchor parameter.
  • GET /messages and 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.
  • POST /users/me/subscriptions: Replaced is_announcement_only boolean with stream_post_policy enum for specifying who can post to a stream.
  • PATCH /streams/{stream_id}: Replaced is_announcement_only boolean with stream_post_policy enum for specifying who can post to a stream.
  • GET /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: 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.
  • 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

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