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

# Setup SCIM

> Enable real-time user and group provisioning from Okta to Bifrost Enterprise using SCIM 2.0.

SCIM (System for Cross-domain Identity Management) keeps Bifrost in sync with Okta in real time — new users are provisioned, deactivated users are suspended, and group memberships are updated without waiting for the next login or background sync.

<Note>
  Complete [SSO using OIDC](./oidc) before setting up SCIM. Okta does not support SCIM on a custom OIDC app, so SCIM runs as a **separate** app alongside your existing OIDC integration.
</Note>

***

## Step 1: Enable SCIM in Bifrost

<Steps>
  <Step title="Open your Okta provider">
    In your Bifrost dashboard, go to **Governance** → **User Provisioning** and open your configured Okta provider.

    <Frame caption="The Okta provider dashboard showing your connection details and attribute mappings.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/bifrost-provider-setting.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=cb767653c96453f674a12975a4a9a88f" alt="Bifrost Okta provider dashboard showing connection details and attribute mappings" width="2916" height="1672" data-path="media/user-provisioning/okta/bifrost-provider-setting.png" />
    </Frame>
  </Step>

  <Step title="Enable SCIM provisioning">
    Click the settings icon to open **Provider Configuration**.

    Toggle on **Enable SCIM Provisioning** and click **Save & Enable**.

    <Frame caption="Enable SCIM Provisioning in Provider Configuration — the SCIM endpoint URL and token are generated after saving.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/bifrost-enable-scim.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=90e7821fe9fdbdea01fb95b3637e79d5" alt="Bifrost Provider Configuration with Enable SCIM Provisioning toggle turned on" width="2916" height="1674" data-path="media/user-provisioning/okta/bifrost-enable-scim.png" />
    </Frame>
  </Step>

  <Step title="Copy the SCIM credentials">
    After saving, Bifrost shows a **Setup Complete** dialog with:

    * **SCIM Endpoint URL** — the base URL Okta will send provisioning requests to
    * **Provisioning Token** — the bearer token Okta uses to authenticate

    Copy both values now — you will need them in [Step 3](#step-3-configure-the-scim-app).

    <Frame caption="Setup Complete dialog showing the SCIM Endpoint URL and Provisioning Token.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/bifrost-scim-provisioning-token-dialog.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=fb4b9436ccfe183c09819ea4d3995baf" alt="Bifrost Setup Complete dialog displaying the SCIM Endpoint URL and one-time Provisioning Token" width="2916" height="1674" data-path="media/user-provisioning/okta/bifrost-scim-provisioning-token-dialog.png" />
    </Frame>

    <Warning>
      The provisioning token is only shown once. Store it somewhere safe before closing this dialog. You can always rotate it later, but the previous token will immediately become invalid.
    </Warning>
  </Step>
</Steps>

***

### Alternative: seed the token declaratively (Helm / config.json)

If you manage Bifrost with Helm or a static `config.json` (GitOps), you can seed the **Provisioning Token** yourself instead of generating it in the dashboard.

<Steps>
  <Step title="Generate a token">
    ```bash theme={null}
    openssl rand -base64 32 | tr '+/' '-_' | tr -d '='
    ```

    This produces a URL-safe token in the same format Bifrost mints internally.
  </Step>

  <Step title="Add it to your SCIM config">
    Helm `values.yaml`:

    ```yaml theme={null}
    bifrost:
      scim:
        enabled: true
        provider: "okta"
        config:
          issuerUrl: "https://your-domain.okta.com/oauth2/default"
          clientId: "..."
          clientSecret: "env.OKTA_CLIENT_SECRET"
          apiToken: "env.OKTA_API_TOKEN"
          provisioningToken: "env.SCIM_PROVISIONING_TOKEN"   # or the literal token
          claimScimAttributes:                                # per-claim SCIM interpretation
            groups:
              attributeType: "group"        # "user" (SCIM User attribute) or "group" (match SCIM Group)
              attributeValue: "displayName"
    ```

    The same keys (`provisioningToken`, `claimScimAttributes`) apply directly under `scim_config.config` in a raw `config.json`.
  </Step>
</Steps>

<Warning>
  Keep the token in a Kubernetes Secret and reference it with the `env.` prefix — never commit the literal value. Rotating the token in the dashboard invalidates any value seeded here.
</Warning>

Then use this token as the **API Token** and your deployment's SCIM endpoint as the **SCIM 2.0 Base URL** in [Step 3](#step-3-configure-the-scim-app) — the rest of the Okta setup is identical.

***

## Step 2: Create a SCIM App in Okta

<Steps>
  <Step title="Browse the App Catalog">
    In the Okta Admin Console, go to **Applications** → **Applications** and click **Browse App Catalog**.

    <Frame caption="Click Browse App Catalog from the Applications page.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-browse-app-catalog.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=99e36c2f82090ad2d338d87dbcbc6afa" alt="Okta Applications page with Browse App Catalog button highlighted" width="3024" height="1588" data-path="media/user-provisioning/okta/okta-browse-app-catalog.png" />
    </Frame>
  </Step>

  <Step title="Add the SCIM 2.0 Test App">
    Search for **SCIM 2.0 Test App (Header Auth)** and add it.

    <Frame caption="Select SCIM 2.0 Test App (Header Auth) from the catalog.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-choose-scim-header-auth.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=df7e17eecec54f7e9102533dc3d8df9b" alt="Okta App Catalog search results with SCIM 2.0 Test App (Header Auth) highlighted" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-choose-scim-header-auth.png" />
    </Frame>

    Name the app `Bifrost SCIM` (or any label you prefer). On the sign-on options screen, skip everything and click **Done** — this app is used for SCIM provisioning only, not authentication.
  </Step>
</Steps>

***

## Step 3: Configure the SCIM App

<Steps>
  <Step title="Connect the app to Bifrost">
    Open the **Bifrost SCIM** app and go to the **Provisioning** tab.

    Click **Configure API Integration**, check **Enable API Integration**, and enter:

    * **SCIM 2.0 Base URL**: the SCIM Endpoint URL from [Step 1](#step-1-enable-scim-in-bifrost)
    * **API Token**: the Provisioning Token from [Step 1](#step-1-enable-scim-in-bifrost)

    Click **Test API Credentials** to verify the connection, then **Save**.

    <Frame caption="Enter the SCIM Endpoint URL and Provisioning Token from Bifrost to connect the app.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-scim-provisioning-setup.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=16376272fe4785f414f11e64363e9178" alt="Okta SCIM app Configure API Integration dialog with Base URL and API Token fields filled in" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-scim-provisioning-setup.png" />
    </Frame>
  </Step>

  <Step title="Enable provisioning actions">
    Still under the **Provisioning** tab, go to **To App** and enable:

    * **Create Users**
    * **Update User Attributes**
    * **Deactivate Users**

    Click **Save**.

    <Frame caption="Provisioning → To App — enable Create Users, Update User Attributes, and Deactivate Users.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-scim-provisioning-to-app.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=2213652297b6da3ad02ad72802731017" alt="Okta Provisioning To App section with Create Users, Update User Attributes, and Deactivate Users enabled" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-scim-provisioning-to-app.png" />
    </Frame>
  </Step>

  <Step title="Add custom attributes (optional)">
    Skip this step if you only need to sync standard user fields (name, email, groups).

    <Accordion title="Syncing custom profile attributes (e.g. employeeId, costCenter, division)">
      Custom attributes need to be declared in the SCIM app schema before Okta can include them in provisioning payloads.

      Go to **Directory** → **Profile Editor** and select the **Bifrost SCIM** app profile. Click **Add Attribute**.

      <Frame caption="Profile Editor for the Bifrost SCIM app — click Add Attribute to declare a new custom field.">
        <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-profile-editor-add-attribute.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=07563b437a98fcba02f03830f0a2928c" alt="Okta Profile Editor for the Bifrost SCIM app showing the Add Attribute and Mappings buttons" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-profile-editor-add-attribute.png" />
      </Frame>

      Configure the attribute — for example, for `Employee ID`:

      | Field                  | Value                                                        |
      | ---------------------- | ------------------------------------------------------------ |
      | **Display name**       | `Employee ID`                                                |
      | **Variable name**      | `employeeID`                                                 |
      | **External name**      | `employeeID`                                                 |
      | **External namespace** | `urn:ietf:params:scim:schemas:extension:enterprise:2.0:User` |

      <Frame caption="Add Attribute dialog — the External name is what Bifrost receives and must match exactly what you configure in Bifrost's SCIM attribute settings.">
        <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-custom-attribute-employee-id.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=9848603762ffc09986b1725e3aef1076" alt="Add Attribute dialog with Display name Employee ID, Variable name employeeID, and External name employeeID filled in" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-custom-attribute-employee-id.png" />
      </Frame>

      Click **Save**, then click **Mappings** on the Bifrost SCIM profile.

      <Frame caption="Click Mappings on the Bifrost SCIM profile to open the attribute mapping view.">
        <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-scim-custom-attribute-mapping-button.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=54ef15acb1d8da6d9bc4037c7fb043da" alt="Bifrost SCIM Attribute Mappings screen with Go to Profile Editor and Force Sync buttons" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-scim-custom-attribute-mapping-button.png" />
      </Frame>

      Select the **Okta User → Bifrost SCIM** tab.

      <Frame caption="Okta User to Bifrost SCIM mapping direction — map each Okta profile field to the corresponding SCIM attribute.">
        <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-custom-attribute-mapping.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=f843fe38f31233d1016e170f14ff8a42" alt="Okta User to Bifrost SCIM mapping direction tab showing attribute mapping fields" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-custom-attribute-mapping.png" />
      </Frame>

      Scroll to find your attribute and set its source from the Okta user profile — e.g. `user.employeeNumber` → `employeeID`. Click **Save Mappings**.

      <Frame caption="Mapping user.employeeID from the Okta user profile to the employeeID SCIM attribute.">
        <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-custom-attribute-mapping-employeeid.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=3236b8e18bc53a7ddb51decff30bd19b" alt="Attribute mapping row showing user.employeeID mapped to the employeeID SCIM attribute" width="3024" height="1590" data-path="media/user-provisioning/okta/okta-custom-attribute-mapping-employeeid.png" />
      </Frame>

      Back in Bifrost, go to **Attribute Mapping** in the provider setup and add a **SCIM Attribute** entry for `employeeID`. The External name you set in Okta must match this exactly.

      <Frame caption="In Bifrost's Attribute Mapping step, add the custom SCIM attribute using the same External name configured in Okta.">
        <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/bifrost-custom-user-attribute-scim.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=074018da69e5ed39f0c52f0d6be06d6e" alt="Bifrost Attribute Mapping step showing SCIM Attributes section with employeeID custom attribute entry" width="2914" height="1670" data-path="media/user-provisioning/okta/bifrost-custom-user-attribute-scim.png" />
      </Frame>

      <Note>
        The **External name** in Okta's Profile Editor and the SCIM attribute name in Bifrost must match exactly — including case.
      </Note>
    </Accordion>
  </Step>
</Steps>

***

## Step 4: Assign Users and Push Groups

<Steps>
  <Step title="Assign users">
    Go to the **Assignments** tab in the Bifrost SCIM app.

    Click **Assign** → **Assign to People** or **Assign to Groups** and select the users or groups to sync with Bifrost.

    <Frame caption="Assign users or groups from the Assignments tab — users are pushed to Bifrost immediately on assignment.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-scim-assignments.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=bf9b1117d92b45b0f576fd43fbd1f563" alt="Bifrost SCIM app Assignments tab with Assign dropdown showing Assign to People and Assign to Groups options" width="2128" height="1480" data-path="media/user-provisioning/okta/okta-scim-assignments.png" />
    </Frame>

    Assigned users are pushed to Bifrost immediately. When a user is unassigned or deactivated in Okta, Bifrost deactivates them in real time.
  </Step>

  <Step title="Push groups (for team and BU mapping)">
    If you use group membership to drive Bifrost team or business unit assignments, you need to push the groups themselves — not just the users in them.

    Go to the **Push Groups** tab in the Bifrost SCIM app and click **Push Groups**.

    You can push groups **by name** (search for specific groups) or **by rule** (create a filter that automatically pushes any matching groups — useful if your groups follow a naming convention like `Bifrost-*`).

    <Frame caption="Push Groups tab — choose to find groups by name or create a rule to push all matching groups automatically.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-scim-push-groups.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=54b53f7cc922d1cf43f0fb5c89e6f6a7" alt="Push Groups tab showing Find groups by name and Find groups by rule options" width="3024" height="1592" data-path="media/user-provisioning/okta/okta-scim-push-groups.png" />
    </Frame>

    <Frame caption="Push by rule — set a filter (e.g. Group name starts with 'Bifrost') to automatically push all matching groups.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-scim-push-groups-by-rule.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=886b3c94b7a11f92ad8c2af9a3782bab" alt="Push Groups by rule dialog with Rule name Bifrost Groups and Group name filter starting with Bifrost" width="2128" height="1480" data-path="media/user-provisioning/okta/okta-scim-push-groups-by-rule.png" />
    </Frame>

    Once groups are pushed and showing as **Active**, Bifrost tracks their membership in real time.

    <Frame caption="Pushed groups showing as Active — Bifrost now tracks membership changes for these groups in real time.">
      <img src="https://mintcdn.com/bifrost/xzA5tsApkV1N-gkH/media/user-provisioning/okta/okta-scim-push-groups-active.png?fit=max&auto=format&n=xzA5tsApkV1N-gkH&q=85&s=c32d1d0793120b59deab230dcdadfd83" alt="Push Groups list showing Bifrost-Admin and Bifrost-Viewer groups with Active push status" width="2128" height="1480" data-path="media/user-provisioning/okta/okta-scim-push-groups-active.png" />
    </Frame>

    In Bifrost, configure **Attribute-to-Team** or **Attribute-to-Business Unit** mappings using the group `displayName` as the match value to automatically assign users to teams or business units based on their group membership.
  </Step>
</Steps>

***

## Step 5: Verify in Bifrost

Once assignments and group pushes are active, confirm everything is syncing correctly.

* Go to **Governance** → **Users** to see provisioned users and their assigned roles
* Go to **Governance** → **Teams** to see teams populated from pushed groups
* Go to **Governance** → **Business Units** to see business units resolved from group or attribute mappings

Changes in Okta — new assignments, group membership updates, deactivations — will reflect in Bifrost in real time.

***

## How Sync Works

**Real-time push** — Okta pushes user and group changes to Bifrost immediately when they occur.

**Background reconciliation** — if you configured an API token in [SSO using OIDC Step 4](./oidc#step-4-copy-your-credentials), Bifrost also runs a full reconciliation every 24 hours to catch anything the SCIM push may have missed.

***

## Troubleshooting

**Test API Credentials fails** — verify the SCIM Base URL has no trailing slash and the API token matches exactly what Bifrost generated. Rotate the token in Bifrost and update Okta if needed.

**Users are pushed but have no role** — SCIM provisions the user record; role assignment comes from attribute mappings in the OIDC provider. Confirm your Attribute-to-Role mappings are set and the relevant claims are present in the JWT.

**Custom attribute is not arriving in Bifrost** — confirm the External name in Okta's Profile Editor matches the SCIM attribute name in Bifrost exactly (case-sensitive). Also verify the Okta User → Bifrost SCIM mapping direction is saved.

**Group membership is not syncing** — ensure groups are added under **Push Groups**, not just **Assignments**. Assignments sync users; Push Groups syncs group membership.
