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 10.0
Feature level 372
- POST /typing: The- "(no topic)"value
  when used for- topicparameter is now interpreted as an empty string.
Feature level 371
No changes; feature level used for Zulip 10.0 release.
Feature level 370
Feature level 369
Feature level 368
Feature level 367
Feature level 366
Feature level 365
- GET /events,- GET /messages,- GET /messages/{message_id}: Added- last_moved_timestampfield to message objects for when the message
  was last moved to a different channel or topic. If the message's topic
  has only been resolved or unresolved, then
  the field is not present. Clients should use this field, rather than
  parsing the message object's- edit_historyarray, to display an
  indicator that the message has been moved.
- GET /events,- GET /messages,- GET /messages/{message_id}: The- last_edit_timestampfield on message objects is only present if the
  message's content has been edited. Previously, this field was present
  if the message's content had been edited or moved to a different
  channel or topic. Clients should use this field, rather than parsing
  the message object's- edit_historyarray, to display an indicator
  that the message has been edited.
Feature level 364
Feature level 363
Feature level 362
Feature level 361
- POST /messages/{message_id}/typing:
  Renamed- POST /messages/{message_id}/typingto- POST /message_edit_typing, passing the one- message_idparameter
  in the URL path, for consistency with the rest of the API.
Feature level 360
Feature level 359
- PATCH /bots/{bot_user_id}: Previously, changing the owner of a bot
  unsubscribed the bot from any channels that the new owner was not
  subscribed to. This behavior was removed in favor of documenting the
  security trade-off associated with giving bots read access to
  sensitive channel content.
Feature level 358
- PATCH /realm,- GET /events: Changed- allow_edit_historyboolean field to- message_edit_history_visibility_policyinteger field to
  support an intermediate field for- Moves onlyedit history of messages.
- POST /register:- realm_allow_edit_historyfield is
  deprecated and has been replaced by- realm_message_edit_history_visibility_policy.
  The value of- realm_allow_edit_historyis set to- Falseif- realm_message_edit_history_visibility_policyis configured as "None",
  and- Truefor "Moves only" or "All" message edit history.
Feature level 357
Feature level 356
- GET /streams: The new parameter- include_can_access_content, if set to True, returns all the
  channels that the user making the request has content access to.
- GET /streams: Rename- include_all_activeto- include_allsince the separate- exclude_archivedparameter is
  what controls whether to include archived channels. The- include_allparameter is now supported for non-administrators.
Feature level 355
- POST /messages/flags/narrow,- POST /messages/flags:
  Added- ignored_because_not_subscribed_channelsfield in the response, which
  is a list of the channels whose messages were skipped to mark as unread
  because the user is not subscribed to them.
Feature level 354
- GET /messages,- GET
  /messages/{message_id}, [- POST
  /messages/flags/narrow]: Users can access messages in unsubscribed
  private channels that are accessible only via groups that grant
  content access.
- GET /messages/{message_id}/read_receipts:
  Users can access read receipts in unsubscribed private channels that are
  accessible only via groups that grant content access.
- POST /messages/{message_id}/reactions,- DELETE /messages/{message_id}/reactions:
  Users can react to messages in unsubscribed private channels that are
  accessible only via groups that grant content access.
- POST /submessage: Users can interact with polls and similar
  widgets in messages in unsubscribed private channels that are
  accessible only via groups that grant content access.
- PATCH /messages/{message_id}: Users can
  edit messages they have posted in unsubscribed private channels that
  are accessible only via groups that grant content access.
- POST
  /message_edit_typing:
  Users can generate typing notifications when editing messages in
  unsubscribed private channels that are accessible only via groups
  that grant content access.
- POST /messages: Users can send messages to
  private channels with shared history without subscribing if they are
  part of groups that grant content access and also in- can_send_message_group.
Feature level 353
- POST /register,- GET /events,- PATCH /realm: Zoom Server to Server OAuth integration added as an option
  for the realm setting- video_chat_provider.
Feature level 352
- PATCH /realm,- POST /register,- GET /events: Added- can_mention_many_users_grouprealm setting, which is a group-setting value
  describing the set of users with permission to use wildcard mentions in large
  channels.
- PATCH /realm,- GET /events: Removed- wildcard_mention_policyproperty, as the permission to use wildcard mentions
  in large channels is now controlled by- can_mention_many_users_groupsetting.
- POST /register:- realm_wildcard_mention_policyfield is deprecated, having been replaced by- can_mention_many_users_group.
  Notably, this backwards-compatible- realm_wildcard_mention_policyvalue
  now contains the superset of the true value that best approximates the actual
  permission setting.
Feature level 351
- 
POST /message_edit_typing:
  Added a new endpoint for sending typing notification when a message is
  being edited both in streams and direct messages.
 
- 
GET /events: The newtyping_edit_messageevent
  is sent when a user starts editing a message.
 
Feature level 350
Feature level 349
- POST /users/me/subscriptions: Users belonging to- can_add_subscribers_groupshould be able to add subscribers to a
  private channel without being subscribed to it.
- DELETE /users/me/subscriptions: Channel
  administrators can now unsubscribe other users even if they are not
  an organization administrator or part of- can_remove_subscribers_group.
- PATCH /streams/{stream_id},- DELETE /streams/{stream_id}: Channel and
  organization administrators can modify all the settings requiring
  only metadata access without having content access to it. They
  cannot add subscribers to the channel or change it's privacy setting
  without having content access to it.
- GET /events: All users with metadata access to
  a channel are now notified when a relevant stream event occurs.
  Previously, non-admin users who were channel admins or users
  belonging to- can_add_subscribers_groupwere not notified of events
  for a private channel they were not subscribed to.
- GET /events: If a user is a channel
  administrator for a private channel they are not subscribed to. That
  channel will now appear either in the- unsubscribedor- never_subscribedlist in subscription info.
Feature level 348
- POST /register,- POST /events,- PATCH /realm: Added- enable_guest_user_dm_warningsetting to decide
  whether clients should show a warning when a user is composing to a
  guest user in the organization.
Feature level 347
Feature level 346
Feature level 345
- POST /remotes/server/register/transfer,- POST /remotes/server/register/verify_challenge,- POST /zulip-services/verify/{access_token}/: Added new API
  endpoints for transferring Zulip services registrations.
- POST /remotes/server/register: Added new response format for
  hostnames that are already registered.
Feature level 344
- PATCH /realm,- GET /events,- POST /register:
  Added two new realm settings,- can_create_bots_groupwhich is a
  group-setting value describing the set of users
  with permission to create bot users in the organization, and- can_create_write_only_bots_groupwhich is a
  group-setting value describing the set of users
  with permission to create bot users who can only send messages in the organization
  in addition to the users who are in- can_create_bots_group.
- PATCH /realm,- GET /events: Removed- bot_creation_policyproperty, as the permission to create bot users
  in the organization is now controlled by two new realm settings,- can_create_bots_groupand- can_create_write_only_bots_group.
Feature level 343
- GET /events: Added a new field- stream_idsto replace- streamsin stream delete event and label- streamsas deprecated.
Feature level 342
Feature level 341
- PATCH /realm,- GET /events,- POST /register:
  Added- can_add_subscribers_grouprealm setting which is a
  group-setting value describing the set of users
  with permission to add subscribers to channels in the organization.
- POST /register: Removed- can_subscribe_other_usersboolean field from the response.
- PATCH /realm,- GET /events: Removed- invite_to_stream_policyproperty, as the permission to subscribe
  other users to channels in the organization is now controlled by the- can_add_subscribers_groupsetting.
Feature level 340
PATCH /user_groups/{user_group_id}: All
the permission settings and description can now be updated for
deactivated groups.
Feature level 339
- GET /events: Added- userfield back in- reactionevents, reverting part of the feature level 328
  changes. Note that this field was only restored in the events API,
  and remains deprecated, pending core clients fully migrating away
  from accessing it.
Feature level 338
- POST /register: Added- password_max_lengthfield, which is the maximum allowed password length.
Feature level 337
- POST /calls/bigbluebutton/create: Added a- voice_onlyparameter
  controlling whether the call should be voice-only, in which case we
  keep cameras disabled for this call. Now the call creator is a
  moderator and all other joiners are viewers.
Feature level 336
- Markdown message formatting: Added
  data-original-content-typeattribute to convey the type of the original
  image, and optionaldata-transcoded-imageattribute for images with formats
  which are not widely supported by browsers.
Feature level 335
- GET /streams/{stream_id}/email_address:
  Added an optional- sender_idparameter to specify the ID of a user or bot
  which should appear as the sender when messages are sent to the channel using
  the returned channel email address.
Feature level 334
- 
POST /register: Addedrealm_empty_topic_display_namefield for clients to use
  while adding support for empty string as topic name.
 
- 
POST /register: Addedempty_topic_nameclient capability
  to allow client to specify whether it supports empty string as a topic name
  inregisterresponse or events involving topic names.
  Clients that don't support this client capability receiverealm_empty_topic_display_namefield value as the topic name replacing
  the empty string.
 
- 
GET /events: For clients that don't support
  theempty_topic_nameclient capability,
  the following fields will have the value ofrealm_empty_topic_display_namefield replacing the empty string for channel messages:
 
- subjectfield in the- messageevent type
- topicfield in the- delete_messageevent type
- orig_subjectand- subjectfields in the- update_messageevent type
- topic_namefield in the- user_topicevent type
- topicfield in the- typingevent type
- topicfield in the- update_message_flagsevent type when removing- readflag
 
- 
GET /messages,GET /messages/{message_id}: Addedallow_empty_topic_nameboolean parameter to decide whether the topic names in the fetched messages
  can be empty strings.
 
- 
GET /messages/{message_id}/history:
  Addedallow_empty_topic_nameboolean parameter to decide whether the
  topic names in the fetched message history objects can be empty strings.
 
- 
GET /users/me/{stream_id}/topics:
  Addedallow_empty_topic_nameboolean parameter to decide whether the
  topic names in the fetchedtopicsarray can be empty strings.
 
- 
POST /register: For clients that don't support
  theempty_topic_nameclient capability,
  thetopicfield in theunread_msgsobject andtopic_namefield
  in theuser_topicsobjects will have the value ofrealm_empty_topic_display_namefield replacing the empty string
  for channel messages.
 
Feature level 333
- Message formatting: System groups can now
  be silently mentioned.
- GET /users/me/subscriptions,- GET /streams,- GET /events,- POST /register: Added- can_send_message_groupwhich is a group-setting value describing the
  set of users with permissions to post in the channel.
- POST /users/me/subscriptions,- PATCH /streams/{stream_id}: Added- can_send_message_groupwhich is a group-setting value describing the
  set of users with permissions to post in the channel.
- GET /users/me/subscriptions,- GET /streams,- GET /events,- POST /register:- stream_post_policyfield is
  deprecated, having been replaced by- can_send_message_group. Notably,
  this backwards-compatible- stream_post_policyvalue now contains the
  superset of the true value that best approximates the actual permission
  setting.
- POST /users/me/subscriptions,- PATCH /streams/{stream_id}: Removed- stream_post_policyand- is_announcement_onlyproperties, as the permission
  to post in the channel is now controlled by- can_send_message_groupsetting.
Feature level 332
- POST /register: Added- server_min_deactivated_realm_deletion_daysand- server_max_deactivated_realm_deletion_daysfields for the permitted
  number of days before full data deletion of a deactivated organization
  on the server.
- POST /realm/deactivate: Added- deletion_delay_daysparameter to
  support setting when a full data deletion of the deactivated
  organization may be done.
Feature level 331
- POST /register,- POST /events,- PATCH /realm: Added- moderation_request_channel_idrealm setting, which is
  the ID of the private channel to which moderation requests will be sent.
Feature level 330
Feature level 329
Feature level 328
- GET /messages,- GET /events:
  Removed deprecated- userdictionary from the- reactionsobjects returned
  by the API, as the clients now use- user_idfield instead.
Feature level 327
Feature level 326
- POST /register: Removed- allow_owners_groupfield from configuration data object of permission settings passed in- server_supported_permission_settings.
- POST /register: Removed- id_field_namefield from configuration data object of permission settings passed
  in- server_supported_permission_settings.
Feature level 325
Feature level 324
Feature level 323
Feature level 322
Feature level 321
- PATCH /realm,- GET /events,- POST /register:
  Added- can_invite_users_grouprealm setting which is a
  group-setting value describing the set of users
  with permission to send email invitations for inviting other users to the
  organization.
- PATCH /realm,- GET /events: Removed- invite_to_realm_policyproperty, as the permission to send email invitations
  for inviting other users to the organization is now controlled by- can_invite_users_groupsetting.
Feature level 320
Feature level 319
Feature level 318
- POST /register: Updated- realm_incoming_webhook_botswith a new- config_optionskey,
  defining which options should be offered when creating URLs for this
  integration.
Feature level 317
- POST /user_groups/create:
  Added- group_idto the success response of the user group creation
  endpoint, enabling clients to easily access the unique identifier
  of the newly created user group.
Feature level 316
- PATCH /realm,- GET /events,- POST /register:
  Added- can_move_messages_between_topics_grouprealm setting which is a
  group-setting value describing the set of users
  with permission to move messages from one topic to another within a channel
  in the organization.
- PATCH /realm,- GET /events: Removed- edit_topic_policyproperty, as the permission to move messages between
  topics in the organization is now controlled by- can_move_messages_between_topics_groupsetting.
Feature level 315
Feature level 314
Feature level 313
Feature level 312
- GET /events: Added- realm_export_consentevent
  type to allow realm administrators to view which users have
  consented to export their private data as part of a realm export.
Feature level 311
Feature level 310
- PATCH /realm,- GET /events,- POST /register:
  Added- can_move_messages_between_channels_grouprealm setting which is a
  group-setting value describing the set of users
  with permission to move messages from one channel to another in the organization.
- PATCH /realm,- GET /events: Removed- move_messages_between_streams_policyproperty, as the permission to move
  messages between channels in the organization is now controlled by- can_move_messages_between_channels_groupsetting.
Feature level 309
- Group-setting values: Starting with
  this feature level, it's now possible to use group-setting values in
  production for those settings whose value is not required to be a
  system group
Feature level 308
Feature level 307
- PATCH /realm,- GET /events,- POST /register:
  Added- can_add_custom_emoji_grouprealm setting which is a
  group-setting value describing the set of users
  with permission to add custom emoji in the organization.
- PATCH /realm,- GET /events: Removed- add_custom_emoji_policyproperty, as the permission to add custom emoji
  in the organization is now controlled by- can_add_custom_emoji_groupsetting.
Feature level 306
- GET /events: Removed the- extra_dataoptional
  field from the- realm/updateevent format, which was only used for- plan_typeevents, with a single- upload_quotafield. Now, we use
  a standard- realm/update_dictevent to notify clients about changes
  in- plan_typeand other fields that atomically change with a given
  change in plan.
- GET /events: Added- max_file_upload_size_mibfield to the- dataobject in- realm/update_dictevent format;
  previously, this was a constant. Note that the field does not have a- realm_prefix in the- POST /registerresponse.
Feature level 305
- POST /register,- GET /events,- GET /user_groups: Add- can_add_members_groupto
  user group objects.
- POST /user_groups/create: Added- can_add_members_groupparameter to support setting the user group which can add members to the user
  group.
- PATCH /user_groups/{user_group_id}: Added- can_add_members_groupparameter to support changing the user group which
  can add members to the specified user group.
- The can_manage_all_groupspermission now has the natural semantics
  of applying to all groups, regardless of the role of the user given
  this permission. Since its introduction in feature level 299,can_manage_all_groupshad temporarily had unusual semantics
  matching those of the originaluser_group_edit_policysetting.
Feature level 304
- 
GET /export/realm,GET /events: Addedexport_typefield
  to the dictionaries inexportsarray. It indicates whether
  the export is of public data or full data with user consent
  (standard export).
 
- 
POST /export/realm: Addedexport_typeparameter to add support for admins to decide whether to create a
  public or a standard data export.
 
Feature level 303
- POST /register,- GET /user_groups,- GET /user_groups/{user_group_id}/members/{user_id},- GET /user_groups/{user_group_id}/members:
  Deactivated users are no longer returned as members of the user groups
  that they were members of prior to deactivation.
- POST /register: Settings, represented as
  group-setting value, will never include
  deactivated users in the- direct_memberslist for settings whose
  value is an anonymous group.
- POST /user_groups/{user_group_id}/members:
  Deactivated users cannot be added or removed from a user group; they
  are now implicitly not members of any groups while deactivated.
- GET /events: User reactivation event is not sent
  to users who cannot access the reactivated user anymore due to a- can_access_all_users_grouppolicy.
- GET /events: The server will now send- user_groupevents with the- add_members/- remove_membersoperations as appropriate when deactivating or reactivating a user,
  to ensure client state correctly reflects groups never containing
  deactivated users.
- GET /events: To ensure that group-setting
  values are correct,- realm/update_dictand- user_group/updateevents may now be by sent by the server when
  processing a deactivation/reactivation of a user, to ensure client
  state correctly reflects the state, given that deactivated users
  cannot have permissions in an organization.
Feature level 302
- GET /users/{email}: Changed the- emailvalues by which users can successfully be looked up to match the
  user email visibility setting's semantics better.
Feature level 301
Feature level 300
- GET /messages: Added a new message_ids parameter,
  as an alternative method of specifying which messages to fetch.
Feature level 299
- PATCH /realm,- POST /register,- GET /events: Added- can_create_groupsrealm setting, which is a group-setting value
  describing the set of users with permission to create user groups.
- PATCH /realm,- POST /register,- GET /events: Added- can_manage_all_groupsrealm setting, which is a group-setting value
  describing the set of users with permission to manage all user groups.
- PATCH /realm,- GET /events: Removed- user_group_edit_policyproperty, as the permission to create user
  groups is now controlled by- can_create_groupssetting and permission to
  manage groups in now controlled by- can_manage_all_groupssetting.
- POST /register:- user_group_edit_policyfield is deprecated, having been replaced by- can_create_groupsfor user
  group creation and- can_manage_all_groupsfor user group management.
Feature level 298
- POST /user_groups/{user_group_id}/deactivate:
  Server now returns a specific error response (- "code": CANNOT_DEACTIVATE_GROUP_IN_USE)
  when a user group cannot be deactivated because it is in use. The
  error response contains details about where the user group is being used.
Feature level 297
Feature level 296:
Feature level 295
- GET /export/realm/consents: Added
  a new endpoint to fetch the consents of users
  for their private data exports.
- /api/v1/tusis an endpoint implementing the- tusprotocol for resumable uploads.
  Clients which send authenticated credentials (either via browser-based
  cookies, or API key via- Authorizationheader) may use this endpoint to
  create uploads, similar to- POST /user_uploads.
Feature level 294
- POST /register: Clients that do not
  support the- include_deactivated_groupsclient capability
  do not receive deactivated user groups in the response.
- GET /events: Clients that do not support the- include_deactivated_groupsclient capability
  receive- removeevent on user group deactivation instead of- updateevent.
- GET /events: Clients that do not support the- include_deactivated_groupsclient capability
  do not receive- updateevent when name of a deactivated user group
  is updated.
- GET /user_groups: Renamed- allow_deactivatedparameter to- include_deactivated_groups.
- DELETE /user_groups/{user_group_id}: Removed support for user group
  deletion as we now support deactivating user groups.
Feature level 293
- POST /register,- PATCH /settings:
  Added a new- allow_private_data_exportsetting to allow users to decide
  whether to let administrators export their private data.
Feature level 292
Feature level 291
- PATCH /realm,- GET /events,- POST /register:
  Added- can_delete_own_message_grouprealm setting which is a
  group-setting value describing the set of users
  with permission to delete the messages that they have sent in the organization.
- PATCH /realm,- GET /events: Removed- delete_own_message_policyproperty, as the permission to delete own messages
  is now controlled by- can_delete_own_message_groupsetting.
Feature level 290
Feature level 289
Feature level 288
- POST /register:
  A new- presence_history_limit_daysparameter can be given, instructing
  the server to only fetch presence data more recent than the given
  number of days ago.
- POST /users/me/presence:
  A new- history_limit_daysparameter can be given, with the
  same meaning as in the- presence_history_limit_daysparameter of- POST /registerabove.
Feature level 287
- Markdown message
  formatting: Added
  data-original-dimensionsattributes to placeholder images
  (image-loading-placeholder), containing the dimensions of the
  original image. This change was also backported to the Zulip 9.x
  series, at feature level 278.
Feature level 286
- POST /user_uploads: Added- filenamefield to
  the response, which is closer to the original filename than the
  basename of the- urlfield in the response.
Feature level 285
- PATCH /messages/{message_id}: Added- detached_uploadsto the response, indicating which uploaded files
  are now only accessible via message edit history.
Feature level 284
Feature level 283
Feature level 282
- POST users/me/tutorial_status: Removed this undocumented endpoint,
  as the state that it maintained has been replaced by a cleaner- onboarding_stepsimplementation.
Feature level 281
Feature level 280
- PATCH /realm,- POST /register,- GET /events: Added- can_create_web_public_channel_grouprealm setting, which is a group-setting value
  describing the set of users with permission to create web-public channels.
- PATCH /realm,- GET /events: Removed- create_web_public_stream_policyproperty, as the permission to create
  web-public channels is now controlled by- can_create_web_public_channel_groupsetting.
- POST /register:- realm_create_web_public_stream_policyfield is deprecated, having been replaced by- can_create_web_public_channel_group.
  Notably, this backwards-compatible- realm_create_web_public_stream_policyvalue
  now contains the superset of the true value that best approximates the actual
  permission setting.
Feature levels 278-279 are reserved for future use in 9.x maintenance
releases.
Changes in Zulip 9.0
Feature level 278
- Markdown message
  formatting: Added
  data-original-dimensionsattributes to placeholder images
  (image-loading-placeholder), containing the dimensions of the
  original image. Backported change from feature level 287.
Feature level 277
No changes; feature level used for Zulip 9.0 release.
Feature level 276
- Markdown message formatting:
  Image preview elements not contain a data-original-dimensionsattribute containing the dimensions of the original image.
Feature level 275
Feature level 274
- GET /events:- delete_messageevents are now
  always sent to the user who deletes the message, even if the message
  was in a channel that the user was not subscribed to.
Feature level 273
- POST /register: Added- server_thumbnail_formatsdescribing what formats the server will thumbnail images into.
Feature level 272
- POST /user_uploads:- uriwas renamed
  to- url, but remains available as a deprecated alias for
  backwards-compatibility.
Feature level 271
Feature level 270
- PATCH /realm,- POST /register,- GET /events: Added two new realm settings,- direct_message_initiator_group, which is a
  group-setting value describing the
  set of users with permission to initiate direct message thread, and- direct_message_permission_group, which is a
  group-setting value describing the
  set of users of which at least one member must be included as sender
  or recipient in all personal and group direct messages.
  Removed- private_message_policyproperty, as the permission to send
  direct messages is now controlled by- direct_message_initiator_groupand- direct_message_permission_groupsettings.
Feature level 269
Feature level 268
Feature level 267
- GET /invites,- POST /invites: Added- notify_referrer_on_joinparameter, indicating whether the referrer has opted
  to receive a direct message from the notification bot whenever a user joins
  via this invitation.
Feature level 266
- PATCH /realm,- POST /register,- GET /events: Added- can_create_private_channel_grouprealm setting, which is a group-setting value
  describing the set of users with permission to create private channels.
- PATCH /realm,- GET /events: Removed- create_private_stream_policyproperty, as the permission to create private
  channels is now controlled by- can_create_private_channel_groupsetting.
- POST /register:- realm_create_private_stream_policyfield is deprecated, having been replaced by- can_create_private_channel_group.
  Notably, this backwards-compatible- realm_create_private_stream_policyvalue
  now contains the superset of the true value that best approximates the actual
  permission setting.
Feature level 265
Feature level 264
- PATCH /realm,- POST /register,- GET /events: Added- can_create_public_channel_grouprealm setting, which is a group-setting value
  describing the set of users with permission to create channels.
- PATCH /realm,- GET /events: Removed- create_public_stream_policyproperty, as the permission to create public
  channels is now controlled by- can_create_public_channel_groupsetting.
- POST /register:- realm_create_public_stream_policyfield is deprecated, having been replaced by- can_create_public_channel_group.
  Notably, this backwards-compatible- realm_create_public_stream_policyvalue
  now contains the superset of the true value that best approximates the actual
  permission setting.
Feature level 263
- 
POST /users/me/presence:
  A newlast_update_idparameter can be given, instructing
  the server to only fetch presence data withlast_update_idgreater than the value provided. The server also provides
  apresence_last_update_idfield in the response, which
  tells the client the greatestlast_update_idof the fetched
  presence data. This can then be used as the value in the
  aforementioned parameter to avoid re-fetching of already known
  data when polling the endpoint next time.
  Additionally, the client specifying thelast_update_idimplies it uses the modern API format, soslim_presence=truewill be assumed by the server.
 
- 
POST /register: The response now also
  includes apresence_last_update_idfield, with the same
  meaning as described above for/users/me/presence.
  In the same way, the retrieved value can be passed when
  querying/users/me/presenceto avoid
  re-fetching of already known data.
 
Feature level 262
Feature level 261
- POST /invites,- POST /invites/multiuse: Added- include_realm_default_subscriptionsparameter to indicate whether
  the newly created user will be automatically subscribed to default
  channels in the
  organization. Previously, the default channel IDs needed to be included
  in the- stream_idsparameter. This also allows a newly created user
  to be automatically subscribed to the default channels in an
  organization when the user creating the invitation does not generally
  have permission to subscribe other users to
  channels.
Feature level 260
Feature level 259
- POST /register,- GET /events:
  For the- onboarding_stepsevent type, an array of onboarding steps
  to be displayed to clients is sent. Onboarding step now has one-time
  notices as the only valid type. Prior to this, both hotspots and
  one-time notices were valid types of onboarding steps. There is no compatibility
  support, as we expect that only official Zulip clients will interact with
  this data. Currently, no client other than the Zulip web app uses this.
Feature level 258
Feature level 257
- POST /register,- POST /server_settings,- PATCH /realm:- realm_uriwas renamed to- realm_url, but remains available as a
  deprecated alias for backwards-compatibility.
- Mobile push notification payloads, similarly, have a new realm_url,
  replacingrealm_uri, which remains available as a deprecated alias
  for backwards-compatibility.
Feature level 256
Feature level 255
- "Stream" was renamed to "Channel" across strings in the Zulip API
  and UI. Clients supporting a range of server versions are encouraged
  to use different strings based on the server's API feature level for
  consistency. Note that feature level marks the strings transition
  only: Actual API changes related to this transition have their own
  API changelog entries.
Feature level 254
Feature level 253
Feature level 252
- PATCH /realm/profile_fields/{field_id}:- name,- hint,- display_in_profile_summary,- requiredand- field_datafields are now optional during an update. Previously we
  required the clients to populate the fields in the PATCH request even if there was
  no change to those fields' values.
Feature level 251
- POST /register: Fixed- realm_upload_quota_mibvalue to actually be in MiB. Until now the value was in bytes.
Feature level 250
Feature level 249
Feature level 248
Feature level 247
Feature level 246
Feature level 245
Feature level 244
Feature level 243
- POST /register,- GET
  /events: Changed the format of- realm_authentication_methodsand- authentication_methods,
  respectively, to use a dictionary rather than a boolean as the value
  for each authentication method. The new dictionaries are more
  extensively and contain fields indicating whether the backend is
  unavailable to the current realm due to Zulip Cloud plan
  restrictions or any other reason.
Feature level 242
- POST /register,- POST /events,- PATCH /realm: Added- zulip_update_announcements_stream_idrealm setting,
  which is the ID of the of the stream to which automated messages announcing
  new features or other end-user updates about the Zulip software are sent.
Feature level 241
- POST /register,- POST /events,- PATCH /realm: Renamed the realm settings- notifications_streamand- signup_notifications_streamto- new_stream_announcements_streamand- signup_announcements_stream, respectively.
Feature level 240
- GET /events: The- restartevent no longer contains an
  optional- immediateflag.
- GET /events: A new- web_reload_clientevent has been
  added; it is used to signal to website-based clients that they should reload
  their code.  This was previously implied by the- restartevent.
Feature levels 238-239 are reserved for future use in 8.x maintenance
releases.
Changes in Zulip 8.0
Feature level 237
No changes; feature level used for Zulip 8.0 release.
Feature level 236
- POST /messages,- POST
  /scheduled_messages: The new- read_by_senderparameter lets the client override the heuristic
  that determines whether the new message will be initially marked
  read by its sender.
Feature level 235
Feature level 234
- Mobile push notifications now include a realm_namefield.
- POST /mobile_push/test_notificationnow sends
  a test notification with- testrather than- test-by-device-tokenin the- eventfield.
Feature level 233
- 
POST /register,GET /events:
  Renamed thehotspotsevent type and the relatedhotspotsobject array
  toonboarding_steps. These are sent to clients if there are onboarding
  steps to display to the user. Onboarding steps now include
  both hotspots and one-time notices. Prior to this, hotspots were the only
  type of onboarding step. Also, added atypefield to the objects
  returned in the renamedonboarding_stepsarray to distinguish between
  the two types of onboarding steps.
 
- 
POST /users/me/onboarding_steps: Added a new endpoint, which
  deprecates the/users/me/hotspotsendpoint, in order to support
  displaying both one-time notices (which highlight new features for
  existing users) and hotspots (which are used in new user tutorials).
  This endpoint marks both types of onboarding steps, i.e.hotspotandone_time_notice, as read by the user. There is no compatibility
  support for/users/me/hotspotsas no client other than the Zulip
  web app used the endpoint prior to these changes.
 
Feature level 232
- 
POST /register: Added a newuser_list_incompleteclient
  capability
  controlling whetherrealm_userscontains "Unknown user"
  placeholder objects for users that the current user cannot access
  due to acan_access_all_users_grouppolicy.
 
- 
GET /events: The newuser_list_incompleteclient
  capability
  controls whether to sendrealm_userevents withop: "add"containing "Unknown user" placeholder objects to clients when a new
  user is created that the client does not have access to due to acan_access_all_users_grouppolicy.
 
Feature level 231
- 
POST /register:realm_push_notifications_enablednow represents more accurately
  whether push notifications are actually enabled via the mobile push
  notifications service. Addedrealm_push_notifications_enabled_end_timestampfield to realm
  data.
 
- 
GET /events: Arealmupdate event is now sent
  wheneverpush_notifications_enabledorpush_notifications_enabled_end_timestampchanges.
 
Feature level 230
- POST /register,- GET /events:
  Added- has_triggerfield to objects returned in the- hotspotsarray to
  identify if the hotspot will activate only when some specific event
  occurs.
Feature level 229
- PATCH /messages/{message_id},- POST
  /messages: Topic wildcard mentions involving
  large numbers of participants are now restricted by- wildcard_mention_policy. The server now uses the- STREAM_WILDCARD_MENTION_NOT_ALLOWEDand- TOPIC_WILDCARD_MENTION_NOT_ALLOWEDerror codes when a message is
  rejected because of- wildcard_mention_policy.
Feature level 228
- 
GET /events:realm_userevents withop: "update"are now only sent to users who can access the modified user.
 
- 
GET /events:presenceevents are now only sent to
  users who can access the user who comes back online if theCAN_ACCESS_ALL_USERS_GROUP_LIMITS_PRESENCEserver setting is set
  totrue.
 
- 
GET /events:user_statusevents are now only
  sent to users who can access the modified user.
 
- 
GET /realm/presence: The endpoint now returns
  presence information of accessible users only if theCAN_ACCESS_ALL_USERS_GROUP_LIMITS_PRESENCEserver setting is set
  totrue.
 
- 
GET /events:realm_userevents withop: "add"are now also sent when a guest user gains access to a user.
 
- 
GET /events:realm_userevents withop: "remove"are now also sent when a guest user loses access to a user.
 
Feature level 227
- PATCH /realm/user_settings_defaults,- POST /register,- PATCH /settings:
  Added- DMs, mentions, and followed topicsoption for- desktop_icon_count_displaysetting, and renumbered the options.
  The total unread count of DMs, mentions, and followed topics appears in
  desktop sidebar and browser tab when this option is configured.
Feature level 226
Feature level 225
- 
PATCH /realm,POST /register,GET /events: Addedcan_access_all_users_group_idrealm setting, which is the ID of the user group whose members can
  access all the users in the organization.
 
- 
POST /register: Addedallowed_system_groupsfield to configuration data object of permission settings passed inserver_supported_permission_settings.
 
Feature level 224
Feature level 223
- 
POST /users/me/apns_device_token:
  Theappidparameter is now required.
  Previously it defaulted to the server settingZULIP_IOS_APP_ID,
  defaulting to "org.zulip.Zulip".
 
- 
POST /remotes/server/register: Theios_app_idparameter is now
  required whenkindis 1, i.e. when registering an APNs token.
  Previously it was ignored, and the push bouncer effectively
  assumed its value was the server settingAPNS_TOPIC,
  defaulting to "org.zulip.Zulip".
 
Feature level 222
- 
GET /events: When a user is deactivated or
  reactivated, the server usesrealm_userevents withop: "update"updating theis_activefield, instead ofrealm_userevents withop: "remove"andop: "add", respectively.
 
- 
GET /events: When a bot is deactivated or
  reactivated, the server sendsrealm_botevents withop: "update"updating theis_activefield, instead ofrealm_botevents withop: "remove"andop: "add", respectively.
 
Feature level 221
- POST /register: Added- server_supported_permission_settingsfield in the response which contains configuration data for various permission
  settings.
Feature level 220
- 
GET /events: Stream creation events for web-public
  streams are now sent to all guest users in the organization as well.
 
- 
GET /events: Thesubscriptionevents forop:
  "peer_add"andop: "peer_remove"are now sent to subscribed guest
  users for public streams and to all the guest users for web-public
  streams; previously, they incorrectly only received these for
  private streams.
 
Feature level 219
Feature level 218
- POST /messages: Added an optional- automatic_new_visibility_policyenum field in the success response
  to indicate the new visibility policy value due to the visibility policy settings
  during the send message action.
Feature level 217
Feature level 216
- PATCH /realm,- POST register,- GET /events: Added- enable_guest_user_indicatorsetting to control whether "(guest)" is added to user names in UI.
Feature level 215
- 
GET /events: Replaced the valueprivatewithdirectin themessage_typefield for thetypingevents
  sent when a user starts or stops typing a message.
 
- 
POST /typing: Stopped supportingprivateas a valid value for thetypeparameter.
 
- 
POST /typing: Stopped using thetoparameter
  for the"stream"type. Previously, in the case of the"stream"type, it
  accepted a single-element list containing the ID of the stream. Added an
  optional parameter,stream_id. Now,tois used only for"direct"type.
  In the case of"stream"type,stream_idandtopicare used.
 
- 
Note that stream typing notifications were not enabled in any Zulip client
  prior to feature level 215. 
Feature level 214
- PATCH /realm/user_settings_defaults,- POST /register,- PATCH /settings:
  Added two new user settings,- automatically_follow_topics_policyand- automatically_unmute_topics_in_muted_streams_policy. The settings control the
  user's preference on which topics the user will automatically 'follow' and
  'unmute in muted streams' respectively.
Feature level 213
- POST /register: Fixed incorrect handling of
  unmuted and followed topics in calculating the- mentionsand- countfields of the- unread_msgsobject.
Feature level 212
- 
GET /events,POST /register,PATCH /realm: Added thejitsi_server_urlfield to therealmobject,
  allowing organizations to set a custom Jitsi Meet server. Previously, this
  was only available as a server-level configuration.
 
- 
POST /register: Addedserver_jitsi_server_urlfields to therealmobject. The existingjitsi_server_urlwill now be
  calculated asrealm_jitsi_server_url || server_jitsi_server_url.
 
Feature level 211
- POST /streams/{stream_id}/delete_topic,- POST /mark_all_as_read:
  Added a- completeboolean field in the success response to indicate
  whether all or only some of the targeted messages were processed.
  This replaces the use of- "result": "partially_completed"(introduced
  in feature levels 154 and 153), so that these endpoints now send a- resultstring of either- "success"or- "error", like the rest of
  the Zulip API.
Feature level 210
Feature level 209
- 
PATCH /realm,POST /register,GET /events: Addedcreate_multiuse_invite_grouprealm setting, which is the ID of the user group whose members can
  create reusable invitation links
  to an organization. Previously, only admin users could create these
  links.
 
- 
POST /invites/multiuse: Non-admin users can
  now use this endpoint to create reusable invitation links. Previously,
  this endpoint was restricted to admin users only.
 
- 
GET /invites: Endpoint response for non-admin users now
  includes both email invitations and reusable invitation links that they have
  created. Previously, non-admin users could only create email invitations, and
  therefore the response did not include reusable invitation links for these
  users.
 
- 
DELETE /invites/multiuse/{invite_id}: Non-admin
  users can now revoke reusable invitation links they have created. Previously,
  only admin users could create and revoke reusable invitation links.
 
- 
GET /events: When the set of invitations in an
  organization changes, aninvites_changedevent is now sent to the
  creator of the changed invitation, as well as all admin users.
  Previously, this event was only sent to admin users.
 
Feature level 208
- POST /users/me/subscriptions,- DELETE /users/me/subscriptions: These endpoints
  now return an HTTP status code of 400 with- code: "BAD_REQUEST"in
  the error response when a user specified in the- principalsparameter
  is deactivated or does not exist. Previously, these endpoints returned
  an HTTP status code of 403 with- code: "UNAUTHORIZED_PRINCIPAL"in the
  error response for these cases.
Feature level 207
- POST /register: Added- display_nameand- all_event_typesfields to the- realm_incoming_webhook_botsobject.
Feature level 206
- POST /calls/zoom/create: Added- is_video_callparameter
  controlling whether to request a Zoom meeting that defaults to
  having video enabled.
Feature level 205
- POST /register:- streamsfield in the response
  now includes web-public streams as well.
- GET /events: Events for stream creation and deletion
  are now sent to clients when a user gains or loses access to any streams
  due to a change in their role.
- GET /events: The- subscriptionevents for- op:
  "peer_add"are now sent to clients when a user gains access to a stream
  due to a change in their role.
Feature level 204
- POST /register: Added- server_typing_started_wait_period_milliseconds,- server_typing_stopped_wait_period_milliseconds, and- server_typing_started_expiry_period_millisecondsfields
  for clients to use when implementing typing
  notifications protocol.
Feature level 203
Feature level 202
Feature level 201
- POST /zulip-outgoing-webhook: Renamed the notification trigger- private_messageto- direct_message.
Feature level 200
- PATCH /streams/{stream_id}: Added- is_default_streamparameter to change whether the stream is a
  default stream for new users in the organization.
- POST /users/me/subscriptions: Added- is_default_streamparameter which determines whether any streams
  created by this request will be default streams for new users.
Feature level 199
Feature level 198
Feature level 197
Feature level 196
Feature level 195
- GET /events,- POST /register:
  The- default_code_block_languagerealm setting is now consistently an
  empty string when no default pygments language code is set. Previously,
  the server had a bug that meant it might represent no default for this
  realm setting as either- nullor an empty string. Clients supporting
  older server versions should treat either value (- nullor- "") as no
  default being set.
Feature level 194
Feature level 193
Feature level 192
- GET /events: Stream creation events are now
  sent when guest users gain access to a public stream by being
  subscribed. Guest users previously only received these events when
  subscribed to private streams.
Feature level 191
Feature level 190
Feature level 189
- PATCH /realm/user_settings_defaults,- POST /register,- PATCH /settings:
  Added new boolean user settings- enable_followed_topic_email_notifications,- enable_followed_topic_push_notifications,- enable_followed_topic_wildcard_mentions_notify,- enable_followed_topic_desktop_notificationsand- enable_followed_topic_audible_notificationsto control whether a user
  receives email, push, wildcard mention, visual desktop and audible desktop
  notifications, respectively, for messages sent to followed topics.
Feature level 188
Feature levels 186-187 are reserved for future use in 7.x maintenance
releases.
Changes in Zulip 7.0
Feature level 185
No changes; feature level used for Zulip 7.0 release.
Feature level 184
Feature level 183
- POST /register: Removed the- realm_community_topic_editing_limit_secondsproperty, which was no
  longer in use. The time limit for editing topics is controlled by the
  realm setting- move_messages_within_stream_limit_seconds, see feature
  level 162.
- GET /events: Removed the- community_topic_editing_limit_secondsproperty from realm- update_dictevent documentation, because it was
  never returned as a changed property in this event and was only ever
  returned in the- POST /registerresponse.
Feature level 182
- POST /export/realm: This endpoint now returns the ID
  of the data export object created by the request.
Feature level 181
- GET /scheduled_messages,- GET
  /events,- POST /register:
  Added- failedboolean field to scheduled message objects to
  indicate if the server tried to send the scheduled message and was
  unsuccessful. Clients that support unscheduling and editing
  scheduled messages should use this field to indicate to the user
  when a scheduled message failed to send at the appointed time.
Feature level 180
- POST /invites: Added support for invitations specifying
  the empty list as the user's initial stream subscriptions. Previously, this
  returned an error. This change was also backported to Zulip 6.2, and
  is available at feature levels 157-158 as well.
Feature level 179
- POST /scheduled_messages:
  Added new endpoint to create and edit scheduled messages.
- GET /events:
  Added- scheduled_messagesevents sent to clients when a user creates,
  edits or deletes scheduled messages.
- POST /register:
  Added an optional- scheduled_messagesfield to that includes all
  of the undelivered scheduled messages for the current user.
Feature level 178
Feature level 177
- GET /messages,- GET /messages/matches_narrow,- POST /messages/flags/narrow,- POST /register:
  Added support for three search/narrow filters
  related to direct messages:- is:dm,- dmand- dm-including.
  The- dmoperator replaces and deprecates the- pm-withoperator.
  The- is:dmfilter replaces and deprecates the- is:privatefilter.
  The- dm-includingoperator replaces and deprecates the- group-pm-withoperator. Because existing Zulip messages may have links with these
  legacy filters, they are still supported for backwards-compatibility.
Feature level 176
- POST /realm/filters,- PATCH /realm/filters/<int:filter_id>:
  The- url_format_stringparameter is replaced by- url_template.
  Linkifiers now only accept
  RFC 6570 compliant URL templates. The old URL format
  strings are no longer supported.
- GET /events,- POST /register:
  The- url_format_stringkey in- realm_linkifiersobjects is replaced
  by- url_template. For backwards-compatibility, clients that do not
  support the- linkifier_url_templateclient capability
  will receive an empty- realm_linkifiersarray in the- /registerresponse and not receive- realm_linkifiersevents. Unconditionally,
  the deprecated- realm_filtersevent type returns an empty array in
  the- /registerresponse and these events are no longer sent to
  clients.
Feature level 175
Feature level 174
- POST /typing,- POST /messages:
  Added- "direct"as the preferred way to indicate a direct message for the- typeparameter, 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 stream messages without a topic.
- PATCH /messages/{message_id}: When users, other
  than organization administrators and moderators, use- "propagate_mode": "change_all"to move messages that have passed the
  organization's time limit for updating a message's topic and/or stream,
  this endpoint now returns an error response
  (- "code": "MOVE_MESSAGES_TIME_LIMIT_EXCEEDED").
Feature level 171
Feature level 170
Feature level 169
Feature level 168
Feature level 167
- All REST API endpoints:
  Implemented ignored_parameters_unsupportedas 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_strparameter. 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_secondsand- server_presence_offline_threshold_secondsfields for clients
  to use when implementing the presence system.
Feature level 163
- GET /users,- GET /users/{user_id},- GET /users/{email},- GET /users/me,- GET /events:
  The- delivery_emailfield is always present in user objects, including
  the case when a user's- email_address_visibilityis set to everyone.
  The value will be- nullif the requester does not have access to the
  user's real email. For bot users, the- delivery_emailfield is always
  set to the bot user's real email.
- GET /events: Event for updating a user's- delivery_emailis now sent to all users who have access to it, and
  is also sent when a user's- email_address_visibilitysetting changes.
- GET /events,- POST /register- GET /users,- GET /users/{user_id},- GET /users/{email},- GET /users/me,- GET /messages,- GET /messages/{message_id}: Whether the- avatar_urlfield in message and user objects returned by these endpoints can be- nullnow depends on if the current user has access to the other user's real
  email address based on the other user's- email_address_visibilitypolicy.
- POST /register,- PATCH /settings,- PATCH /realm/user_settings_defaults:
  Added user setting- email_address_visibility, to replace the
  realm setting- email_address_visibility.
- POST /register,- PATCH /realm: Removed realm
  setting- email_address_visibility.
Feature level 162
- PATCH /realm,- POST /register,- GET /events: Added two new realm settings- move_messages_within_stream_limit_secondsand- move_messages_between_streams_limit_secondsfor organizations to
  configure time limits for editing topics and moving messages between streams.
- PATCH /messages/{message_id}: For users other than
  administrators and moderators, the time limit for editing topics is now
  controlled via the realm setting- move_messages_within_stream_limit_secondsand the time limit for moving messages between streams is now controlled by
  the realm setting- move_messages_between_streams_limit_seconds.
Feature level 161
- POST /users/me/subscriptions,- PATCH /streams/{stream_id}: Added- can_remove_subscribers_group_idparameter to support setting and
  changing the user group whose members can remove other subscribers
  from the specified stream.
- DELETE /users/me/subscriptions: Expanded the
  situations where users can use this endpoint to unsubscribe other
  users from a stream to include the case where the current user has
  access to the stream and is a member of the user group specified by
  the- can_remove_subscribers_group_idfor the stream.
Feature level 160
- POST /api/v1/jwt/fetch_api_key: Added new endpoint to fetch API
  keys using JSON Web Token (JWT) authentication.
- accounts/login/jwt/: Adjusted format of requests to undocumented,
  optional endpoint for JWT authentication log in support.
Feature level 159
- PATCH /realm,- POST /register,- GET /events:
  Nobody added as an option for the realm settings- edit_topic_policyand- move_messages_between_streams_policy.
- PATCH /messages/{message_id}: Permission
  to edit the stream and/or topic of messages no longer depends on the
  realm setting- allow_message_editing.
- PATCH /messages/{message_id}: The user who
  sent the message can no longer edit the message's topic indefinitely.
Feature level 158 is reserved for future use in 6.x maintenance
releases.
Changes in Zulip 6.2
Feature level 157
- POST /invites: Added support for invitations specifying
  the empty list as the user's initial stream subscriptions. Previously, this
  returned an error. This change was backported from the Zulip 7.0
  branch, and thus is available at feature levels 157-158 and 180+.
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_anchorparameter controls whether a message with ID matching the specified- anchorshould be included.
- The update_message_flagsevent sent byPOST
  /messages/flagsno 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, but successfully
  deletes some messages in the topic (see feature level 147 for when
  this endpoint started deleting messages in batches), a success
  response with- "result": "partially_completed"will now be returned
  by the server, analogically to the- POST /mark_all_as_readendpoint
  (see feature level 153 entry below).
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- "result": "partially_completed"will be returned by the server.
Feature level 152
- PATCH /messages/{message_id}:
  The default value for- send_notification_to_old_threadwas changed from- trueto- false.
  When moving a topic within a stream, the- send_notification_to_old_threadand- send_notification_to_new_threadparameters are now respected, and by
  default a notification is sent to the new thread.
Feature level 151
Feature level 150
- GET /events: Separate events are now sent on changing- allow_message_editing,- message_content_edit_limit_secondsand- edit_topic_policysettings, 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_policyand- message_content_edit_limit_secondssettings, 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- awayfield/parameter is deprecated, and as of this
  feature level are a legacy way to access the user's- presence_enabledsetting, 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_thresholdsettings 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_urlto the response.
Feature level 139
- GET /get-events: When a user mutes or unmutes
  their subscription to a stream, a- subscriptionupdate event
  is now sent for the- is_mutedproperty and for the deprecated- in_home_viewproperty to support clients fully migrating to use the- is_mutedproperty. Prior to this feature level, only one event was
  sent to clients with the deprecated- in_home_viewproperty.
Feature level 138
- POST /register,- GET
  /events:- message_content_edit_limit_secondsnow represents no limit using- null, instead of the integer 0.
- PATCH /realm: One now sets- message_content_edit_limit_secondsto 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_subscribersparameter without- is_privateand- is_web_publicparameters.
Feature level 135
- DELETE /user/{user_id}: Added- deactivation_notification_commentfield controlling whether the
  user receives a notification email about their deactivation.
Feature level 134
- GET /events: Added- user_topicevent type
  which is sent when a topic is muted or unmuted. This generalizes and
  replaces the previous- muted_topicsarray, which will no longer be
  sent if- user_topicwas included in- event_typeswhen registering
  the queue.
- POST /register: Added- user_topicsarray
  to the response. This generalizes and replaces the previous- muted_topicsarray, which will no longer be sent if- user_topicis included in- fetch_event_types.
- GET /events: When private streams are made
  public,- streamevents for- op: "create"and- subscriptionevents
  for- op: "peer_add"are now sent to clients.
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_directoryfor organizations to give
  permission to be advertised in the Zulip communities directory.
Feature level 128
Feature level 127
Feature level 126
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_detailsfield
  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: Added- other_user_idfield
  to the- pmsobjects in the- unread_msgsdata set, deprecating the
  less clearly named- sender_idfield. This change was motivated by
  the possibility that a one-on-one direct message sent by the current
  user to another user could be marked as unread. The- sender_idfield
  is still present for backwards compatibility with older server versions.
Feature level 118
- 
GET /messages,GET
  /events: Improved the format of theedit_historyobject within message objects. Entries for stream
  edits now include a both aprev_streamandstreamfield to
  indicate the previous and current stream IDs. Prior to this feature
  level, only theprev_streamfield was present. Entries for topic
  edits now include both aprev_topicandtopicfield to indicate
  the previous and current topic, replacing theprev_subjectfield. These changes substantially simplify client complexity for
  processing historical message edits.
 
- 
GET /messages/{message_id}/history:
  Addedstreamfield to message historysnapshotindicating
  the updated stream ID of messages moved to a new stream.
 
Feature level 117
Feature level 116
- GET /server_settings: Added- realm_web_public_access_enabledas 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_idfield.
Feature level 114
- 
GET /events: Addedrendering_onlyfield toupdate_messageevent 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: Updatedupdate_messageevent type
  to always includeedit_timestampanduser_idfields. If the event
  only updates the rendering of the message, then theuser_idfield
  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_urlfield 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_messageevent type
  to include- stream_idfield for all edits to stream messages.
Feature level 111
Feature level 110
- POST /register: Added- server_web_public_streams_enabledto the response.
Feature level 109
Feature level 108
- In the mobile application authentication flow, the authenticated
  user's user_idis now included in the parameters encoded in the
  finalzulip://redirect URL.
Feature level 107
Feature level 106
Feature level 105
Feature level 104
- PATCH /realm: Added- string_idparameter 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_policypolicy 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_streamsboolean
  field to the response.
Feature level 102
- POST /register,- PATCH /realm: The- create_stream_policysetting was split into two settings for
  different types of streams:- create_private_stream_policyand- create_public_stream_policy.
- POST /register: The- create_stream_policyproperty was deprecated in favor of the- create_private_stream_policyand- create_public_stream_policyproperties, but it still available for backwards-compatibility.
Feature level 101
- POST /register,- PATCH /realm: Replaced
  the- allow_message_deletingboolean field with an integer field- delete_own_message_policydefining which roles can delete messages
  they had sent.
Feature level 100
- POST /register,- GET
  /events:- message_content_delete_limit_secondsnow 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_secondsto no limit by passing the string- unlimited, rather than the
  integer 0.
Feature level 99
- 
PATCH /realm/user_settings_defaults,PATCH /realm: Thedefault_twenty_four_hour_timeparameter toPATCH /realmhas been replaced by thetwenty_four_hour_timeparameter
  toPATCH /realm/user_settings_defaults, to match the new model for
  user preference defaults settings.
 
- 
POST /register: Removedrealm_default_twenty_four_hour_timefrom the response object. This value is now available in thetwenty_four_hour_timefield of therealm_user_settings_defaultobject.
 
Feature level 98
Feature level 97
- GET /realm/emoji,- POST /realm/emoji/{emoji_name},- GET
  /events,- POST /register:
  Custom emoji objects may now contain a- still_urlfield, with the
  URL of a PNG still image version of the emoji. This field will only be
  present for animated emoji.
Feature level 96
Feature level 95
- 
POST /register: Addedrealm_user_settings_defaultsobject, containing default values of
  personal user settings for new users in the realm.
 
- 
GET /events: Addedrealm_user_settings_defaultsevent 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_datefield 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_msgssection
  of the response no longer includes- sender_idsin the- streamsdictionaries. 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_settingsevent type, unifying and replacing the previous- update_display_settingsand- update_global_notificationsevent
  types. The legacy event types are still supported for backwards
  compatibility, but will be removed in a future release.
- POST /register: Added- user_settingsfield
  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_objectclient capability.
- POST /register: Added the- user_settings_objectproperty 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_settingsand- update_global_notificationsevents now only sent to clients that
  did not include- user_settings_objectin their- client_capabilitieswhen the event queue was created.
Feature level 88
- POST /register: Added- zulip_merge_basefield to the response.
- GET /events: Added new- zulip_merge_basefield to the- restartevent.
- GET /server_settings: Added- zulip_merge_baseto the responses which can be used to
  make "About Zulip" widgets in clients.
Feature level 87
- 
PATCH /settings: Added a newenable_drafts_synchronizationsetting, which controls whether the
  syncing drafts between different clients is enabled.
 
- 
GET /events,POST /register:
  Added newenable_drafts_synchronizationsetting underupdate_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_typefields to- user_statusobjects.
- POST /register: Added- emoji_name,- emoji_code, and- reaction_typefields to- user_statusobjects.
- POST /users/me/status: Added support for new- emoji_name,- emoji_code, and- reaction_typeparameters.
Feature level 85
- POST /register,- PATCH /realm: Replaced- add_emoji_by_admins_onlyfield with an integer field- add_custom_emoji_policy.
Feature level 84
- POST /register: The- enter_sendssetting
  is now sent when- update_display_settingis present in- fetch_event_typesinstead of- realm_user.
Feature level 83
- POST /register: The- cross_realm_botssection of the response now uses the- is_system_botflag to
  indicate whether the bot is a system bot.
Feature level 82
- PATCH /settingsnow accepts a new- email_notifications_batching_period_secondsfield for setting the
  time duration for which the server will collect email notifications
  before sending them.
Feature level 81
- POST /users/me/enter-sendshas been removed. The- enter_sendssetting is now edited using the normal- PATCH
  /settingsendpoint.
Feature level 80
- PATCH /settings: The- /settings/notificationsand- /settings/displayendpoints were
  merged into the main- /settingsendpoint; 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- subscribersfield now returns user IDs if- include_subscribersis
  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: Addedignored_parameters_unsupportedfield, which is a list of
  parameters that were ignored by the endpoint, to the response
  object.
 
- 
PATCH /settings: Removedfull_nameandaccount_emailfields from the response object.
 
Feature level 77
- GET /events: Removed- recipient_idand- sender_idfield in responses of- delete_messageevent when- message_typeis- private.
Feature level 76
- POST /fetch_api_key,- POST /dev_fetch_api_key: The HTTP status
  for authentication errors is now 401. These previously used the HTTP
  403 error status.
- Error handling: API
  requests that involve a deactivated user or organization now use the
  HTTP 401 error status. These previously used the HTTP 403 error status.
- Error handling: All error responses
  now include a codekey with a machine-readable string value. The
  default value for this key is"BAD_REQUEST"for general error
  responses.
- Mobile push notifications now include the mentioned_user_group_idandmentioned_user_group_namefields when a user group containing
  the user is mentioned.  Previously, these were indistinguishable
  from personal mentions (as both types havetrigger="mention").
Feature level 75
- POST /register,- PATCH /realm: Replaced- allow_community_topic_editingfield with an integer field- edit_topic_policy.
Feature level 74
- POST /register: Added- server_needs_upgradeand- event_queue_longpoll_timeout_secondsfield when fetching
  realm data.
Feature level 73
Feature level 72
- POST /register: Renamed- max_icon_file_sizeto- max_icon_file_size_mib,- realm_upload_quotato- realm_upload_quota_miband- max_logo_file_sizeto- max_logo_file_size_mib.
Feature level 71
- GET /events: Added- is_web_publicfield to- streamevents changing- invite_only.
Feature level 70
- POST /register: Added new top-level- server_timestampfield 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_nameand- description.
- PATCH /settings/display: Removed unnecessary JSON-encoding of string
  parameters- default_view,- emojisetand- 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_nameand- new_description.
- POST /users/me/hotspots: Removed unnecessary JSON-encoding of string
  parameter- hotspot.
Feature level 62
- Added moderators onlyoption forwildcard_mention_policy.
Feature level 61
Feature level 60
- POST /register: Added a new boolean field- is_moderator, similar to the existing- is_admin,- is_ownerand- is_guestfields, to the response.
- PATCH /users/{user_id}: Added support for
  changing a user's organization-level role to moderator.
- API endpoints that return rolevalues can now return300, the
  encoding of the moderator role.
Feature level 59
Feature level 58
- POST /register: Added the new- stream_typing_notificationsproperty to supported- client_capabilities.
- GET /events: Extended format for- typingevents to support typing notifications in stream messages. These new
  events are only sent to clients with- client_capabilitiesshowing support for- stream_typing_notifications.
- POST /typing: 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_policyfor controlling who can
  move messages between streams.
Feature level 55
- POST /register: Added- realm_giphy_ratingand- giphy_rating_optionsfields.
- PATCH /realm: Added- giphy_ratingparameter.
Feature level 54
- GET /realm/filtershas been removed and replace with- GET
  /realm/linkifierswhich returns the data in a
  cleaner dictionary format.
- GET /events: Introduced new event type- realm_linkifiers.  The previous- realm_filtersevent type is
  still supported for backwards compatibility, but will be removed in
  a future release.
- POST /register: The response now supports a- realm_linkifiersevent type, containing the same data as the
  legacy- realm_filterskey, with a more extensible object
  format. The previous- realm_filtersevent type is still supported
  for backwards compatibility, but will be removed in a future
  release. The legacy- realm_filterskey is deprecated but remains
  available for backwards compatibility.
Feature level 53
- POST /register: Added- max_topic_lengthand- max_message_length, and renamed- max_stream_name_lengthand- max_stream_description_lengthto 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
Feature level 50
- POST /register: Replaced- invite_by_admins_onlyfield with an integer field- invite_to_realm_policy.
Feature level 49
Feature level 48
Feature level 47
- POST /register: Added a new- giphy_api_keyfield, which is required to fetch GIFs using the GIPHY API.
Feature level 46
- GET /messagesand- GET
  /events: The- topic_linksfield now contains a
  list of dictionaries, rather than a list of strings.
Feature level 45
- GET /events: Removed useless- opfield from- custom_profile_fieldsevents.  These events contain the full set
  of configured- custom_profile_fieldsfor the organization
  regardless of what triggered the change.
Feature level 44
- POST /register: extended the- unread_msgsobject to include- old_unreads_missing, which indicates whether the
  server truncated the- unread_msgsdue to excessive total unread
  messages.
Feature level 43
Feature level 42
- PATCH /settings/display: Added a new- default_viewsetting allowing
  the user to set the default view.
Feature level 41
- GET /events: Removed- namefield from update
  subscription events.
Feature level 40
- GET /events: Removed- emailfield from update
  subscription events.
Feature level 39
Feature level 38
- POST /register: Increased- realm_community_topic_editing_limit_secondstime limit value
  to 259200s (3 days).
Feature level 37
- Consistently provide subscribersin stream data when
  clients register for subscriptions withinclude_subscribers,
  even if the user can't access subscribers.
Feature level 36
- POST /users: Restricted access to organization
  administrators with the- can_create_userspermission.
- Error handling: The
  codekey will now be present in errors that are due to rate
  limits, with a value of"RATE_LIMIT_HIT".
Feature level 35
- GET /events: The- subscriptionevents for- peer_addand- peer_removenow include- user_idsand- stream_idsarrays. Previously, these events included singular- user_idand- stream_idintegers.
Feature level 34
- POST /register: Added a new- wildcard_mention_policysetting for controlling who can use wildcard mentions in large streams.
Feature level 33
- Markdown message formatting:
  Code blocks now have a data-code-languageattribute attached to the outer HTMLdivelement, recording the
  programming language that was selected for syntax highlighting.
Feature level 32
- GET /events: Added- opfield to- update_message_flagsevents, deprecating the- operationfield
  (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 arolefield to Subscription objects representing whether the user
  is a stream administrator.
 
- 
GET /events: Addedrolefield to
  Subscription objects sent insubscriptionsevents.
 
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_namefield from- display_recipientarray objects.
Feature level 26
- GET /messages,- GET /events:
  The- sender_short_namefield is no longer included in message objects
  returned by these endpoints.
- GET /messages: Removed- short_namefield from- display_recipientarray objects.
Changes in Zulip 3.0
Feature level 25
No changes; feature level used for Zulip 3.0 release.
Feature level 24
- Markdown message formatting:
  The rarely used !avatar()and!gravatar()markup syntax, which
  was never documented and had inconsistent syntax, 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).
- POST /register: The encoding of an
  unlimited- realm_message_retention_daysin the response was changed
  from- nullto- -1.
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: The- subscriptionevents for- peer_addand- peer_removenow identify the modified
  stream by the- 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: Removed- pointerfrom 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
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:- delete_messageevents 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. This was previously hard-coded in the server
  as 86400 seconds (1 day).
- POST /register: The response now contains
  an- is_ownerboolean field, which is similar to the existing- is_adminand- is_guestfields.
- POST /typing: Removed legacy
  support for sending email addresses in the- toparameter, rather
  than user IDs, to encode direct 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 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_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 that had 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_botevents,
  sent when changes are made to bot users, now contain an
  integer-format- owner_idfield, replacing the- ownerfield (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
- POST /register:- zulip_versionand- zulip_feature_levelare always returned in the endpoint response.
  Previously, they were only present 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
- PATCH /messages/{message_id}: Added the- stream_idparameter to support moving messages between streams.
- GET /messages,- GET /events:
  Added- prev_streamas a potential property of the- edit_historyobject
  within message objects to indicate when a message was moved to another
  stream.
- GET /messages/{message_id}/history:- prev_streamis present in- snapshotobjects within- message_historyobject when a message was moved to another stream.
- 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}: 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- anchorparameter, deprecating and replacing the- use_first_unread_anchorparameter.
- GET /messages,- 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.
- GET /streams,- POST /users/me/subscriptions,- PATCH /streams/{stream_id}: Stream objects now
  have- stream_post_policyenum for specifying who can post to the stream,
  deprecating and replacing the- is_announcement_onlyboolean.
- 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_topicsarray 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- gitlabboolean
  to deprecated- authentication_methodsobject.
- POST /register,- GET /events,- PATCH /realm: None added as an option for the realm setting- video_chat_providerto disable video call UI.
Changes in Zulip 2.1
- POST /register: Added- realm_default_external_accountsto endpoint response.
- 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_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.
- GET /export/realm: Added endpoint for
  fetching public data exports.- POST /export/realm: Added endpoint for
  triggering a public 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.
- 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_ACCOUNTfield 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- topicparameter name.  The previous- subjectparameter name was deprecated but is still supported for
  backwards-compatibility.
- POST /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: Added- slim_presenceparameter.  Changes the format of presence events, but is still
  being changed and should not be used by clients.