Establish a new authentication inquiry for an application.
const url = 'https://connect-api.sudomimus.com/establish';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"applicationAnchor":"example","authenticationConstraints":[{"accessTokenTtlSeconds":1,"refreshTokenTtlSeconds":1,"method":"PASSKEY_USERNAMELESS","payload":{}}],"realizeConstraints":[{"accessTokenTtlSeconds":1,"refreshTokenTtlSeconds":1,"constraintType":"EMAIL","payload":{"allowedEmails":["example"]}}],"returnMethods":[{"type":"CALLBACK","payload":{"callbackUrl":"example"}}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://connect-api.sudomimus.com/establish \ --header 'Content-Type: application/json' \ --data '{ "applicationAnchor": "example", "authenticationConstraints": [ { "accessTokenTtlSeconds": 1, "refreshTokenTtlSeconds": 1, "method": "PASSKEY_USERNAMELESS", "payload": {} } ], "realizeConstraints": [ { "accessTokenTtlSeconds": 1, "refreshTokenTtlSeconds": 1, "constraintType": "EMAIL", "payload": { "allowedEmails": [ "example" ] } } ], "returnMethods": [ { "type": "CALLBACK", "payload": { "callbackUrl": "example" } } ] }'Creates an authentication inquiry for the calling application. The
client-auth JWT binds the exact request bytes and is single-use; see
SudomimusClientJWT for its claim contract.
Constraint and return-method arrays are optional. When supplied, they narrow the application’s configured rules and MUST be non-empty. The schemas define per-field limits; the three arrays together are limited to 65,536 serialized UTF-8 bytes.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Public anchor identifying the integrating application.
Optional per-inquiry narrowing of the application’s authentication-rule layer. Absent means no narrowing. If present, the array MUST be non-empty; empty arrays are rejected with 400.
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty payload — narrows to usernameless (discoverable-credential) passkey login shown before an email is entered. Other configured authorization rules still apply.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty payload — narrows to email-first (“reasoned”) passkey login, the passkey option offered after the user enters an email. Other configured authorization rules still apply.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty payload — email-verification constraints carry no further parameters.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Steam-native-ticket payload. Gates native-api’s
/direct-issue/steam-ticket flow. allowedSteamAppIds is the
non-empty list of Steam App IDs whose tickets are accepted.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Steam OpenID 2.0 carries no app-id concept (that is native-ticket-specific). Any Steam account is accepted as long as the application’s rule set allows STEAM_OPENID at all.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Enables Native API /direct-issue/access-key authentication.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty allowedHostedDomains means no hosted-domain gating. A
non-empty list requires an exact, case-insensitive match against the
Google Workspace hd claim. Matching is case-insensitive.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty allowedGitHubOrgs array means no org gating — any
GitHub account is accepted. Non-empty means the user must be a
member of at least one listed organization (case-insensitive
match on the org login). The read:org OAuth scope is only
requested when at least one matching rule carries a non-empty
allowlist; applications without org gating keep the minimal
read:user user:email consent screen.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty allowedDiscordGuilds means no guild gating. A non-empty list
requires membership in at least one listed Discord guild and causes
the authentication flow to request the guilds scope.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Battle.net (Blizzard) has no per-application gating concept, so any Battle.net account is accepted as long as the application’s rule set allows BATTLENET_OAUTH at all. Empty payload. Battle.net is an email-less provider, so Layer-2 EMAIL rules fail closed against a Battle.net-only account.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
X (formerly Twitter) has no per-application gating concept, so any X account is accepted as long as the application’s rule set allows X_OAUTH at all. Empty payload. X is an email-less provider, so Layer-2 EMAIL rules fail closed against an X-only account.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Application-managed enterprise federation. connectorAnchor names an
enabled FederationConnector owned by the application’s organization.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty payload — the connector is selected from the verified adopted domain’s SSO_ONLY policy rather than by the application.
object
Optional per-inquiry narrowing of the application’s realize-rule layer. Absent means no narrowing. If present, the array MUST be non-empty; empty arrays are rejected with 400.
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
object
List of email addresses or glob patterns the realized identity must match.
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Per-realize-time check against the realized account’s SteamID64.
Each entry is either the literal "*" (wildcard, allow any
Steam identity) or a decimal SteamID64 string.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Exact match on the account alias shared by the user. Wildcards are not supported, and a new account cannot match a pre-existing alias list. Values are opaque and compared exactly.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Exact match on the application-visible token sub. Wildcards are not
supported. A rotated subject must be allow-listed separately. Values
are opaque and compared exactly.
object
object
Per-constraint override for access token lifetime. Resolved at realize time.
Per-constraint override for refresh token lifetime. Resolved at realize time.
Empty payload — the explicit EVERYONE constraint admits any realized identity on this side of the Layer-2 AND boundary.
object
Optional return methods for this inquiry. Connect accepts CALLBACK, STATUS_POLL, and REVEAL. CALLBACK includes its concrete delivery URL. Absence means no per-inquiry narrowing, but CALLBACK is not available without a URL. If supplied, the array MUST be non-empty.
object
object
Concrete callback URL for this inquiry. The host MUST match
one of the application’s allowed callback domains. The scheme
MUST be HTTPS except loopback HTTP for local development
(localhost, 127.0.0.1, [::1]). After realization,
Connect appends the canonical exposure-key and
confirmation-key query parameters. Existing query parameters
and fragments are preserved; caller-supplied or duplicate
values for the two canonical names are overwritten. The URL
MUST be concrete and MUST NOT contain Inquiry-key templates.
Length is measured in UTF-8 bytes.
object
Empty payload — STATUS_POLL carries no per-inquiry parameters.
object
object
Empty payload. Tokens are surfaced directly in the UI at
realize time and the inquiry is marked redeemed immediately;
any subsequent /redeem for the same inquiry fails with
InquiryAlreadyRedeemed.
object
Responses
Section titled “Responses”Inquiry established.
object
Public half of the inquiry key pair; safe to share with the user agent.
Private half of the inquiry key pair; must stay on the originating client.
Examplegenerated
{ "applicationAnchor": "example", "exposureKey": "example", "hiddenKey": "example"}Headers
Section titled “Headers”Prevent storage of the credential-bearing response.
Legacy cache instruction retained for credential responses.
Client-auth JWT missing, malformed, expired, or invalid.
Error response body. Known failures may include a stable reason.
Some failures are status-only and have an empty body. A missing,
malformed, or structurally invalid JSON body returns InvalidBody.
object
Stable machine-readable reason code.
Examplegenerated
{ "reason": "example"}Application is not ACTIVE, or its parent Sector or Organization is
unavailable.
Reason ApplicationNotActive.
Error response body. Known failures may include a stable reason.
Some failures are status-only and have an empty body. A missing,
malformed, or structurally invalid JSON body returns InvalidBody.
object
Stable machine-readable reason code.
Examplegenerated
{ "reason": "example"}default
Section titled “default”Error response.
Error response body. Known failures may include a stable reason.
Some failures are status-only and have an empty body. A missing,
malformed, or structurally invalid JSON body returns InvalidBody.
object
Stable machine-readable reason code.
Examplegenerated
{ "reason": "example"}