// POST /v1/b2b/oauth/discovery/authenticate
const stytch = require('stytch');
const client = new stytch.B2BClient({
project_id: '${projectId}',
secret: '${secret}',
});
const params = {
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
};
client.OAuth.Discovery.Authenticate(params)
.then(resp => { console.log(resp) })
.catch(err => { console.log(err) });// POST /v1/b2b/oauth/discovery/authenticate
package main
import (
"context"
"log"
"github.com/stytchauth/stytch-go/v18/stytch/b2b/b2bstytchapi"
"github.com/stytchauth/stytch-go/v18/stytch/b2b/oauth/discovery"
)
func main() {
client, err := b2bstytchapi.NewClient(
"${projectId}",
"${secret}",
)
if err != nil {
log.Fatalf("error instantiating client: %v", err)
}
params := &discovery.AuthenticateParams{
DiscoveryOAuthToken: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
}
resp, err := client.OAuth.Discovery.Authenticate(context.Background(), params)
if err != nil {
log.Fatalf("error in method call: %v", err)
}
log.Println(resp)
}
// POST /v1/b2b/oauth/discovery/authenticate
package com.example;
import com.stytch.java.b2b.models.oauthdiscovery.AuthenticateRequest;
import com.stytch.java.b2b.StytchB2BClient;
import com.stytch.java.common.StytchResult;
public class Main {
public static void main(String[] args) {
StytchB2BClient.configure("${projectId}", "${secret}");
AuthenticateRequest params = new AuthenticateRequest();
params.setDiscoveryOAuthToken("hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g");
Object result = StytchB2BClient.getOAuth().getDiscovery().authenticate(params);
if (result instanceof StytchResult.Success) {
System.out.println(((StytchResult.Success) result).getValue());
} else {
System.out.println(((StytchResult.Error) result).getException());
}
}
}// POST /v1/b2b/oauth/discovery/authenticate
package com.example
import com.stytch.java.b2b.StytchB2BClient
import com.stytch.java.b2b.models.oauthdiscovery.AuthenticateRequest
fun main() {
StytchB2BClient.configure(
projectId = "${projectId}",
secret = "${secret}",
)
when (
val result =
StytchB2BClient.oauth.discovery.authenticate(
AuthenticateRequest(
discoveryOAuthToken = "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
),
)
) {
is StytchResult.Success -> println(result.value)
is StytchResult.Error -> println(result.exception)
}
}
// POST /v1/b2b/oauth/discovery/authenticate
const stytch = require('stytch');
const client = new stytch.B2BClient({
project_id: '${projectId}',
secret: '${secret}',
});
const params = {
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
};
client.oauth.discovery.authenticate(params)
.then(resp => { console.log(resp) })
.catch(err => { console.log(err) });$response = $client->oauth->discovery->authenticate([
'discovery_oauth_token' => 'hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g',
]);# POST /v1/b2b/oauth/discovery/authenticate
from stytch import B2BClient
client = B2BClient(
project_id="${projectId}",
secret="${secret}",
)
resp = client.oauth.discovery.authenticate(
discovery_oauth_token="hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
)
print(resp)
# frozen_string_literal: true
# POST /v1/b2b/oauth/discovery/authenticate
require 'stytch'
client = StytchB2B::Client.new(
project_id: "${projectId}",
secret: "${secret}"
)
resp = client.oauth.discovery.authenticate(
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g"
)
puts resp// POST /v1/b2b/oauth/discovery/authenticate
use stytch::b2b::client::Client;
use stytch::b2b::oauth_discovery::AuthenticateRequest;
fn main() {
let client = Client::new("${projectId}", "${secret}").unwrap();
let resp = client.oauth.discovery.authenticate(
AuthenticateRequest{
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
..Default::default()
}
).await;
println!("The response is {:?}", resp);
}# POST /v1/b2b/oauth/discovery/authenticate
curl --request POST \
--url https://test.stytch.com/v1/b2b/oauth/discovery/authenticate \
-u '${projectId}:${secret}' \
-H 'Content-Type: application/json' \
-d '{
"discovery_oauth_token": "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g"
}'{
"request_id": "<string>",
"intermediate_session_token": "<string>",
"email_address": "<string>",
"discovered_organizations": [
{
"member_authenticated": true,
"organization": {
"organization_id": "<string>",
"organization_name": "<string>",
"organization_logo_url": "<string>",
"organization_slug": "<string>",
"sso_jit_provisioning": "<string>",
"sso_jit_provisioning_allowed_connections": [
"<string>"
],
"sso_active_connections": [
{
"connection_id": "<string>",
"display_name": "<string>",
"identity_provider": "<string>"
}
],
"email_allowed_domains": [
"<string>"
],
"email_jit_provisioning": "<string>",
"email_invites": "<string>",
"auth_methods": "<string>",
"allowed_auth_methods": [
"<string>"
],
"mfa_policy": "<string>",
"rbac_email_implicit_role_assignments": [
{
"domain": "<string>",
"role_id": "<string>"
}
],
"mfa_methods": "<string>",
"allowed_mfa_methods": [
"<string>"
],
"oauth_tenant_jit_provisioning": "<string>",
"claimed_email_domains": [
"<string>"
],
"first_party_connected_apps_allowed_type": "<string>",
"allowed_first_party_connected_apps": [
"<string>"
],
"third_party_connected_apps_allowed_type": "<string>",
"allowed_third_party_connected_apps": [
"<string>"
],
"custom_roles": [
{
"role_id": "<string>",
"description": "<string>",
"permissions": [
{
"resource_id": "<string>",
"actions": [
"<string>"
]
}
]
}
],
"trusted_metadata": {},
"created_at": "<string>",
"updated_at": "<string>",
"organization_external_id": "<string>",
"sso_default_connection_id": "<string>",
"scim_active_connection": {
"connection_id": "<string>",
"display_name": "<string>",
"bearer_token_last_four": "<string>",
"bearer_token_expires_at": "<string>"
},
"allowed_oauth_tenants": {}
},
"membership": {
"type": "<string>",
"details": {},
"member": {
"organization_id": "<string>",
"member_id": "<string>",
"email_address": "<string>",
"status": "<string>",
"name": "<string>",
"sso_registrations": [
{
"connection_id": "<string>",
"external_id": "<string>",
"registration_id": "<string>",
"sso_attributes": {}
}
],
"is_breakglass": true,
"member_password_id": "<string>",
"oauth_registrations": [
{
"provider_type": "<string>",
"provider_subject": "<string>",
"member_oauth_registration_id": "<string>",
"profile_picture_url": "<string>",
"locale": "<string>"
}
],
"email_address_verified": true,
"mfa_phone_number_verified": true,
"is_admin": true,
"totp_registration_id": "<string>",
"retired_email_addresses": [
{
"email_id": "<string>",
"email_address": "<string>"
}
],
"is_locked": true,
"mfa_enrolled": true,
"mfa_phone_number": "<string>",
"default_mfa_method": "<string>",
"roles": [
{
"role_id": "<string>",
"sources": [
{
"type": "<string>",
"details": {}
}
]
}
],
"trusted_metadata": {},
"untrusted_metadata": {},
"created_at": "<string>",
"updated_at": "<string>",
"scim_registration": {
"connection_id": "<string>",
"registration_id": "<string>",
"external_id": "<string>",
"scim_attributes": {
"user_name": "<string>",
"id": "<string>",
"external_id": "<string>",
"active": true,
"groups": [
{
"value": "<string>",
"display": "<string>"
}
],
"display_name": "<string>",
"nick_name": "<string>",
"profile_url": "<string>",
"user_type": "<string>",
"title": "<string>",
"preferred_language": "<string>",
"locale": "<string>",
"timezone": "<string>",
"emails": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"phone_numbers": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"addresses": [
{
"formatted": "<string>",
"street_address": "<string>",
"locality": "<string>",
"region": "<string>",
"postal_code": "<string>",
"country": "<string>",
"type": "<string>",
"primary": true
}
],
"ims": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"photos": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"entitlements": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"roles": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"x509certificates": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"name": {
"formatted": "<string>",
"family_name": "<string>",
"given_name": "<string>",
"middle_name": "<string>",
"honorific_prefix": "<string>",
"honorific_suffix": "<string>"
},
"enterprise_extension": {
"employee_number": "<string>",
"cost_center": "<string>",
"division": "<string>",
"department": "<string>",
"organization": "<string>",
"manager": {
"value": "<string>",
"ref": "<string>",
"display_name": "<string>"
}
}
}
},
"external_id": "<string>",
"lock_created_at": "<string>",
"lock_expires_at": "<string>"
}
},
"primary_required": {
"allowed_auth_methods": [
"<string>"
]
},
"mfa_required": {
"member_options": {
"mfa_phone_number": "<string>",
"totp_registration_id": "<string>"
},
"secondary_auth_initiated": "<string>"
}
}
],
"provider_type": "<string>",
"provider_tenant_id": "<string>",
"provider_tenant_ids": [
"<string>"
],
"full_name": "<string>",
"status_code": 123,
"intermediate_session_token_expires_at": "<string>"
}{
"status_code": 401,
"request_id": "request-id-test-b05c992f-ebdc-489d-a754-c7e70ba13141",
"error_type": "unauthorized_credentials",
"error_message": "Unauthorized credentials.",
"error_url": "https://stytch.com/docs/api/errors/401"
}{
"status_code": 429,
"request_id": "request-id-test-b05c992f-ebdc-489d-a754-c7e70ba13141",
"error_type": "too_many_requests",
"error_message": "Too many requests have been made.",
"error_url": "https://stytch.com/docs/api/errors/429"
}{
"status_code": 500,
"request_id": "request-id-test-b05c992f-ebdc-489d-a754-c7e70ba13141",
"error_type": "internal_server_error",
"error_message": "Oops, something seems to have gone wrong, please reach out to support@stytch.com to let us know what went wrong.",
"error_url": "https://stytch.com/docs/api/errors/500"
}Authenticate OAuth Discovery Token
Exchange a Discovery OAuth token for an Intermediate Session Token
// POST /v1/b2b/oauth/discovery/authenticate
const stytch = require('stytch');
const client = new stytch.B2BClient({
project_id: '${projectId}',
secret: '${secret}',
});
const params = {
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
};
client.OAuth.Discovery.Authenticate(params)
.then(resp => { console.log(resp) })
.catch(err => { console.log(err) });// POST /v1/b2b/oauth/discovery/authenticate
package main
import (
"context"
"log"
"github.com/stytchauth/stytch-go/v18/stytch/b2b/b2bstytchapi"
"github.com/stytchauth/stytch-go/v18/stytch/b2b/oauth/discovery"
)
func main() {
client, err := b2bstytchapi.NewClient(
"${projectId}",
"${secret}",
)
if err != nil {
log.Fatalf("error instantiating client: %v", err)
}
params := &discovery.AuthenticateParams{
DiscoveryOAuthToken: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
}
resp, err := client.OAuth.Discovery.Authenticate(context.Background(), params)
if err != nil {
log.Fatalf("error in method call: %v", err)
}
log.Println(resp)
}
// POST /v1/b2b/oauth/discovery/authenticate
package com.example;
import com.stytch.java.b2b.models.oauthdiscovery.AuthenticateRequest;
import com.stytch.java.b2b.StytchB2BClient;
import com.stytch.java.common.StytchResult;
public class Main {
public static void main(String[] args) {
StytchB2BClient.configure("${projectId}", "${secret}");
AuthenticateRequest params = new AuthenticateRequest();
params.setDiscoveryOAuthToken("hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g");
Object result = StytchB2BClient.getOAuth().getDiscovery().authenticate(params);
if (result instanceof StytchResult.Success) {
System.out.println(((StytchResult.Success) result).getValue());
} else {
System.out.println(((StytchResult.Error) result).getException());
}
}
}// POST /v1/b2b/oauth/discovery/authenticate
package com.example
import com.stytch.java.b2b.StytchB2BClient
import com.stytch.java.b2b.models.oauthdiscovery.AuthenticateRequest
fun main() {
StytchB2BClient.configure(
projectId = "${projectId}",
secret = "${secret}",
)
when (
val result =
StytchB2BClient.oauth.discovery.authenticate(
AuthenticateRequest(
discoveryOAuthToken = "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
),
)
) {
is StytchResult.Success -> println(result.value)
is StytchResult.Error -> println(result.exception)
}
}
// POST /v1/b2b/oauth/discovery/authenticate
const stytch = require('stytch');
const client = new stytch.B2BClient({
project_id: '${projectId}',
secret: '${secret}',
});
const params = {
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
};
client.oauth.discovery.authenticate(params)
.then(resp => { console.log(resp) })
.catch(err => { console.log(err) });$response = $client->oauth->discovery->authenticate([
'discovery_oauth_token' => 'hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g',
]);# POST /v1/b2b/oauth/discovery/authenticate
from stytch import B2BClient
client = B2BClient(
project_id="${projectId}",
secret="${secret}",
)
resp = client.oauth.discovery.authenticate(
discovery_oauth_token="hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
)
print(resp)
# frozen_string_literal: true
# POST /v1/b2b/oauth/discovery/authenticate
require 'stytch'
client = StytchB2B::Client.new(
project_id: "${projectId}",
secret: "${secret}"
)
resp = client.oauth.discovery.authenticate(
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g"
)
puts resp// POST /v1/b2b/oauth/discovery/authenticate
use stytch::b2b::client::Client;
use stytch::b2b::oauth_discovery::AuthenticateRequest;
fn main() {
let client = Client::new("${projectId}", "${secret}").unwrap();
let resp = client.oauth.discovery.authenticate(
AuthenticateRequest{
discovery_oauth_token: "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g",
..Default::default()
}
).await;
println!("The response is {:?}", resp);
}# POST /v1/b2b/oauth/discovery/authenticate
curl --request POST \
--url https://test.stytch.com/v1/b2b/oauth/discovery/authenticate \
-u '${projectId}:${secret}' \
-H 'Content-Type: application/json' \
-d '{
"discovery_oauth_token": "hdPVZHHX0UoRa7hJTuuPHi1vlddffSnoweRbVFf5-H8g"
}'{
"request_id": "<string>",
"intermediate_session_token": "<string>",
"email_address": "<string>",
"discovered_organizations": [
{
"member_authenticated": true,
"organization": {
"organization_id": "<string>",
"organization_name": "<string>",
"organization_logo_url": "<string>",
"organization_slug": "<string>",
"sso_jit_provisioning": "<string>",
"sso_jit_provisioning_allowed_connections": [
"<string>"
],
"sso_active_connections": [
{
"connection_id": "<string>",
"display_name": "<string>",
"identity_provider": "<string>"
}
],
"email_allowed_domains": [
"<string>"
],
"email_jit_provisioning": "<string>",
"email_invites": "<string>",
"auth_methods": "<string>",
"allowed_auth_methods": [
"<string>"
],
"mfa_policy": "<string>",
"rbac_email_implicit_role_assignments": [
{
"domain": "<string>",
"role_id": "<string>"
}
],
"mfa_methods": "<string>",
"allowed_mfa_methods": [
"<string>"
],
"oauth_tenant_jit_provisioning": "<string>",
"claimed_email_domains": [
"<string>"
],
"first_party_connected_apps_allowed_type": "<string>",
"allowed_first_party_connected_apps": [
"<string>"
],
"third_party_connected_apps_allowed_type": "<string>",
"allowed_third_party_connected_apps": [
"<string>"
],
"custom_roles": [
{
"role_id": "<string>",
"description": "<string>",
"permissions": [
{
"resource_id": "<string>",
"actions": [
"<string>"
]
}
]
}
],
"trusted_metadata": {},
"created_at": "<string>",
"updated_at": "<string>",
"organization_external_id": "<string>",
"sso_default_connection_id": "<string>",
"scim_active_connection": {
"connection_id": "<string>",
"display_name": "<string>",
"bearer_token_last_four": "<string>",
"bearer_token_expires_at": "<string>"
},
"allowed_oauth_tenants": {}
},
"membership": {
"type": "<string>",
"details": {},
"member": {
"organization_id": "<string>",
"member_id": "<string>",
"email_address": "<string>",
"status": "<string>",
"name": "<string>",
"sso_registrations": [
{
"connection_id": "<string>",
"external_id": "<string>",
"registration_id": "<string>",
"sso_attributes": {}
}
],
"is_breakglass": true,
"member_password_id": "<string>",
"oauth_registrations": [
{
"provider_type": "<string>",
"provider_subject": "<string>",
"member_oauth_registration_id": "<string>",
"profile_picture_url": "<string>",
"locale": "<string>"
}
],
"email_address_verified": true,
"mfa_phone_number_verified": true,
"is_admin": true,
"totp_registration_id": "<string>",
"retired_email_addresses": [
{
"email_id": "<string>",
"email_address": "<string>"
}
],
"is_locked": true,
"mfa_enrolled": true,
"mfa_phone_number": "<string>",
"default_mfa_method": "<string>",
"roles": [
{
"role_id": "<string>",
"sources": [
{
"type": "<string>",
"details": {}
}
]
}
],
"trusted_metadata": {},
"untrusted_metadata": {},
"created_at": "<string>",
"updated_at": "<string>",
"scim_registration": {
"connection_id": "<string>",
"registration_id": "<string>",
"external_id": "<string>",
"scim_attributes": {
"user_name": "<string>",
"id": "<string>",
"external_id": "<string>",
"active": true,
"groups": [
{
"value": "<string>",
"display": "<string>"
}
],
"display_name": "<string>",
"nick_name": "<string>",
"profile_url": "<string>",
"user_type": "<string>",
"title": "<string>",
"preferred_language": "<string>",
"locale": "<string>",
"timezone": "<string>",
"emails": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"phone_numbers": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"addresses": [
{
"formatted": "<string>",
"street_address": "<string>",
"locality": "<string>",
"region": "<string>",
"postal_code": "<string>",
"country": "<string>",
"type": "<string>",
"primary": true
}
],
"ims": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"photos": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"entitlements": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"roles": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"x509certificates": [
{
"value": "<string>",
"type": "<string>",
"primary": true
}
],
"name": {
"formatted": "<string>",
"family_name": "<string>",
"given_name": "<string>",
"middle_name": "<string>",
"honorific_prefix": "<string>",
"honorific_suffix": "<string>"
},
"enterprise_extension": {
"employee_number": "<string>",
"cost_center": "<string>",
"division": "<string>",
"department": "<string>",
"organization": "<string>",
"manager": {
"value": "<string>",
"ref": "<string>",
"display_name": "<string>"
}
}
}
},
"external_id": "<string>",
"lock_created_at": "<string>",
"lock_expires_at": "<string>"
}
},
"primary_required": {
"allowed_auth_methods": [
"<string>"
]
},
"mfa_required": {
"member_options": {
"mfa_phone_number": "<string>",
"totp_registration_id": "<string>"
},
"secondary_auth_initiated": "<string>"
}
}
],
"provider_type": "<string>",
"provider_tenant_id": "<string>",
"provider_tenant_ids": [
"<string>"
],
"full_name": "<string>",
"status_code": 123,
"intermediate_session_token_expires_at": "<string>"
}{
"status_code": 401,
"request_id": "request-id-test-b05c992f-ebdc-489d-a754-c7e70ba13141",
"error_type": "unauthorized_credentials",
"error_message": "Unauthorized credentials.",
"error_url": "https://stytch.com/docs/api/errors/401"
}{
"status_code": 429,
"request_id": "request-id-test-b05c992f-ebdc-489d-a754-c7e70ba13141",
"error_type": "too_many_requests",
"error_message": "Too many requests have been made.",
"error_url": "https://stytch.com/docs/api/errors/429"
}{
"status_code": 500,
"request_id": "request-id-test-b05c992f-ebdc-489d-a754-c7e70ba13141",
"error_type": "internal_server_error",
"error_message": "Oops, something seems to have gone wrong, please reach out to support@stytch.com to let us know what went wrong.",
"error_url": "https://stytch.com/docs/api/errors/500"
}Authorizations
Body
Request type
Response
Successful response
The Intermediate Session Token. This token does not necessarily belong to a specific instance of a Member, but represents a bag of factors that may be converted to a member session. The token can be used with the OTP SMS Authenticate endpoint, TOTP Authenticate endpoint, or Recovery Codes Recover endpoint to complete an MFA flow and log in to the Organization. The token has a default expiry of 10 minutes. It can also be used with the Exchange Intermediate Session endpoint to join a specific Organization that allows the factors represented by the intermediate session token; or the Create Organization via Discovery endpoint to create a new Organization and Member. Intermediate Session Tokens have a default expiry of 10 minutes.
An array of discovered_organization objects tied to the intermediate_session_token, session_token, or session_jwt. See the Discovered Organization Object for complete details.
Note that Organizations will only appear here under any of the following conditions:
-
The end user is already a Member of the Organization.
-
The end user is invited to the Organization.
-
The end user can join the Organization because:
a) The Organization allows JIT provisioning.
b) The Organizations' allowed domains list contains the Member's email domain.
c) The Organization has at least one other Member with a verified email address with the same domain as the end user (to prevent phishing attacks).
Show child attributes
Show child attributes
The tenant ID returned by the OAuth provider. This is typically used to identify an organization or group within the provider's domain. For example, in HubSpot this is a Hub ID, in Slack this is the Workspace ID, and in GitHub this is an organization ID. This field will only be populated if exactly one tenant ID is returned from a successful OAuth authentication and developers should prefer provider_tenant_ids over this since it accounts for the possibility of an OAuth provider yielding multiple tenant IDs.
All tenant IDs returned by the OAuth provider. These is typically used to identify organizations or groups within the provider's domain. For example, in HubSpot this is a Hub ID, in Slack this is the Workspace ID, and in GitHub this is an organization ID. Some OAuth providers do not return tenant IDs, some providers are guaranteed to return one, and some may return multiple. This field will always be populated if at least one tenant ID was returned from the OAuth provider and developers should prefer this field over provider_tenant_id.