Reference · Tools

Zulip

Send messages, upload files, manage streams, and administer users on Zulip team chat.

Action (binary) Communication v1 Binary data

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

DirectionPort(s)
InputInput
OutputOutput, Error

Credentials

This tool requires Zulip API credentials. See the Credentials Guide for setup instructions.

Resources

ResourceValue
Messagemessage
Streamstream
Useruser

Operations

OperationValueDescription
DeletedeleteDelete a message
GetgetGet a message
Send PrivatesendPrivateSend a private message
Send to StreamsendStreamSend a message to a stream
UpdateupdateUpdate a message
Upload a FileuploadFileUpload a file to Zulip
CreatecreateCreate a stream
Get AllgetAllGet all streams
Get SubscribedgetSubscribedGet subscribed streams
DeactivatedeactivateDeactivate 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

ParameterTypeRequiredDefaultDescription
To (Emails)stringYesComma-separated list of recipient email addresses for the private message. Supports expressions.
ContentstringYesThe content of the message. Supports Zulip Markdown and expressions like {{ $json.body }}.

Message: Send to Stream

ParameterTypeRequiredDefaultDescription
Stream (ID or Name)stringYesThe stream ID or name to send the message to. Use GET /streams to list available streams. Supports expressions.
TopicstringYesThe topic within the stream for this message. Supports expressions.
ContentstringYesThe content of the message. Supports Zulip Markdown and expressions.

Message: Get

ParameterTypeRequiredDefaultDescription
Message IDstringYesThe unique identifier of the message to retrieve. Supports expressions.

Message: Update

ParameterTypeRequiredDefaultDescription
Message IDstringYesThe unique identifier of the message to update. Supports expressions.
Update FieldscollectionNo{}What to change on the message.
— ContentstringNoNew content for the message.
— Propagate ModeoptionsNochangeOneWhich messages to edit when changing topic: just the one, messages sent after, or all.
Options: changeOne, changeLater, changeAll
— TopicstringNoNew topic for the message.

Message: Delete

ParameterTypeRequiredDefaultDescription
Message IDstringYesThe unique identifier of the message to delete. Supports expressions.

Message: Upload a File

ParameterTypeRequiredDefaultDescription
Binary PropertystringYesdataName 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

ParameterTypeRequiredDefaultDescription
JSON ParametersbooleanNofalseWhether to provide additional fields as raw JSON.
Additional Fields (JSON)jsonNoJSON object with additional parameters for stream creation (e.g., invite_only, principals, announce). (shown when JSON Parameters is true)
SubscriptionsfixedCollectionYes{}List of streams to create/subscribe to. Each requires a name and description. (shown when JSON Parameters is false)
— NamestringYesStream name.
— DescriptionstringYesStream description.
Additional FieldscollectionNo{}Optional stream settings. (shown when JSON Parameters is false)
— AnnouncebooleanNofalseWhether to announce new stream creation.
— Authorization Errors FatalbooleanNofalseWhether authorization errors should be considered fatal.
— History Public to SubscribersbooleanNofalseWhether message history is visible to new subscribers.
— Invite OnlybooleanNofalseWhether the stream is private/invite-only.
— Principals (Emails)stringNoComma-separated email addresses of users to subscribe. Leave empty for the authenticated user.
— Stream Post PolicyoptionsNo1Policy for which users can post messages.
Options: 1 (any user), 2 (administrators only), 3 (new members only)

Stream: Get All

ParameterTypeRequiredDefaultDescription
Additional FieldscollectionNo{}Which categories of stream to include.
— Include All ActivebooleanNotrueInclude all active streams (admin only).
— Include DefaultbooleanNotrueInclude default streams.
— Include Owner SubscribedbooleanNotrueInclude streams the bot owner is subscribed to.
— Include PublicbooleanNotrueInclude public streams.
— Include SubscribedbooleanNotrueInclude streams the user is subscribed to.

Stream: Get Subscribed

ParameterTypeRequiredDefaultDescription
Additional FieldscollectionNo{}Extra detail to request.
— Include SubscribersbooleanNotrueInclude subscriber user IDs in response.

Stream: Update

ParameterTypeRequiredDefaultDescription
Stream IDstringYesThe ID of the stream to update. Supports expressions.
JSON ParametersbooleanNofalseWhether to provide additional fields as raw JSON.
Additional Fields (JSON)jsonNoJSON object with update fields for the stream. (shown when JSON Parameters is true)
Additional FieldscollectionNo{}Settings to change on the stream. (shown when JSON Parameters is false)
— Announcement OnlybooleanNofalseWhether the stream is limited to announcements.
— DescriptionstringNoNew description for the stream.
— History Public to SubscribersbooleanNofalseWhether message history is visible to new subscribers.
— Is PrivatebooleanNofalseWhether the stream is private.
— New NamestringNoNew name for the stream.
— Stream Post PolicyoptionsNo1Policy for which users can post messages.
Options: 1 (any user), 2 (administrators only), 3 (new members only)

Stream: Delete

ParameterTypeRequiredDefaultDescription
Stream IDstringYesThe ID of the stream to delete. Supports expressions.

User: Create

ParameterTypeRequiredDefaultDescription
EmailstringYesEmail address for the new user. Supports expressions.
Full NamestringYesFull name of the new user. Supports expressions.
PasswordstringYesPassword for the new user.
Short NamestringYesShort name for the new user (not user-visible).

User: Get

ParameterTypeRequiredDefaultDescription
User IDstringYesThe ID of the user to retrieve. Supports expressions.
Additional FieldscollectionNo{}Extra detail to request.
— Client GravatarbooleanNofalseWhether the client supports computing gravatar URLs.
— Custom Profile FieldsbooleanNofalseWhether to include custom profile field data in the response.

User: Get All

ParameterTypeRequiredDefaultDescription
Additional FieldscollectionNo{}Extra detail to request.
— Client GravatarbooleanNofalseWhether the client supports computing gravatar URLs.
— Custom Profile FieldsbooleanNofalseWhether to include custom profile field data in the response.

User: Update

ParameterTypeRequiredDefaultDescription
User IDstringYesThe ID of the user to update. Supports expressions.
Additional FieldscollectionNo{}What to change on the user.
— Full NamestringNoNew full name for the user.
— Is AdminbooleanNofalseWhether the user is an administrator.
— Is GuestbooleanNofalseWhether the user is a guest.
— Profile Data (JSON)jsonNo[]JSON array of { “id”: , “value”: } objects for custom profile fields.
— RoleoptionsNo400Role for the user.
Options: 100 (organization owner), 200 (organization administrator), 300 (organization moderator), 400 (member), 600 (guest)

User: Deactivate

ParameterTypeRequiredDefaultDescription
User IDstringYesThe ID of the user to deactivate. Supports expressions.

All Operations

ParameterTypeRequiredDefaultDescription
Max ConcurrencynumberNo10Maximum 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, create and deactivate.
  • Three operations fan out, emitting one output item per record: streamgetAll (one item per stream), streamgetSubscribed (one item per subscription) and usergetAll (one item per member).
  • uploadFile puts the uploaded file’s uri on 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

ModeBehavior
stopHalts workflow on first error
continueSkips failed items, passes successful ones through
errorPortRoutes 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

  • resource determines available operation values
  • operation determines which additional parameters are shown
  • jsonParameters (for streams) toggles between structured fields and raw JSON
  • Collection-type additionalFields have 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 BusyBot

Last updated . Spotted something wrong? Tell us.