Zulip mobile API
The mobile API from Zulip — 6 operation(s) for mobile.
The mobile API from Zulip — 6 operation(s) for mobile.
openapi: 3.0.1
info:
version: 1.0.0
title: Zulip REST authentication mobile API
description: 'Powerful open source group chat
'
contact:
url: https://zulip.com
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://{subdomain}.zulipchat.com/api/v1
variables:
subdomain:
default: example
- url: '{server}/api/v1'
variables:
server:
default: https://
- url: https://chat.zulip.org/api/v1
- url: http://localhost:9991/api/v1
- url: http://{subdomain}.testserver/json
security:
- basicAuth: []
tags:
- name: mobile
paths:
/mobile_push/test_notification:
post:
deprecated: true
operationId: test-notify
summary: Send a test notification to mobile device(s)
tags:
- mobile
description: 'Trigger sending a test push notification to the user''s
selected mobile device or all of their mobile devices.
**Changes**: Deprecated in Zulip 11.0 (feature level 420).
Clients connecting to newer servers and with E2EE push
notifications support should use the
[Send an E2EE test notification to mobile device(s)](/api/e2ee-test-notify)
endpoint, as this endpoint will be removed in a future release.
Starting with Zulip 8.0 (feature level 234), test
notifications sent via this endpoint use `test` rather than
`test-by-device-token` in the `event` field. Also, as of this
feature level, all mobile push notifications now include a
`realm_name` field.
New in Zulip 8.0 (feature level 217).
'
requestBody:
required: false
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
token:
description: 'The push token for the device to which to send the test notification.
If this parameter is not submitted, the test notification will be sent
to all of the user''s devices registered on the server.
A mobile client should pass this parameter, to avoid triggering a test
notification for other clients.
'
type: string
example: '111222'
responses:
'200':
description: Success.
content:
application/json:
schema:
$ref: '#/components/schemas/JsonSuccess'
'400':
description: 'Bad request.
'
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/InvalidPushDeviceTokenError'
- $ref: '#/components/schemas/InvalidRemotePushDeviceTokenError'
/mobile_push/e2ee/test_notification:
post:
operationId: e2ee-test-notify
summary: Send an E2EE test notification to mobile device(s)
tags:
- mobile
description: 'Trigger sending an end-to-end encrypted (E2EE) test push notification
to the user''s selected mobile device or all of their mobile devices.
**Changes**: New in Zulip 11.0 (feature level 420).
'
requestBody:
required: false
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
device_id:
description: 'The ID for the device to which to send the test notification.
If this parameter is not submitted, the E2EE test notification will
be sent to all of the user''s devices registered on the server.
A mobile client should pass this parameter, to avoid triggering a test
notification for other clients.
See [`POST /register_client_device`](/api/register-client-device)
for details on device ID.
**Changes**: New in Zulip 12.0 (feature level 468).
Previously, `push_account_id` was used.
'
type: integer
example: 1144
responses:
'200':
description: Success.
content:
application/json:
schema:
$ref: '#/components/schemas/JsonSuccess'
'400':
description: 'Bad request.
'
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/NoActivePushDeviceError'
'403':
description: 'Forbidden.
'
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/PushNotificationAdminActionRequiredError'
'502':
description: 'Bad gateway.
'
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/FailedToConnectBouncerError'
- $ref: '#/components/schemas/InternalBouncerServerError'
/mobile_push/register:
post:
operationId: register-push-device
summary: Register E2EE push device
tags:
- mobile
description: 'Register a device to receive end-to-end encrypted mobile push notifications,
or update such a registration.
To perform an initial registration, clients must provide both the
push key fields (`push_key` and `push_key_id`) and the token fields
(`token_kind`, `token_id`, `bouncer_public_key`, and `encrypted_push_registration`).
Once registered, clients should use this endpoint to rotate `push_key` or
FCM/APNs provided token:
- **Rotate push key**: Provide only the push key fields.
- **Rotate token**: Provide only the token fields.
On a successful registration, the server automatically removes
any legacy push device registration with a matching token for
the user. For self-hosted servers, if removing the legacy
registration from the push notification bouncer fails (e.g.,
due to a network error), legacy notifications to that token
will continue until all of the user''s legacy registrations
have been removed from the local server, at which point the
server will stop sending legacy notification requests to the
bouncer entirely.
**Changes**: In Zulip 12.0 (feature level 483),
the server began automatically removing legacy registrations
with a matching token on successful E2EE registration.
In Zulip 12.0 (feature level 468), the endpoint was significantly
redesigned to support rotation of `push_key` and token provided by FCM/APNs.
New in Zulip 11.0 (feature level 406).
'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
device_id:
description: 'The ID of the device to configure for push notifications.
See [`POST /register_client_device`](/api/register-client-device)
for how to obtain a device ID.
'
type: integer
example: 1
push_key_id:
description: 'A random unsigned 32-bit integer generated by the client as an identifier
for `push_key`. It will be included in mobile push notifications
along with encrypted payloads to identify the `push_key` to decrypt.
'
type: integer
example: 2408
push_key:
description: "Key that the client would like the server to use to encrypt notifications,\nencoded with Base64.\n\nThe key is a byte sequence beginning with a single byte that encodes which\ncryptosystem to use, followed by the key to use for that cryptosystem.\nThis byte sequence is encoded using standard Base64 encoding as defined in RFC 4648.\n\nThe client should avoid sharing the key anywhere else: in particular it should\ngenerate a fresh key for each server, and to the extent possible keep the key\nout of any backups of the client's data.\n\nSupported cryptosystems are:\n\n- `0x31`: LibSodium's [SecretBox][libsodium-secretbox] symmetric key encryption\n system. Keys are 32 bytes, which the server will use with libsodium's\n `crypto_secretbox_easy`. See the [NaCl documentation][nacl-secretbox], which\n details how this system uses `XSalsa20` and `Poly1305` to provide authenticated\n encryption.\n\n[libsodium-secretbox]: https://libsodium.gitbook.io/doc/secret-key_cryptography/secretbox\n[nacl-secretbox]: https://nacl.cr.yp.to/secretbox.html\n\n**Changes**: New in Zulip 12.0 (feature level 432). This replaced the\n`push_public_key` parameter which had a prototype asymmetric cryptosystem, and\ndid not have a natural way to support multiple cryptosystems.\n"
type: string
example: MTaUDJDMWypQ1WufZ1NRTHSSvgYtXh1qVNSjN3aBiEFt
token_kind:
description: 'Whether the token was generated by FCM or APNs.
'
type: string
enum:
- fcm
- apns
example: fcm
token_id:
description: 'Identifier for the FCM/APNs provided token to the device,
produced by taking the first 8 bytes of the SHA-256 hash of
the token, then encoding those bytes using standard Base64 encoding
as defined in RFC 4648.
'
type: string
example: hGsEWGmyyfI=
bouncer_public_key:
description: 'Which of the bouncer''s public keys the client used to encrypt the
`PushRegistration` dictionary.
When the bouncer rotates the key, a new asymmetric key pair is created,
and the new public key is baked into a new client release. Because
the bouncer routinely rotates key, this field clarifies which
public key the client is using.
The public key is encoded using standard Base64 encoding as defined
in RFC 4648.
'
type: string
example: bouncer-public-key
encrypted_push_registration:
description: 'Ciphertext generated by encrypting a `PushRegistration` dictionary
using the `bouncer_public_key`, encoded using a RFC 4648 standard
base64 encoder.
The `PushRegistration` dictionary contains the fields `token`,
`token_kind`, `timestamp`, and (for iOS devices) `ios_app_id`.
The dictionary is JSON-encoded before encryption.
'
type: string
example: encrypted-push-registration-data
required:
- device_id
responses:
'200':
$ref: '#/components/responses/SimpleSuccess'
'400':
description: Bad request.
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
result: error
msg: Server is not configured to use push notification service.
code: PUSH_SERVICE_NOT_CONFIGURED
description: 'Error when the server is not configured to use push notification service:
'
/remotes/push/e2ee/register:
post:
operationId: register-remote-push-device
summary: Register E2EE push device to bouncer
tags:
- mobile
description: 'Register a push device to bouncer to receive end-to-end encrypted
mobile push notifications.
Self-hosted servers use this endpoint to asynchronously register
a push device to the bouncer server after receiving a request from
the mobile client to [register E2EE push device](/api/register-push-device).
It is not meant to be used by mobile clients directly.
**Changes**: New in Zulip 11.0 (feature level 406).
'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
realm_uuid:
description: 'The UUID of the realm to which the push device
being registered belongs.
'
type: string
example: 9aa61d0b-8ce5-488d-8e9e-fedc346e6836
token_id:
description: 'The `token_id` value provided by the mobile client
to [register E2EE push device](/api/register-push-device).
**Changes**: New in Zulip 12.0 (feature level 468),
replacing `push_account_id`.
'
type: string
example: +wKIhyAx/Eg=
encrypted_push_registration:
description: 'The `encrypted_push_registration` value provided by the mobile client
to [register E2EE push device](/api/register-push-device).
'
type: string
example: encrypted-push-registration-data
bouncer_public_key:
description: 'The `bouncer_public_key` value provided by the mobile client
to [register E2EE push device](/api/register-push-device).
'
type: string
example: bouncer-public-key
required:
- realm_uuid
- token_id
- encrypted_push_registration
- bouncer_public_key
responses:
'200':
$ref: '#/components/responses/SimpleSuccess'
'400':
description: Bad request.
content:
application/json:
schema:
oneOf:
- allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: INVALID_BOUNCER_PUBLIC_KEY
msg: Invalid bouncer_public_key
result: error
description: 'An example JSON response for when the given `bouncer_public_key` is invalid:
'
- allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: REQUEST_EXPIRED
msg: Request expired
result: error
description: 'An example JSON response for when the given `encrypted_push_registration` is stale:
'
- allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: BAD_REQUEST
msg: Invalid encrypted_push_registration
result: error
description: 'An example JSON response for when either the bouncer fails to decrypt
the given `encrypted_push_registration` or the decrypted data is invalid:
'
'403':
description: 'Forbidden.
'
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: MISSING_REMOTE_REALM
msg: Organization not registered
result: error
description: 'An example JSON response for when no realm is registered for
the authenticated server on the bouncer for the given `realm_uuid`:
'
/register_client_device:
post:
operationId: register-client-device
summary: Register a logged-in device
tags:
- mobile
description: 'Logged-in mobile devices use this endpoint as an initial step to
register themselves, before registering for E2EE push notifications.
This endpoint is currently not useful for clients other than mobile.
**Changes**: New in Zulip 12.0 (feature level 468).
'
responses:
'200':
description: Success.
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/JsonSuccessBase'
- additionalProperties: false
required:
- device_id
properties:
result: {}
msg: {}
ignored_parameters_unsupported: {}
device_id:
type: integer
description: 'The ID of the newly registered device.
'
example:
msg: ''
device_id: 2
result: success
/remove_client_device:
post:
operationId: remove-client-device
summary: Remove a registered device
tags:
- mobile
description: 'Mobile devices use this endpoint to remove their device record
registered using [`POST /register_client_device`](/api/register-client-device)
when the user logs out.
This endpoint is currently not useful for clients other than mobile.
**Changes**: New in Zulip 12.0 (feature level 470).
'
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
properties:
device_id:
description: 'The ID of the device to remove.
'
type: integer
example: 2
required:
- device_id
responses:
'200':
$ref: '#/components/responses/SimpleSuccess'
components:
schemas:
JsonSuccessBase:
description: '**Changes**: As of Zulip 7.0 (feature level 167), if any
parameters sent in the request are not supported by this
endpoint, a successful JSON response will include an
[`ignored_parameters_unsupported`][ignored_params] array.
A typical successful JSON response may look like:
[ignored_params]: /api/rest-error-handling#ignored-parameters
'
allOf:
- $ref: '#/components/schemas/JsonResponseBase'
- required:
- result
- msg
properties:
result:
enum:
- success
msg:
type: string
ignored_parameters_unsupported:
$ref: '#/components/schemas/IgnoredParametersUnsupported'
JsonSuccess:
allOf:
- $ref: '#/components/schemas/JsonSuccessBase'
- additionalProperties: false
properties:
result: {}
msg: {}
ignored_parameters_unsupported: {}
example:
msg: ''
result: success
PushNotificationAdminActionRequiredError:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: ADMIN_ACTION_REQUIRED
msg: Push notification configuration issue on server, contact the server administrator or retry later.
result: error
description: '## Admin action required
A typical failed JSON response for when there is a push notification
configuration issue on the server, such as invalid credentials,
an expired plan, or an unregistered organization. Admin action is required.
'
InternalBouncerServerError:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: INTERNAL_SERVER_ERROR_ON_BOUNCER
msg: Internal server error on Zulip push notification service, retry later.
result: error
description: '## Internal bouncer server error
A typical failed JSON response for when a 5xx error occurs on the bouncer server.
'
InvalidRemotePushDeviceTokenError:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: INVALID_REMOTE_PUSH_DEVICE_TOKEN
msg: Device not recognized by the push bouncer
result: error
description: '## Invalid push device token
A typical failed JSON response for when the push device token is not recognized
by the push notification bouncer:
'
IgnoredParametersUnsupported:
type: array
items:
type: string
description: 'An array of any parameters sent in the request that are not
supported by the endpoint.
See [error handling](/api/rest-error-handling#ignored-parameters) documentation
for details on this and its change history.
'
JsonResponseBase:
type: object
properties:
result:
type: string
InvalidPushDeviceTokenError:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: INVALID_PUSH_DEVICE_TOKEN
msg: Device not recognized
result: error
description: '## Invalid push device token
A typical failed JSON response for when the push device token is not
recognized by the Zulip server:
'
FailedToConnectBouncerError:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: FAILED_TO_CONNECT_BOUNCER
msg: Network error while connecting to Zulip push notification service.
result: error
description: '## Failed to connect bouncer
A typical failed JSON response for when a network error occurs
while the server attempts to connect to the bouncer server.
'
CodedError:
allOf:
- $ref: '#/components/schemas/CodedErrorBase'
- additionalProperties: false
properties:
result: {}
msg: {}
code: {}
NoActivePushDeviceError:
allOf:
- $ref: '#/components/schemas/CodedError'
- example:
code: NO_ACTIVE_PUSH_DEVICE
msg: No active registered push device
result: error
description: '## No active push device
A typical failed JSON response for when no registered device is available
for the user (and `push_account_id`) to receive a push notification.
'
CodedErrorBase:
allOf:
- $ref: '#/components/schemas/JsonResponseBase'
- required:
- result
- msg
- code
properties:
result:
enum:
- error
msg:
type: string
code:
type: string
description: 'A string that identifies the error.
'
responses:
SimpleSuccess:
description: Success.
content:
application/json:
schema:
$ref: '#/components/schemas/JsonSuccess'
securitySchemes:
BasicAuth:
type: http
scheme: basic
description: 'Basic authentication, with the user''s email as the username, and the API
key as the password. The API key can be fetched using the
`/fetch_api_key` or `/dev_fetch_api_key` endpoints.
'