Zulip authentication API

The authentication API from Zulip — 4 operation(s) for authentication.

OpenAPI Specification

zulip-authentication-api-openapi.yml Raw ↑
openapi: 3.0.1
info:
  version: 1.0.0
  title: Zulip REST authentication 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: authentication
paths:
  /fetch_api_key:
    post:
      operationId: fetch-api-key
      summary: Fetch an API key (production)
      tags:
      - authentication
      description: "This API endpoint is used by clients such as the Zulip mobile and\nterminal apps to implement password-based authentication. Given the\nuser's Zulip login credentials, it returns a Zulip API key that the client\ncan use to make requests as the user.\n\nThis endpoint is only useful for Zulip servers/organizations with\nEmailAuthBackend or LDAPAuthBackend enabled.\n\nThe Zulip mobile apps also support SSO/social authentication (GitHub\nauth, Google auth, SAML, etc.) that does not use this endpoint. Instead,\nthe mobile apps reuse the web login flow passing the `mobile_flow_otp` in\na webview, and the credentials are returned to the app (encrypted) via a redirect\nto a `zulip://` URL.\n\n!!! warn \"\"\n\n    **Note:** If you signed up using passwordless authentication and\n    never had a password, you can [reset your password](/help/change-your-password).\n\nSee the [API keys](/api/api-keys) documentation for more details\non how to download an API key manually.\n\nIn a [Zulip development environment](https://zulip.readthedocs.io/en/latest/development/overview.html),\nsee also [the unauthenticated variant](/api/dev-fetch-api-key).\n"
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                username:
                  description: 'The username to be used for authentication (typically, the email

                    address, but depending on configuration, it could be an LDAP username).


                    See the `require_email_format_usernames` parameter documented in

                    [GET /server_settings](/api/get-server-settings) for details.

                    '
                  type: string
                  example: iago@zulip.com
                password:
                  type: string
                  example: abcd1234
                  description: 'The user''s Zulip password (or LDAP password, if LDAP authentication is in use).

                    '
              required:
              - username
              - password
      security: []
      responses:
        '200':
          description: 'Valid credentials the client can use to access the Zulip API:

            '
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiKeyResponse'
  /jwt/fetch_api_key:
    post:
      operationId: jwt-fetch-api-key
      summary: Fetch an API key (JWT)
      tags:
      - authentication
      description: "This API endpoint is used by clients to implement JSON Web Token\n(JWT) authentication. Given a JWT identifying a Zulip user, it\nreturns a Zulip API key that the client can use to make requests\nas the user.\n\n!!! warn \"\"\n\n    **Note:** This endpoint is only useful for Zulip servers/organizations\n    with [JSON web token authentication][prod-jwt-auth] enabled.\n\nSee the [API keys](/api/api-keys) documentation for more details\non how to manage API keys manually.\n\n**Changes**: New in Zulip 7.0 (feature level 160).\n\n[prod-jwt-auth]: https://zulip.readthedocs.io/en/latest/production/authentication-methods.html#json-web-tokens-jwt\n"
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                token:
                  description: 'A JSON Web Token for the target user.


                    The token payload must contain a custom `email` claim with the target

                    user''s email address, e.g., `{"email": "<target user email>"}`.

                    '
                  type: string
                  example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImhhbWxldEB6dWxpcC5jb20ifQ.EsHxSVt54zPR-ywgPH54TB1FYmrGKsfq7hsQEhp_9w0
                include_profile:
                  type: boolean
                  default: false
                  example: false
                  description: 'Whether to include a `user` object containing the target

                    user''s profile details in the response.

                    '
              required:
              - token
      security: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccessBase'
                - required:
                  - api_key
                  - email
                  additionalProperties: false
                  properties:
                    result: {}
                    msg: {}
                    ignored_parameters_unsupported: {}
                    api_key:
                      type: string
                      description: 'The API key that can be used to authenticate as the requested user.

                        '
                    email:
                      type: string
                      description: 'The email address of the user who owns the API key.

                        '
                    user:
                      description: 'Only present if `include_profile` parameter was set to `true`.


                        A dictionary with data on the target user.

                        '
                      allOf:
                      - $ref: '#/components/schemas/UserBase'
                      - additionalProperties: false
                        properties:
                          user_id: {}
                          delivery_email:
                            nullable: true
                          email: {}
                          full_name: {}
                          date_joined: {}
                          is_active: {}
                          is_owner: {}
                          is_admin: {}
                          is_guest: {}
                          is_bot: {}
                          bot_type:
                            nullable: true
                          bot_owner_id:
                            nullable: true
                          role: {}
                          timezone: {}
                          avatar_url:
                            nullable: true
                          avatar_version: {}
                          is_imported_stub: {}
                  example:
                    api_key: gjA04ZYcqXKalvYMA8OeXSfzUOLrtbZv
                    email: hamlet@zulip.com
                    msg: ''
                    result: success
  /dev_fetch_api_key:
    post:
      operationId: dev-fetch-api-key
      summary: Fetch an API key (development only)
      tags:
      - authentication
      description: "For easy testing of mobile apps and other clients and against Zulip\ndevelopment servers, we support fetching a Zulip API key for any user\non the development server without authentication (so that they can\nimplement analogues of the one-click login process available for Zulip\ndevelopment servers on the web).\n\n!!! warn \"\"\n\n    **Note:** This endpoint is only available on Zulip development\n    servers; for obvious security reasons it will always return an error\n    in a Zulip production server.\n"
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                username:
                  description: 'The email address for the user that owns the API key.

                    '
                  type: string
                  example: iago@zulip.com
              required:
              - username
      security: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiKeyResponse'
  /dev_list_users:
    get:
      operationId: dev-list-users
      summary: List users (development only)
      tags:
      - authentication
      description: "Get a list of all, non-bot users in a [Zulip development\nserver](https://zulip.readthedocs.io/en/latest/development/overview.html).\nThis endpoint is used by mobile developers to fetch users for the\ndevelopment login flow.\n\n!!! warn \"\"\n\n    **Note:** This endpoint is only available on Zulip development\n    servers; for obvious security reasons it will always return an error\n    in a Zulip production server.\n"
      security: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccessBase'
                - type: object
                  additionalProperties: false
                  properties:
                    result: {}
                    msg: {}
                    ignored_parameters_unsupported: {}
                    direct_admins:
                      type: array
                      description: 'A list of administrators in the development server.

                        '
                      items:
                        type: object
                        additionalProperties: false
                        properties:
                          email:
                            type: string
                            description: 'The email of the dev admin user.

                              '
                          realm_url:
                            type: string
                            description: 'The URL of the dev admin user''s organization.

                              '
                    direct_users:
                      type: array
                      description: 'A list of non-admin users in the development server.

                        '
                      items:
                        type: object
                        additionalProperties: false
                        properties:
                          email:
                            type: string
                            description: 'The email of the dev user.

                              '
                          realm_url:
                            type: string
                            description: 'The URL of the dev user''s organization.

                              '
                  example:
                    msg: ''
                    result: success
                    direct_admins:
                    - email: iago@zulip.com
                      realm_url: http://localhost:9991
                    direct_users:
                    - email: hamlet@zulip.com
                      realm_url: http://localhost:9991
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'
    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
    UserBase:
      type: object
      description: 'A dictionary containing basic data on a given Zulip user.


        **Changes**: Removed `is_billing_admin` field in Zulip 10.0 (feature level 363), as it was

        replaced by the `can_manage_billing_group` realm setting.

        '
      properties:
        user_id:
          type: integer
          description: 'The unique ID of the user.

            '
        delivery_email:
          type: string
          nullable: true
          description: 'The user''s real email address. This value will be `null` if you cannot

            access user''s real email address. For bot users, this field is always

            set to the real email of the bot, because bot users always have

            `email_address_visibility` set to everyone.


            **Changes**: Prior to Zulip 7.0 (feature level 163), this field was

            present only when `email_address_visibility` was restricted and you had

            access to the user''s real email. As of this feature level, this field

            is always present, including the case when `email_address_visibility`

            is set to everyone (and therefore not restricted).

            '
        email:
          type: string
          description: 'The Zulip API email address of the user or bot.


            If you do not have permission to view the email address of the target user,

            this will be a fake email address that is usable for the Zulip API but nothing else.

            '
        full_name:
          type: string
          description: 'Full name of the user or bot, used for all display purposes.

            '
        date_joined:
          type: string
          description: 'The time when the user joined. For users imported from other

            applications and users created via the API, this is set to the

            account creation time until the user logs in for the first time,

            after which it is updated to that login time.


            For imported users, clients can use the `is_imported_stub` flag

            to determine how to display this field: when `is_imported_stub`

            is `true`, the user has not yet logged in and this value is the

            account creation time during import; when `is_imported_stub` is

            `false`, this value reflects when the user first logged in.


            **Changes**: Starting with Zulip 12.0 (feature level 475),

            this field is updated when an imported stub user or a user created

            via the API logs in for the first time.

            '
        is_active:
          type: boolean
          description: 'A boolean specifying whether the user account has been deactivated.

            '
        is_owner:
          type: boolean
          description: 'A boolean specifying whether the user is an organization owner.

            If true, `is_admin` will also be true.


            **Changes**: New in Zulip 3.0 (feature level 8).

            '
        is_admin:
          type: boolean
          description: 'A boolean specifying whether the user is an organization administrator.

            '
        is_guest:
          type: boolean
          description: 'A boolean specifying whether the user is a guest user.

            '
        is_bot:
          type: boolean
          description: 'A boolean specifying whether the user is a bot or full account.

            '
        bot_type:
          type: integer
          nullable: true
          description: 'An integer describing the type of bot:


            - `null` if the user isn''t a bot.

            - `1` for a `Generic` bot.

            - `2` for an `Incoming webhook` bot.

            - `3` for an `Outgoing webhook` bot.

            - `4` for an `Embedded` bot.

            '
        bot_owner_id:
          type: integer
          nullable: true
          description: 'If the user is a bot (i.e. `is_bot` is true), then `bot_owner_id`

            is the user ID of the bot''s owner (usually, whoever created the bot).


            Will be `null` for legacy bots that do not have an owner.


            **Changes**: New in Zulip 3.0 (feature level 1). In previous

            versions, there was a `bot_owner` field containing the email

            address of the bot''s owner.

            '
        role:
          type: integer
          enum:
          - 100
          - 200
          - 300
          - 400
          - 600
          description: '[Organization-level role](/api/roles-and-permissions) of the user.

            Possible values are:


            - 100 = Organization owner

            - 200 = Organization administrator

            - 300 = Organization moderator

            - 400 = Member

            - 600 = Guest


            **Changes**: New in Zulip 4.0 (feature level 59).

            '
        timezone:
          type: string
          description: 'The IANA identifier of the user''s [profile time zone](/help/change-your-timezone),

            which is used primarily to display the user''s local time to other users.

            '
        avatar_url:
          type: string
          nullable: true
          description: 'URL for the user''s avatar.


            Will be `null` if the `client_gravatar`

            query parameter was set to `true`, the current user has access to

            this user''s real email address, and this user''s avatar is hosted by

            the Gravatar provider (i.e. this user has never uploaded an avatar).


            **Changes**: Before Zulip 7.0 (feature level 163), access to a

            user''s real email address was a realm-level setting. As of this

            feature level, `email_address_visibility` is a user setting.


            In Zulip 3.0 (feature level 18), if the client has the

            `user_avatar_url_field_optional` capability, this will be missing at

            the server''s sole discretion.

            '
        avatar_version:
          type: integer
          description: 'Version for the user''s avatar. Used for cache-busting requests

            for the user''s avatar. Clients generally shouldn''t need to use this;

            most avatar URLs sent by Zulip will already end with `?v={avatar_version}`.

            '
        is_imported_stub:
          type: boolean
          description: 'Indicates whether this user object is a stub account imported from

            another chat system. Stub accounts are used to represent the senders

            for imported messages. Stub accounts can be converted to regular Zulip

            accounts when the user starts using Zulip, preserving that imported

            user''s message history.


            **Changes**: New in Zulip 12.0 (feature level 433).

            '
          example: false
        is_deleted:
          type: boolean
          description: 'A boolean specifying whether the user has been permanently

            deleted. Deleted users are a subset of deactivated users

            (`is_active=false`) who have had their account data removed.


            This field is only present when `true`.


            **Changes**: New in Zulip 12.0 (feature level 490).

            '
    ApiKeyResponse:
      allOf:
      - $ref: '#/components/schemas/JsonSuccessBase'
      - required:
        - api_key
        - email
        additionalProperties: false
        properties:
          result: {}
          msg: {}
          ignored_parameters_unsupported: {}
          api_key:
            type: string
            description: 'The API key that can be used to authenticate as the requested user.

              '
          email:
            type: string
            description: 'The email address of the user who owns the API key.

              '
          user_id:
            type: integer
            description: 'The unique ID of the user who owns the API key.


              **Changes**: New in Zulip 7.0 (feature level 171).

              '
        example:
          api_key: gjA04ZYcqXKalvYMA8OeXSfzUOLrtbZv
          email: iago@zulip.com
          msg: ''
          result: success
          user_id: 5
  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.

        '