Skip to content

Zulip configuration

Credentials

FieldTypeDescription
server_urlstringOrganization root URL, such as https://example.zulipchat.com
emailstringBot API email
api_keystringBot API key; rendered as a sensitive field in the Web UI

Do not append /api/v1 to server_url. The old serverUrl, apiKey, and websocket fields were removed: Zulip's real-time protocol is the long-polling Event Queue API, not WebSocket.

yaml
zulip.team-bot:
  server_url: https://example.zulipchat.com
  email: onebots-bot@example.zulipchat.com
  api_key: your-api-key
  default_topic: general
  receive_mode: event_queue
  event_queue:
    event_types:
      - message
      - update_message
      - delete_message
      - reaction
      - subscription
      - realm_user
    all_public_streams: false
    retry_initial_delay_ms: 1000
    retry_max_delay_ms: 30000
  onebot.v11:
    access_token: your-token

The Web form can add and remove event types directly. receive_mode is either event_queue (default) or manual; the removed event_queue.enabled field is not accepted. Reconnection is always unlimited; the delay grows exponentially from retry_initial_delay_ms up to retry_max_delay_ms.

Manual mode does not register or poll a queue. Existing consumers call await client.ingest(rawEvent); deduplication is committed only after raw, typed, canonical, and protocol delivery succeeds.

Identity verification, Event Queue registration, and subsequent protocol outlets share the account startup boundary. When the global timeout expires or a hot reload is cancelled, the adapter aborts registration and long polling and deletes both established queues and queues returned late by a server that ignored cancellation. An obsolete startup task cannot mark the account ready again.

Optional HTTP(S) and SOCKS proxy settings are available under proxy.url, proxy.username, and proxy.password. Missing proxy support fails startup explicitly instead of silently using a direct connection.

See Zulip platform support for scene IDs and native actions.