Langfuse Okta SSO and SCIM provisioning: what the integration does
A platform team running self-hosted Langfuse usually wants Okta to handle both sign-in and the user lifecycle. In this integration, Okta SSO uses an OIDC app, and SCIM provisioning uses a separate app that calls Langfuse's SCIM endpoints under /api/public/scim. Those endpoints authenticate with organization-scoped API keys and require the Enterprise Edition, so the license decision comes before any Okta work starts. The two apps do different jobs: the OIDC app decides who can sign in, and the SCIM app decides which people exist in the Langfuse organization and what organization role they start with. Neither app replaces the other, so the platform team should plan both as one change.
When Okta pushes a user, Langfuse's POST to /Users creates the user if the email address is new and adds them to the organization with role NONE, unless the request includes a roles attribute. A user with role NONE is unlikely to have useful access until a role is assigned, so confirm exactly which permissions NONE grants in the version you run. SCIM does not set passwords. Sign-in always goes through the SSO flow, so a provisioned user who cannot complete the OIDC sign-in will hold an account that exists but cannot be used. Test both paths with a pilot user before assigning a broad Okta group.
Deprovisioning is narrower than many teams expect. A DELETE to /Users/{id} removes the user's membership in the organization, and the user record stays in Langfuse. Anyone who should lose all access therefore needs the membership removed and their SSO path blocked in Okta. Reprovisioning carries a separate risk: Langfuse warns that SCIM deprovisioning and reprovisioning can overwrite a user's organization role with the value of the SCIM roles attribute, which defaults to NONE. A user who returns to a group after removal can come back with no role. Set the roles attribute mapping before enabling provisioning, and verify it in a non-production instance first.
Okta's own constraint shapes the design. Okta does not support SCIM on a custom OIDC app, which is why Langfuse's Okta guide uses two applications. The Okta administrator needs to decide which groups are assigned to the SCIM app, how group membership maps to the roles attribute, and who owns each app's configuration after go-live. Record these decisions in the design document, because changing a group-to-role mapping later can trigger the role overwrite described above on the next sync. Also name an owner for the SCIM API key, since that key determines which organization the provisioning calls act on.
Before the build, confirm three things with Langfuse and your Okta tenant: that your Enterprise license key covers the org management API with SCIM, that the organization-scoped API key can be created and rotated under your security policy, and what permissions the NONE role grants in the version you will run. Plan a pilot group of a few users in a non-production instance, then run a full sync only after the role values match your access model.
What you need in place before configuring Okta and Langfuse
Provisioning from Okta into a self-hosted Langfuse depends on a license, a running instance, an API key and two Okta applications, all set up before any user is pushed. The cards below cover what each prerequisite is and what to confirm before you start, so the role model is agreed before SCIM can change anyone's access.
Enterprise license key for SCIM
The org management API with SCIM is an Enterprise Edition feature for self-hosted Langfuse, so the instance needs a valid Enterprise license key before any SCIM call will work. Other governance features, such as project-level RBAC roles and audit logs, also depend on that key, so confirm the full list against the license key documentation. Ask whether the license covers the instance you plan to run and who holds the key for renewals.
Self-hosted Langfuse reachable by Okta
Okta calls the SCIM endpoints under /api/public/scim over HTTPS, so the Langfuse instance must be reachable from Okta's cloud at a stable, publicly resolvable URL with a certificate Okta trusts. If the instance sits behind a VPN, an internal load balancer or a private DNS zone, the network path needs an approved exception. Confirm the exact path, firewall rules and certificate chain with Okta and your infrastructure team before configuring anything.
Organization-scoped API key
SCIM requests authenticate with an organization-scoped API key, not a project key, so the key must be created at the organization level in Langfuse. Store it in your secrets manager and give it to the Okta SCIM app only, since anyone holding it can manage projects, memberships and API keys within the organization. Plan who may rotate the key and how the change is coordinated with the Okta app.
Okta rights to create two apps
Langfuse's Okta guide uses two separate applications: an OIDC app for single sign-on and a SCIM provisioning app, because Okta does not support SCIM on a custom OIDC app. The administrator configuring them needs rights to create and assign both apps and to manage their provisioning settings. Confirm current Okta admin permissions and any licensing that applies to provisioning with Okta, since these change over time.
Agreed role model with identity owners
Initial provisioning can overwrite an existing user's organization role with the SCIM roles attribute, which defaults to NONE, so existing administrators can lose access during a sync. Identity owners and Langfuse administrators must agree which Okta groups map to which organization and project roles before provisioning is enabled. Record that mapping, the owner of each group and who signs off on changes.
Why Okta Langfuse SCIM provisioning needs a second Okta app
Okta does not support SCIM on a custom OIDC app, so Langfuse's Okta guide calls for two Okta applications. The first is an OIDC app that handles sign-in to Langfuse. The second is a separate SCIM app that handles user provisioning into the Langfuse organization. Teams that expect one application to cover both jobs will find that the provisioning side has no place to attach. The split also means a person can be able to sign in while holding no Langfuse role, because authentication and membership are managed by different objects. Plan for both apps before SSO is declared working.
The two apps share one population of users but carry different responsibilities. The OIDC app decides who can authenticate and passes them into Langfuse through the SSO configuration. The SCIM app calls Langfuse's SCIM endpoints, which sit under the public API path and authenticate with an organization-scoped API key, to create memberships and remove them. SCIM does not set passwords, so every sign-in still runs through the OIDC app. Each app therefore needs its own assignments: the OIDC app assigned to users who should sign in, and the SCIM app assigned to users who should hold organization membership. Confirm in writing which group or user set feeds each app.
Before changing any assignment, name both apps and document them together. The record should state each app's purpose, the users and groups it covers, the Langfuse organization it targets, the owner of the API key used for SCIM, and the roles attribute the SCIM app will send. That last item matters because Langfuse defaults the role to NONE when no roles attribute is provided, and deprovisioning and reprovisioning can overwrite an existing organization role with that attribute. Assignments on a live app can therefore change memberships for many people at once. Ask the Okta administrator and the Langfuse administrator to approve the same document before any change is made.
Clear names also matter during operations. When someone asks why access changed, the team must know which app authenticated the user and which app created or removed the membership. Verify this in a test organization before production. Assign a test user to the SCIM app and confirm the membership appears, confirm that sign-in works only through the OIDC app, then unassign the user and confirm the membership is removed while the user record remains. Check the self-hosted Enterprise license first, because Langfuse's SCIM endpoints require it. Record each test result against the documented apps so the same names carry into the production runbook.
How to configure Okta SSO and SCIM provisioning for Langfuse in sequence
This sequence connects a self-hosted Langfuse Enterprise instance to Okta for sign-in and user provisioning. Each step depends on the one before it, and the role attribute must be settled before the first sync so that existing members keep the roles they should have.
Enable the Enterprise license key
The platform administrator adds the Enterprise license key to the self-hosted instance before any identity work starts. SCIM and the organization management API are gated behind the Enterprise Edition, so provisioning cannot be tested until the key is accepted. Confirm the instance accepts the key and that the Enterprise-only features you plan to use are available to your organization. Record the key location in your secrets manager so that later steps and future upgrades do not depend on one person's workstation.
Create an organization-scoped API key
An organization administrator creates an API key at the organization level, because that scope is what allows it to manage projects, API keys and memberships. The SCIM endpoints under /api/public/scim authenticate with this key, so store it in your secrets manager and limit who can read it. Check the key by making one authenticated read request to the SCIM endpoint from a host you control and confirming that the request is accepted.
Configure the Okta OIDC app for sign-in
The Okta administrator creates an OIDC application for single sign-on, following the Langfuse Okta guide for the redirect and sign-in settings. This application handles authentication only. Okta does not support SCIM on a custom OIDC app, so provisioning is configured separately in the next step. Check the result by signing in to Langfuse with a test user and confirming that the sign-in is initiated and completed through Okta.
Create a separate Okta SCIM app
The Okta administrator creates a second application for provisioning and points it at the Langfuse SCIM endpoints, authenticated with the organization-scoped API key. Keeping SCIM in its own application is required because Okta does not support SCIM on a custom OIDC app. SCIM does not set passwords, so users continue to sign in through the OIDC application. Check that the connection test from Okta against the endpoints succeeds before any user or group is assigned.
Set the roles attribute before any sync
Before Okta pushes any user, define the roles attribute that the SCIM app sends and agree the mapping from Okta groups or profile values to Langfuse organization roles with your security owner. A new user created through SCIM receives role NONE unless a roles attribute is provided. Deprovisioning and reprovisioning can overwrite an existing organization role with the attribute value, which defaults to NONE, so an incomplete mapping can downgrade current members. Check the mapping by confirming that the attribute sends the intended role for a sample user before sync is enabled.
Assign a small test group
Assign one small test group in Okta to both the OIDC application and the SCIM application. Include a few test users whose intended Langfuse roles are written down, and leave existing production members out of the group during the first sync. Check that each test user appears in Langfuse with the expected role. Then remove one test user from the group and confirm that their organization membership is removed while the user record itself remains, since deprovisioning removes membership and not the user.
How Okta user attributes map to Langfuse organization roles
This table compares each attribute and object that moves between Okta and Langfuse during SCIM provisioning, what Langfuse does with it, and the decision your team must settle first. Read it before the first sync, because the roles attribute and deprovisioning behavior determine who keeps access. The main takeaway is that the roles attribute must be set correctly before provisioning is enabled. Confirm accepted role values in the Langfuse SCIM documentation.
| Attribute or object | What happens during sync | Decision for your team |
|---|---|---|
| User email | SCIM POST /Users creates a new Langfuse user when the email is not already present. | Confirm Okta sends the same email users sign in with through SSO, so each person maps to one identity. |
| SCIM roles attribute | A new user is added with role NONE unless a roles attribute is provided. | Map each Okta group or assignment to a role before enabling provisioning. Confirm accepted values in the Langfuse SCIM documentation. |
| Organization membership | DELETE /Users/{id} removes the user's membership in the organization. | Decide whether removing membership fully covers offboarding, or whether project access and API keys need a separate review. |
| User record after deprovisioning | The Langfuse user record remains after its organization membership is removed. | Decide how long retained user records are kept, and confirm whether SSO sign-in must also be blocked in Okta. |
| Passwords | SCIM does not set passwords for provisioned users. | Decide whether users sign in only through SSO, and whether password sign-in should be disabled for your email domains. |
| Role on reprovisioning | Deprovisioning and reprovisioning can overwrite a user's organization role with the roles attribute, which defaults to NONE. | Set the roles attribute correctly before the initial sync, and review role assignments after the first sync completes. |
How the role downgrade risk appears during initial sync
The main risk in the first sync is that a user's organization role can be set by the SCIM roles attribute rather than by the role the person held before. Langfuse warns that SCIM deprovisioning and reprovisioning can overwrite a user's organization role with that attribute, and the attribute defaults to NONE. A user created through SCIM POST /Users without a roles value starts with no role. Any access the person had before therefore depends on what Okta sends at the moment the user is provisioned or reprovisioned.
Consider an illustrative case, not a record of any real deployment. A project lead holds a project-level role in a self-hosted Langfuse Enterprise instance. An administrator removes them from the Okta group assigned to the Langfuse SCIM app, and Langfuse removes their organization membership through DELETE /Users/{id}. The user record itself remains. Weeks later, the person is re-added to the group, but the roles attribute was never set in the Okta mapping. Langfuse recreates the membership with role NONE, so the project lead signs in, sees no projects they should manage, and cannot act until an administrator reassigns the role by hand.
The attribute has to be correct before provisioning is switched on because the role assigned during initial sync is the one every later deprovision and reprovision repeats. If the mapping is wrong at that stage, the error spreads to every user who changes group membership, and the fix becomes a manual reassignment across the organization with an unclear audit trail. Before enabling provisioning, decide which Okta groups map to which Langfuse roles, decide what a user outside all mapped groups should receive, and assign one owner to maintain that mapping. Confirm the exact role values your Langfuse version accepts in its SCIM and Org API documentation.
Run a dry run against a non-production Langfuse instance with a small set of test users in test groups. Confirm the role each test user receives after first provisioning, then remove and re-add one user and check that the role survives the cycle. Check that a user left outside every mapped group receives the role you intended and not NONE by accident. Verify that the SCIM credential is an organization-scoped API key and that the Enterprise license is active, since SCIM requires it for self-hosted use. Ask your Okta administrator to confirm which provisioning actions the SCIM app will send in your tenant, and record the results before the production group assignments change.
Security controls for Okta SCIM provisioning to Langfuse
Connecting Okta to a self-hosted Langfuse Enterprise instance gives one identity system control over who can reach the workspace, and that control depends on a few decisions made before provisioning starts. The cards below cover the credentials, app boundaries, role attributes and sign-in settings that determine whether provisioning stays under your control.
Protect the organization-scoped API key
Okta authenticates SCIM calls to Langfuse with an organization-scoped API key, which can create users, change memberships and manage projects. Store it in your secrets manager, restrict who can read the Okta app configuration, and limit where the key is used. Ask your security team how the key is rotated, how rotation is coordinated with the Okta SCIM configuration, and where Langfuse and Okta events are logged so a key misuse can be traced.
Assign the SCIM app to least privilege
Assign the SCIM application only to the Okta groups whose members should hold a Langfuse account, not to the whole directory. Review the group-to-app mapping with the owners of the access model, because each assigned user will be created or updated in Langfuse. Role values sent through the roles attribute should follow your organization's own access model rather than a default chosen for convenience.
Separate the SSO app from the SCIM app
Langfuse's Okta guide uses two applications: an OIDC app that handles sign-in and a separate SCIM app that handles user lifecycle, because Okta does not support SCIM on a custom OIDC app. Keep their assignments, owners and change history apart so a change to sign-in policy does not alter provisioning, and so a provisioning fault does not block login. SCIM does not set passwords, so authentication still depends on the SSO app.
Review deprovisioning for leavers
In Langfuse, a SCIM delete removes only the organization membership, not the user record, so access ends but the account remains. Define who reviews departed users, how often the review runs, and what happens to traces and prompts those users created. Confirm with the Langfuse team how deprovisioned accounts appear in the instance and whether any residual sessions or API keys need separate revocation.
Disable password sign-in or enforce SSO by domain
Langfuse documents options to disable password sign-in and to enforce SSO for given email domains. Enforcing SSO means that a user whose Okta account is disabled cannot fall back to a local password, so the two controls should be planned together. Before enabling either setting, confirm which administrator accounts keep a break-glass path, test the sign-in flow with a non-production user, and check the domain list against your email tenants.
Common Okta and Langfuse SCIM failures and how to fix them
This table lists six failures seen when Okta provisions users into a self-hosted Langfuse instance, with the likely cause, the check to run and the fix for each. Read it in order during the first sync, because the license, API key and role settings must be correct before provisioning or SSO enforcement is enabled.
| Symptom | Likely cause | Check | Fix |
|---|---|---|---|
| Provisioning runs but SCIM calls fail or do nothing | The instance has no Enterprise license key, and the org management API with SCIM is locked. | Confirm the license key is loaded in the self-hosted deployment and that the instance is running the Enterprise Edition. | Add the Enterprise license key to the deployment configuration, restart the containers, then retry the Okta push or import. |
| SCIM requests return authorization errors or touch the wrong organization | The API key used by the Okta SCIM app is scoped to a different organization than the one being provisioned. | Compare the organization ID the key belongs to with the organization in the Okta SCIM app configuration. | Create an organization-scoped API key for the target organization, update the Okta SCIM app secret, and rerun a test push. |
| Users sign in with SSO but have no project access | SCIM creates users with role NONE when no roles attribute is sent, so memberships exist without permissions. | Open the user's organization membership in Langfuse and check the role value after sync for a known test user. | Map the Okta role attribute to the intended Langfuse role in the SCIM app, then reprovision the test user and confirm the role. |
| Deprovisioned user can still find a user record in Langfuse | SCIM DELETE removes only the organization membership, so the user record remains by design. | Confirm the user has no membership in the organization and no remaining access path through other organizations or password sign-in. | Treat the record as expected. Block access by unassigning in Okta, disabling password sign-in and confirming the membership is gone. |
| Users are locked out after enforcing SSO for a domain | SSO was enforced for an email domain before any test user had signed in through the OIDC app. | Sign in with a test account on the domain through the Okta OIDC app and confirm access before enforcement is turned on. | Disable enforcement, confirm a working admin sign-in path, complete a test sign-in, then enforce the domain again. |
| Roles change back to NONE after a deprovision and reprovision cycle | The roles attribute was not set before provisioning was enabled, so SCIM reapplies the default NONE role. | Review the roles attribute in the Okta SCIM mappings and compare each user's role before and after the cycle. | Set the roles attribute for every assigned group, test a reprovision on one user, then restore roles for affected users before wider rollout. |
How to test Okta SCIM provisioning before the full rollout
Run the full provisioning cycle on a small pilot group before you assign the SCIM application to the wider Okta group. The reason is the roles attribute. Langfuse's SCIM endpoints create a new user with the NONE role unless a roles attribute is provided, and a deprovision and reprovision can overwrite an existing organization role with that attribute's value, which defaults to NONE. A pilot lets you observe that behavior in your own tenant with a handful of accounts. Choose pilot users who cover each organization role you plan to assign, and write down each user's expected role, Okta group membership and Langfuse project access before the first sync. Those written expectations become the baseline that every later step is checked against.
Run the cycle in order and review Langfuse after every step. First, create: assign each pilot user to the SCIM application and confirm the user appears in the organization with the expected role. Second, change the role: alter the attribute or group that drives it in Okta, push the change, and confirm the membership role updates. Third, deprovision: unassign the user, confirm the organization membership is removed, and confirm the user account still exists, because a SCIM DELETE removes only the membership. Fourth, reprovision: assign the same user again and confirm the role matches the roles attribute and the value you recorded, not NONE. After the create and reprovision steps, sign in through the separate OIDC application, because SCIM does not set passwords and sign-in depends on that app.
Record enough to prove the roles attribute held through reprovisioning. For each step, log the time, the Okta action and resulting event, the pilot user's organization membership and role as shown in Langfuse, any project access, and the sign-in result. Where you can, keep the SCIM request and response, including the roles value sent and the status returned. Store the log with the pilot plan so an internal reviewer or external auditor can trace what changed and when. Keep the record factual: it shows what happened in your environment, but on its own it does not establish that a control operates effectively. Before the first run, confirm with Langfuse the exact attribute name and payload format for your version, and confirm the attribute mapping on the SCIM application in Okta.
Plan the rollback before the first test. Note the current organization membership and role for every pilot user, so you can restore values by hand if provisioning changes them unexpectedly. Keep at least one administrator with organization-level access who can edit memberships in Langfuse without depending on the SCIM path. Know how to pause provisioning by unassigning the pilot group from the SCIM application, and know how to rotate the organization-scoped API key that SCIM uses if that credential is exposed. Agree in advance who can halt the rollout and who must be told. If a reprovisioned user lands at NONE, stop, restore the recorded role, and repeat the cycle only after the cause is fixed and documented.
Questions buyers ask before hiring help for Okta SCIM provisioning
How much does Okta SCIM provisioning for Langfuse cost?
There is no fixed price on this page. Langfuse's Self-Hosted Enterprise plan is custom-priced, and SCIM on a self-hosted instance requires an Enterprise license key, so the license is one cost line. DeployOpen's work follows from a written scope that is agreed before the engagement starts. The main cost drivers are the number of Okta applications and groups, how complex your role model is, whether identity governance already exists in your environment, and how much environment setup and testing you need before enabling provisioning. One-time costs are the implementation and testing. Recurring costs are the license, any support plan and any retainer for upgrades or ongoing work. Ask for each as a separate line item.
How long does Okta SCIM provisioning for Langfuse take?
Duration depends on the written scope, so this page does not give a timeline. Time follows the same drivers as cost: the number of Okta apps and attribute mappings, the complexity of the role model, whether an existing identity governance process must be aligned, and whether a non-production environment is available for a dry run. Confirm which Langfuse version and deployment target you operate before work starts, because Enterprise features depend on the instance. Ask for dated milestones that include a test sync with a small user group, a documented rollback step and a sign-off before any production group is assigned. Align the milestones with your change windows.
What does our team need to provide for the engagement?
Expect to provide access and decisions as well as time. You need an Okta administrator who can create two applications: an OIDC app for sign-in and a separate app for SCIM, because Okta does not support SCIM on a custom OIDC app. You also need someone with organization-level administrator rights in Langfuse, a valid Enterprise license key, and an organization-scoped API key for the SCIM endpoints. Decide the mapping from Okta groups to Langfuse roles in advance and confirm the default role for new users. Provide a non-production Langfuse instance, your change approval process, and a named owner who signs off the role matrix. Agree who owns the Okta policies after handover.
Can our own team set up Okta SCIM provisioning for Langfuse alone?
A capable team can, if it has the Okta and Langfuse skills and the time, but the risk sits in the details. SCIM creates a user with role NONE unless a roles attribute is provided, and DELETE removes only the organization membership, not the user account. The larger risk is role downgrade during deprovisioning and reprovisioning, which can overwrite a user's organization role with the SCIM roles attribute. Your team should own the Okta configuration, Langfuse administration and a written test plan that covers admin accounts. If internal capacity is limited, a fixed-scope engagement can cover the same steps with written deliverables and an agreed acceptance test.
What is the role downgrade risk during the first Okta sync?
The risk is that a sync overwrites an existing Langfuse role with a default value. Langfuse warns that SCIM deprovisioning and reprovisioning can overwrite a user's organization role with the SCIM roles attribute, which defaults to NONE. Users who already hold roles in Langfuse can lose access if Okta sends an empty or default value. Before enabling provisioning, export current organization memberships, confirm the roles attribute mapping for every Okta group, and test with a small set of accounts that includes an administrator. Keep a rollback plan that restores roles from your export, and check the results in Langfuse before expanding the assignment to more groups.
Do we need a retainer after Okta SCIM provisioning goes live?
Not always, but plan for recurring work. Ongoing support, upgrades and continuous testing are available as retainers from DeployOpen. The Self-Hosted Enterprise plan adds a named support engineer, solutions architect access and a support SLA, and Langfuse lists these in its pricing. Upgrades matter because Langfuse says updates within a major version are non-disruptive, while major upgrades change infrastructure and data models and follow separate migration guides. Role mappings also change whenever Okta groups change. Decide whether your team will own group and role changes or whether a retainer will cover them, and get the response terms in writing before you sign.
What should we ask for in a quote for Okta SCIM provisioning?
Ask for a written scope that lists each deliverable, its acceptance test and what is excluded. Request separate lines for the Langfuse Enterprise license, DeployOpen's implementation work, non-production testing, cutover support, documentation and handover, and any support plan or retainer. Ask which Okta applications are covered, how many groups and roles the mapping includes, and whether the role downgrade check is part of the work. Confirm your assumptions about the environment, including who provides Okta and Langfuse administrator access. Finally, ask which changes would alter the price, what is one-time and what recurs, and how change requests are priced.
How DeployOpen scopes and delivers Langfuse Okta integration work
DeployOpen plans and builds Langfuse Okta SSO and SCIM provisioning inside your own infrastructure, on a self-hosted Langfuse Enterprise instance. Scope starts with the two Okta applications, the role attribute mapping and the order of changes, so the role downgrade risk during initial sync is settled before anything is enabled. Work is agreed as a fixed scope in writing, and ongoing support is available as a retainer.
How we scope
- Written scope lists the OIDC app for SSO and the separate SCIM app that Okta requires for provisioning.
- Scope records which Langfuse roles each Okta group maps to and the default role when no attribute is sent.
- Fixed-scope agreement fixes deliverables and timelines in writing before work starts, and quotes follow from that scope.
How we build
- Role attributes are set before SCIM is enabled, and initial sync is tested against existing organization roles.
- Test cases cover SSO sign-in, password sign-in disablement, email domain enforcement and SCIM user creation.
- Deprovisioning tests confirm that DELETE removes only the organization membership, while the user account remains.
How we hand over
- Runbook documents both Okta apps, API key scope, attribute mappings, and the order of changes for future reviewers.
- Handover walks operators through adding, changing and removing users from Okta, with expected results.
- Evidence pack records configuration, test results and the Enterprise license dependency for your compliance files.
How we support
- Retainer support is available for SCIM mapping changes, Okta app updates and Langfuse upgrades after go-live.
- Before any Langfuse upgrade, role attribute and SCIM settings are re-checked against the release notes.
- Ask whether changes to your Okta tenant, such as app reassignment or group rules, are covered by the support terms.

