62 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	API changelog
This page documents changes to the Zulip Server API over time. See also the Zulip release lifecycle for background on why this API changelog is important, and the Zulip server changelog.
The API feature levels system used in this changelog is designed to make it possible to write API clients, such as the Zulip mobile and terminal apps, that work with a wide range of Zulip server versions. Every change to the Zulip API is recorded briefly here and with full details in Changes entries in the API documentation for the modified endpoint(s).
When using an API endpoint whose behavior has changed, Zulip API
clients should check the zulip_feature_level field, present in the
GET /server_settings and POST /register responses, to determine the API
format used by the Zulip server that they are interacting with.
Changes in Zulip 7.0
Feature level 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
- POST users/me/presence,- POST /register,- GET /events,- GET /realm/presence,- GET /users/<user_id_or_email>/presence: The server no longer stores which client submitted presence data, and presence responses from the server will always contain the- aggregatedand- websitekeys.
Feature level 177
- GET /messages,- GET /messages/matches_narrow,- POST /message/flags/narrow,- POST /register: Added support for three search/narrow filters related to direct messages:- is:dm,- 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,- realm/filters/<int:filter_id>: The parameter- url_format_stringis replaced by- url_template. The linkifiers now accept only RFC 6570 compliant URL Templates. The old URL format strings are no longer supported.
- GET /events,- POST /register: The key- url_format_stringis replaced by- url_templatefor the- realm_linkifiersevent type. For backwards-compatibility, clients that do not support the- linkifier_url_templateclient capability will get an empty list in the response of- /registerand not receive- realm_linkifiersevents. Unconditionally, the deprecated event type- realm_filtersgives an empty list in the response of- /registerand is no longer sent the clients otherwise.
Feature level 175
- POST /register,- PATCH /settings,- PATCH /realm/user_settings_defaults: Added new user setting- web_mark_read_on_scroll_policy. This determines whether to mark messages as read or not as the client scrolls through their feed.
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:
- GET /scheduled_messages,- DELETE /scheduled_messages/<int:scheduled_message_id>: Added new endpoints to fetch and delete scheduled messages.
Feature level 172
- PATCH /messages/{message_id}: Topic editing restrictions now apply to messages without a topic as well.
- PATCH /messages/{message_id}: The endpoint now returns an error when users, other than organization administrators and moderators, try to move messages that have passed the time limit using- change_allvalue for- propagate_modeparameter.
Feature level 171:
- POST /fetch_api_key,- POST /dev_fetch_api_key: The return values for these endpoints now include the unique ID of the user who owns the API key.
Feature level 170
- POST /user_topics: Added a new endpoint to update the personal preferences for a topic.
Feature level 169
- PATCH /users/me/subscriptions/muted_topics: Trying to mute a topic that is already muted or unmute a topic that was not previously muted now results in a success response rather than an error.
Feature level 168
- PATCH /realm/user_settings_defaults,- POST /register,- PATCH /settings: Replaced the- realm_name_in_notificationsboolean field with an integer field- realm_name_in_email_notifications_policy.
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
- PATCH /user_groups/{user_group_id}: The- nameand- descriptionparameters are now optional.
Feature level 164
- POST /register: Added the- server_presence_ping_interval_secondsand- server_presence_offline_threshold_secondsattributes.
Feature level 163
- GET /users,- GET /users/{user_id},- GET /users/{email},- GET /users/meand- GET /events: The- delivery_emailfield is always present in user objects, including the case when- email_address_visibilityis set to- EMAIL_ADDRESS_VISIBILITY_EVERYONE, with the value being- Noneif the requestor does not have access to the user's real email. For bot users, the- delivery_emailfield is always set to the real email.
- GET /events: Event for updating- delivery_emailis now sent to all users who have access to it and is also sent when- email_address_visibilitysetting changes.
- POST /register,- PATCH /settings,- PATCH /realm/user_settings_defaults: Added user setting- email_address_visibilitywhich will replace the existing realm setting- email_address_visibility.
- POST /register,- PATCH /realm: Removed realm-level- email_address_visibilitysetting.
Feature level 162
- POST /register,- GET /events,- PATCH /realm: Added new- move_messages_within_stream_limit_secondssetting.
- POST /register,- GET /events,- PATCH /realm: Added new- move_messages_between_streams_limit_secondssetting.
- PATCH /messages/{message_id}: Time limit to edit topics, for users other than administrators and moderators, can now be configured using- move_messages_within_stream_limit_secondssetting.
- PATCH /messages/{message_id}: Time limit to move messages between streams, for users other than administrators and moderators, can now be configured using- move_messages_between_streams_limit_secondssetting.
Feature level 161
- PATCH /streams/{stream_id}: Added- can_remove_subscribers_group_idparameter to support changing- can_remove_subscribers_groupsetting.
- POST /users/me/subscriptions: Added- can_remove_subscribers_group_idparameter to set- can_remove_subscribers_groupsetting while creating streams.
Feature level 160
- POST /api/v1/jwt/fetch_api_key: New API endpoint to fetch API keys using JSON Web Token (JWT) authentication.
- accounts/login/jwt/: Adjusted format of requests to this previously undocumented, optional endpoint for JWT authentication log in support.
Feature level 159
- POST /register,- GET /events,- PATCH /realm: Nobody added as an option for the realm setting- edit_topic_policy.
- POST /register,- GET /events,- PATCH /realm: Nobody added as an option for the realm setting- move_messages_between_streams_policy.
- PATCH /messages/{message_id}: Permission to edit stream and topic of messages do not depend on- allow_message_editingsetting now.
- PATCH /messages/{message_id}: Message senders are not allowed to edit topics indefinitely now.
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, a success response with "partially_completed" result will now be returned by the server, analogically to the- /mark_all_as_readendpoint.
Feature level 153
- POST /mark_all_as_read: Messages are now marked as read in batches, so that progress will be made even if the request times out because of an extremely large number of unread messages to process. Upon timeout, a success response with a "partially_completed" result will be returned by the server.
Feature level 152
- PATCH /messages/{message_id}: The- send_notification_to_old_threadand- send_notification_to_new_threadparameters are now respected when moving a topic within a stream. The default value for- send_notification_to_old_threadwas changed from- trueto- false.
Feature level 151
- POST /register,- GET /events,- POST /realm/profile_fields,- GET /realm/profile_fields: Added pronouns custom profile field type.
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
- POST /register: The- client_gravatarand- include_subscribersparameters now return an error for unauthenticated requests if an unsupported value is requested by the client.
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
- POST /realm/profile_fields,- GET /realm/profile_fields: Added a new parameter- display_in_profile_summary, which clients use to decide whether to display the field in a small/summary section of the user's profile.
Feature level 145
- DELETE users/me/subscriptions: Normal users can now remove bots that they own from streams.
Feature level 144
- GET /messages/{message_id}/read_receipts: The- user_idsarray returned by the server no longer includes IDs of users who have been muted by or have muted the current user.
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
- GET users/me/subscriptions,- GET /streams,- POST /register,- GET /events: Added- can_remove_subscribers_group_idfield to Stream and Subscription objects.
Feature level 141
- POST /register,- PATCH /settings,- PATCH /realm/user_settings_defaults: Added new- user_list_styledisplay setting, which controls the layout of the right sidebar.
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
- GET /messages/{message_id}/read_receipts: Added new endpoint to fetch read receipts for a message.
- POST /register,- GET /events,- PATCH /realm: Added new- enable_read_receiptsrealm setting.
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.
Feature level 133
- POST /register,- PATCH /realm: Removed stream administrators option from- wildcard_mention_policysetting.
- POST /register,- GET /events,- GET /users/me/subscriptions: Removed- rolefield from subscription objects.
Feature level 132
- GET /streams/{stream_id}: Added new endpoint to get a stream by ID.
Feature level 131
- GET /user_groups,- POST /register: Renamed- subgroupsfield in the user group objects to- direct_subgroup_ids.
- GET /events: Renamed- subgroup_idsfield in the group object to- direct_subgroup_ids.
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
- POST /register,- GET /events,- PATCH /realm: Added- org_typerealm setting.
Feature level 127
- GET /user_groups,- POST /register: Added- subgroupsfield, which is a list of IDs of all the subgroups of the user group, to user group objects.
- GET /events: Added new- user_groupevents operations for live updates to subgroups (- add_subgroupsand- remove_subgroups).
- PATCH /user_groups/{user_group_id}/subgroups: Added new endpoint for updating subgroups of a user group.
- GET /user_groups/{user_group_id}/members/{user_id}: Added new endpoint for checking whether a given user is member of a given user group.
- GET /user_groups/{user_group_id}/members: Added new endpoint to get members of a user group.
- GET /user_groups/{user_group_id}/members: Added new endpoint to get subgroups of a user group.
Feature level 126
- POST /invites,- POST /invites/multiuse: Replaced- invite_expires_in_daysparameter with- invite_expires_in_minutes.
Feature level 125
- POST /register,- PATCH /settings,- PATCH /realm/user_settings_defaults: Added new- display_emoji_reaction_usersdisplay setting, controlling whether to display the names of users with emoji reactions.
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: The- unread_msgssection of the response now prefers- other_user_idover the poorly named- sender_idfield in the- pmsdictionaries. This change is motivated by the possibility that a message you yourself sent to another user could be marked as unread.
Feature level 118
- 
GET /messages,GET /events: Improved the format of theedit_historyobject within message objects. Entries for stream edits now include a both aprev_streamandstreamfield to indicate the previous and current stream IDs. 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
- POST /invites,- POST /invites/multiuse: Added support for passing- nullas the- invite_expires_in_daysparameter to request an invitation that never expires.
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
- POST /users/me/subscriptions/properties: Removed- subscription_datafrom response object, replacing it with- ignored_parameters_unsupported.
Feature level 110
- POST /register: Added- server_web_public_streams_enabledto the response.
Feature level 109
- POST /register,- GET /events,- PATCH /realm: Added new- enable_spectator_accessrealm setting.
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
- POST /register,- PATCH /settings,- PATCH /realm/user_settings_defaults: Added user setting- escape_navigates_to_default_viewto allow users to disable the keyboard shortcut for the- Esckey that navigates the app to the default view.
Feature level 106
- PATCH /user/{user_id}: Removed unnecessary JSON-encoding of string parameter- full_name.
Feature level 105
- POST /register,- PATCH /settings,- PATCH /realm/user_settings_defaults: Added three new privacy settings:- send_private_typing_notifications,- send_stream_typing_notifications, and- send_read_receipts.
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
- POST /subscribe: Added- is_web_publicparameter for requesting the creation of a web-public stream.
- PATCH /streams/{stream_id}: Added- is_web_publicparameter for converting a stream into a web-public stream.
Feature level 97
- GET /realm/emoji,- POST /realm/emoji/{emoji_name},- GET /events,- POST /register: Custom emoji objects may now contain a- still_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
- PATCH /realm/user_settings_defaults: Added new endpoint to update default values of user settings in a realm.
- POST /invites,- POST /invites/multiuse: Added- invite_expires_in_daysparameter encoding the number days before the invitation should expire.
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
- POST /register,- GET /user_groups,- GET /events: Added- is_system_groupfield to user group objects.
Feature level 92
- GET /messages,- POST /register,- GET /users,- GET /users/{user_id},- GET /users/{email}: The- client_gravatarparameter now defaults to- true.
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. This was previously 403.
- All API endpoints now use the HTTP 401 error status for API requests involving a deactivated user or realm. This was previously 403.
- Mobile push notifications now include the mentioned_user_group_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
- GET /users,- GET /users/{user_id},- GET /users/{email}and- GET /users/me: Added is- user_billing_adminfield to returned user objects.
- GET /events: Added- is_billing_adminfield to user objects sent in- realm_userevents.
- POST /register: Added- is_billing_adminfield in the user objects returned in the- realm_usersfield.
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
- POST /invites,- POST /invites/multiuse: Added support for inviting users as moderators.
Feature level 60
- POST /register: Added a new boolean field- is_moderator, similar to the existing- is_admin,- is_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
- GET /users,- GET /users/{user_id},- GET /users/{email}and- GET /users/me: Added- rolefield to returned user objects.
- GET /events: Added- rolefield to user objects sent in- realm_userevents.
- POST /register: Added- rolefield in the user objects returned in the- realm_usersfield.
- GET /events: Added new- zulip_versionand- zulip_feature_levelfields to the- restartevent.
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 /set-typing-status: Added support for sending typing notifications for stream messages.
Feature level 57
- PATCH /realm/filters/{filter_id}: New endpoint added to update a realm linkifier.
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
- POST /register: Added a new boolean field- can_invite_others_to_realm.
Feature level 50
- POST /register: Replaced- invite_by_admins_onlyfield with an integer field- invite_to_realm_policy.
Feature level 49
- Added new POST /realm/playgroundandDELETE /realm/playground/{playground_id}endpoints for code playgrounds.
- GET /events: A new- realm_playgroundsevents is sent when changes are made to a set of configured code playgrounds for an organization.
- POST /register: Added a new- realm_playgroundsfield, which is required to fetch the set of configured code playgrounds for an organization.
Feature level 48
- POST /users/me/muted_users/{muted_user_id},- DELETE /users/me/muted_users/{muted_user_id}: New endpoints added to mute/unmute users.
- GET /events: Added new event type- muted_userswhich will be sent to a user when the set of users muted by them has changed.
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
- GET /users/{user_id_or_email}/presence: Added support for passing the- user_idto identify the target user.
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
- Added new GET /users/{email}endpoint.
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 codeproperty will now be present in errors due to rate limits.
Feature level 35
- The peer_add and peer_remove subscription events now have plural
versions of user_idsandstream_ids.
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 code blocks now have a data-code-languageattribute attached to the outerdivelement, recording the programming language that was selecting for syntax highlighting. This field supports the upcoming "view in playground" feature for code blocks.
Feature level 32
- GET /events: Added- 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
- GET users/me/subscriptions,- GET /streams: Added- date_createdto Stream objects.
- POST /users,- POST /bots: The ID of the newly created user is now returned in the response.
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:- sender_short_namefield is no longer included in return values for this endpoint.
- 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
- The !avatar()and!gravatar()Markdown syntax, which was never documented, had inconsistent syntax, and was rarely used, was removed.
Feature level 23
- GET/PUT/POST /users/me/pointer: Removed. Zulip 3.0 removes the- pointerconcept from Zulip; this legacy data structure was replaced by tracking unread messages and loading views centered on the first unread message.
Feature level 22
- GET /attachments: The date when a message using the attachment was sent is now correctly encoded as- date_sent, replacing the confusingly named- namefield. The- date_sentand- create_timefields of attachment objects are now encoded as integers; (previously the implementation could send floats incorrectly suggesting that microsecond precision is relevant).
- GET /invites: Now encodes the user ID of the person who created the invitation as- invited_by_user_id, replacing the previous- reffield (which had that user's Zulip display email address).
- 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:- subscriptionsevent with- op="peer_add"and- op="peer_remove"now identify the modified stream by a- stream_idfield, replacing the old- namefield.
Feature level 18
- POST /register: Added- user_avatar_url_field_optionalto supported- client_capabilities.
Feature level 17
- GET users/me/subscriptions,- GET /streams: Added- message_retention_daysto Stream objects.
- POST users/me/subscriptions,- PATCH streams/{stream_id}: Added- message_retention_daysparameter.
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
- Added spoilers to supported Markdown features.
Feature level 14
- GET users/me/subscriptions: Removed the- is_old_streamfield from Stream objects. This field was always equivalent to- stream_weekly_traffic != nullon the same object.
Feature level 13
- POST /register: Added- bulk_message_deletionto supported- client_capabilities.
- GET /events:- 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
- GET users/{user_id}/subscriptions/{stream_id}: New endpoint added for checking if another user is subscribed to a stream.
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 a- is_owner, similar to the existing- is_adminand- is_guestfields.
- POST /set-typing-status: Removed legacy support for sending email addresses, rather than user IDs, to encode private message recipients.
Feature level 10
- GET users/me: Added- avatar_version,- is_guest,- is_active,- timezone, and- date_joinedfields to the User objects.
- GET users/me: Removed- client_idand- short_namefrom the response to this endpoint. These fields had no purpose and were inconsistent with other API responses describing users.
Feature level 9
- POST users/me/subscriptions,- DELETE /users/me/subscriptions: Other users to subscribe/unsubscribe, declared in the- principalsparameter, can now be referenced by user_id, rather than Zulip display email address.
- PATCH /messages/{message_id}: Added- send_notification_to_old_threadand- send_notification_to_new_threadoptional parameters.
Feature level 8
- GET /users,- GET /users/{user_id}and- GET /users/me: User objects now contain the- is_ownerfield as well.
- Added time mentions to supported Markdown features.
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:
- zulip_versionand- zulip_feature_levelare always returned in- POST /register; previously they were only returned if- event_typesincluded- zulip_version.
- Added new presence_enableduser notification setting; previously presence was always enabled.
Feature level 2:
- POST /messages/{message_id}/reactions: The- reaction_typeparameter is optional; the server will guess the- reaction_typeif it is not specified (checking custom emoji, then Unicode emoji for any with the provided name).
- reactionsobjects returned by the API (both in- GET /messagesand in- GET /events) now include the user who reacted in a top-level- user_idfield. The legacy- userdictionary (which had inconsistent format between those two endpoints) is deprecated.
Feature level 1:
- GET /server_settings: Added- zulip_feature_level, which can be used by clients to detect which of the features described in this changelog are supported.
- POST /register: Added- zulip_feature_levelto the response if- zulip_versionis among the requested- event_types.
- GET /users: User objects for bots now contain a- bot_owner_id, replacing the previous- bot_ownerfield (which had the email address of the bot owner).
- GET /users/{user_id}: 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
- 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.
- Added /export/realmendpoints for triggering a data export.
- PATCH /realm: Added- invite_to_stream_policy,- create_stream_policy,- digest_emails_enabled,- digest_weekday,- user_group_edit_policy, and- avatar_changes_disabledorganization settings.
- Added fluid_layout_width,desktop_icon_count_display, anddemote_inactive_streamsdisplay settings.
- enable_stream_soundswas renamed to- enable_stream_audible_notifications.
- 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 /set-typing-status: Added support for specifying the recipients with user IDs, deprecating the original API of specifying them using email addresses.
Changes not yet stabilized
- POST /register: Added- slim_presenceparameter. Changes the format of presence events, but is still being changed and should not be used by clients.