Inbound OAuth¶
Inbound OAuth allows user authentication to the DataRobot API using access tokens from an identity provider (IdP). This identity federation pattern builds on OAuth 2.0 token exchange (RFC 8693). Instead of issuing DataRobot API keys, configure DataRobot to trust tokens that your IdP (e.g. Okta, Microsoft Entra ID, Ping, or Auth0) already issues. A caller exchanges an IdP access token for a temporary DataRobot access token, and then sends that token as a bearer token on DataRobot API requests.
With this "bring your own IdP" model, users authenticate to the DataRobot API with their existing credentials. Administrators configure the trusted IdP, optional just-in-time (JIT) user provisioning, and how IdP groups, scopes, and organizations map to DataRobot.
Note
Inbound OAuth handles inbound API authentication: external callers authenticating to DataRobot. It is distinct from outbound OAuth, where DataRobot authenticates to a third-party service on your behalf.
Availability information
Inbound OAuth has no license requirement, but it isn't enabled by default. DataRobot must enable it for your organization through an application configuration. If it isn't enabled, contact your DataRobot representative.
Required permission: Organization or System Administrator
On the Managed AI Platform, the high-level workflow to configure inbound OAuth for an organization is as follows:
- Review and complete the prerequisites.
- Register a trusted IdP and optionally, enable JIT user provisioning.
- Define mapping for attributes, groups, and scopes so DataRobot resolves each token to the right user and resources.
- Share the developer workflow with your API developers.
Availability information
Required permission: System Administrator (global configuration) or Organization Administrator (organization configuration)
Required cluster configuration: enable exactly one of the following:
ENABLE_GLOBAL_EXTERNAL_APPLICATION_AUTHENTICATION=TrueENABLE_ORGANIZATION_EXTERNAL_APPLICATION_AUTHENTICATION=True
On the Self-Managed AI Platform, configure inbound OAuth globally (one configuration for the whole application) or per organization. The basic workflow is as follows:
- Review and complete the prerequisites.
- Enable the feature through cluster configuration and choose a configuration scope.
- Register a trusted IdP and, optionally, enable JIT user provisioning.
- Define mapping for attributes, groups, scopes, and organizations.
- Set advanced options for JWKS caching and token validation.
How it works¶
Inbound OAuth adds a token exchange step when authenticating to the DataRobot API. Your IdP remains the source of truth for identity; DataRobot validates the IdP token, resolves it to a DataRobot user, and issues its own temporary access token for the API.
sequenceDiagram
participant Client as User
participant IdP as Your IdP
participant DR as DataRobot token exchange
participant API as DataRobot API
Client->>IdP: Sign in
IdP-->>Client: IdP access token
Client->>DR: Exchange IdP token (RFC 8693)
DR->>IdP: Fetch JWKS keys and validate token
DR->>DR: Resolve user (JIT provision if new) and map groups
DR-->>Client: DataRobot access token
Client->>API: Request with Bearer DataRobot token
API-->>Client: Response
- Token exchange—DataRobot validates the IdP token against the keys published at the IdP's JWKS URI, confirms it carries the required
dr.impersonationscope, then issues a DataRobot access token that is accepted by DataRobot API endpoints. The token exchange follows RFC 8693. - JIT user provisioning—when a valid token arrives for a user who does not yet exist in DataRobot, DataRobot can create the account automatically from the token claims. See User provisioning.
- Group mapping—groups in the IdP token map to DataRobot groups, which control the user's access to resources such as AI agents. See Mapping reference.
Prerequisites¶
You must meet the following prerequisites before configuring inbound OAuth:
- SAML single sign-on is enabled for your organization, or enhanced global SAML SSO is enabled for your cluster. Inbound OAuth requires SAML SSO and isn't available to organizations that authenticate users only through LDAP or DataRobot username and password login.
- Inbound OAuth is enabled for your organization or cluster.
- You have the Organization or System Administrator role. The administrator is responsible for configuring inbound OAuth.
- You have an IdP (e.g. Okta, Microsoft Entra ID, Ping, or Auth0) that issues OAuth 2.0 access tokens and publishes a JWKS URI.
- Your IdP can issue access tokens for DataRobot with two required properties: the
dr.impersonationscope, and an audience (aud) that matches the value DataRobot shows in OAuth Details. DataRobot validates both on every token; a missing scope denies user access, and a mismatched audience is rejected asinvalid_target. See OAuth details and Scope mapping. - You know the IdP
issuerURL andjwksUri, and the claim names the IdP uses for usernames, groups, and scopes.
Important
Inbound OAuth requires SAML single sign-on. Because users provisioned through inbound OAuth authenticate exclusively with external tokens (never a DataRobot password), your organization must already federate identity through an external IdP. Until SAML SSO is enabled, the Enabled toggle on the configuration page remains unavailable and displays the message Enable SAML SSO for the organization to use this feature (or Enable enhanced global SAML SSO to use this feature for a global configuration). All other fields remain editable, so you can prepare the configuration before SSO is in place. Confirm your configuration with your DataRobot representative before beginning.
Contact your DataRobot representative to enable inbound OAuth and, if necessary, to set up the first administrator.
Configuration scope¶
Inbound OAuth supports two configuration scopes; however, only one scope can be active at a time.
| Scope | Who configures it | Environments | Description |
|---|---|---|---|
| Global | System Administrator | Self-Managed, single-tenant SaaS | One configuration for the whole application. Works with the default organization or routes users to multiple organizations through organization mapping. |
| Organization | System or Organization Administrator | managed AI Platform, single-tenant SaaS, Self-Managed | A separate configuration per organization. Configure multiple organizations independently, each with its own IdP and mapping. |
Note
The inbound OAuth configuration scope must match your single sign-on (SSO) scope: a global inbound OAuth configuration requires global SSO, and an organization configuration requires organization-level SSO.
Configure inbound OAuth¶
To configure inbound OAuth in DataRobot, navigate to Admin settings > External Application. System administrators must first select an organization to access this page. The path entered here depends on the configuration scope:
| Scope | Path |
|---|---|
| Global | /admin/external-application-configuration |
| Organization | /admin/org-external-application-configuration |
This table lists the settings found on the configuration page:
| Label | Section | Description |
|---|---|---|
| 1 | OAuth Authentication | Enable or disable OAuth authentication for an external application. |
| 2 | OAuth Details | Read-only, DataRobot-provided values your callers use: the token exchange endpoint, the token audience, and the DataRobot JWKS URI. |
| 3 | External IdP Configuration | The external issuer and JWKS URI DataRobot uses to validate incoming IdP tokens. |
| 4 | User Provisioning | Enable automatic provisioning of new users. |
| 5 | Mapping | Map IdP token claims to DataRobot user attributes, groups, and scopes. Global configurations also have an Organizations tab. |
| 6 | Advanced Options | Set how often DataRobot refreshes the IdP JWKS keys. |
OAuth details¶
The OAuth Details section shows read-only values that DataRobot generates for the configuration. Share them with your developers, who set them in the token-exchange client. See the developer workflow for how each value is used.
| Field | Description |
|---|---|
| Token exchange endpoint | The DataRobot endpoint a caller posts an IdP token to in exchange for a DataRobot access token. It includes the organization ID for an organization configuration. |
| Audience | The audience (aud) value DataRobot requires in the exchanged token. |
| JWKS URI | The URI where DataRobot publishes the keys used to validate DataRobot-issued access tokens. |
External IdP configuration¶
In the External IdP Configuration section, identify the IdP that DataRobot trusts and where it fetches the signing keys used to validate incoming tokens.
| Field | Required | Description |
|---|---|---|
| External issuer | Yes | The issuer (iss) claim value to validate in incoming external JWT tokens. Tokens are accepted only if their issuer matches this value. |
| External JWKS URI | Yes | The URI to fetch the JSON Web Key Set (JWKS) for validating incoming external JWT tokens. DataRobot caches these keys (see Advanced options). |
Note
The External JWKS URI is your IdP's key set, used to validate incoming tokens. It is different from the DataRobot JWKS URI shown in OAuth Details, which publishes DataRobot's own signing keys (/.well-known/jwks.json) for validating DataRobot-issued tokens.
Configure your identity provider¶
Set up your IdP so the access tokens it issues meet DataRobot's requirements: the token's issuer matches the External issuer you enter above, its audience (aud) matches the value in OAuth Details, and it carries the dr.impersonation scope. The steps differ by provider.
- Create a custom authorization server. In the Okta Admin Console, go to Security > API > Authorization Servers and use or create a server dedicated to DataRobot.
- The server's Issuer URI (for example,
https://YOUR_ORG.okta.com/oauth2/ausXXXXXXXX) is the value you enter as External issuer. - Its JWKS URI is the issuer with
/v1/keysappended; enter it as External JWKS URI.
- The server's Issuer URI (for example,
- Add the
dr.impersonationscope. On the authorization server, go to Scopes > Add Scope and add a scope nameddr.impersonation. DataRobot validates this scope on every token; without it, user access is denied. - Set the audience. Copy External Application > OAuth Details > Audience from DataRobot (it looks like
https://YOUR_DATAROBOT_HOST/ORGANIZATION_ID) and set the authorization server's Audience to exactly that value. A mismatch fails the exchange withinvalid_target. If the server must serve other audiences, create a dedicated server for DataRobot. - Add an access policy. On the authorization server, go to Access Policies and add a policy and rule that allow your app to request the
dr.impersonationscope. - Create an app integration. Create an OIDC app that uses the Authorization Code flow (with PKCE), and assign the users who need API access. Your API clients use this app to sign users in and obtain tokens. Okta typically disables the Resource Owner Password grant, so use Authorization Code.
- Confirm the claims. Make sure the access token carries the claims your mapping expects: username (Okta uses
subby default), scopes (Okta usesscp), and agroupsclaim if you use group mapping.
- Register an app to represent DataRobot. In the Microsoft Entra admin center, go to App registrations > New registration. Open the new registration's Expose an API page and set the Application ID URI to the DataRobot audience from External Application > OAuth Details > Audience (for example,
https://YOUR_DATAROBOT_HOST/ORGANIZATION_ID). This value becomes the token'saud. A custom identifier URI like this requires the v2.0 access token format. - Expose the
dr.impersonationscope. Still under Expose an API, select Add a scope and add a scope nameddr.impersonation. - Set the issuer and JWKS URI. Open your tenant's OpenID configuration at
https://login.microsoftonline.com/TENANT_ID/v2.0/.well-known/openid-configuration. Enter itsissuervalue as External issuer and itsjwks_urivalue as External JWKS URI. Match the token version your app issues (a v2.0 issuer looks likehttps://login.microsoftonline.com/TENANT_ID/v2.0). - Grant the client app access. In the client app registration your users sign in with, go to API permissions, add the
dr.impersonationscope you exposed, and grant admin consent. Assign the users who need API access. - Confirm the claims. Entra access tokens carry scopes in
scpand the username inpreferred_username(orupn); map these in mapping. For group mapping, add the groups claim under the app's Token configuration.
User provisioning¶
In the User provisioning section, choose whether DataRobot creates accounts automatically.
| Field | Description |
|---|---|
| Auto-generate users | If enabled, DataRobot provisions a new user account the first time a valid token arrives for a user who does not yet exist. The account is created from the token claims and added to the mapped organization. |
When inbound OAuth provisions a user, DataRobot:
- Extracts the username and, if mapped, the display name, first name, last name, email, and groups from the token claims.
- Creates and activates the DataRobot account, assigning a non-builder seat if one is available.
- Adds the user to the mapped DataRobot groups.
Note
If no non-builder seat is available, provisioning still succeeds; the user is created without a seat rather than blocked.
Configure via the API¶
You can manage inbound OAuth configurations programmatically instead of through the UI, which is useful for automation and infrastructure-as-code. Use the externalApplicationConfigurations endpoint with a personal or application API key that has administrator permissions.
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v2/externalApplicationConfigurations/ (global) or /api/v2/externalApplicationConfigurations/ORGANIZATION_ID/ (organization) |
Retrieve a configuration. |
POST |
Same as GET |
Create a configuration. |
PATCH |
Same as GET |
Update a configuration. clientId and organizationId are immutable. |
The following request creates an organization-level configuration:
curl --location -X POST \
"${DATAROBOT_ENDPOINT}/externalApplicationConfigurations/ORGANIZATION_ID/" \
--header "Authorization: Bearer ${DATAROBOT_API_TOKEN}" \
--header "Content-Type: application/json" \
--data '{
"isEnabled": true,
"issuer": "https://customer.okta.com/oauth2/default",
"jwksUri": "https://customer.okta.com/oauth2/default/v1/keys",
"autoGenerateUsers": true,
"groupDelimiter": ",",
"scopeDelimiter": ",",
"attributesMapping": {
"username": "preferred_username",
"firstName": "given_name",
"lastName": "family_name",
"email": "email",
"groups": "groups",
"scopes": "scope"
},
"groupMapping": {
"idp-group-name": "682d0a4b857826ab7c447136"
},
"advancedConfiguration": {
"jwksRefreshIntervalSeconds": 3600
}
}'
The following table describes the configuration options:
| Option | Required | Type | Default | Limits | Description |
|---|---|---|---|---|---|
organizationId |
ObjectId | None | 24 | ID of the target organization. Omit for a global configuration. Immutable. | |
isEnabled |
Yes | Boolean | false |
Whether the configuration is active. | |
issuer |
Yes | String | "" |
256 | The issuer URL of the identity provider. |
jwksUri |
Yes | String | "" |
256 | The JWKS URI of the identity provider. |
autoGenerateUsers |
Yes | Boolean | false |
If true, automatically provision users on first login via the IdP. |
|
groupDelimiter |
String | "" |
4 | Delimiter used to split group claims. | |
scopeDelimiter |
String | "" |
4 | Delimiter used to split scope claims. | |
clientId |
String | Auto | Auto-generated unique client identifier. Immutable. | ||
attributesMapping.username |
Yes | String | "" |
128 | Claim name for the username. |
attributesMapping.displayName |
String | "" |
128 | Claim name for the display name. | |
attributesMapping.firstName |
String | "" |
128 | Claim name for the first name. | |
attributesMapping.lastName |
String | "" |
128 | Claim name for the last name. | |
attributesMapping.email |
String | "" |
128 | Claim name for the email. | |
attributesMapping.groups |
String | "" |
128 | Claim name for the groups. | |
attributesMapping.scopes |
Yes | String | "" |
128 | Claim name for the scopes. The mapped claim must include the required dr.impersonation scope. |
attributesMapping.organization |
String | "" |
128 | Claim name for the organization. Organization scope only. | |
groupMapping |
Dictionary | {} |
Mapping of IdP group names to DataRobot group IDs. | ||
organizationMapping |
Dictionary | {} |
Mapping of IdP organization names to DataRobot organization IDs. Global scope only. | ||
groupMappingPerOrganization |
Dictionary | {} |
Group mapping per organization. Global scope only. | ||
advancedConfiguration.jwksRefreshIntervalSeconds |
Number | 3600 |
0–604800 | Interval, in seconds, for refreshing JWKS keys. |
Mapping reference¶
Mapping tells DataRobot how to translate the claims in an IdP token into DataRobot users, groups, scopes, and organizations. The model is the same one used for SAML SSO.
Attribute mapping¶
On the Attributes tab, set the claim name DataRobot reads for each user attribute. Because DataRobot and your IdP may use different names, this tab maps the IdP claim to the DataRobot field. The username claim is required; the others are optional. Set the group and scope claim names on the Groups and Scopes tabs.
| DataRobot attribute | Example claim | Required |
|---|---|---|
| Display name | name |
|
| Username | preferred_username |
Yes |
| First name | given_name |
|
| Last name | family_name |
|
email |
Group mapping¶
Group mapping is optional. Use it to control which resources (such as AI agents) a user can access by mapping IdP groups to existing DataRobot groups. You can map by DataRobot group ID to IdP group ID or to IdP group name, the same approach used for SAML SSO. Each mapping consists of a DataRobot group paired with an IdP group.
| Field | Description |
|---|---|
| Group attribute | The claim that identifies group names in the token. |
| Group delimiter | The delimiter between group names when the claim is a single delimited string. |
| DataRobot group | The existing DataRobot group to assign the user to. |
| Identity provider group | The IdP group the user belongs to. |
Scope mapping¶
Scope mapping is required for user token exchange. DataRobot validates that each incoming token carries the dr.impersonation scope before it grants access, so you must map the claim DataRobot reads scopes from (typically scp or scope), and your IdP must include dr.impersonation in the tokens it issues. If a user's token doesn't carry dr.impersonation, DataRobot rejects the exchange and the user gets no access.
| Field | Required | Description |
|---|---|---|
| Scope attribute | Yes | The claim that identifies scopes in the token (for example, scp or scope). |
| Scope delimiter | The delimiter between scopes when the claim is a single delimited string. |
Important
Configure your IdP to include the dr.impersonation scope in the access tokens users present for exchange. Without it, DataRobot doesn't grant API access to the user. Share this requirement with your developers, who set it up in your IdP's authorization server or app registration.
Organization mapping¶
Organization mapping is only available for global configurations, and is optional. It maps IdP organizations to existing DataRobot organizations, the same way global SAML SSO does. If a token has no mapped organization, or the user belongs to no organization, DataRobot assigns the user to the default organization from System Configuration. Each mapping consists of a DataRobot organization paired with an IdP organization.
| Field | Description |
|---|---|
| Organization attribute | The claim that identifies the organization in the token. |
| DataRobot organization | The existing DataRobot organization to assign the user to. |
| Identity provider organization | The IdP organization the user belongs to. |
For a global configuration, you can also define separate group mapping per organization, so each organization keeps its own group mapping.
Advanced options¶
The following options tune JWKS caching and token validation. Availability depends on your platform, as shown in the Platforms column.
- JWKS refresh interval—set per configuration in Admin settings (the Advanced Options section) or through the config API. Available on all platforms.
- Cluster configuration options—apply to the whole application, not a single configuration. On the Self-Managed AI Platform, your system administrator sets them. On SaaS, DataRobot manages them; contact DataRobot Support to request a change.
| Configuration | Set via | Platforms | Default | Description |
|---|---|---|---|---|
jwksRefreshIntervalSeconds |
Admin UI or config API | SaaS, Self-Managed | 3600 |
How often DataRobot refreshes cached JWKS keys, in seconds (0–604800). |
DR_JWT_JWKS_URI_FRESHNESS |
Cluster configuration | Self-Managed (DataRobot-managed on SaaS) | 600 |
JWKS cache freshness, in seconds, for the application. |
DR_JWT_LEEWAY |
Cluster configuration | Self-Managed (DataRobot-managed on SaaS) | 0 |
Seconds past a token's exp claim that a token is still accepted, to tolerate clock skew. |
EXTERNAL_APPLICATION_AUTHENTICATION_JWKS_URI_PROXY |
Cluster configuration | Self-Managed (DataRobot-managed on SaaS) | {} |
Proxy for outbound JWKS requests, defined per protocol (http, https). |
DR_JWT_AUDIENCE_OVERRIDE |
Cluster configuration | Self-Managed (DataRobot-managed on SaaS) | "" |
Overrides the base URL of the token audience for the whole application. |
Audit logs¶
Inbound OAuth records the following events in the User Activity Monitor:
| Event | Description |
|---|---|
| External token exchanged | An IdP token was exchanged for a DataRobot access token. |
| Inbound OAuth configuration created | An administrator created a configuration. |
| Inbound OAuth configuration updated | An administrator updated a configuration. |
FAQ¶
How do I let users authenticate to the DataRobot API with Okta, Microsoft Entra ID, or my own IdP?¶
Configure inbound OAuth to trust your IdP, then have developers exchange their IdP token for a DataRobot access token. See Configure inbound OAuth for the admin setup and the developer workflow for the token-exchange steps.
What's the difference between inbound OAuth and SSO?¶
SAML SSO authenticates users to the DataRobot web application in the browser. Inbound OAuth authenticates users to the DataRobot API by exchanging an IdP access token for a DataRobot token. The two are complementary, and SAML SSO is a prerequisite for inbound OAuth, because both rely on your organization federating identity through an external IdP.
Do provisioned users consume a seat?¶
A JIT-provisioned user is assigned a non-builder seat if one is available. If none is available, the account is still created without a seat.
Related¶
- Authenticate to the DataRobot API with inbound OAuth—the developer token-exchange workflow.
- SAML single sign-on—browser-based user authentication.
- SCIM provisioning—automated user lifecycle management.
- Role-based access control (RBAC)—roles and privileges.