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 3.1
Feature level 27
- The short_namefield is removed fromdisplay_recipientsinPOST /users.
Feature level 26
- The sender_short_namefield is no longer included inGET /messages.
- The short_namefield is removed fromdisplay_recipientsinGET /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- pointerconcept 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- namefield.  The- date_sentand- create_timefields 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- reffield (which had that user's Zulip display email address).
Feature level 21
- PATCH /settings/display: Replaced the- night_modeboolean with- color_schemeas 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:- subscriptionsevent with- op="peer_add"and- op="peer_remove"now identify the modified
  stream by a- stream_idfield, replacing the old- namefield.
Feature level 18
- POST /register: Added- user_avatar_url_field_optionalto supported- client_capabilities.
Feature level 17
Feature level 16
- [GET /users/me]: Removedpointerfrom 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_streamfield from Stream objects.  This field was
  always equivalent to- stream_weekly_traffic != nullon the same object.
Feature level 13
- POST /register: Added- bulk_message_deletionto supported- client_capabilities.
- GET /events:- message_deletedevents have new behavior.  The- senderand- sender_idfields were
  removed, and the- message_idfield was replaced by a- message_idslist for clients with the- bulk_message_deletionclient capability.
  All clients should upgrade; we expect- bulk_message_deletionto be
  required in the future.
Feature level 12
Feature level 11
- POST /register: Added- realm_community_topic_editing_limit_secondsto the response, the
  time limit before community topic editing is forbidden.  A- nullvalue means no limit.
- POST /register: The response now contains a- is_owner, similar to the existing- is_adminand- is_guestfields.
- 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_joinedfields to the User objects.
- GET users/me: Removed- client_idand- short_namefrom 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_userand- realm_botevents no longer contain an- emailfield to identify
  the user; use the- user_idfield instead.  Previously, some (but
  not all) events of these types contained an- emailkey in addition to
  to- user_id) for identifying the modified user.
- PATCH /users/{user_id}: The- is_adminand- is_guestparameters were removed in favor of the more general- roleparameter for specifying a change in user role.
- GET /events:- realm_userevents
  sent when a user's role changes now include- roleproperty, instead
  of the previous- is_guestor- is_adminbooleans.
- GET /realm/emoji: The user who uploaded a given custom emoji is
  now indicated by an- author_idfield, replacing a previous- authorobject with unnecessary additional data.
Feature level 6
- GET /events:- realm_userevents to
  update a user's avatar now include the- avatar_versionfield, which
  is important for correctly refetching medium-size avatar images when
  the user's avatar changes.
- GET /usersand- GET
  /users/{user_id}: User objects now contain the- avatar_versionfield 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_disabledand- server_name_changes_disabledfields are now available via- POST /registerto make them accessible to all the clients;
  they were only internally available to Zulip's web app prior to this.
Feature level 3:
- zulip_versionand- zulip_feature_levelare always returned
  in- POST /register; previously they were only returned if- event_typesincluded- zulip_version.
- Added new presence_enableduser notification setting; previously
  presence was always enabled.
Feature level 2:
- POST /messages/{message_id}/reactions:
  The- reaction_typeparameter is optional; the server will guess the- reaction_typeif it is not specified (checking custom emoji, then
  unicode emoji for any with the provided name).
- reactionsobjects returned by the API (both in- GET /messagesand
  in- GET /events) now include the user who reacted in a top-level- user_idfield.  The legacy- userdictionary (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_levelto the response if- zulip_versionis among the requested- event_types.
- GET /users: User objects for bots now
  contain a- bot_owner_id, replacing the previous- bot_ownerfield
  (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- anchorparameter, deprecating and replacing the- use_first_unread_anchorparameter.
- GET /messagesand- GET
  /events: Message objects now use- topic_linksrather than- subject_linksto indicate links either
  present in the topic or generated by Linkifiers applied to the topic.
- POST /users/me/subscriptions: Replaced- is_announcement_onlyboolean with- stream_post_policyenum for
  specifying who can post to a stream.
- PATCH /streams/{stream_id}: Replaced- is_announcement_onlyboolean with- stream_post_policyenum for
  specifying who can post to a stream.
- GET /streams: Replaced- is_announcement_onlyboolean with- stream_post_policyenum 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_NOBODYpossible value foremail_address_visibility.
- Added private_message_policyrealm setting.
- muted_topicobjects now are a 3-item tuple: (- stream_id,- topic,- date_muted).  Previously, they were a 2-item tuple.
- GitLabauthentication is now available.
- Added Noneas a video call provider option.
Changes in Zulip 2.1
- GET /users: Added- include_custom_profile_fieldsto request custom profile field data.
- GET /users/me: Added- avatar_urlfield,
  containing the user's avatar URL, to the response.
- GET /users/me/subscriptions: Added- include_subscribersparameter 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_notificationswere
  changed to be nullable boolean fields (true/false/null), with- nullmeaning 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_notifynotification setting, with the same
  global-plus-stream-level-override model as other notification settings.
- GET /server_settings: Added- external_authentication_methodsstructure, used to display login
  buttons nicely in the mobile apps.
- Added first_message_idfield 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_publicfield to Stream objects.  This field is
  intended to support web-public streams.
- Added /export/realmendpoints 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_disabledorganization settings.
- Added fluid_layout_width,desktop_icon_count_display, anddemote_inactive_streamsdisplay settings.
- enable_stream_soundswas renamed to- enable_stream_audible_notifications.
- Deprecated in_home_view, replacing it with the more readableis_muted(with the opposite meaning).
- Custom profile fields: Added EXTERNAL_ACCOUNTfield 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- topicparameter name.  The previous- subjectparameter 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_presenceparameter.  Changes the format of presence events, but is still
  being changed and should not be used by clients.