API Changelog
This page documents changes to the Zulip Server API over time. See also
the Zulip server changelog.
The recommended way for a client like the Zulip mobile or desktop apps
that needs to support interaction with a wide range of different Zulip
server versions is to check the zulip_feature_level
parameter in the
/register
and /server_settings
responses to determine which of the
below features are supported.
Changes in Zulip 4.0
Feature level 65
No changes; feature level used for Zulip 4.0 release.
Feature level 64
PATCH /streams/{stream_id}
: Removed unnecessary JSON-encoding of string
parameters new_name
and description
.
PATCH /settings/display
: Removed unnecessary JSON-encoding of string
parameters default_view
, emojiset
and timezone
.
Feature level 63
PATCH /settings/notifications
: Removed unnecessary JSON-encoding of string
parameter notification_sound
.
PATCH /settings/display
: Removed unnecessary JSON-encoding of string
parameter default_language
.
POST /users/me/tutorial_status
: Removed unnecessary JSON-encoding of string
parameter status
.
POST /realm/domains
: Removed unnecessary JSON-encoding of string
parameter domain
.
PATCH /default_stream_groups/{user_id}
: Removed unnecessary JSON-encoding of string
parameters new_group_name
and new_description
.
POST /users/me/hotspots
: Removed unnecessary JSON-encoding of string
parameter hotspot
.
Feature level 62
- Added
moderators only
option for wildcard_mention_policy
.
Feature level 61
- Added support for inviting users as moderators to the invitation
endpoints.
Feature level 60
POST /register
: Added a new boolean field
is_moderator
, similar to the existing is_admin
, is_owner
and
is_guest
fields, to the response.
PATCH /users/{user_id}
: Added support for
changing a user's organization-level role to moderator.
- API endpoints that return
role
values can now return 300
, the
encoding of the moderator role.
Feature level 59
Feature level 58
POST /register
: Added the new
stream_typing_notifications
property to supported
client_capabilities
.
GET /events
: Extended format for typing
events to support typing notifications in stream messages. These new
events are only sent to clients with client_capabilities
showing support for stream_typing_notifications
.
POST /set-typing-status
: Added support
for sending typing notifications for stream messages.
Feature level 57
Feature level 56
POST /register
: Added a new setting
move_messages_between_streams_policy
for controlling who can
move messages between streams.
Feature level 55
POST /register
: Added realm_giphy_rating
and giphy_rating_options
fields.
PATCH /realm
: Added giphy_rating
parameter.
Feature level 54
GET /realm/filters
has been removed and replace with GET
/realm/linkifiers
which returns the data in a
cleaner dictionary format.
GET /events
: Introduced new event type
realm_linkifiers
. The previous realm_filters
event type is
still supported for backwards compatibility, but will be removed in
a future release.
POST /register
: The response now supports a
realm_linkifiers
event type, containing the same data as the
legacy realm_filters
key, with a more extensible object
format. The previous realm_filters
event type is still supported
for backwards compatibility, but will be removed in a future
release. The legacy realm_filters
key is deprecated but remains
available for backwards compatibility.
Feature level 53
POST /register
: Added max_topic_length
and max_message_length
, and renamed max_stream_name_length
and
max_stream_description_length
to allow clients to transparently
support these values changing in a future server version.
Feature level 52
PATCH /realm
: Removed unnecessary JSON-encoding of string
parameters name
, description
, default_language
, and
default_code_block_language
.
Feature level 51
Feature level 50
POST /register
: Replaced invite_by_admins_only
field with an integer field invite_to_realm_policy
.
Feature level 49
Feature level 48
Feature level 47
POST /register
: Added a new giphy_api_key
field, which is required to fetch GIFs using the GIPHY API.
Feature level 46
GET /messages
and GET
/events
: The topic_links
field now contains a
list of dictionaries, rather than a list of strings.
Feature level 45
GET /events
: Removed useless op
field from
custom_profile_fields
events. These events contain the full set
of configured custom_profile_fields
for the organization
regardless of what triggered the change.
Feature level 44
POST /register
: extended the unread_msgs
object to include old_unreads_missing
, which indicates whether the
server truncated the unread_msgs
due to excessive total unread
messages.
Feature level 43
- [
GET /users/{user_id_or_email}/presence
]: Added support for
passing the user_id
to identify the target user.
Feature level 42
PATCH /settings/display
: Added a new default_view
setting allowing
the user to set the default view.
Feature level 41
GET /events
: Removed name
field from update
subscription events.
Feature level 40
GET /events
: Removed email
field from update
subscription events.
Feature level 39
Feature level 38
POST /register
: Increased
realm_community_topic_editing_limit_seconds
time limit value
to 259200s (3 days).
Feature level 37
- Consistently provide
subscribers
in stream data when
clients register for subscriptions with include_subscribers
,
even if the user can't access subscribers.
Feature level 36
POST /users
: Restricted access to organization
administrators with the can_create_users
permission.
Feature level 35
- The peer_add and peer_remove subscription events now have plural
versions of
user_ids
and stream_ids
.
Feature level 34
POST /register
: Added a new wildcard_mention_policy
setting for controlling who can use wildcard mentions in large streams.
Feature level 33
- Markdown code blocks now have a
data-code-language
attribute
attached to the outer div
element, recording the programming
language that was selecting for syntax highlighting. This field
supports the upcoming "view in playground" feature for code blocks.
Feature level 32
GET /events
: Added op
field to
update_message_flags
events, deprecating the operation
field
(which has the same value). This removes an unintentional anomaly
in the format of this event type.
Feature level 31
-
GET users/me/subscriptions
: Added a
role
field to Subscription objects representing whether the user
is a stream administrator.
-
GET /events
: Added role
field to
Subscription objects sent in subscriptions
events.
Note that as of this feature level, stream administrators are a
partially completed feature. In particular, it is impossible for a
user to be a stream administrator at this feature level.
Feature level 30
Feature levels 28 and 29 are reserved for future use in 3.x bug fix
releases.
Changes in Zulip 3.1
Feature level 27
- The
short_name
field is removed from display_recipients
in POST /users
.
Feature level 26
- The
sender_short_name
field is no longer included in
GET /messages
.
- The
short_name
field is removed from display_recipients
in GET /messages
.
Changes in Zulip 3.0
Feature level 25
No changes; feature level used for Zulip 3.0 release.
Feature level 24
- The
!avatar()
and !gravatar()
Markdown syntax, which was never
documented, had inconsistent syntax, and was rarely used, was
removed.
Feature level 23
GET/PUT/POST /users/me/pointer
: Removed. Zulip 3.0 removes the
pointer
concept from Zulip; this legacy data structure was
replaced by tracking unread messages and loading views centered on
the first unread message.
Feature level 22
GET /attachments
: The date when a message
using the attachment was sent is now correctly encoded as
date_sent
, replacing the confusingly named name
field. The
date_sent
and create_time
fields of attachment objects are now
encoded as integers; (previously the implementation could send
floats incorrectly suggesting that microsecond precision is
relevant).
GET /invites
: Now encodes the user ID of the person who created
the invitation as invited_by_user_id
, replacing the previous
ref
field (which had that user's Zulip display email address).
Feature level 21
PATCH /settings/display
: Replaced the night_mode
boolean with
color_scheme
as part of supporting automatic night theme detection.
Feature level 20
- Added support for inviting users as organization owners to the
invitation endpoints.
Feature level 19
GET /events
: subscriptions
event with
op="peer_add"
and op="peer_remove"
now identify the modified
stream by a stream_id
field, replacing the old name
field.
Feature level 18
POST /register
: Added
user_avatar_url_field_optional
to supported client_capabilities
.
Feature level 17
Feature level 16
- [
GET /users/me
]: Removed pointer
from the response, as the
"pointer" concept is being removed in Zulip.
- Changed the rendered HTML markup for mentioning a time to use the
<time>
HTML tag. It is OK for clients to ignore the previous time
mention markup, as the feature was not advertised before this change.
Feature level 15
- Added spoilers
to supported Markdown features.
Feature level 14
GET users/me/subscriptions
: Removed
the is_old_stream
field from Stream objects. This field was
always equivalent to stream_weekly_traffic != null
on the same object.
Feature level 13
POST /register
: Added
bulk_message_deletion
to supported client_capabilities
.
GET /events
: message_deleted
events have new behavior. The sender
and sender_id
fields were
removed, and the message_id
field was replaced by a message_ids
list for clients with the bulk_message_deletion
client capability.
All clients should upgrade; we expect bulk_message_deletion
to be
required in the future.
Feature level 12
Feature level 11
POST /register
: Added
realm_community_topic_editing_limit_seconds
to the response, the
time limit before community topic editing is forbidden. A null
value means no limit. This was previously hard-coded in the server
as 86400 seconds (1 day).
POST /register
: The response now contains a
is_owner
, similar to the existing is_admin
and is_guest
fields.
POST /set-typing-status
: Removed legacy support for sending email
addresses, rather than user IDs, to encode private message recipients.
Feature level 10
GET users/me
: Added avatar_version
, is_guest
,
is_active
, timezone
, and date_joined
fields to the User objects.
GET users/me
: Removed client_id
and short_name
from the response to this endpoint. These fields had no purpose and
were inconsistent with other API responses describing users.
Feature level 9
Feature level 8
Feature level 7
GET /events
: realm_user
and
realm_bot
events no longer contain an email
field to identify
the user; use the user_id
field instead. Previously, some (but
not all) events of these types contained an email
key in addition to
to user_id
) for identifying the modified user.
PATCH /users/{user_id}
: The is_admin
and
is_guest
parameters were removed in favor of the more general
role
parameter for specifying a change in user role.
GET /events
: realm_user
events
sent when a user's role changes now include role
property, instead
of the previous is_guest
or is_admin
booleans.
GET /realm/emoji
: The user who uploaded a given custom emoji is
now indicated by an author_id
field, replacing a previous author
object with unnecessary additional data.
Feature level 6
GET /events
: realm_user
events to
update a user's avatar now include the avatar_version
field, which
is important for correctly refetching medium-size avatar images when
the user's avatar changes.
GET /users
and GET
/users/{user_id}
: User objects now contain the
avatar_version
field as well.
Feature level 5
* GET /events
: realm_bot
events,
sent when changes are made to bot users, now contain an
integer-format owner_id
field, replacing the owner
field (which
was an email address).
Feature level 4
jitsi_server_url
, development_environment
, server_generation
,
password_min_length
, password_min_guesses
, max_file_upload_size_mib
,
max_avatar_file_size_mib
, server_inline_image_preview
,
server_inline_url_embed_preview
, server_avatar_changes_disabled
and
server_name_changes_disabled
fields are now available via
POST /register
to make them accessible to all the clients;
they were only internally available to Zulip's web app prior to this.
Feature level 3:
zulip_version
and zulip_feature_level
are always returned
in POST /register
; previously they were only returned if event_types
included zulip_version
.
- Added new
presence_enabled
user notification setting; previously
presence was always enabled.
Feature level 2:
POST /messages/{message_id}/reactions
:
The reaction_type
parameter is optional; the server will guess the
reaction_type
if it is not specified (checking custom emoji, then
Unicode emoji for any with the provided name).
reactions
objects returned by the API (both in GET /messages
and
in GET /events
) now include the user who reacted in a top-level
user_id
field. The legacy user
dictionary (which had
inconsistent format between those two endpoints) is deprecated.
Feature level 1:
GET /server_settings
: Added
zulip_feature_level
, which can be used by clients to detect which
of the features described in this changelog are supported.
POST /register
: Added zulip_feature_level
to the response if zulip_version
is among the requested
event_types
.
GET /users
: User objects for bots now
contain a bot_owner_id
, replacing the previous bot_owner
field
(which had the email address of the bot owner).
GET /users/{user_id}
: Endpoint added.
GET /messages
: Add support for string-format
values for the anchor
parameter, deprecating and replacing the
use_first_unread_anchor
parameter.
GET /messages
and GET
/events
: Message objects now use
topic_links
rather than subject_links
to indicate links either
present in the topic or generated by linkifiers applied to the topic.
POST /users/me/subscriptions
: Replaced
is_announcement_only
boolean with stream_post_policy
enum for
specifying who can post to a stream.
PATCH /streams/{stream_id}
: Replaced
is_announcement_only
boolean with stream_post_policy
enum for
specifying who can post to a stream.
GET /streams
: Replaced
is_announcement_only
boolean with stream_post_policy
enum for
specifying who can post to a stream.
GET /api/v1/user_uploads
: Added new endpoint for requesting a
temporary URL for an uploaded file that does not require
authentication to access (e.g. for passing from a Zulip desktop,
mobile, or terminal app to the user's default browser).
- Added
EMAIL_ADDRESS_VISIBILITY_NOBODY
possible value for
email_address_visibility
.
- Added
private_message_policy
realm setting.
muted_topic
objects now are a 3-item tuple: (stream_id
, topic
,
date_muted
). Previously, they were a 2-item tuple.
GitLab
authentication is now available.
- Added
None
as a video call provider option.
Changes in Zulip 2.1
GET /users
: Added include_custom_profile_fields
to request custom profile field data.
GET /users/me
: Added avatar_url
field,
containing the user's avatar URL, to the response.
GET /users/me/subscriptions
: Added
include_subscribers
parameter controlling whether data on the
other subscribers is included. Previous behavior was to always send
subscriber data.
GET /users/me/subscriptions
:
Stream-level notification settings like push_notifications
were
changed to be nullable boolean fields (true/false/null), with null
meaning that the stream inherits the organization-level default.
Previously, the only values were true/false. A client communicates
support for this feature using client_capabilities
.
GET /users/me/subscriptions
: Added
wildcard_mentions_notify
notification setting, with the same
global-plus-stream-level-override model as other notification settings.
GET /server_settings
: Added
external_authentication_methods
structure, used to display login
buttons nicely in the mobile apps.
- Added
first_message_id
field to Stream objects. This is helpful
for determining whether the stream has any messages older than a
window cached in a client.
- Added
is_web_public
field to Stream objects. This field is
intended to support web-public streams.
- Added
/export/realm
endpoints for triggering a data export.
PATCH /realm
: Added invite_to_stream_policy
,
create_stream_policy
, digest_emails_enabled
, digest_weekday
,
user_group_edit_policy
, and avatar_changes_disabled
organization settings.
- Added
fluid_layout_width
, desktop_icon_count_display
, and
demote_inactive_streams
display settings.
enable_stream_sounds
was renamed to
enable_stream_audible_notifications
.
- Deprecated
in_home_view
, replacing it with the more readable
is_muted
(with the opposite meaning).
- Custom profile fields: Added
EXTERNAL_ACCOUNT
field type.
Changes in Zulip 2.0
POST /messages
: Added support for using user
IDs and stream IDs for specifying the recipients of a message.
POST /messages
, POST
/messages/{message_id}
: Added support for
encoding topics using the topic
parameter name. The previous
subject
parameter name was deprecated but is still supported for
backwards-compatibility.
POST /set-typing-status
: Added support for specifying the
recipients with user IDs, deprecating the original API of specifying
them using email addresses.
Changes not yet stabilized
POST /register
: Added slim_presence
parameter. Changes the format of presence events, but is still
being changed and should not be used by clients.