> ## 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.

# Builder.io

> Visual CMS — Space users, models & access

<Tabs>
  <Tab title="Overview">
    Connect Builder.io with a Space's private key to sync the Space's users with their roles, the Space and its content models, and run access reviews. Read-only calls only. Data feeds into your Access accounts and Inventory pages.

    <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>

    <Info>
      **What you'll see.** The Access page lists the users of the one Builder.io **Space** the private key belongs to, with their name (or their email address when Builder.io carries no name), email, and their Builder.io role in the role column (for example **Admin**, or **Member** when Builder.io reports none). Builder.io's user list carries no status, invitation or bot flag, so every row it returns is shown as **Active** and stamped with the date of the sync; a user's last-active time is not synced. Builder.io reports no per-user MFA state, so the **MFA** column is blank (shown as a dash).
    </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 Space's user list — names, emails and roles — which appears on your **Access** page; and the **Space** itself (name, parent organization and creation date) and its **content models** (kind, whether it is a page model, and whether it is archived or hidden), which appear on your **Inventory** page. The Space and its models are read best-effort after the user list; a Space with no models shows only the Space row. Content entries, assets, folders and webhooks are not read.

    Every call is a `POST` to a single GraphQL admin endpoint, `https://cdn.builder.io/api/v2/admin`, with one of these queries:

    * `{ id }`
    * `{ users { id name email role lastActive } }`
    * `{ models { id name kind isPage archived hidden } }`
    * `{ settings }`

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

    ## Troubleshooting

    <AccordionGroup>
      <Accordion title="The connection is rejected">
        The key is the **Public API Key** rather than the Space's private key, or the private key was revoked. Builder.io answers both with a *Private Key is invalid* error, which DSALTA rejects at connect time. Open **Space Settings → Private Keys**, create a key — it starts with `bpk-` — and connect again.
      </Accordion>

      <Accordion title="The Access page covers only one of our Spaces">
        A private key belongs to exactly one Space, and DSALTA syncs that Space's users. Connect Builder.io once per Space, each time with that Space's own private key; an Organization key is not the right credential.
      </Accordion>

      <Accordion title="Inventory is empty while Access works">
        The Space row and the content models are read best-effort after the user list: a failure on either query leaves that part of the Inventory page empty without failing the sync. Click **Sync from integrations** on the **Integrations** page to retry.
      </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/compliance/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 Builder.io private key of the Space to review. The Space is detected from the key. Read-only calls only.

    **Before you begin**

    * A Builder.io Space Admin — only Admins can view or create private keys.

    You will need:

    | Field | Where to find it | Example |
    | - | - | - |
    | **Private Space key** | **Space Settings → Private Keys → Edit** | `bpk-…` |

    <Steps>
      <Step title="Start in DSALTA">
        Open **Integrations** in the DSALTA sidebar, find **Builder.io**, and click **Connect** to open the connect panel.
      </Step>

      <Step title="Sign in as a Space Admin">
        Sign in at [builder.io](https://builder.io) and open the Space you want to review. Only Space Admins see the **Private Keys** row. An organization with several Spaces needs one connection per Space.
      </Step>

      <Step title="Create a private Space key">
        Open **Space Settings**, click **Edit** next to **Private Keys**, create a key and copy the value that starts with `bpk-`.

        <Warning>
          **A private key carries write access to the Space's content.** Builder.io offers no read-only variant; DSALTA only ever sends read queries. Do not paste the **Public API Key** from the tutorials — it does not authenticate the admin API and is rejected at connect time.
        </Warning>
      </Step>

      <Step title="Connect Builder.io">
        Return to the connect panel, paste the private Space key, and click **Connect**. The Space is detected from the key.
      </Step>
    </Steps>

    <Check>
      DSALTA validates the key when you click **Connect**, by asking the admin API for the Space's ID and listing the Space's users — a key that returns no Space ID or no users is rejected. 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.** The Public API Key instead of the private key, an invalid or revoked private key, or a key that returns no Space ID or no users.

      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/builder-io/user-access-to-critical-system-should-be-valid) | Info | Checks that everyone with Builder.io access is an active employee on the People page. |
    | [Offboarded users should not have active access](/integrations/builder-io/offboarded-users-should-not-have-active-access) | High | Checks that offboarded employees no longer have active Builder.io access. |
  </Tab>

  <Tab title="Useful links">
    | Topic | Link |
    | - | - |
    | Setup | [Builder.io API keys (public vs private)](https://www.builder.io/c/docs/using-your-api-key) |
    | Remediation | [Managing users](https://www.builder.io/c/docs/managing-users) |
    | General | [Builder.io](https://builder.io) |
    | DSALTA | [Connection error messages](/troubleshooting/connection-error-messages) |
  </Tab>
</Tabs>
