This page describes the component descriptor structure returned by the native journey. Use it to implement the visual and functional components of your native login experience.
Screens
The screen field represents the current logical step in the login or registration flow - for example, identification, password, registration. Use it to determine which screen to display and whether any special handling is needed.
The full screen state object returned by every native journey response:
| Field | Type | Description |
|---|---|---|
screen | string | Identifier of the current journey step (for example, identification, registration). |
forms | array | List of Form objects, each containing a widgets array. |
layout | object | Layout descriptor defining the visual arrangement of widgets across forms. |
messages | object | Error and informational messages for the current step, including a global message. |
hostedUrl | string | Fallback URL to the hosted login page, if the screen cannot be rendered natively. |
finalizeUrl | string | Present when the journey is complete. Pass to finalizeSession(). |
In minimal response mode the render field is not included in any widget, and the
layoutandbrandingtop-level fields are omitted. See Minimal response mode.
Forms and widgets
This section describes the widget types returned in the forms[].widgets array. Each widget has a type and an id. The application is responsible for rendering each widget type and collecting the user's input.
Common fields
Every widget includes:
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier within the form. Use as the field path when submitting (see note below). |
type | string | Widget type. Determines which fields are present. |
Submission formatWidget
idvalues use dot notation to represent a path into a nested object. When building the form submission body, expand dot-separated ids into nested objects rather than using them as flat keys. For example, idsaddress.cityandaddress.countrybecome{ "address": { "city": "...", "country": "..." } }, not{ "address.city": "...", "address.country": "..." }.
Widget types
static
staticDisplay-only text or HTML content. Does not collect user input.
| Field | Type | Description |
|---|---|---|
value | string | Content to display |
render | object | type: "text" | "html" - how to interpret value |
{
"type": "static",
"id": "section-title",
"value": "Sign in"
}
input
inputA single-line text input field.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
value | string | Pre-filled value, if any |
readonly | boolean | Whether the field is editable |
autocomplete | string | HTML autocomplete hint (for example, "username", "email") |
inputmode | string | Input mode hint (for example, "email", "numeric") |
validator | object | required, minLength, maxLength, regex |
render | object | autocompleteHint - additional autocomplete hint |
{
"type": "input",
"id": "email",
"label": "Email",
"value": null,
"readonly": false,
"autocomplete": "username",
"inputmode": "email",
"validator": {
"required": true,
"minLength": null,
"maxLength": null,
"regex": null
}
}
password
passwordA password input field. May include a quality indicator.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
qualityIndicator | boolean | Whether to show a password strength indicator |
validator | object | minLength, maxLength, maxNumericCharacterSequences, maxRepeatedCharacters, mustContain (UPPERCASE, LOWERCASE, NUMERIC, SPECIAL), restrictedCharacters |
{
"type": "password",
"id": "password",
"label": "Enter your password",
"qualityIndicator": false,
"validator": null
}
passcode
passcodeA fixed-length passcode input, typically used for MFA.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
validator | object | length - expected digit count |
{
"type": "passcode",
"id": "passcode",
"label": "6-digit passcode",
"validator": {
"length": 6
}
}
phone
phoneA phone number input field.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
value | string | Pre-filled value, if any |
readonly | boolean | Whether the field is editable |
validator | object | required |
{
"type": "phone",
"id": "phone",
"label": "Telephone number",
"value": null,
"readonly": false,
"validator": {
"required": true
}
}
date
dateA date input field.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
value | string | Pre-filled value in YYYY-MM-DD format |
readonly | boolean | Whether the field is editable |
render | object | type: "native" | "fieldSet" - display variant |
validator | object | notBefore, notAfter, required |
{
"type": "date",
"id": "dob",
"label": "Date of birth",
"value": null,
"readonly": false,
"validator": null
}
checkbox
checkboxA boolean toggle field.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
value | boolean | Current value |
readonly | boolean | Whether the field is editable |
render | object | type: "checkboxHidden" | "checkboxShown", `labelType: "text" |
validator | object | required |
{
"type": "checkbox",
"id": "keepMeLoggedIn",
"label": "Keep me logged in",
"readonly": false,
"value": false,
"validator": {
"required": false
}
}
select
selectA single-choice selection field.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
value | string | Currently selected value |
readonly | boolean | Whether the field is editable |
options | array | List of { type: "item", value, label } or { type: "group", label, options: [...] } |
render | object | type: "dropdown" | "radio" |
validator | object | required |
{
"type": "select",
"id": "country",
"label": "Country",
"value": null,
"readonly": false,
"options": [
{ "type": "item", "value": "us", "label": "United States" },
{ "type": "item", "value": "de", "label": "Germany" }
],
"validator": {
"required": true
}
}
multiSelect
multiSelectA multi-choice selection field.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
value | array | Array of currently selected values |
readonly | boolean | Whether the field is editable |
options | array | Same structure as select |
validator | object | minSelectable, maxSelectable |
{
"type": "multiSelect",
"id": "interests",
"label": "Interests",
"value": [],
"readonly": false,
"options": [
{ "type": "item", "value": "news", "label": "News" },
{ "type": "item", "value": "sports", "label": "Sports" }
],
"validator": {
"minSelectable": 1,
"maxSelectable": 3
}
}
submit
submitA form submission button or link. Submitting this widget advances the flow.
| Field | Type | Description |
|---|---|---|
label | string | Button label |
render | object | type: "button" | "link", textColor, bgColor, hint: { icon, variant } |
{
"type": "submit",
"id": "submit",
"label": "Continue"
}
close
closeSignals the end of the journey and instructs the application to close or exit the login experience. No form submission is needed.
| Field | Type | Description |
|---|---|---|
| label | string | Button label |
| render | object | type: "button" | "link", textColor, bgColor, hint: { icon, variant } |
{
"type": "close",
"id": "close",
"label": "Done"
}
passkeyLogin
passkeyLoginTriggers a WebAuthn passkey assertion for login.
| Field | Type | Description |
|---|---|---|
label | string | Button label |
assertionOptions | object | PublicKeyCredentialRequestOptions from the server |
render | object | type: "button", hint: { variant } |
passkeyEnroll
Triggers a WebAuthn passkey registration (enrollment).
| Field | Type | Description |
|---|---|---|
label | string | Button label |
enrollOptions | object | PublicKeyCredentialCreationOptions from the server |
render | object | type: "button", hint: { variant } |
webauthnLogin
webauthnLoginTriggers a WebAuthn assertion for a specific authenticator type.
| Field | Type | Description |
|---|---|---|
label | string | Button label |
authenticatorType | string | "deviceBiometrics" or "securityKey" |
assertionOptions | object | PublicKeyCredentialRequestOptions from the server |
render | object | type: "button", hint: { variant } |
webauthnEnroll
webauthnEnrollTriggers a WebAuthn registration for a specific authenticator type.
| Field | Type | Description |
|---|---|---|
label | string | Button label |
authenticatorType | string | "deviceBiometrics" or "securityKey" |
enrollOptions | object | PublicKeyCredentialCreationOptions from the server |
render | object | type: "button", hint: { variant } |
Layout
The layout object (included in full/non-minimal responses) describes how widgets from different forms should be arranged on the screen. It supports nested vertical and horizontal grouping.
type LayoutWidget = {
type: 'vertical' | 'horizontal';
items: Array<{ type: 'widget'; formId: string; widgetId: string } | LayoutWidget>;
};
Each leaf node references a widget by formId + widgetId. Use this to compose the visual layout rather than rendering forms sequentially.
Branding
The branding object (included in full/non-minimal responses) provides tenant-level styling data:
| Field | Type | Description |
|---|---|---|
logoUrl | string | null | URL of the tenant logo |
brandName | string | null | Tenant or brand name |
copyright | string | null | Copyright notice |
privacyPolicyUrl | string | null | Link to the privacy policy |
siteTermsUrl | string | null | Link to the terms of service |
