<commit_before># This file contains the API definitions for the Zulip REST API.
#
# For details on the OpenAPI specification, see http://swagger.io/specification
#
# Our own documentation lives at
#
#   https://zulip.readthedocs.io/en/latest/subsystems/openapi-api-docs.html
#

openapi: 3.0.1
info:
  version: 1.0.0
  title: Zulip REST API
  description: Powerful open source group chat
  contact:
    url: https://zulipchat.com
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: 'https://your.zulip.server/api/v1'

#######################
# Endpoint definitions
#######################
paths:
  /events:
    get:
      description: Receive new events from
        [a registered event queue](/api/register-queue).
      parameters:
      - name: queue_id
        in: query
        description: The ID of a queue that you registered via
          `POST /api/v1/register`
          (see [Register a queue](/api/register-queue)).
        schema:
          type: string
        example: 1375801870:2942
      - name: last_event_id
        in: query
        description: The highest event ID in this queue that you've received
          and wish to acknowledge. See the [code for `call_on_each_event`](https://github.com/zulip/python-zulip-api/blob/master/zulip/zulip/__init__.py)
          in the [zulip Python module](https://github.com/zulip/python-zulip-api)
          for an example implementation of correctly processing each event
          exactly once.
        schema:
          type: integer
        example: -1
      - name: dont_block
        in: query
        description: Set to `true` if the client is requesting a nonblocking
          reply. If not specified, the request will block until either a new
          event is available or a few minutes have passed, in which case the
          server will send the client a heartbeat event.
        schema:
          type: boolean
          default: false
        example: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    events:
                      type: array
                      description: An array of `event` objects (possibly
                        zero-length if `dont_block` is set) of events with
                        IDs newer than `last_event_id`. Event IDs are
                        guaranted to be increasing, but they are not
                        guaranteed to be consecutive.
                - example:
                    {
                        "events": [
                            {
                                "id": 0,
                                "message": {
                                    "avatar_url": "https://url/for/othello-bots/avatar",
                                    "client": "website",
                                    "content": "Something is rotten in the state of Denmark.",
                                    "content_type": "text/x-markdown",
                                    "display_recipient": "Denmark",
                                    "id": 12345678,
                                    "recipient_id": 12314,
                                    "sender_email": "<EMAIL>",
                                    "sender_full_name": "<NAME>",
                                    "sender_id": 13215,
                                    "sender_realm_str": "example",
                                    "sender_short_name": "othello-bot",
                                    "subject": "Castle",
                                    "subject_links": [],
                                    "timestamp": 1375978403,
                                    "type": "stream"
                                },
                                "type": "message"
                            },
                            {
                                "id": 1,
                                "message": {
                                    "avatar_url": "https://url/for/othello-bots/avatar",
                                    "client": "website",
                                    "content": "I come not, friends, to steal away your hearts.",
                                    "content_type": "text/x-markdown",
                                    "display_recipient": [
                                        {
                                            "email": "<EMAIL>",
                                            "full_name": "<NAME>",
                                            "id": 31572,
                                            "short_name": "hamlet"
                                        }
                                    ],
                                    "id": 12345679,
                                    "recipient_id": 18391,
                                    "sender_email": "<EMAIL>",
                                    "sender_full_name": "<NAME>",
                                    "sender_id": 13215,
                                    "sender_realm_str": "example",
                                    "sender_short_name": "othello-bot",
                                    "subject": "",
                                    "subject_links": [],
                                    "timestamp": 1375978404,
                                    "type": "private"
                                },
                                "type": "message"
                            }
                        ],
                        "msg": "",
                        "result": "success"
                    }
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadEventQueueIdError'
    delete:
      description: Delete a previously registered queue.
      parameters:
      - name: queue_id
        in: query
        description: The ID of a queue that you registered via
          `POST /api/v1/register`(see [Register a queue](/api/register-queue).
        schema:
           type: string
        example: 1375801870:2942
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonSuccess'
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadEventQueueIdError'
  /get_stream_id:
    get:
      description: Get the unique ID of a given stream.
      parameters:
      - name: stream
        in: query
        description: The name of the stream to retrieve the ID for.
        schema:
           type: string
        example: Denmark
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    stream_id:
                      type: integer
                      description: The ID of the given stream.
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "stream_id": 15
                    }
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "Invalid stream name 'nonexistent'",
                        "result": "error"
                    }
  /messages:
    post:
      description: Send a message.
      parameters:
      - name: type
        in: query
        description: The type of message to be sent. `private` for a private
          message and `stream` for a stream message.
        schema:
          type: string
          enum:
            - private
            - stream
        example: private
        required: true
      - name: to
        in: query
        description: The destination stream, or a CSV/JSON-encoded list
          containing the usernames (emails) of the recipients.
        schema:
          type: string
        example: <EMAIL>, <EMAIL>
        required: true
      - name: subject
        in: query
        description: The topic of the message. Only required if `type` is
          `stream`, ignored otherwise. Maximum length of 60 characters.
        schema:
          type: string
          default:
        example: Castle
      - name: content
        in: query
        description: The content of the message. Maximum message size of
          10000 bytes.
        schema:
          type: string
        example: Hello
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    id:
                      type: integer
                      description: The ID assigned to the message sent.
                - example:
                    {
                        "msg": "",
                        "id": 42,
                        "result": "success"
                    }
        '400_non_existing_stream':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - properties:
                    stream:
                      type: string
                      description: The name of the stream that could not be
                        found.
                - example:
                    {
                        "code": "STREAM_DOES_NOT_EXIST",
                        "msg": "Stream 'nonexistent_stream' does not exist",
                        "result": "error",
                        "stream": "nonexistent_stream"
                    }
        '400_non_existing_user':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "Invalid email '<EMAIL>'",
                        "result": "error"
                    }
  /messages/{message_id}:
    patch:
      description: Edit a message that has already been sent.
      parameters:
      - name: message_id
        in: path
        description: The ID of the message that you wish to edit/update.
        schema:
          type: integer
        example: 42
        required: true
      - name: subject
        in: query
        description: |
          The topic of the message. Only required for stream messages.
          Maximum length of 60 characters.
        schema:
          type: string
          default:
        example: Castle
      - name: propagate_mode
        in: query
        description: |
          Which message(s) should be edited: just the one indicated in
          `message_id`, messages in the same topic that had been sent after
          this one, or all of them.
        schema:
          type: string
          enum:
          - change_one
          - change_later
          - change_all
          default: change_one
        example: change_all
      - name: content
        in: query
        description: |
          The content of the message. Maximum message size of 10000 bytes.
        schema:
          type: string
        example: Hello
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonSuccess'
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonError'
                - properties:
                    msg:
                      enum:
                      - Your organization has turned off message editing
                      - You don't have permission to edit this message
                      - The time limit for editing this message has past
                      - Nothing to change
                      - Topic can't be empty
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "You don't have permission to edit this message",
                        "result": "error"
                    }
  /messages/render:
    post:
      description: Render a message to HTML.
      parameters:
        - name: content
          in: query
          description: The content of the message.
          schema:
             type: string
          example: '**foo**'
          required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    rendered:
                      type: string
                      description: The rendered HTML.
                - example:
                    {
                        "msg": "",
                        "rendered": "<p><strong>foo</strong></p>",
                        "result": "success"
                    }
  /user_uploads:
    post:
      description: Upload a single file and get the corresponding URI.
      requestBody:
        content:
          multipart/form-data:
            schema:
              properties:
                filename:
                  type: string
                  format: binary
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    uri:
                      type: string
                      description: The URI of the uploaded file.
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "uri": "/user_uploads/1/4e/m2A3MSqFnWRLUf9SaPzQ0Up_/zulip.txt"
                    }
  /users:
    get:
      description: Retrieve all users in a realm.
      parameters:
      - name: client_gravatar
        in: query
        description: The `client_gravatar` field is set to `true` if clients
          can compute their own gravatars.
        schema:
           type: boolean
           default : false
        example: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    members:
                      type: array
                      description: A list of `member` objects, each containing
                        details of a user in the realm (like their email, name,
                        avatar, user type...).
                - example:
                    {
                        "members": [
                            {
                                "avatar_url": "https://secure.gravatar.com/avatar/818c212b9f8830dfef491b3f7da99a14?d=identicon&version=1",
                                "bot_type": null,
                                "email": "<EMAIL>",
                                "full_name": "aaron",
                                "is_active": true,
                                "is_admin": false,
                                "is_bot": false,
                                "user_id": 1
                            },
                            {
                                "avatar_url": "https://secure.gravatar.com/avatar/77c3871a68c8d70356156029fd0a4999?d=identicon&version=1",
                                "bot_type": null,
                                "email": "<EMAIL>",
                                "full_name": "<NAME>",
                                "is_active": true,
                                "is_admin": false,
                                "is_bot": false,
                                "user_id": 3
                            },
                            {
                                "avatar_url": "https://secure.gravatar.com/avatar/0cbf08f3a355995fa2ec542246e35123?d=identicon&version=1",
                                "bot_type": null,
                                "email": "<EMAIL>",
                                "full_name": "<NAME>",
                                "is_active": true,
                                "is_admin": false,
                                "is_bot": false,
                                "user_id": 24
                            }
                        ],
                        "msg": "",
                        "result": "success"
                    }
    post:
      description: Create a new user in a realm.
      parameters:
      - name: email
        in: query
        description: The email address of the new user.
        schema:
           type: string
        example: <EMAIL>
        required: true
      - name: password
        in: query
        description: The password of the new user.
        schema:
           type: string
        example: <PASSWORD>
        required: true
      - name: full_name
        in: query
        description: The full name of the new user.
        schema:
           type: string
        example: <NAME>
        required: true
      - name: short_name
        in: query
        description: The short name of the new user.
        schema:
           type: string
        example: jsmith
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonSuccess'
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonError'
                - example:
                    {
                        "msg": "Email '<EMAIL>' already in use",
                        "result": "error"
                    }
  /users/me/{stream_id}/topics:
    get:
      description: Get all the topics in a specific stream.
      parameters:
      - name: stream_id
        in: path
        description: The unique ID of the stream.
        schema:
          type: integer
        example: 42
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    topics:
                      type: array
                      items:
                        type: object
                        properties:
                          max_id:
                            description:
                              The ID of the last message sent to the topic.
                            type: number
                          name:
                            description: The name of the topic.
                            type: string
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "topics": [
                            {
                                "max_id": 26,
                                "name": "Denmark3"
                            },
                            {
                                "max_id": 23,
                                "name": "Denmark1"
                            },
                            {
                                "max_id": 6,
                                "name": "Denmark2"
                            }
                        ]
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "Invalid stream id",
                        "result": "error"
                    }
  /users/me/subscriptions:
    post:
      description: Subscribe one or more users to one or more streams.
      parameters:
      - name: subscriptions
        in: query
        description: |
          A list of dictionaries, where each dictionary contains key/value
          pairs specifying a particular stream to subscribe to.
          **Note**: This argument is called `streams` and not `subscriptions`
          in our Python API.
        schema:
          type: string
        example: [{"name": "Verona"}]
        required: true
      - name: invite_only
        in: query
        description: |
          A boolean specifying whether the streams specified in
          `subscriptions` are invite-only or not.
        schema:
          type: boolean
          default: false
        example: true
      - name: announce
        in: query
        description: |
          If `announce` is `True` and one of the streams specified in
          `subscriptions` has to be created (i.e. doesn't exist to begin
          with), an announcement will be made notifying that a new stream was
          created.
        schema:
          type: boolean
        example: true
      - name: principals
        in: query
        description: |
          A list of email addresses of the users that will be subscribed to
          the streams specified in the `subscriptions` argument. If not
          provided, then the requesting user/bot is subscribed.
        schema:
          type: string
          default: []
        example: ['<EMAIL>']
      - name: authorization_errors_fatal
        in: query
        description: |
          A boolean specifying whether authorization errors (such as when the
          requesting user is not authorized to access a private stream) should
          be considered fatal or not. When `True`, an authorization error is
          reported as such. When set to `False`, the returned JSON payload
          indicates that there was an authorization error, but the response is
          still considered a successful one.
        schema:
          type: boolean
          default: true
        example: false
      security:
      - basicAuth: []
      responses:
        '200_without_principals':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "already_subscribed": {},
                        "msg": "",
                        "result": "success",
                        "subscribed": {
                            "<EMAIL>": [
                                "new stream"
                            ]
                        }
                    }
        '200_already_subscribed':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "already_subscribed": {
                            "<EMAIL>": [
                                "new stream"
                            ]
                        },
                        "msg": "",
                        "result": "success",
                        "subscribed": {}
                    }
        '400_unauthorized_errors_fatal_true':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "msg": "Unable to access stream (private_stream).",
                        "result": "error"
                    }
        '400_unauthorized_errors_fatal_false':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "already_subscribed": {},
                        "msg": "",
                        "result": "success",
                        "subscribed": {},
                        "unauthorized": [
                            "private_stream"
                        ]
                    }
    delete:
      description: Unsubscribe yourself or other users from one or more
        streams.
      parameters:
      - name: subscriptions
        in: query
        description: A list of stream names to unsubscribe from. This argument
          is called `streams` in our Python API.
        schema:
          type: array
          items:
            type: string
        example: ['Verona', 'Denmark']
        required: true
      - name: principals
        in: query
        description: A list of email addresses of the users that will be
          unsubscribed from the streams specified in the `subscriptions`
          argument. If not provided, then the requesting user/bot is
          unsubscribed.
        schema:
          type: array
          items:
            type: string
          default:
        example: ['<EMAIL>']
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    not_subscribed:
                      type: array
                      items:
                        type: string
                      description: A list of the names of streams that the
                        user is already unsubscribed from, and hence doesn't
                        need to be unsubscribed.
                    removed:
                      type: array
                      items:
                        type: string
                      description: A list of the names of streams which were
                        unsubscribed from as a result of the query.
                - example:
                    {
                        "msg": "",
                        "not_subscribed": [],
                        "removed": [
                            "new stream"
                        ],
                        "result": "success"
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - properties:
                    stream:
                      type: string
                      description: The name of the stream that could not be
                        found.
                - example:
                    {
                        "code": "STREAM_DOES_NOT_EXIST",
                        "msg": "Stream 'nonexistent_stream' does not exist",
                        "result": "error",
                        "stream": "nonexistent_stream"
                    }
  /register:
    post:
      description: This powerful endpoint can be used to register a Zulip
        "event queue" (subscribed to certain types of "events", or updates to
        the messages and other Zulip data the current user has access to), as
        well as to fetch the current state of that data.
      parameters:
      - name: apply_markdown
        in: query
        description: Set to `true` if you would like the content to be
          rendered in HTML format (by default, the API returns the raw text
          that the user entered)
        schema:
           type: boolean
           default : false
        example: true
      - name: client_gravatar
        in: query
        description: The `client_gravatar` field is set to `true` if clients
          can compute their own gravatars.
        schema:
           type: boolean
           default : false
        example: true
      - name: event_types
        in: query
        description: "A JSON-encoded array indicating which types of events
          you're interested in. Values that you might find useful include:
          <br/> <br/>
          * **message** (messages), <br/>
          * **subscription** (changes in your subscriptions), <br/>
          * **realm_user** (changes in the list of users in your realm)
          <br/> <br/>
          If you do not specify this argument, you will receive all events,
          and have to filter out the events not relevant to your client in
          your client code. For most applications, one is only interested in
          messages, so one specifies: `event_types=['message']`"
        schema:
           type: string
        example: event_types=['message']
      - name: all_public_streams
        in: query
        description: Set to `True` if you would like to receive events that
          occur within all public streams.
        schema:
           type: boolean
           default: false
        example: true
      - name: include_subscribers
        in: query
        description: Set to `True` if you would like to receive events that
          include the subscribers for each stream.
        schema:
           type: boolean
           default : false
        example: true
      - name: fetch_event_types
        in: query
        description: Same as the `event_types` argument except that the values
          in `fetch_event_types` are used to fetch initial data. If
          `fetch_event_types` is not provided, `event_types` is used and if
          `event_types` is not provided, this argument defaults to `None`.
        schema:
           type: string
        example: event_types=['message']
      - name: narrow
        in: query
        description: A JSON-encoded array of length 2 indicating the narrow
          for which you'd like to receive events for. For instance, to
          receive events for the stream `Denmark`, you would specify
          `narrow=['stream', 'Denmark']`. Another example is
          `narrow=['is', 'private']` for private messages.
        schema:
           type: string
           default : narrow=[]
        example: narrow=['stream', 'Denmark']
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    queue_id:
                      type: string
                      description: The ID of the queue that has been allocated
                        for your client.
                    last_event_id:
                      type: integer
                      description: The initial value of `last_event_id` to
                        pass to `GET /api/v1/events`.
                - example:
                    {
                        "last_event_id": -1,
                        "msg": "",
                        "queue_id": "1517975029:0",
                        "realm_emoji": {
                            "1": {
                                "author": {
                                    "email": "<EMAIL>",
                                    "full_name": "Iago",
                                    "id": 5
                                },
                                "deactivated": false,
                                "id": "1",
                                "name": "green_tick",
                                "source_url": "/user_avatars/1/emoji/images/1.png"
                            }
                        },
                        "result": "success"
                    }
  /streams:
    get:
      description: Get all streams that the user has access to.
      parameters:
      - name: include_public
        in: query
        description: Include all public streams.
        schema:
           type: boolean
           default : true
        example: false
      - name: include_subscribed
        in: query
        description: Include all streams that the user is subscribed to.
        schema:
           type: boolean
           default : true
        example: false
      - name: include_all_active
        in: query
        description: Include all active streams. The user must have
          administrative privileges to use this parameter.
        schema:
           type: boolean
           default : false
        example: true
      - name: include_default
        in: query
        description: Include all default streams for the user's realm.
        schema:
           type: boolean
           default : false
        example: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    streams:
                      type: array
                      items:
                        type: object
                      description: A list of `stream` objects, which contain a
                        `description`, a `name`, their `stream_id` and whether
                        they are `invite_only` or not.
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "streams": [
                            {
                                "description": "A Scandinavian country",
                                "invite_only": false,
                                "name": "Denmark",
                                "stream_id": 1
                            },
                            {
                                "description": "Yet another Italian city",
                                "invite_only": false,
                                "name": "Rome",
                                "stream_id": 2
                            },
                            {
                                "description": "Located in the United Kingdom",
                                "invite_only": false,
                                "name": "Scotland",
                                "stream_id": 3
                            },
                            {
                                "description": "A northeastern Italian city",
                                "invite_only": false,
                                "name": "Venice",
                                "stream_id": 4
                            },
                            {
                                "description": "A city in Italy",
                                "invite_only": false,
                                "name": "Verona",
                                "stream_id": 5
                            },
                            {
                                "description": "New stream for testing",
                                "invite_only": false,
                                "name": "new stream",
                                "stream_id": 6
                            }
                        ]
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "User not authorized for this query",
                        "result": "error"
                    }

components:
  #######################
  # Security definitions
  #######################
  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.

  schemas:
    JsonResponse:
      type: object
      properties:
        result:
          type: string
    JsonSuccess:
      allOf:
      - $ref: '#/components/schemas/JsonResponse'
      - required:
        - result
        - msg
      - properties:
          result:
            enum:
            - success
          msg:
            type: string
      - example:
          {
            "msg": "",
            "result": "success"
          }
    JsonError:
      allOf:
      - $ref: '#/components/schemas/JsonResponse'
      - required:
        - result
        - msg
      - properties:
          result:
            enum:
            - error
          msg:
            type: string
    CodedError:
      allOf:
      - $ref: '#/components/schemas/JsonError'
      - properties:
          code:
            type: string
            description: A string that identifies the error.
    BadEventQueueIdError:
      allOf:
      - $ref: '#/components/schemas/CodedError'
      - properties:
          queue_id:
            type: string
            description: The string that identifies the invalid event queue.
      - example:
          {
              "code": "BAD_EVENT_QUEUE_ID",
              "msg": "Bad event queue id: 1518820930:1",
              "queue_id": "1518820930:1",
              "result": "error"
          }
    AddSubscriptionsResponse:
      allOf:
      - $ref: '#/components/schemas/JsonSuccess'
      - properties:
          subscribed:
            type: object
            description: |
              A dictionary where the key is the email address of the user/bot
              and the value is a list of the names of the streams that were
              subscribed to as a result of the query.
          already_subscribed:
            type: object
            description: |
              A dictionary where the key is the email address of the user/bot
              and the value is a list of the names of the streams that the
              user/bot is already subscribed to.
          unauthorized:
            type: array
            items:
              type: string
            description: |
              A list of names of streams that the requesting user/bot was not
              authorized to subscribe to.

  ###################
  # Shared responses
  ###################
  responses:
    SimpleSuccess:
      description: Success
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/JsonSuccess'<commit_msg>api docs: Minor formatting improvements.<commit_after># This file contains the API definitions for the Zulip REST API.
#
# For details on the OpenAPI specification, see http://swagger.io/specification
#
# Our own documentation lives at
#
#   https://zulip.readthedocs.io/en/latest/subsystems/openapi-api-docs.html
#

openapi: 3.0.1
info:
  version: 1.0.0
  title: Zulip REST API
  description: Powerful open source group chat
  contact:
    url: https://zulipchat.com
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: 'https://your.zulip.server/api/v1'

#######################
# Endpoint definitions
#######################
paths:
  /events:
    get:
      description: Receive new events from
        [a registered event queue](/api/register-queue).
      parameters:
      - name: queue_id
        in: query
        description: The ID of a queue that you registered via
          `POST /api/v1/register`
          (see [Register a queue](/api/register-queue)).
        schema:
          type: string
        example: 1375801870:2942
      - name: last_event_id
        in: query
        description: The highest event ID in this queue that you've received
          and wish to acknowledge. See the [code for `call_on_each_event`](https://github.com/zulip/python-zulip-api/blob/master/zulip/zulip/__init__.py)
          in the [zulip Python module](https://github.com/zulip/python-zulip-api)
          for an example implementation of correctly processing each event
          exactly once.
        schema:
          type: integer
        example: -1
      - name: dont_block
        in: query
        description: Set to `true` if the client is requesting a nonblocking
          reply. If not specified, the request will block until either a new
          event is available or a few minutes have passed, in which case the
          server will send the client a heartbeat event.
        schema:
          type: boolean
          default: false
        example: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    events:
                      type: array
                      description: An array of `event` objects (possibly
                        zero-length if `dont_block` is set) of events with
                        IDs newer than `last_event_id`. Event IDs are
                        guaranted to be increasing, but they are not
                        guaranteed to be consecutive.
                - example:
                    {
                        "events": [
                            {
                                "id": 0,
                                "message": {
                                    "avatar_url": "https://url/for/othello-bots/avatar",
                                    "client": "website",
                                    "content": "Something is rotten in the state of Denmark.",
                                    "content_type": "text/x-markdown",
                                    "display_recipient": "Denmark",
                                    "id": 12345678,
                                    "recipient_id": 12314,
                                    "sender_email": "<EMAIL>",
                                    "sender_full_name": "<NAME>",
                                    "sender_id": 13215,
                                    "sender_realm_str": "example",
                                    "sender_short_name": "othello-bot",
                                    "subject": "Castle",
                                    "subject_links": [],
                                    "timestamp": 1375978403,
                                    "type": "stream"
                                },
                                "type": "message"
                            },
                            {
                                "id": 1,
                                "message": {
                                    "avatar_url": "https://url/for/othello-bots/avatar",
                                    "client": "website",
                                    "content": "I come not, friends, to steal away your hearts.",
                                    "content_type": "text/x-markdown",
                                    "display_recipient": [
                                        {
                                            "email": "<EMAIL>",
                                            "full_name": "<NAME>",
                                            "id": 31572,
                                            "short_name": "hamlet"
                                        }
                                    ],
                                    "id": 12345679,
                                    "recipient_id": 18391,
                                    "sender_email": "<EMAIL>",
                                    "sender_full_name": "<NAME>",
                                    "sender_id": 13215,
                                    "sender_realm_str": "example",
                                    "sender_short_name": "othello-bot",
                                    "subject": "",
                                    "subject_links": [],
                                    "timestamp": 1375978404,
                                    "type": "private"
                                },
                                "type": "message"
                            }
                        ],
                        "msg": "",
                        "result": "success"
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadEventQueueIdError'
    delete:
      description: Delete a previously registered queue.
      parameters:
      - name: queue_id
        in: query
        description: The ID of a queue that you registered via
          `POST /api/v1/register`(see [Register a queue](/api/register-queue).
        schema:
          type: string
        example: 1375801870:2942
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonSuccess'
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadEventQueueIdError'
  /get_stream_id:
    get:
      description: Get the unique ID of a given stream.
      parameters:
      - name: stream
        in: query
        description: The name of the stream to retrieve the ID for.
        schema:
          type: string
        example: Denmark
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    stream_id:
                      type: integer
                      description: The ID of the given stream.
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "stream_id": 15
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "Invalid stream name 'nonexistent'",
                        "result": "error"
                    }
  /messages:
    post:
      description: Send a message.
      parameters:
      - name: type
        in: query
        description: The type of message to be sent. `private` for a private
          message and `stream` for a stream message.
        schema:
          type: string
          enum:
          - private
          - stream
        example: private
        required: true
      - name: to
        in: query
        description: The destination stream, or a CSV/JSON-encoded list
          containing the usernames (emails) of the recipients.
        schema:
          type: string
        example: <EMAIL>, <EMAIL>
        required: true
      - name: subject
        in: query
        description: The topic of the message. Only required if `type` is
          `stream`, ignored otherwise. Maximum length of 60 characters.
        schema:
          type: string
          default:
        example: Castle
      - name: content
        in: query
        description: The content of the message. Maximum message size of
          10000 bytes.
        schema:
          type: string
        example: Hello
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    id:
                      type: integer
                      description: The ID assigned to the message sent.
                - example:
                    {
                        "msg": "",
                        "id": 42,
                        "result": "success"
                    }
        '400_non_existing_stream':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - properties:
                    stream:
                      type: string
                      description: The name of the stream that could not be
                        found.
                - example:
                    {
                        "code": "STREAM_DOES_NOT_EXIST",
                        "msg": "Stream 'nonexistent_stream' does not exist",
                        "result": "error",
                        "stream": "nonexistent_stream"
                    }
        '400_non_existing_user':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "Invalid email '<EMAIL>'",
                        "result": "error"
                    }
  /messages/{message_id}:
    patch:
      description: Edit a message that has already been sent.
      parameters:
      - name: message_id
        in: path
        description: The ID of the message that you wish to edit/update.
        schema:
          type: integer
        example: 42
        required: true
      - name: subject
        in: query
        description: The topic of the message. Only required for stream
          messages. Maximum length of 60 characters.
        schema:
          type: string
          default:
        example: Castle
      - name: propagate_mode
        in: query
        description: "Which message(s) should be edited: just the one
          indicated in `message_id`, messages in the same topic that had been
          sent after this one, or all of them."
        schema:
          type: string
          enum:
          - change_one
          - change_later
          - change_all
          default: change_one
        example: change_all
      - name: content
        in: query
        description: The content of the message. Maximum message size of 10000
          bytes.
        schema:
          type: string
        example: Hello
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonSuccess'
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonError'
                - properties:
                    msg:
                      enum:
                      - Your organization has turned off message editing
                      - You don't have permission to edit this message
                      - The time limit for editing this message has past
                      - Nothing to change
                      - Topic can't be empty
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "You don't have permission to edit this message",
                        "result": "error"
                    }
  /messages/render:
    post:
      description: Render a message to HTML.
      parameters:
      - name: content
        in: query
        description: The content of the message.
        schema:
          type: string
        example: '**foo**'
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    rendered:
                      type: string
                      description: The rendered HTML.
                - example:
                    {
                        "msg": "",
                        "rendered": "<p><strong>foo</strong></p>",
                        "result": "success"
                    }
  /user_uploads:
    post:
      description: Upload a single file and get the corresponding URI.
      requestBody:
        content:
          multipart/form-data:
            schema:
              properties:
                filename:
                  type: string
                  format: binary
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    uri:
                      type: string
                      description: The URI of the uploaded file.
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "uri": "/user_uploads/1/4e/m2A3MSqFnWRLUf9SaPzQ0Up_/zulip.txt"
                    }
  /users:
    get:
      description: Retrieve all users in a realm.
      parameters:
      - name: client_gravatar
        in: query
        description: The `client_gravatar` field is set to `true` if clients
          can compute their own gravatars.
        schema:
          type: boolean
          default: false
        example: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    members:
                      type: array
                      description: A list of `member` objects, each containing
                        details of a user in the realm (like their email, name,
                        avatar, user type...).
                - example:
                    {
                        "members": [
                            {
                                "avatar_url": "https://secure.gravatar.com/avatar/818c212b9f8830dfef491b3f7da99a14?d=identicon&version=1",
                                "bot_type": null,
                                "email": "<EMAIL>",
                                "full_name": "aaron",
                                "is_active": true,
                                "is_admin": false,
                                "is_bot": false,
                                "user_id": 1
                            },
                            {
                                "avatar_url": "https://secure.gravatar.com/avatar/77c3871a68c8d70356156029fd0a4999?d=identicon&version=1",
                                "bot_type": null,
                                "email": "<EMAIL>",
                                "full_name": "<NAME>",
                                "is_active": true,
                                "is_admin": false,
                                "is_bot": false,
                                "user_id": 3
                            },
                            {
                                "avatar_url": "https://secure.gravatar.com/avatar/0cbf08f3a355995fa2ec542246e35123?d=identicon&version=1",
                                "bot_type": null,
                                "email": "<EMAIL>",
                                "full_name": "<NAME>",
                                "is_active": true,
                                "is_admin": false,
                                "is_bot": false,
                                "user_id": 24
                            }
                        ],
                        "msg": "",
                        "result": "success"
                    }
    post:
      description: Create a new user in a realm.
      parameters:
      - name: email
        in: query
        description: The email address of the new user.
        schema:
          type: string
        example: <EMAIL>
        required: true
      - name: password
        in: query
        description: The password of the new user.
        schema:
          type: string
        example: abdec@7982
        required: true
      - name: full_name
        in: query
        description: The full name of the new user.
        schema:
          type: string
        example: <NAME>
        required: true
      - name: short_name
        in: query
        description: The short name of the new user.
        schema:
          type: string
        example: jsmith
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonSuccess'
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonError'
                - example:
                    {
                        "msg": "Email '<EMAIL>' already in use",
                        "result": "error"
                    }
  /users/me/{stream_id}/topics:
    get:
      description: Get all the topics in a specific stream.
      parameters:
      - name: stream_id
        in: path
        description: The unique ID of the stream.
        schema:
          type: integer
        example: 42
        required: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    topics:
                      type: array
                      items:
                        type: object
                        properties:
                          max_id:
                            description:
                              The ID of the last message sent to the topic.
                            type: number
                          name:
                            description: The name of the topic.
                            type: string
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "topics": [
                            {
                                "max_id": 26,
                                "name": "Denmark3"
                            },
                            {
                                "max_id": 23,
                                "name": "Denmark1"
                            },
                            {
                                "max_id": 6,
                                "name": "Denmark2"
                            }
                        ]
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "Invalid stream id",
                        "result": "error"
                    }
  /users/me/subscriptions:
    post:
      description: Subscribe one or more users to one or more streams.
      parameters:
      - name: subscriptions
        in: query
        description: "A list of dictionaries, where each dictionary contains
          key/value pairs specifying a particular stream to subscribe to.
          **Note**: This argument is called `streams` and not `subscriptions`
          in our Python API."
        schema:
          type: array
        example: [{"name": "Verona"}]
        required: true
      - name: invite_only
        in: query
        description: A boolean specifying whether the streams specified in
          `subscriptions` are invite-only or not.
        schema:
          type: boolean
          default: false
        example: true
      - name: announce
        in: query
        description: If `announce` is `True` and one of the streams specified
          in `subscriptions` has to be created (i.e. doesn't exist to begin
          with), an announcement will be made notifying that a new stream was
          created.
        schema:
          type: boolean
        example: true
      - name: principals
        in: query
        description: A list of email addresses of the users that will be
          subscribed to the streams specified in the `subscriptions` argument.
          If not provided, then the requesting user/bot is subscribed.
        schema:
          type: array
          default: []
        example: ['<EMAIL>']
      - name: authorization_errors_fatal
        in: query
        description: A boolean specifying whether authorization errors (such
          as when the requesting user is not authorized to access a private
          stream) should be considered fatal or not. When `True`, an
          authorization error is reported as such. When set to `False`, the
          returned JSON payload indicates that there was an authorization
          error, but the response is still considered a successful one.
        schema:
          type: boolean
          default: true
        example: false
      security:
      - basicAuth: []
      responses:
        '200_without_principals':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "already_subscribed": {},
                        "msg": "",
                        "result": "success",
                        "subscribed": {
                            "<EMAIL>": [
                                "new stream"
                            ]
                        }
                    }
        '200_already_subscribed':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "already_subscribed": {
                            "<EMAIL>": [
                                "new stream"
                            ]
                        },
                        "msg": "",
                        "result": "success",
                        "subscribed": {}
                    }
        '400_unauthorized_errors_fatal_true':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "msg": "Unable to access stream (private_stream).",
                        "result": "error"
                    }
        '400_unauthorized_errors_fatal_false':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/AddSubscriptionsResponse'
                - example:
                    {
                        "already_subscribed": {},
                        "msg": "",
                        "result": "success",
                        "subscribed": {},
                        "unauthorized": [
                            "private_stream"
                        ]
                    }
    delete:
      description: Unsubscribe yourself or other users from one or more
        streams.
      parameters:
      - name: subscriptions
        in: query
        description: A list of stream names to unsubscribe from. This argument
          is called `streams` in our Python API.
        schema:
          type: array
          items:
            type: string
        example: ['Verona', 'Denmark']
        required: true
      - name: principals
        in: query
        description: A list of email addresses of the users that will be
          unsubscribed from the streams specified in the `subscriptions`
          argument. If not provided, then the requesting user/bot is
          unsubscribed.
        schema:
          type: array
          items:
            type: string
          default:
        example: ['<EMAIL>']
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    not_subscribed:
                      type: array
                      items:
                        type: string
                      description: A list of the names of streams that the
                        user is already unsubscribed from, and hence doesn't
                        need to be unsubscribed.
                    removed:
                      type: array
                      items:
                        type: string
                      description: A list of the names of streams which were
                        unsubscribed from as a result of the query.
                - example:
                    {
                        "msg": "",
                        "not_subscribed": [],
                        "removed": [
                            "new stream"
                        ],
                        "result": "success"
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - properties:
                    stream:
                      type: string
                      description: The name of the stream that could not be
                        found.
                - example:
                    {
                        "code": "STREAM_DOES_NOT_EXIST",
                        "msg": "Stream 'nonexistent_stream' does not exist",
                        "result": "error",
                        "stream": "nonexistent_stream"
                    }
  /register:
    post:
      description: This powerful endpoint can be used to register a Zulip
        "event queue" (subscribed to certain types of "events", or updates to
        the messages and other Zulip data the current user has access to), as
        well as to fetch the current state of that data.
      parameters:
      - name: apply_markdown
        in: query
        description: Set to `true` if you would like the content to be
          rendered in HTML format (by default, the API returns the raw text
          that the user entered)
        schema:
          type: boolean
          default: false
        example: true
      - name: client_gravatar
        in: query
        description: The `client_gravatar` field is set to `true` if clients
          can compute their own gravatars.
        schema:
          type: boolean
          default: false
        example: true
      - name: event_types
        in: query
        description: "A JSON-encoded array indicating which types of events
          you're interested in. Values that you might find useful include:
          <br/> <br/>
          * **message** (messages), <br/>
          * **subscription** (changes in your subscriptions), <br/>
          * **realm_user** (changes in the list of users in your realm)
          <br/> <br/>
          If you do not specify this argument, you will receive all events,
          and have to filter out the events not relevant to your client in
          your client code. For most applications, one is only interested in
          messages, so one specifies: `event_types=['message']`"
        schema:
          type: string
        example: event_types=['message']
      - name: all_public_streams
        in: query
        description: Set to `True` if you would like to receive events that
          occur within all public streams.
        schema:
          type: boolean
          default: false
        example: true
      - name: include_subscribers
        in: query
        description: Set to `True` if you would like to receive events that
          include the subscribers for each stream.
        schema:
          type: boolean
          default: false
        example: true
      - name: fetch_event_types
        in: query
        description: Same as the `event_types` argument except that the values
          in `fetch_event_types` are used to fetch initial data. If
          `fetch_event_types` is not provided, `event_types` is used and if
          `event_types` is not provided, this argument defaults to `None`.
        schema:
          type: string
        example: event_types=['message']
      - name: narrow
        in: query
        description: A JSON-encoded array of length 2 indicating the narrow
          for which you'd like to receive events for. For instance, to
          receive events for the stream `Denmark`, you would specify
          `narrow=['stream', 'Denmark']`. Another example is
          `narrow=['is', 'private']` for private messages.
        schema:
          type: string
          default: narrow=[]
        example: narrow=['stream', 'Denmark']
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    queue_id:
                      type: string
                      description: The ID of the queue that has been allocated
                        for your client.
                    last_event_id:
                      type: integer
                      description: The initial value of `last_event_id` to
                        pass to `GET /api/v1/events`.
                - example:
                    {
                        "last_event_id": -1,
                        "msg": "",
                        "queue_id": "1517975029:0",
                        "realm_emoji": {
                            "1": {
                                "author": {
                                    "email": "<EMAIL>",
                                    "full_name": "Iago",
                                    "id": 5
                                },
                                "deactivated": false,
                                "id": "1",
                                "name": "green_tick",
                                "source_url": "/user_avatars/1/emoji/images/1.png"
                            }
                        },
                        "result": "success"
                    }
  /streams:
    get:
      description: Get all streams that the user has access to.
      parameters:
      - name: include_public
        in: query
        description: Include all public streams.
        schema:
          type: boolean
          default: true
        example: false
      - name: include_subscribed
        in: query
        description: Include all streams that the user is subscribed to.
        schema:
          type: boolean
          default: true
        example: false
      - name: include_all_active
        in: query
        description: Include all active streams. The user must have
          administrative privileges to use this parameter.
        schema:
          type: boolean
          default: false
        example: true
      - name: include_default
        in: query
        description: Include all default streams for the user's realm.
        schema:
          type: boolean
          default: false
        example: true
      security:
      - basicAuth: []
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/JsonSuccess'
                - properties:
                    streams:
                      type: array
                      items:
                        type: object
                      description: A list of `stream` objects, which contain a
                        `description`, a `name`, their `stream_id` and whether
                        they are `invite_only` or not.
                - example:
                    {
                        "msg": "",
                        "result": "success",
                        "streams": [
                            {
                                "description": "A Scandinavian country",
                                "invite_only": false,
                                "name": "Denmark",
                                "stream_id": 1
                            },
                            {
                                "description": "Yet another Italian city",
                                "invite_only": false,
                                "name": "Rome",
                                "stream_id": 2
                            },
                            {
                                "description": "Located in the United Kingdom",
                                "invite_only": false,
                                "name": "Scotland",
                                "stream_id": 3
                            },
                            {
                                "description": "A northeastern Italian city",
                                "invite_only": false,
                                "name": "Venice",
                                "stream_id": 4
                            },
                            {
                                "description": "A city in Italy",
                                "invite_only": false,
                                "name": "Verona",
                                "stream_id": 5
                            },
                            {
                                "description": "New stream for testing",
                                "invite_only": false,
                                "name": "new stream",
                                "stream_id": 6
                            }
                        ]
                    }
        '400':
          description: Bad request.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/CodedError'
                - example:
                    {
                        "code": "BAD_REQUEST",
                        "msg": "User not authorized for this query",
                        "result": "error"
                    }

components:
  #######################
  # Security definitions
  #######################
  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.

  schemas:
    JsonResponse:
      type: object
      properties:
        result:
          type: string
    JsonSuccess:
      allOf:
      - $ref: '#/components/schemas/JsonResponse'
      - required:
        - result
        - msg
      - properties:
          result:
            enum:
            - success
          msg:
            type: string
      - example:
          {
            "msg": "",
            "result": "success"
          }
    JsonError:
      allOf:
      - $ref: '#/components/schemas/JsonResponse'
      - required:
        - result
        - msg
      - properties:
          result:
            enum:
            - error
          msg:
            type: string
    CodedError:
      allOf:
      - $ref: '#/components/schemas/JsonError'
      - properties:
          code:
            type: string
            description: A string that identifies the error.
    BadEventQueueIdError:
      allOf:
      - $ref: '#/components/schemas/CodedError'
      - properties:
          queue_id:
            type: string
            description: The string that identifies the invalid event queue.
      - example:
          {
              "code": "BAD_EVENT_QUEUE_ID",
              "msg": "Bad event queue id: 1518820930:1",
              "queue_id": "1518820930:1",
              "result": "error"
          }
    AddSubscriptionsResponse:
      allOf:
      - $ref: '#/components/schemas/JsonSuccess'
      - properties:
          subscribed:
            type: object
            description: A dictionary where the key is the email address of
              the user/bot and the value is a list of the names of the streams
              that were subscribed to as a result of the query.
          already_subscribed:
            type: object
            description: A dictionary where the key is the email address of
              the user/bot and the value is a list of the names of the streams
              that the user/bot is already subscribed to.
          unauthorized:
            type: array
            items:
              type: string
            description: A list of names of streams that the requesting
              user/bot was not authorized to subscribe to.

  ###################
  # Shared responses
  ###################
  responses:
    SimpleSuccess:
      description: Success.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/JsonSuccess'
{'fraction_non_alphanumeric': 0.07817772078140368, 'fraction_numerical': 0.008590958327626779, 'mean_word_length': 0.9843363968771618, 'pattern_counts': {'":': 374, '<': 68, '<?xml version=': 0, '>': 68, 'https://': 22, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 94, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5903299', 'n_tokens_mistral': 18896, 'n_tokens_neox': 17510, 'n_words': 5491}