Reference · Tools
Zulip
Send messages, upload files, manage streams, and administer users on Zulip team chat.
The Zulip node sends messages, uploads files, manages streams and administers users on Zulip. A typical build is broadcasting a release note to several streams with the changelog attached as a file.
- Node type
- Action (binary)
- Parameters
- 35
- Outputs
- Output, Error
- Credentials
- Zulip API
Zulip
Send messages, upload files, manage streams, and administer users on Zulip
Overview
The Zulip tool integrates with the Zulip team chat API (v1) to manage messages (send private, send to stream, get, update, delete, upload file), streams (create, get all, get subscribed, update, delete), and users (create, get, get all, update, deactivate). File uploads use multipart form data via the /user_uploads endpoint. All other requests use application/x-www-form-urlencoded encoding. Authentication is HTTP Basic (email + API key). Supports self-hosted and Zulip Cloud instances.
Category: Communication
Tool Name: zulip
Version: 1
Appearance: Icon: lucide-MessageCircle | Color: #6492FE
Node Type
Action (Binary) — handles file/binary data operations
Input / Output
| Direction | Port(s) |
|---|---|
| Input | Input |
| Output | Output, Error |
Credentials
This tool requires Zulip API credentials. See the Credentials Guide for setup instructions.
Resources
| Resource | Value |
|---|---|
| Message | message |
| Stream | stream |
| User | user |
Operations
| Operation | Value | Description |
|---|---|---|
| Delete | delete | Delete a message |
| Get | get | Get a message |
| Send Private | sendPrivate | Send a private message |
| Send to Stream | sendStream | Send a message to a stream |
| Update | update | Update a message |
| Upload a File | uploadFile | Upload a file to Zulip |
| Create | create | Create a stream |
| Get All | getAll | Get all streams |
| Get Subscribed | getSubscribed | Get subscribed streams |
| Deactivate | deactivate | Deactivate a user |
sendPrivate, sendStream and uploadFile are Message-only; getSubscribed is Stream-only; deactivate is User-only. create, get, getAll, update and delete are offered on whichever resources support them — Stream also has create, update, delete and getAll; User also has create, get, getAll and update.
Parameters
Message: Send Private
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| To (Emails) | string | Yes | — | Comma-separated list of recipient email addresses for the private message. Supports expressions. |
| Content | string | Yes | — | The content of the message. Supports Zulip Markdown and expressions like {{ $json.body }}. |
Message: Send to Stream
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Stream (ID or Name) | string | Yes | — | The stream ID or name to send the message to. Use GET /streams to list available streams. Supports expressions. |
| Topic | string | Yes | — | The topic within the stream for this message. Supports expressions. |
| Content | string | Yes | — | The content of the message. Supports Zulip Markdown and expressions. |
Message: Get
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Message ID | string | Yes | — | The unique identifier of the message to retrieve. Supports expressions. |
Message: Update
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Message ID | string | Yes | — | The unique identifier of the message to update. Supports expressions. |
| Update Fields | collection | No | {} | What to change on the message. |
| — Content | string | No | — | New content for the message. |
| — Propagate Mode | options | No | changeOne | Which messages to edit when changing topic: just the one, messages sent after, or all. |
Options: changeOne, changeLater, changeAll | ||||
| — Topic | string | No | — | New topic for the message. |
Message: Delete
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Message ID | string | Yes | — | The unique identifier of the message to delete. Supports expressions. |
Message: Upload a File
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Binary Property | string | Yes | data | Name of the binary property containing the file data to upload. Names are case-sensitive — see the upstream node’s Binary Data panel for the exact names to use. |
Stream: Create
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| JSON Parameters | boolean | No | false | Whether to provide additional fields as raw JSON. |
| Additional Fields (JSON) | json | No | — | JSON object with additional parameters for stream creation (e.g., invite_only, principals, announce). (shown when JSON Parameters is true) |
| Subscriptions | fixedCollection | Yes | {} | List of streams to create/subscribe to. Each requires a name and description. (shown when JSON Parameters is false) |
| — Name | string | Yes | — | Stream name. |
| — Description | string | Yes | — | Stream description. |
| Additional Fields | collection | No | {} | Optional stream settings. (shown when JSON Parameters is false) |
| — Announce | boolean | No | false | Whether to announce new stream creation. |
| — Authorization Errors Fatal | boolean | No | false | Whether authorization errors should be considered fatal. |
| — History Public to Subscribers | boolean | No | false | Whether message history is visible to new subscribers. |
| — Invite Only | boolean | No | false | Whether the stream is private/invite-only. |
| — Principals (Emails) | string | No | — | Comma-separated email addresses of users to subscribe. Leave empty for the authenticated user. |
| — Stream Post Policy | options | No | 1 | Policy for which users can post messages. |
Options: 1 (any user), 2 (administrators only), 3 (new members only) |
Stream: Get All
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Additional Fields | collection | No | {} | Which categories of stream to include. |
| — Include All Active | boolean | No | true | Include all active streams (admin only). |
| — Include Default | boolean | No | true | Include default streams. |
| — Include Owner Subscribed | boolean | No | true | Include streams the bot owner is subscribed to. |
| — Include Public | boolean | No | true | Include public streams. |
| — Include Subscribed | boolean | No | true | Include streams the user is subscribed to. |
Stream: Get Subscribed
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Additional Fields | collection | No | {} | Extra detail to request. |
| — Include Subscribers | boolean | No | true | Include subscriber user IDs in response. |
Stream: Update
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Stream ID | string | Yes | — | The ID of the stream to update. Supports expressions. |
| JSON Parameters | boolean | No | false | Whether to provide additional fields as raw JSON. |
| Additional Fields (JSON) | json | No | — | JSON object with update fields for the stream. (shown when JSON Parameters is true) |
| Additional Fields | collection | No | {} | Settings to change on the stream. (shown when JSON Parameters is false) |
| — Announcement Only | boolean | No | false | Whether the stream is limited to announcements. |
| — Description | string | No | — | New description for the stream. |
| — History Public to Subscribers | boolean | No | false | Whether message history is visible to new subscribers. |
| — Is Private | boolean | No | false | Whether the stream is private. |
| — New Name | string | No | — | New name for the stream. |
| — Stream Post Policy | options | No | 1 | Policy for which users can post messages. |
Options: 1 (any user), 2 (administrators only), 3 (new members only) |
Stream: Delete
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Stream ID | string | Yes | — | The ID of the stream to delete. Supports expressions. |
User: Create
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
string | Yes | — | Email address for the new user. Supports expressions. | |
| Full Name | string | Yes | — | Full name of the new user. Supports expressions. |
| Password | string | Yes | — | Password for the new user. |
| Short Name | string | Yes | — | Short name for the new user (not user-visible). |
User: Get
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| User ID | string | Yes | — | The ID of the user to retrieve. Supports expressions. |
| Additional Fields | collection | No | {} | Extra detail to request. |
| — Client Gravatar | boolean | No | false | Whether the client supports computing gravatar URLs. |
| — Custom Profile Fields | boolean | No | false | Whether to include custom profile field data in the response. |
User: Get All
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Additional Fields | collection | No | {} | Extra detail to request. |
| — Client Gravatar | boolean | No | false | Whether the client supports computing gravatar URLs. |
| — Custom Profile Fields | boolean | No | false | Whether to include custom profile field data in the response. |
User: Update
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| User ID | string | Yes | — | The ID of the user to update. Supports expressions. |
| Additional Fields | collection | No | {} | What to change on the user. |
| — Full Name | string | No | — | New full name for the user. |
| — Is Admin | boolean | No | false | Whether the user is an administrator. |
| — Is Guest | boolean | No | false | Whether the user is a guest. |
| — Profile Data (JSON) | json | No | [] | JSON array of { “id”: |
| — Role | options | No | 400 | Role for the user. |
Options: 100 (organization owner), 200 (organization administrator), 300 (organization moderator), 400 (member), 600 (guest) |
User: Deactivate
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| User ID | string | Yes | — | The ID of the user to deactivate. Supports expressions. |
All Operations
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Max Concurrency | number | No | 10 | Maximum number of items to process concurrently. |
Output Data
The Zulip response is merged onto the top level of the item JSON; anything already on the item passes through, and binary data is forwarded unchanged. Every Zulip reply carries result and, when something went wrong, msg — the node treats result: "error" as a failure and raises msg as the error message, so a successful item always reads result: "success".
- One output item per input item for
sendPrivate,sendStream,get,update,delete,uploadFile,createanddeactivate. - Three operations fan out, emitting one output item per record:
stream→getAll(one item per stream),stream→getSubscribed(one item per subscription) anduser→getAll(one item per member). uploadFileputs the uploaded file’surion the item, rewritten to an absolute URL against your Zulip host so you can paste it straight into a following message’s Content.
Usage Examples
- Send a private message to a Zulip user
- Send a message to a Zulip stream topic
- Upload a file to Zulip and get its URI
- Create a new Zulip stream
- Get all users on a Zulip server
- Update a Zulip stream description
Example Configuration
Send a private message to two people:
{
"type": "zulip",
"parameters": {
"resource": "message",
"operation": "sendPrivate",
"to": "user@example.com,another@example.com",
"content": "Hello from the workflow!"
}
}
Post to a stream topic:
{
"type": "zulip",
"parameters": {
"resource": "message",
"operation": "sendStream",
"stream": "general",
"topic": "Workflow Updates",
"content": "Automated message from workflow"
}
}
Edit a message:
{
"type": "zulip",
"parameters": {
"resource": "message",
"operation": "update",
"messageId": "12345",
"updateFields": {
"content": "Updated message content",
"topic": "New Topic Name",
"propagateMode": "changeAll"
}
}
}
Create a stream from structured fields:
{
"type": "zulip",
"parameters": {
"resource": "stream",
"operation": "create",
"jsonParameters": false,
"subscriptions": {
"properties": [
{
"name": "workflow-notifications",
"description": "Automated workflow notifications"
}
]
},
"additionalFields": {
"inviteOnly": false,
"announce": true
}
}
}
Create a stream from raw JSON instead:
{
"type": "zulip",
"parameters": {
"resource": "stream",
"operation": "create",
"jsonParameters": true,
"additionalFieldsJson": "{\"subscriptions\":[{\"name\":\"workflow-alerts\",\"description\":\"Critical workflow alerts\"}],\"invite_only\":true,\"principals\":[\"admin@example.com\"]}"
}
}
List streams, one output item per stream:
{
"type": "zulip",
"parameters": {
"resource": "stream",
"operation": "getAll",
"additionalFields": {
"includeAllActive": true,
"includePublic": true,
"includeSubscribed": false
}
}
}
Update a stream:
{
"type": "zulip",
"parameters": {
"resource": "stream",
"operation": "update",
"streamId": "123",
"jsonParameters": false,
"additionalFields": {
"description": "Updated stream description",
"isPrivate": false,
"streamPostPolicy": 1
}
}
}
Create a user:
{
"type": "zulip",
"parameters": {
"resource": "user",
"operation": "create",
"email": "newuser@example.com",
"fullName": "New User",
"password": "securepassword123",
"shortName": "newuser"
}
}
Promote a user to organization administrator:
{
"type": "zulip",
"parameters": {
"resource": "user",
"operation": "update",
"userId": "456",
"additionalFields": {
"fullName": "Updated Full Name",
"isAdmin": true,
"role": 200
}
}
}
Read a user with their custom profile fields:
{
"type": "zulip",
"parameters": {
"resource": "user",
"operation": "get",
"userId": "789",
"additionalFields": {
"clientGravatar": false,
"includeCustomProfileFields": true
}
}
}
Upload a file and post the link in the same workflow — first the upload:
{
"type": "zulip",
"parameters": {
"resource": "message",
"operation": "uploadFile",
"binaryPropertyName": "data"
}
}
then the message, referencing the returned URI:
{
"type": "zulip",
"parameters": {
"resource": "message",
"operation": "sendStream",
"stream": "general",
"topic": "Reports",
"content": "Latest report: {{ $json.uri }}"
}
}
Error Handling
| Mode | Behavior |
|---|---|
| stop | Halts workflow on first error |
| continue | Skips failed items, passes successful ones through |
| errorPort | Routes failed items to Error output port |
Tips
Send messages, upload files, manage streams, and administer users on the Zulip team chat platform.
Common Patterns
Message broadcasting — get all streams to identify targets, send stream messages to each, and upload files first when an attachment is needed.
Stream management — create streams for new projects, update stream settings as they change, and use Get Subscribed to audit membership.
User administration — create users for new team members, update roles as permissions change, and use Get All to audit the roster.
Parameter Dependency Chain
resourcedetermines availableoperationvaluesoperationdetermines which additional parameters are shownjsonParameters(for streams) toggles between structured fields and raw JSON- Collection-type
additionalFieldshave different structures per operation context
Frequently asked questions
What does a broadcast pattern look like?
Get all streams to identify the targets, send a stream message to each, and upload the file first when an attachment is needed so the message can reference it.
Can it manage streams as well as post to them?
Yes — create streams for new projects, update their settings as they change, and use Get Subscribed to audit who is in them.
Can it upload files?
Yes, file upload is supported, so attachments generated upstream can be sent with a message.
Which credential does it need?
A Zulip API credential.
Build with the Zulip node
Drop it into a workflow, wire it to an agent, or call it on a schedule. You'll need Zulip API credentials first.
Open BusyBotLast updated . Spotted something wrong? Tell us.