> ## Documentation Index
> Fetch the complete documentation index at: https://help.dsalta.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Zulip

> Team chat — users & access

<Tabs>
  <Tab title="Overview">
    Connect Zulip with a bot's email and API key to sync organization users and channels, and run access reviews. Read-only.

    <Info>
      **Read-only access.** DSALTA only reads data from this integration. It never creates, modifies, or deletes anything in your environment, and every remediation step is performed by your team directly in the third-party product.
    </Info>

    <Note>
      DSALTA collects this integration's data when you connect it — you can refresh it at any time with **Sync from integrations** on the **Integrations** page. The compliance checks below re-run once a day at 02:00 America/New\_York.
    </Note>

    ## What DSALTA reads

    DSALTA reads the Zulip user roster — full names, email addresses, organization role (Owner, Administrator, Moderator or Member) and active status — which appears on your **Access** page; and your Zulip channels, which appear on your **Inventory** page. Bot accounts and guest users are left out of the Access page, archived channels are left out of Inventory, and each channel is recorded as Public or Private. Zulip's user record carries no join date, so every Access row is stamped with the date of the sync rather than a real one.

    It calls these Zulip endpoints:

    * `/api/v1/users/me`
    * `/api/v1/users`
    * `/api/v1/streams`

    Every request is a read. DSALTA has no code path that creates, modifies, or deletes anything in your Zulip environment.

    ## Troubleshooting

    <AccordionGroup>
      <Accordion title="The connection fails to validate">
        Invalid organization URL, bot email, or API key.
      </Accordion>
    </AccordionGroup>

    <AccordionGroup>
      <Accordion title="How do I check whether the connection is healthy?">
        Open **Integrations** in the DSALTA sidebar, stay on the **Connected** tab, and click **Manage** on the integration's card. Open the **Status** tab: it shows either **Connected and working properly** or **Connection issues detected**.

        Use the **Status** tab, not **Overview** — Overview always reports **Connected** regardless of the real state.
      </Accordion>

      <Accordion title="A check shows Failed and nothing changed on my side">
        On an integration-powered check, **Failed** normally means DSALTA was blocked rather than that you are non-compliant. Open the test, go to **Source Data**, and read the result code: **403** is a missing permission, **428** is a setting DSALTA still needs, **500** is a failure on DSALTA's side.

        A real compliance gap shows **207** and leaves the test looking **Completed**. See [Understanding Test Results](/guides/data-library/test-results).
      </Accordion>

      <Accordion title="Data looks out of date">
        Compliance checks re-run once a day at 02:00 America/New\_York. To refresh sooner, open **Integrations → Connected** and click **Sync from integrations** at the top right — it refreshes every connected integration at once.
      </Accordion>

      <Accordion title="How do I repair a broken connection?">
        There is no Reconnect, Repair or Refresh Token button. The only repair available is to disconnect and connect again.

        <Warning>
          **Disconnecting is destructive and cannot be undone.** DSALTA removes the access records, inventory, vulnerabilities, code changes, incidents and device records collected from this integration, and deletes the test results tied to the connection. Export anything you still need as audit evidence first — see [Integration errors](/troubleshooting/integration-errors).
        </Warning>
      </Accordion>

      <Accordion title="Configure scope will not let me change anything">
        That is expected. **Configure scope** is read-only — it shows what DSALTA is permitted to read, and has no Save action. To change what DSALTA can see, change the permissions on the credential in the third-party product, then disconnect and connect again.
      </Accordion>
    </AccordionGroup>
  </Tab>

  <Tab title="How to connect">
    A Zulip bot's email and API key (HTTP Basic auth). Read-only.

    **Before you begin**

    * A Zulip organization (free plan works)
    * A generic bot account (Personal settings → Bots → Add a new bot)

    You will need:

    | Field                | Where to find it                       | Example                             |
    | -------------------- | -------------------------------------- | ----------------------------------- |
    | **Organization URL** | See the steps below                    | `your-org.zulipchat.com`            |
    | **Bot Email**        | See the steps below                    | `dsalta-bot@your-org.zulipchat.com` |
    | **API Key**          | [Open](https://zulip.com/api/api-keys) | `Bot's API key`                     |

    <Steps>
      <Step title="Start in DSALTA">
        Open **Integrations** in the DSALTA sidebar, find **Zulip**, and click **Connect** to open the connect panel. Leave it open — it lists every value you need, and you create those in the steps below.
      </Step>

      <Step title="Create a generic bot">
        In Zulip, open Personal settings → Bots, click Add a new bot, choose Generic bot, give it a name (e.g. DSALTA), and click Create bot.

        <Tip>If you do not see **Add a new bot**, your organization restricts who may create bots. Zulip lets owners and admins configure "who can create incoming webhook bots (which are more limited in what they can do), and who can create any bot" under **Organization settings > Organization permissions > Other permissions**, assignable to "any combination of roles, groups, and individual users" — so ask an owner to grant you the permission or to create the bot for you.</Tip>

        <img src="https://mintcdn.com/dsalta/4UzgskHSsjeDN5e5/images/integrations/zulip/01-zulip-personal-settings-menu.png?fit=max&auto=format&n=4UzgskHSsjeDN5e5&q=85&s=300aad909692d06cf5de804003195092" alt="Zulip web app with the gear menu open, showing the Personal settings entry alongside Channel settings, Organization settings and Group settings" style={{maxWidth:"720px",width:"100%",borderRadius:"8px"}} width="2932" height="1242" data-path="images/integrations/zulip/01-zulip-personal-settings-menu.png" />
      </Step>

      <Step title="Copy the bot's email and API key">
        On the new bot's row, click the manage icon to view and copy its email address and API key.

        <Tip>Check that the bot can actually see real email addresses, or the access reviews will not match anyone. Zulip's API returns `delivery_email` as "The user's real email address" but "will be null if you cannot access user's real email address", and in that case `email` is "a fake email address that is usable for the Zulip API but nothing else" — which is what DSALTA would store and try to match against your People page. The control is the per-user setting **"Who can access your email address"** (Personal settings → Account & Privacy); owners and admins set the organization-wide default under **Organization settings → Default user settings → Privacy settings**. A generic bot is a Member, so anyone who has restricted their email to admins will land on the Access page under a fake address.</Tip>

        <img src="https://mintcdn.com/dsalta/4UzgskHSsjeDN5e5/images/integrations/zulip/02-zulip-bots-list.png?fit=max&auto=format&n=4UzgskHSsjeDN5e5&q=85&s=a4338ba9a7cbf1a052d4fe389bf8eb26" alt="Zulip Personal settings Bots page listing the dsaltacompliance bot with its bot email address, Member role, owner, Generic bot type and the row action icons" style={{maxWidth:"720px",width:"100%",borderRadius:"8px"}} width="2342" height="1606" data-path="images/integrations/zulip/02-zulip-bots-list.png" />
      </Step>

      <Step title="Connect Zulip">
        Enter your organization URL (e.g. your-org.zulipchat.com), the bot's email, and its API key, then click Connect.

        Inventory will list your public channels plus any channel the bot is subscribed to — nothing more. Zulip's channel listing defaults to "all public channels" and "all channels that the user is subscribed to", and only organization administrators "implicitly have metadata access to all channels". If you want private channels on the Inventory page, subscribe the bot to them (or make it an administrator). Archived channels are excluded either way.

        Self-hosted Zulip works the same way — put your own server's address in **Organization URL** instead of a `*.zulipchat.com` host. DSALTA accepts the value with or without a leading `https://` and strips any trailing slash, then calls that server directly; there is no Zulip Cloud requirement anywhere in the connection.
      </Step>
    </Steps>

    <Check>
      DSALTA validates the credential when you click **Connect**. On success the integration moves to the **Connected** tab, and **Manage → Status** reads **Connected and working properly**. Checks begin reporting after the first sync.
    </Check>

    <Warning>
      **If the connection is rejected.** Invalid organization URL, bot email, or API key.

      The on-screen message is generic — see [Connection error messages](/troubleshooting/connection-error-messages).
    </Warning>
  </Tab>

  <Tab title="Automated checks">
    Each check below re-runs once a day, at 02:00 America/New\_York, while this integration is connected. Click any check for step-by-step remediation guidance.

    | Check                                                                                                                | Severity | What it verifies                                                                 |
    | -------------------------------------------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------- |
    | [User access to Critical System should be valid](/integrations/zulip/user-access-to-critical-system-should-be-valid) | Info     | Checks that everyone with Zulip access is an active employee on the People page. |
    | [Offboarded users should not have active access](/integrations/zulip/offboarded-users-should-not-have-active-access) | High     | Checks that offboarded employees no longer have active Zulip access.             |
  </Tab>

  <Tab title="Useful links">
    | Topic   | Link                                                                                   |
    | ------- | -------------------------------------------------------------------------------------- |
    | Setup   | [Create a Zulip bot](https://zulip.com/help/add-a-bot-or-integration)                  |
    | Setup   | [Zulip: configure email visibility](https://zulip.com/help/configure-email-visibility) |
    | General | [Zulip website](https://zulip.com)                                                     |
    | DSALTA  | [Connection error messages](/troubleshooting/connection-error-messages)                |
  </Tab>
</Tabs>
