This topic explains how to use the System for Cross-domain Identity Management (SCIM) API to work with users, roles, and teams in your SSO-enabled LaunchDarkly account.
The SCIM API enables user provisioning of account members from identity providers (IdPs). SCIM enables IdPs such as Okta, OneLogin, or Entra ID to tell LaunchDarkly which users should or should not have an account, and optionally determine what level of access users have in LaunchDarkly.
SCIM uses web (REST) APIs to exchange data formatted in JSON, with a standard schema that works with two resource types: User and Group. The LaunchDarkly SCIM API maps the Group resource to LaunchDarkly teams. Group-based team sync is currently only available through the Okta integration. We provide an extension schema to work with LaunchDarkly roles. To learn more, read Teams and Roles.
If you configure SCIM to provision resources from identity providers, you can no longer manage teams using the LaunchDarkly user interface.
The SCIM API is only supported for the OAuth2 authorization type. Not all supported third-party providers support user provisioning through SCIM. To learn more about how LaunchDarkly treats users imported from the IdP, read Default initial role.
All SCIM endpoints require OAuth2 authentication with the scim scope. Regular personal access tokens will not work. You must use a SCIM-enabled OAuth client.
The following information is generally needed to configure SCIM in your IdP. The actual names for these fields may vary by IdP:
https://app.launchdarkly.com/trust/scim/v2oauth2https://app.launchdarkly.com/trust/oauth/authorizehttps://app.launchdarkly.com/trust/oauth/tokenuserNameIf you are using the LaunchDarkly app from the Okta or OneLogin catalog, authentication is handled automatically during the setup wizard.
For Entra ID or any other provider you configure manually, you will also need a Client ID and Client Secret. Start a Support ticket and we will generate these for you.
You can also use the REST API: OAuth2 Clients
This section describes all endpoints provided with the SCIM API.
All SCIM endpoints are prefixed with the base URL: https://app.launchdarkly.com/trust/scim/v2
Groups in LaunchDarkly map to teams.
The SCIM Group endpoints are used by the Okta integration to power team sync. They are not intended for direct API calls or custom SCIM integrations. If you use a different IdP, you cannot use these endpoints to manage teams. To learn more about team sync, read Team sync with SCIM.
LaunchDarkly uses the standard SCIM 2.0 user schema (urn:ietf:params:scim:schemas:core:2.0:User) and supports a custom extension schema (urn:ietf:params:scim:schemas:extension:launchdarkly:2.0:User) for LaunchDarkly-specific permissions.
While the SCIM 2.0 standard typically requires userName, LaunchDarkly’s implementation requires emails instead. The userName field is optional and defaults to the email address if not provided. Most IdPs should map their unique identifier to the userName field for proper user matching.
LaunchDarkly allows you to define roles using either the standard extension namespace or root-level attributes for convenience.
Root-level fields, such as role, take precedence over fields that are nested in the extension namespace. If both customRolesArray and customRole are provided, customRolesArray takes precedence.
You can also use the extension namespace format, which is useful for IdPs like Azure Entra ID:
You cannot create new custom attributes using the SCIM API, but you can set the role and customRole attributes for SCIM users. For SAML-based SSO, LaunchDarkly supports mapping only the role, customRole, and teamKey attributes.
To learn more about these attributes, read Roles.
For an in-depth guide on how to use custom roles with IdPs, read Creating roles.
The following fields are automatically generated by LaunchDarkly and cannot be set or modified:
Endpoint: POST /scim/v2/Users
Minimal request:
Request with custom roles (root level):
Response: 201 Created with the created user object including the LaunchDarkly id field.
Endpoint: PUT /scim/v2/Users/{id}
PUT requires the complete user object. All fields should be included.
Response: 200 OK
Endpoint: PATCH /scim/v2/Users/{id}
LaunchDarkly supports both SCIM PATCH format and JSON Patch (RFC 6902) for partial updates.
SCIM patch format:
Update custom roles:
JSON patch format (alternative):
Supported operations: add, remove, replace
Endpoint: GET /scim/v2/Users/{id}
Response: 200 OK with complete user object.
Complete response example:
Endpoint: GET /scim/v2/Users
Query parameters:
filter: SCIM filter expression (for example, userName eq "user@example.com")startIndex: 1-based starting index for paginationcount: Number of results per pageExamples:
Response:
Endpoint: POST /scim/v2/Users/.search
This is an alternative to GET /scim/v2/Users that accepts filter parameters in the request body.
Request:
Response: Same format as GET /scim/v2/Users (ListResponse)
Endpoint: DELETE /scim/v2/Users/{id}
Response: 204 No Content (or 200 OK with empty body)
Note: Deleting a user deactivates them and removes them from the account and all teams. Cannot delete an owner.
Groups in LaunchDarkly map to teams. The Group endpoints are used by the Okta integration to sync IdP groups to LaunchDarkly teams. They are not intended for direct API calls or custom SCIM integrations.
To manage teams through Okta, enable team sync with SCIM in LaunchDarkly, and then manage teams through Group Push in Okta. To learn more, read Use Okta to manage LaunchDarkly teams with SCIM.
All errors follow the SCIM error format:
To learn more about how to remediate SCIM assertion consumer errors, read SSO SCIM Error Messages.
"owner" role (returns 400 error: “Cannot create an owner”)You cannot update attributes (name, role, and so forth) on a user who is currently deactivated (active: false). You must reactivate them first or simultaneously with the update.
When assigning custom roles, you must use the role key, and not the human-readable name or ID. Custom roles must exist in the account before they can be assigned.
Email addresses must be unique within an account. If you attempt to provision a user with an email that already exists, you will receive a 409 Conflict error.
givenName and familyName must be ≤ 256 characters each"reader", "writer", "admin", or "noAccess"For Okta requests (identified by User-Agent header starting with “okta”), the customRole string field is not included in responses. Only customRolesArray is returned.
LaunchDarkly’s implementation is lenient and will accept root-level extension attributes (role, customRole, customRolesArray) even if the extension schema is not declared in the schemas array. However, for strict SCIM 2.0 compliance, include urn:ietf:params:scim:schemas:extension:launchdarkly:2.0:User in the schemas array when using these attributes.