@faable/auth-sdk 2.5.77 → 2.5.79

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -220,6 +220,26 @@ export interface paths {
220
220
  patch?: never;
221
221
  trace?: never;
222
222
  };
223
+ "/login/identify": {
224
+ parameters: {
225
+ query?: never;
226
+ header?: never;
227
+ path?: never;
228
+ cookie?: never;
229
+ };
230
+ get?: never;
231
+ put?: never;
232
+ /**
233
+ * Leave the identifier-first screen
234
+ * @description Records the identifier the user typed on the hosted `/flow/identify` screen and advances the login to the method chooser. `state` is the id the screen was opened with; it stays valid, so the chooser is reached with the same `?state=`.
235
+ */
236
+ post: operations["login/identify"];
237
+ delete?: never;
238
+ options?: never;
239
+ head?: never;
240
+ patch?: never;
241
+ trace?: never;
242
+ };
223
243
  "/client": {
224
244
  parameters: {
225
245
  query?: never;
@@ -484,6 +504,26 @@ export interface paths {
484
504
  patch?: never;
485
505
  trace?: never;
486
506
  };
507
+ "/user/{user_id}/passkey-prompt/reset": {
508
+ parameters: {
509
+ query?: never;
510
+ header?: never;
511
+ path?: never;
512
+ cookie?: never;
513
+ };
514
+ get?: never;
515
+ put?: never;
516
+ /**
517
+ * Reset a user's passkey offer counter
518
+ * @description The post-login "create a passkey" offer stops after `login_methods.passkey_promotion_max_prompts` times and snoozes between them. This clears both, so the user is offered a passkey again on their next login — for "why does it keep asking" and "please ask me again" alike.
519
+ */
520
+ post: operations["user/resetPasskeyPrompt"];
521
+ delete?: never;
522
+ options?: never;
523
+ head?: never;
524
+ patch?: never;
525
+ trace?: never;
526
+ };
487
527
  "/identity": {
488
528
  parameters: {
489
529
  query?: never;
@@ -1100,6 +1140,175 @@ export interface paths {
1100
1140
  patch?: never;
1101
1141
  trace?: never;
1102
1142
  };
1143
+ "/loginflow/resolved": {
1144
+ parameters: {
1145
+ query?: never;
1146
+ header?: never;
1147
+ path?: never;
1148
+ cookie?: never;
1149
+ };
1150
+ /**
1151
+ * The graph this account (or client) runs right now
1152
+ * @description What a login actually walks: the published graph of the bound flow, or the graph compiled from the settings when nothing is bound or published. With `client_id`, resolved for that client (its own flow, else the account's, else compiled from its overrides). The bound flow, if any, comes along with its draft so an editor can show both.
1153
+ */
1154
+ get: operations["loginflow/resolved"];
1155
+ put?: never;
1156
+ post?: never;
1157
+ delete?: never;
1158
+ options?: never;
1159
+ head?: never;
1160
+ patch?: never;
1161
+ trace?: never;
1162
+ };
1163
+ "/loginflow/materialize": {
1164
+ parameters: {
1165
+ query?: never;
1166
+ header?: never;
1167
+ path?: never;
1168
+ cookie?: never;
1169
+ };
1170
+ get?: never;
1171
+ put?: never;
1172
+ /**
1173
+ * Start a custom flow from what runs today
1174
+ * @description Creates a login flow whose draft is the graph the account (or, with `client_id`, that client) currently runs — compiled from its settings — and binds it. Nothing changes for logins until the flow is published: a bound flow with no published graph keeps running the compiled one. Never a blank canvas: customising always starts from the tenant's own behaviour.
1175
+ */
1176
+ post: operations["loginflow/materialize"];
1177
+ delete?: never;
1178
+ options?: never;
1179
+ head?: never;
1180
+ patch?: never;
1181
+ trace?: never;
1182
+ };
1183
+ "/loginflow/{loginflow_id}/validate": {
1184
+ parameters: {
1185
+ query?: never;
1186
+ header?: never;
1187
+ path?: never;
1188
+ cookie?: never;
1189
+ };
1190
+ get?: never;
1191
+ put?: never;
1192
+ /** Check a draft against the rules a publish enforces */
1193
+ post: operations["loginflow/validate"];
1194
+ delete?: never;
1195
+ options?: never;
1196
+ head?: never;
1197
+ patch?: never;
1198
+ trace?: never;
1199
+ };
1200
+ "/loginflow/{loginflow_id}/publish": {
1201
+ parameters: {
1202
+ query?: never;
1203
+ header?: never;
1204
+ path?: never;
1205
+ cookie?: never;
1206
+ };
1207
+ get?: never;
1208
+ put?: never;
1209
+ /**
1210
+ * Make the draft the graph logins run
1211
+ * @description Validates the draft and freezes it as `published` under its current revision; the previous published graph moves to `history`. Logins already in flight keep the revision they started on. Refused with the list of issues when the draft does not validate.
1212
+ */
1213
+ post: operations["loginflow/publish"];
1214
+ delete?: never;
1215
+ options?: never;
1216
+ head?: never;
1217
+ patch?: never;
1218
+ trace?: never;
1219
+ };
1220
+ "/loginflow/{loginflow_id}/rollback": {
1221
+ parameters: {
1222
+ query?: never;
1223
+ header?: never;
1224
+ path?: never;
1225
+ cookie?: never;
1226
+ };
1227
+ get?: never;
1228
+ put?: never;
1229
+ /**
1230
+ * Run a previously published revision again
1231
+ * @description Makes the named revision from `history` the published graph; the one being replaced moves to `history`. The draft is not touched.
1232
+ */
1233
+ post: operations["loginflow/rollback"];
1234
+ delete?: never;
1235
+ options?: never;
1236
+ head?: never;
1237
+ patch?: never;
1238
+ trace?: never;
1239
+ };
1240
+ "/loginflow/{loginflow_id}/preview-token": {
1241
+ parameters: {
1242
+ query?: never;
1243
+ header?: never;
1244
+ path?: never;
1245
+ cookie?: never;
1246
+ };
1247
+ get?: never;
1248
+ put?: never;
1249
+ /**
1250
+ * Try the draft on a real login, in your browser only
1251
+ * @description Returns a short-lived token. Open `/authorize?…&flow_preview=<token>` (or the hosted login with the same parameter) and that login runs the DRAFT of this flow instead of what is published, for that browser only. Nothing is published.
1252
+ */
1253
+ post: operations["loginflow/previewToken"];
1254
+ delete?: never;
1255
+ options?: never;
1256
+ head?: never;
1257
+ patch?: never;
1258
+ trace?: never;
1259
+ };
1260
+ "/loginflow": {
1261
+ parameters: {
1262
+ query?: never;
1263
+ header?: never;
1264
+ path?: never;
1265
+ cookie?: never;
1266
+ };
1267
+ /**
1268
+ * List Loginflows
1269
+ * @description List Loginflows
1270
+ */
1271
+ get: operations["loginflow/list"];
1272
+ put?: never;
1273
+ /**
1274
+ * Create Loginflow
1275
+ * @description Create Loginflow
1276
+ */
1277
+ post: operations["loginflow/create"];
1278
+ delete?: never;
1279
+ options?: never;
1280
+ head?: never;
1281
+ patch?: never;
1282
+ trace?: never;
1283
+ };
1284
+ "/loginflow/{loginflow_id}": {
1285
+ parameters: {
1286
+ query?: never;
1287
+ header?: never;
1288
+ path?: never;
1289
+ cookie?: never;
1290
+ };
1291
+ /**
1292
+ * Get Loginflow
1293
+ * @description Get Loginflow
1294
+ */
1295
+ get: operations["loginflow/get"];
1296
+ put?: never;
1297
+ /**
1298
+ * Update Loginflow
1299
+ * @description Update Loginflow
1300
+ */
1301
+ post: operations["loginflow/update"];
1302
+ /**
1303
+ * Delete Loginflow
1304
+ * @description Delete Loginflow
1305
+ */
1306
+ delete: operations["loginflow/delete"];
1307
+ options?: never;
1308
+ head?: never;
1309
+ patch?: never;
1310
+ trace?: never;
1311
+ };
1103
1312
  "/notificationsubscription": {
1104
1313
  parameters: {
1105
1314
  query?: never;
@@ -1320,6 +1529,54 @@ export interface paths {
1320
1529
  patch?: never;
1321
1530
  trace?: never;
1322
1531
  };
1532
+ "/mfa/challenge/options": {
1533
+ parameters: {
1534
+ query?: never;
1535
+ header?: never;
1536
+ path?: never;
1537
+ cookie?: never;
1538
+ };
1539
+ /**
1540
+ * What the second-factor screen should offer
1541
+ * @description For a login parked on the hosted challenge screen: which factors the user can answer with, in the order and with the default the login flow chose, and whether recovery codes are an option. Reads the state without consuming it.
1542
+ */
1543
+ get: {
1544
+ parameters: {
1545
+ query: {
1546
+ state: string;
1547
+ };
1548
+ header?: never;
1549
+ path?: never;
1550
+ cookie?: never;
1551
+ };
1552
+ requestBody?: never;
1553
+ responses: {
1554
+ /** @description Default Response */
1555
+ 200: {
1556
+ headers: {
1557
+ [name: string]: unknown;
1558
+ };
1559
+ content: {
1560
+ "application/json": {
1561
+ /** @description The ways this user can answer, in the order the screen should offer them. Only factors the user actually has and the policy accepts. */
1562
+ factors: ("totp" | "webauthn")[];
1563
+ /** @description The one to mark as the default, when there are several. */
1564
+ preferred?: "totp" | "webauthn";
1565
+ /** @description Whether to offer the recovery-code way in: the flow allows it and the user has codes. */
1566
+ recovery: boolean;
1567
+ };
1568
+ };
1569
+ };
1570
+ };
1571
+ };
1572
+ put?: never;
1573
+ post?: never;
1574
+ delete?: never;
1575
+ options?: never;
1576
+ head?: never;
1577
+ patch?: never;
1578
+ trace?: never;
1579
+ };
1323
1580
  "/mfa/verify": {
1324
1581
  parameters: {
1325
1582
  query?: never;
@@ -1789,6 +2046,54 @@ export interface paths {
1789
2046
  patch?: never;
1790
2047
  trace?: never;
1791
2048
  };
2049
+ "/passkey/offer/skip": {
2050
+ parameters: {
2051
+ query?: never;
2052
+ header?: never;
2053
+ path?: never;
2054
+ cookie?: never;
2055
+ };
2056
+ get?: never;
2057
+ put?: never;
2058
+ /**
2059
+ * Decline the post-login passkey offer
2060
+ * @description Finishes a login the passkey offer parked without registering anything. `dismissed` is the user saying "not now" (starts the snooze); `unsupported` is the screen finding the browser cannot do WebAuthn (the prompt is given back); `failed` is a registration that errored. Returns where the login was going.
2061
+ */
2062
+ post: {
2063
+ parameters: {
2064
+ query?: never;
2065
+ header?: never;
2066
+ path?: never;
2067
+ cookie?: never;
2068
+ };
2069
+ requestBody: {
2070
+ content: {
2071
+ "application/json": {
2072
+ state: string;
2073
+ reason: "dismissed" | "unsupported" | "failed";
2074
+ };
2075
+ };
2076
+ };
2077
+ responses: {
2078
+ /** @description Default Response */
2079
+ 200: {
2080
+ headers: {
2081
+ [name: string]: unknown;
2082
+ };
2083
+ content: {
2084
+ "application/json": {
2085
+ redirect_url: string;
2086
+ };
2087
+ };
2088
+ };
2089
+ };
2090
+ };
2091
+ delete?: never;
2092
+ options?: never;
2093
+ head?: never;
2094
+ patch?: never;
2095
+ trace?: never;
2096
+ };
1792
2097
  "/passkey/login/options": {
1793
2098
  parameters: {
1794
2099
  query?: never;
@@ -1866,6 +2171,8 @@ export interface paths {
1866
2171
  client_id: string;
1867
2172
  redirect_to?: string;
1868
2173
  state?: string;
2174
+ /** @description The "Remember me on this device" checkbox. Honoured only when the tenant shows one (`login_methods.remember_me: "optional"`). */
2175
+ remember_me?: boolean;
1869
2176
  };
1870
2177
  };
1871
2178
  };
@@ -2442,7 +2749,19 @@ export interface components {
2442
2749
  identifier_first?: boolean;
2443
2750
  /** @description Surface the method the returning user chose last time. Defaults to false. */
2444
2751
  remember_last_method?: boolean;
2445
- };
2752
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
2753
+ passkey_promotion?: "off" | "offer";
2754
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
2755
+ passkey_promotion_snooze_days?: number;
2756
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
2757
+ passkey_promotion_max_prompts?: number;
2758
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
2759
+ remember_me?: "off" | "optional";
2760
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
2761
+ remember_me_days?: number;
2762
+ };
2763
+ /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
2764
+ login_flow?: string | null;
2446
2765
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
2447
2766
  mfa_policy?: {
2448
2767
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -2722,6 +3041,16 @@ export interface components {
2722
3041
  identifier_first?: boolean;
2723
3042
  /** @description Surface the method the returning user chose last time. Defaults to false. */
2724
3043
  remember_last_method?: boolean;
3044
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
3045
+ passkey_promotion?: "off" | "offer";
3046
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
3047
+ passkey_promotion_snooze_days?: number;
3048
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
3049
+ passkey_promotion_max_prompts?: number;
3050
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
3051
+ remember_me?: "off" | "optional";
3052
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
3053
+ remember_me_days?: number;
2725
3054
  };
2726
3055
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
2727
3056
  mfa_policy?: {
@@ -2732,6 +3061,8 @@ export interface components {
2732
3061
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
2733
3062
  remember_device_days?: number;
2734
3063
  };
3064
+ /** @description A login flow bound to this client (`loginflow_xxx`), overriding the account's. Absent = inherit. */
3065
+ login_flow?: string | null;
2735
3066
  /** @description Object is related with this account */
2736
3067
  account: string;
2737
3068
  /**
@@ -2815,6 +3146,16 @@ export interface components {
2815
3146
  identifier_first?: boolean;
2816
3147
  /** @description Surface the method the returning user chose last time. Defaults to false. */
2817
3148
  remember_last_method?: boolean;
3149
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
3150
+ passkey_promotion?: "off" | "offer";
3151
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
3152
+ passkey_promotion_snooze_days?: number;
3153
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
3154
+ passkey_promotion_max_prompts?: number;
3155
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
3156
+ remember_me?: "off" | "optional";
3157
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
3158
+ remember_me_days?: number;
2818
3159
  } | null;
2819
3160
  mfa_policy?: {
2820
3161
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -2824,6 +3165,7 @@ export interface components {
2824
3165
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
2825
3166
  remember_device_days?: number;
2826
3167
  } | null;
3168
+ login_flow?: string | null;
2827
3169
  /**
2828
3170
  * @description Free-form client metadata. Replaces the whole object — send the full merged value, not a partial delta.
2829
3171
  * @default {}
@@ -2872,6 +3214,12 @@ export interface components {
2872
3214
  email_bounced_at?: string | null;
2873
3215
  /** @description ISO 8601 timestamp of the built-in welcome email send. Set once by the platform; guarantees at most one welcome per user. */
2874
3216
  welcome_sent_at?: string | null;
3217
+ /** @description ISO 8601 timestamp of the last time the hosted "create a passkey" offer was shown to this user after a login. Drives the snooze in `login_methods.passkey_promotion_snooze_days`. */
3218
+ passkey_prompted_at?: string | null;
3219
+ /** @description How many times the passkey offer has been shown to this user. Capped by `login_methods.passkey_promotion_max_prompts`; reset by an administrator through `POST /user/:id/passkey-prompt/reset`. */
3220
+ passkey_prompt_count?: number;
3221
+ /** @description ISO 8601 timestamp of the last time the user chose "Not now" on the passkey offer, as opposed to closing the tab. */
3222
+ passkey_prompt_dismissed_at?: string | null;
2875
3223
  /** @description contact phone number */
2876
3224
  phone?: string | null;
2877
3225
  /** @description phone is verified */
@@ -3602,19 +3950,160 @@ export interface components {
3602
3950
  /** @description Execution order */
3603
3951
  order?: number;
3604
3952
  };
3605
- /** @description NotificationSubscription */
3606
- NotificationSubscription: {
3607
- /** @description NotificationSubscriptionEmail ID */
3953
+ /** @description LoginFlow */
3954
+ LoginFlow: {
3955
+ /** @description LoginFlow ID */
3608
3956
  id: string;
3609
- events: string[];
3957
+ name: string;
3610
3958
  /** @enum {string} */
3611
- channel: "email";
3612
- /** @description Whether the subscription is active */
3613
- active: boolean;
3614
- config: {
3615
- recipients: string[];
3616
- };
3617
- /** @description Object is related with this account */
3959
+ trigger: "login";
3960
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
3961
+ graph: {
3962
+ nodes: {
3963
+ id: string;
3964
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
3965
+ config?: {
3966
+ [key: string]: unknown;
3967
+ };
3968
+ }[];
3969
+ edges: {
3970
+ from: string;
3971
+ handle: string;
3972
+ to: string;
3973
+ }[];
3974
+ };
3975
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
3976
+ revision: number;
3977
+ published?: {
3978
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
3979
+ graph: {
3980
+ nodes: {
3981
+ id: string;
3982
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
3983
+ config?: {
3984
+ [key: string]: unknown;
3985
+ };
3986
+ }[];
3987
+ edges: {
3988
+ from: string;
3989
+ handle: string;
3990
+ to: string;
3991
+ }[];
3992
+ };
3993
+ revision: number;
3994
+ published_at: string;
3995
+ };
3996
+ /** @description Previously published graphs, newest first, for rollback. */
3997
+ history: {
3998
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
3999
+ graph: {
4000
+ nodes: {
4001
+ id: string;
4002
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
4003
+ config?: {
4004
+ [key: string]: unknown;
4005
+ };
4006
+ }[];
4007
+ edges: {
4008
+ from: string;
4009
+ handle: string;
4010
+ to: string;
4011
+ }[];
4012
+ };
4013
+ revision: number;
4014
+ published_at: string;
4015
+ }[];
4016
+ /** @description Node positions in the editor. Presentation only. */
4017
+ layout?: {
4018
+ [key: string]: {
4019
+ x: number;
4020
+ y: number;
4021
+ };
4022
+ };
4023
+ /** @description Object is related with this account */
4024
+ account: string;
4025
+ /**
4026
+ * @description LoginFlowMetadata
4027
+ * @default {}
4028
+ */
4029
+ metadata: {
4030
+ [key: string]: unknown;
4031
+ };
4032
+ /** @description LoginFlow creation date */
4033
+ createdAt: string;
4034
+ /** @description LoginFlow updated date */
4035
+ updatedAt?: string;
4036
+ };
4037
+ /**
4038
+ * @description LoginFlowMetadata
4039
+ * @default {}
4040
+ */
4041
+ LoginFlowMetadata: {
4042
+ [key: string]: unknown;
4043
+ };
4044
+ LoginFlowCreate: {
4045
+ name: string;
4046
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
4047
+ graph: {
4048
+ nodes: {
4049
+ id: string;
4050
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
4051
+ config?: {
4052
+ [key: string]: unknown;
4053
+ };
4054
+ }[];
4055
+ edges: {
4056
+ from: string;
4057
+ handle: string;
4058
+ to: string;
4059
+ }[];
4060
+ };
4061
+ /** @description Node positions in the editor. Presentation only. */
4062
+ layout?: {
4063
+ [key: string]: {
4064
+ x: number;
4065
+ y: number;
4066
+ };
4067
+ };
4068
+ };
4069
+ LoginFlowUpdate: {
4070
+ name?: string;
4071
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
4072
+ graph?: {
4073
+ nodes: {
4074
+ id: string;
4075
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
4076
+ config?: {
4077
+ [key: string]: unknown;
4078
+ };
4079
+ }[];
4080
+ edges: {
4081
+ from: string;
4082
+ handle: string;
4083
+ to: string;
4084
+ }[];
4085
+ };
4086
+ /** @description Node positions in the editor. Presentation only. */
4087
+ layout?: {
4088
+ [key: string]: {
4089
+ x: number;
4090
+ y: number;
4091
+ };
4092
+ };
4093
+ };
4094
+ /** @description NotificationSubscription */
4095
+ NotificationSubscription: {
4096
+ /** @description NotificationSubscriptionEmail ID */
4097
+ id: string;
4098
+ events: string[];
4099
+ /** @enum {string} */
4100
+ channel: "email";
4101
+ /** @description Whether the subscription is active */
4102
+ active: boolean;
4103
+ config: {
4104
+ recipients: string[];
4105
+ };
4106
+ /** @description Object is related with this account */
3618
4107
  account: string;
3619
4108
  /**
3620
4109
  * @description NotificationSubscriptionEmailMetadata
@@ -4089,6 +4578,16 @@ export interface components {
4089
4578
  identifier_first?: boolean;
4090
4579
  /** @description Surface the method the returning user chose last time. Defaults to false. */
4091
4580
  remember_last_method?: boolean;
4581
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
4582
+ passkey_promotion?: "off" | "offer";
4583
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
4584
+ passkey_promotion_snooze_days?: number;
4585
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
4586
+ passkey_promotion_max_prompts?: number;
4587
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
4588
+ remember_me?: "off" | "optional";
4589
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
4590
+ remember_me_days?: number;
4092
4591
  } | null;
4093
4592
  mfa_policy?: {
4094
4593
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -4099,6 +4598,7 @@ export interface components {
4099
4598
  remember_device_days?: number;
4100
4599
  } | null;
4101
4600
  webauthn_rp_id?: string | null;
4601
+ login_flow?: string | null;
4102
4602
  };
4103
4603
  FactorSummary: {
4104
4604
  id: string;
@@ -4145,6 +4645,8 @@ export interface components {
4145
4645
  response_type?: string;
4146
4646
  /** @description Same-origin path to return the user to after authentication, instead of the OAuth client redirect. Used by first-party interactive flows (e.g. device-code confirm). Non same-origin values are ignored. */
4147
4647
  redirect_to?: string;
4648
+ /** @description The "Remember me on this device" checkbox. Honoured only when the tenant shows one (`login_methods.remember_me: "optional"`): `true` keeps the session for `remember_me_days`, `false` ends it when the browser closes. */
4649
+ remember_me?: boolean;
4148
4650
  client_id: string;
4149
4651
  /** @description Deprecated. Use connection_id */
4150
4652
  connection?: string;
@@ -4249,7 +4751,19 @@ export interface operations {
4249
4751
  identifier_first?: boolean;
4250
4752
  /** @description Surface the method the returning user chose last time. Defaults to false. */
4251
4753
  remember_last_method?: boolean;
4252
- };
4754
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
4755
+ passkey_promotion?: "off" | "offer";
4756
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
4757
+ passkey_promotion_snooze_days?: number;
4758
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
4759
+ passkey_promotion_max_prompts?: number;
4760
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
4761
+ remember_me?: "off" | "optional";
4762
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
4763
+ remember_me_days?: number;
4764
+ };
4765
+ /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
4766
+ login_flow?: string | null;
4253
4767
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
4254
4768
  mfa_policy?: {
4255
4769
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -4387,7 +4901,19 @@ export interface operations {
4387
4901
  identifier_first?: boolean;
4388
4902
  /** @description Surface the method the returning user chose last time. Defaults to false. */
4389
4903
  remember_last_method?: boolean;
4390
- };
4904
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
4905
+ passkey_promotion?: "off" | "offer";
4906
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
4907
+ passkey_promotion_snooze_days?: number;
4908
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
4909
+ passkey_promotion_max_prompts?: number;
4910
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
4911
+ remember_me?: "off" | "optional";
4912
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
4913
+ remember_me_days?: number;
4914
+ };
4915
+ /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
4916
+ login_flow?: string | null;
4391
4917
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
4392
4918
  mfa_policy?: {
4393
4919
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -4479,7 +5005,19 @@ export interface operations {
4479
5005
  identifier_first?: boolean;
4480
5006
  /** @description Surface the method the returning user chose last time. Defaults to false. */
4481
5007
  remember_last_method?: boolean;
4482
- };
5008
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
5009
+ passkey_promotion?: "off" | "offer";
5010
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
5011
+ passkey_promotion_snooze_days?: number;
5012
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
5013
+ passkey_promotion_max_prompts?: number;
5014
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
5015
+ remember_me?: "off" | "optional";
5016
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
5017
+ remember_me_days?: number;
5018
+ };
5019
+ /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
5020
+ login_flow?: string | null;
4483
5021
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
4484
5022
  mfa_policy?: {
4485
5023
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -4543,6 +5081,16 @@ export interface operations {
4543
5081
  identifier_first?: boolean;
4544
5082
  /** @description Surface the method the returning user chose last time. Defaults to false. */
4545
5083
  remember_last_method?: boolean;
5084
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
5085
+ passkey_promotion?: "off" | "offer";
5086
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
5087
+ passkey_promotion_snooze_days?: number;
5088
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
5089
+ passkey_promotion_max_prompts?: number;
5090
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
5091
+ remember_me?: "off" | "optional";
5092
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
5093
+ remember_me_days?: number;
4546
5094
  } | null;
4547
5095
  mfa_policy?: {
4548
5096
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -4553,6 +5101,7 @@ export interface operations {
4553
5101
  remember_device_days?: number;
4554
5102
  } | null;
4555
5103
  webauthn_rp_id?: string | null;
5104
+ login_flow?: string | null;
4556
5105
  };
4557
5106
  };
4558
5107
  };
@@ -4614,7 +5163,19 @@ export interface operations {
4614
5163
  identifier_first?: boolean;
4615
5164
  /** @description Surface the method the returning user chose last time. Defaults to false. */
4616
5165
  remember_last_method?: boolean;
4617
- };
5166
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
5167
+ passkey_promotion?: "off" | "offer";
5168
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
5169
+ passkey_promotion_snooze_days?: number;
5170
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
5171
+ passkey_promotion_max_prompts?: number;
5172
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
5173
+ remember_me?: "off" | "optional";
5174
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
5175
+ remember_me_days?: number;
5176
+ };
5177
+ /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
5178
+ login_flow?: string | null;
4618
5179
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
4619
5180
  mfa_policy?: {
4620
5181
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -4715,7 +5276,19 @@ export interface operations {
4715
5276
  identifier_first?: boolean;
4716
5277
  /** @description Surface the method the returning user chose last time. Defaults to false. */
4717
5278
  remember_last_method?: boolean;
4718
- };
5279
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
5280
+ passkey_promotion?: "off" | "offer";
5281
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
5282
+ passkey_promotion_snooze_days?: number;
5283
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
5284
+ passkey_promotion_max_prompts?: number;
5285
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
5286
+ remember_me?: "off" | "optional";
5287
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
5288
+ remember_me_days?: number;
5289
+ };
5290
+ /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
5291
+ login_flow?: string | null;
4719
5292
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
4720
5293
  mfa_policy?: {
4721
5294
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -5231,6 +5804,10 @@ export interface operations {
5231
5804
  parameters: {
5232
5805
  query?: {
5233
5806
  client_id?: string;
5807
+ /** @description The login state the screen was opened with. When the flow put an identifier-first screen before this one, the identifier the user typed comes back as `identifier`. */
5808
+ state?: string;
5809
+ /** @description The method key (`passkey` or a connection id) this browser used last time, as remembered by the hosted UI. Honoured only when the tenant enabled `remember_last_method`: that method is moved first and echoed as `last_used`. */
5810
+ last_used?: string;
5234
5811
  };
5235
5812
  header?: never;
5236
5813
  path?: never;
@@ -5259,6 +5836,12 @@ export interface operations {
5259
5836
  } | null;
5260
5837
  identifier_first: boolean;
5261
5838
  remember_last_method: boolean;
5839
+ /** @description Render a "Remember me on this device" checkbox on the password and email-code forms, and send its value as `remember_me` when posting the credential. */
5840
+ remember_me: boolean;
5841
+ /** @description What the user typed on the identifier-first screen, when the flow has one. Prefill the email field with it. */
5842
+ identifier?: string;
5843
+ /** @description The method key that was moved first because this browser used it last time (`remember_last_method`). Absent otherwise. */
5844
+ last_used?: string;
5262
5845
  /** @description Already filtered and ordered. Render them in this order; do not re-sort or re-filter client-side. */
5263
5846
  methods: components["schemas"]["LoginOptionMethod"][];
5264
5847
  };
@@ -5266,6 +5849,35 @@ export interface operations {
5266
5849
  };
5267
5850
  };
5268
5851
  };
5852
+ "login/identify": {
5853
+ parameters: {
5854
+ query?: never;
5855
+ header?: never;
5856
+ path?: never;
5857
+ cookie?: never;
5858
+ };
5859
+ requestBody: {
5860
+ content: {
5861
+ "application/json": {
5862
+ state: string;
5863
+ identifier: string;
5864
+ };
5865
+ };
5866
+ };
5867
+ responses: {
5868
+ /** @description Default Response */
5869
+ 200: {
5870
+ headers: {
5871
+ [name: string]: unknown;
5872
+ };
5873
+ content: {
5874
+ "application/json": {
5875
+ ok: boolean;
5876
+ };
5877
+ };
5878
+ };
5879
+ };
5880
+ };
5269
5881
  "client/list": {
5270
5882
  parameters: {
5271
5883
  query?: {
@@ -5376,6 +5988,16 @@ export interface operations {
5376
5988
  identifier_first?: boolean;
5377
5989
  /** @description Surface the method the returning user chose last time. Defaults to false. */
5378
5990
  remember_last_method?: boolean;
5991
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
5992
+ passkey_promotion?: "off" | "offer";
5993
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
5994
+ passkey_promotion_snooze_days?: number;
5995
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
5996
+ passkey_promotion_max_prompts?: number;
5997
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
5998
+ remember_me?: "off" | "optional";
5999
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
6000
+ remember_me_days?: number;
5379
6001
  };
5380
6002
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
5381
6003
  mfa_policy?: {
@@ -5386,6 +6008,8 @@ export interface operations {
5386
6008
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
5387
6009
  remember_device_days?: number;
5388
6010
  };
6011
+ /** @description A login flow bound to this client (`loginflow_xxx`), overriding the account's. Absent = inherit. */
6012
+ login_flow?: string | null;
5389
6013
  /** @description Object is related with this account */
5390
6014
  account: string;
5391
6015
  /**
@@ -5467,6 +6091,16 @@ export interface operations {
5467
6091
  identifier_first?: boolean;
5468
6092
  /** @description Surface the method the returning user chose last time. Defaults to false. */
5469
6093
  remember_last_method?: boolean;
6094
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
6095
+ passkey_promotion?: "off" | "offer";
6096
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
6097
+ passkey_promotion_snooze_days?: number;
6098
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
6099
+ passkey_promotion_max_prompts?: number;
6100
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
6101
+ remember_me?: "off" | "optional";
6102
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
6103
+ remember_me_days?: number;
5470
6104
  };
5471
6105
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
5472
6106
  mfa_policy?: {
@@ -5477,6 +6111,8 @@ export interface operations {
5477
6111
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
5478
6112
  remember_device_days?: number;
5479
6113
  };
6114
+ /** @description A login flow bound to this client (`loginflow_xxx`), overriding the account's. Absent = inherit. */
6115
+ login_flow?: string | null;
5480
6116
  /** @description Object is related with this account */
5481
6117
  account: string;
5482
6118
  /**
@@ -5552,6 +6188,16 @@ export interface operations {
5552
6188
  identifier_first?: boolean;
5553
6189
  /** @description Surface the method the returning user chose last time. Defaults to false. */
5554
6190
  remember_last_method?: boolean;
6191
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
6192
+ passkey_promotion?: "off" | "offer";
6193
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
6194
+ passkey_promotion_snooze_days?: number;
6195
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
6196
+ passkey_promotion_max_prompts?: number;
6197
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
6198
+ remember_me?: "off" | "optional";
6199
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
6200
+ remember_me_days?: number;
5555
6201
  } | null;
5556
6202
  mfa_policy?: {
5557
6203
  /** @description `off` (default) never challenges. `optional` challenges a user who has enrolled a factor, and lets everyone else in. `required` challenges everyone and sends users with no factor through enrolment during login — it never locks anyone out in place. */
@@ -5561,6 +6207,7 @@ export interface operations {
5561
6207
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
5562
6208
  remember_device_days?: number;
5563
6209
  } | null;
6210
+ login_flow?: string | null;
5564
6211
  /**
5565
6212
  * @description Free-form client metadata. Replaces the whole object — send the full merged value, not a partial delta.
5566
6213
  * @default {}
@@ -5624,6 +6271,16 @@ export interface operations {
5624
6271
  identifier_first?: boolean;
5625
6272
  /** @description Surface the method the returning user chose last time. Defaults to false. */
5626
6273
  remember_last_method?: boolean;
6274
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
6275
+ passkey_promotion?: "off" | "offer";
6276
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
6277
+ passkey_promotion_snooze_days?: number;
6278
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
6279
+ passkey_promotion_max_prompts?: number;
6280
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
6281
+ remember_me?: "off" | "optional";
6282
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
6283
+ remember_me_days?: number;
5627
6284
  };
5628
6285
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
5629
6286
  mfa_policy?: {
@@ -5634,6 +6291,8 @@ export interface operations {
5634
6291
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
5635
6292
  remember_device_days?: number;
5636
6293
  };
6294
+ /** @description A login flow bound to this client (`loginflow_xxx`), overriding the account's. Absent = inherit. */
6295
+ login_flow?: string | null;
5637
6296
  /** @description Object is related with this account */
5638
6297
  account: string;
5639
6298
  /**
@@ -5715,6 +6374,16 @@ export interface operations {
5715
6374
  identifier_first?: boolean;
5716
6375
  /** @description Surface the method the returning user chose last time. Defaults to false. */
5717
6376
  remember_last_method?: boolean;
6377
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
6378
+ passkey_promotion?: "off" | "offer";
6379
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
6380
+ passkey_promotion_snooze_days?: number;
6381
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
6382
+ passkey_promotion_max_prompts?: number;
6383
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
6384
+ remember_me?: "off" | "optional";
6385
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
6386
+ remember_me_days?: number;
5718
6387
  };
5719
6388
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
5720
6389
  mfa_policy?: {
@@ -5725,6 +6394,8 @@ export interface operations {
5725
6394
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
5726
6395
  remember_device_days?: number;
5727
6396
  };
6397
+ /** @description A login flow bound to this client (`loginflow_xxx`), overriding the account's. Absent = inherit. */
6398
+ login_flow?: string | null;
5728
6399
  /** @description Object is related with this account */
5729
6400
  account: string;
5730
6401
  /**
@@ -5806,6 +6477,16 @@ export interface operations {
5806
6477
  identifier_first?: boolean;
5807
6478
  /** @description Surface the method the returning user chose last time. Defaults to false. */
5808
6479
  remember_last_method?: boolean;
6480
+ /** @description Invite users to create a passkey right after a successful login with another method. `offer` shows a hosted screen once per `passkey_promotion_snooze_days`, at most `passkey_promotion_max_prompts` times, to users who have no second factor yet; it never blocks the login. Requires `passkey_login_enabled`. Defaults to `off`. */
6481
+ passkey_promotion?: "off" | "offer";
6482
+ /** @description Days to wait before offering a passkey again to a user who dismissed it. Defaults to 30. */
6483
+ passkey_promotion_snooze_days?: number;
6484
+ /** @description How many times a user is offered a passkey over their lifetime. `0` switches the offer off for this tenant without changing `passkey_promotion`. Defaults to 3. */
6485
+ passkey_promotion_max_prompts?: number;
6486
+ /** @description Show a "Remember me on this device" checkbox on the password and email-code forms. `optional`: unchecked, the session ends when the browser closes; checked, it lasts `remember_me_days`. `off` (the default): no checkbox, every session lasts the built-in 30 days. */
6487
+ remember_me?: "off" | "optional";
6488
+ /** @description How long a session lasts when the user ticked "Remember me". Defaults to 30. */
6489
+ remember_me_days?: number;
5809
6490
  };
5810
6491
  /** @description Second-factor policy. Set on the Account as the tenant default; the same object on a Client overrides it **field by field**, so one app can require MFA without changing the rest. */
5811
6492
  mfa_policy?: {
@@ -5816,6 +6497,8 @@ export interface operations {
5816
6497
  /** @description How long a browser that already passed a challenge may skip the next one. 0 (default) challenges every time. */
5817
6498
  remember_device_days?: number;
5818
6499
  };
6500
+ /** @description A login flow bound to this client (`loginflow_xxx`), overriding the account's. Absent = inherit. */
6501
+ login_flow?: string | null;
5819
6502
  /** @description Object is related with this account */
5820
6503
  account: string;
5821
6504
  /**
@@ -5961,6 +6644,12 @@ export interface operations {
5961
6644
  email_bounced_at?: string | null;
5962
6645
  /** @description ISO 8601 timestamp of the built-in welcome email send. Set once by the platform; guarantees at most one welcome per user. */
5963
6646
  welcome_sent_at?: string | null;
6647
+ /** @description ISO 8601 timestamp of the last time the hosted "create a passkey" offer was shown to this user after a login. Drives the snooze in `login_methods.passkey_promotion_snooze_days`. */
6648
+ passkey_prompted_at?: string | null;
6649
+ /** @description How many times the passkey offer has been shown to this user. Capped by `login_methods.passkey_promotion_max_prompts`; reset by an administrator through `POST /user/:id/passkey-prompt/reset`. */
6650
+ passkey_prompt_count?: number;
6651
+ /** @description ISO 8601 timestamp of the last time the user chose "Not now" on the passkey offer, as opposed to closing the tab. */
6652
+ passkey_prompt_dismissed_at?: string | null;
5964
6653
  /** @description contact phone number */
5965
6654
  phone?: string | null;
5966
6655
  /** @description phone is verified */
@@ -6095,6 +6784,12 @@ export interface operations {
6095
6784
  email_bounced_at?: string | null;
6096
6785
  /** @description ISO 8601 timestamp of the built-in welcome email send. Set once by the platform; guarantees at most one welcome per user. */
6097
6786
  welcome_sent_at?: string | null;
6787
+ /** @description ISO 8601 timestamp of the last time the hosted "create a passkey" offer was shown to this user after a login. Drives the snooze in `login_methods.passkey_promotion_snooze_days`. */
6788
+ passkey_prompted_at?: string | null;
6789
+ /** @description How many times the passkey offer has been shown to this user. Capped by `login_methods.passkey_promotion_max_prompts`; reset by an administrator through `POST /user/:id/passkey-prompt/reset`. */
6790
+ passkey_prompt_count?: number;
6791
+ /** @description ISO 8601 timestamp of the last time the user chose "Not now" on the passkey offer, as opposed to closing the tab. */
6792
+ passkey_prompt_dismissed_at?: string | null;
6098
6793
  /** @description contact phone number */
6099
6794
  phone?: string | null;
6100
6795
  /** @description phone is verified */
@@ -6269,6 +6964,12 @@ export interface operations {
6269
6964
  email_bounced_at?: string | null;
6270
6965
  /** @description ISO 8601 timestamp of the built-in welcome email send. Set once by the platform; guarantees at most one welcome per user. */
6271
6966
  welcome_sent_at?: string | null;
6967
+ /** @description ISO 8601 timestamp of the last time the hosted "create a passkey" offer was shown to this user after a login. Drives the snooze in `login_methods.passkey_promotion_snooze_days`. */
6968
+ passkey_prompted_at?: string | null;
6969
+ /** @description How many times the passkey offer has been shown to this user. Capped by `login_methods.passkey_promotion_max_prompts`; reset by an administrator through `POST /user/:id/passkey-prompt/reset`. */
6970
+ passkey_prompt_count?: number;
6971
+ /** @description ISO 8601 timestamp of the last time the user chose "Not now" on the passkey offer, as opposed to closing the tab. */
6972
+ passkey_prompt_dismissed_at?: string | null;
6272
6973
  /** @description contact phone number */
6273
6974
  phone?: string | null;
6274
6975
  /** @description phone is verified */
@@ -6403,6 +7104,12 @@ export interface operations {
6403
7104
  email_bounced_at?: string | null;
6404
7105
  /** @description ISO 8601 timestamp of the built-in welcome email send. Set once by the platform; guarantees at most one welcome per user. */
6405
7106
  welcome_sent_at?: string | null;
7107
+ /** @description ISO 8601 timestamp of the last time the hosted "create a passkey" offer was shown to this user after a login. Drives the snooze in `login_methods.passkey_promotion_snooze_days`. */
7108
+ passkey_prompted_at?: string | null;
7109
+ /** @description How many times the passkey offer has been shown to this user. Capped by `login_methods.passkey_promotion_max_prompts`; reset by an administrator through `POST /user/:id/passkey-prompt/reset`. */
7110
+ passkey_prompt_count?: number;
7111
+ /** @description ISO 8601 timestamp of the last time the user chose "Not now" on the passkey offer, as opposed to closing the tab. */
7112
+ passkey_prompt_dismissed_at?: string | null;
6406
7113
  /** @description contact phone number */
6407
7114
  phone?: string | null;
6408
7115
  /** @description phone is verified */
@@ -6681,6 +7388,30 @@ export interface operations {
6681
7388
  };
6682
7389
  };
6683
7390
  };
7391
+ "user/resetPasskeyPrompt": {
7392
+ parameters: {
7393
+ query?: never;
7394
+ header?: never;
7395
+ path: {
7396
+ user_id: string;
7397
+ };
7398
+ cookie?: never;
7399
+ };
7400
+ requestBody?: never;
7401
+ responses: {
7402
+ /** @description Default Response */
7403
+ 200: {
7404
+ headers: {
7405
+ [name: string]: unknown;
7406
+ };
7407
+ content: {
7408
+ "application/json": {
7409
+ reset: boolean;
7410
+ };
7411
+ };
7412
+ };
7413
+ };
7414
+ };
6684
7415
  "identity/list": {
6685
7416
  parameters: {
6686
7417
  query?: {
@@ -9246,6 +9977,986 @@ export interface operations {
9246
9977
  };
9247
9978
  };
9248
9979
  };
9980
+ "loginflow/resolved": {
9981
+ parameters: {
9982
+ query?: {
9983
+ client_id?: string;
9984
+ };
9985
+ header?: never;
9986
+ path?: never;
9987
+ cookie?: never;
9988
+ };
9989
+ requestBody?: never;
9990
+ responses: {
9991
+ /** @description Default Response */
9992
+ 200: {
9993
+ headers: {
9994
+ [name: string]: unknown;
9995
+ };
9996
+ content: {
9997
+ "application/json": {
9998
+ source: "compiled" | "published";
9999
+ flow_id: string | null;
10000
+ revision: number;
10001
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10002
+ graph: {
10003
+ nodes: {
10004
+ id: string;
10005
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10006
+ config?: {
10007
+ [key: string]: unknown;
10008
+ };
10009
+ }[];
10010
+ edges: {
10011
+ from: string;
10012
+ handle: string;
10013
+ to: string;
10014
+ }[];
10015
+ };
10016
+ bound: {
10017
+ flow_id: string;
10018
+ bound_to: "account" | "client";
10019
+ name: string;
10020
+ revision: number;
10021
+ published_revision: number | null;
10022
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10023
+ draft: {
10024
+ nodes: {
10025
+ id: string;
10026
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10027
+ config?: {
10028
+ [key: string]: unknown;
10029
+ };
10030
+ }[];
10031
+ edges: {
10032
+ from: string;
10033
+ handle: string;
10034
+ to: string;
10035
+ }[];
10036
+ };
10037
+ /** @description Node positions in the editor. Presentation only. */
10038
+ layout?: {
10039
+ [key: string]: {
10040
+ x: number;
10041
+ y: number;
10042
+ };
10043
+ };
10044
+ history: number[];
10045
+ } | null;
10046
+ };
10047
+ };
10048
+ };
10049
+ };
10050
+ };
10051
+ "loginflow/materialize": {
10052
+ parameters: {
10053
+ query?: never;
10054
+ header?: never;
10055
+ path?: never;
10056
+ cookie?: never;
10057
+ };
10058
+ requestBody: {
10059
+ content: {
10060
+ "application/json": {
10061
+ client_id?: string;
10062
+ name?: string;
10063
+ };
10064
+ };
10065
+ };
10066
+ responses: {
10067
+ /** @description LoginFlow */
10068
+ 200: {
10069
+ headers: {
10070
+ [name: string]: unknown;
10071
+ };
10072
+ content: {
10073
+ "application/json": {
10074
+ /** @description LoginFlow ID */
10075
+ id: string;
10076
+ name: string;
10077
+ /** @enum {string} */
10078
+ trigger: "login";
10079
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10080
+ graph: {
10081
+ nodes: {
10082
+ id: string;
10083
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10084
+ config?: {
10085
+ [key: string]: unknown;
10086
+ };
10087
+ }[];
10088
+ edges: {
10089
+ from: string;
10090
+ handle: string;
10091
+ to: string;
10092
+ }[];
10093
+ };
10094
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
10095
+ revision: number;
10096
+ published?: {
10097
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10098
+ graph: {
10099
+ nodes: {
10100
+ id: string;
10101
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10102
+ config?: {
10103
+ [key: string]: unknown;
10104
+ };
10105
+ }[];
10106
+ edges: {
10107
+ from: string;
10108
+ handle: string;
10109
+ to: string;
10110
+ }[];
10111
+ };
10112
+ revision: number;
10113
+ published_at: string;
10114
+ };
10115
+ /** @description Previously published graphs, newest first, for rollback. */
10116
+ history: {
10117
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10118
+ graph: {
10119
+ nodes: {
10120
+ id: string;
10121
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10122
+ config?: {
10123
+ [key: string]: unknown;
10124
+ };
10125
+ }[];
10126
+ edges: {
10127
+ from: string;
10128
+ handle: string;
10129
+ to: string;
10130
+ }[];
10131
+ };
10132
+ revision: number;
10133
+ published_at: string;
10134
+ }[];
10135
+ /** @description Node positions in the editor. Presentation only. */
10136
+ layout?: {
10137
+ [key: string]: {
10138
+ x: number;
10139
+ y: number;
10140
+ };
10141
+ };
10142
+ /** @description Object is related with this account */
10143
+ account: string;
10144
+ /**
10145
+ * @description LoginFlowMetadata
10146
+ * @default {}
10147
+ */
10148
+ metadata: {
10149
+ [key: string]: unknown;
10150
+ };
10151
+ /** @description LoginFlow creation date */
10152
+ createdAt: string;
10153
+ /** @description LoginFlow updated date */
10154
+ updatedAt?: string;
10155
+ };
10156
+ };
10157
+ };
10158
+ };
10159
+ };
10160
+ "loginflow/validate": {
10161
+ parameters: {
10162
+ query?: never;
10163
+ header?: never;
10164
+ path: {
10165
+ loginflow_id: string;
10166
+ };
10167
+ cookie?: never;
10168
+ };
10169
+ requestBody: {
10170
+ content: {
10171
+ "application/json": {
10172
+ client_id?: string;
10173
+ };
10174
+ };
10175
+ };
10176
+ responses: {
10177
+ /** @description Default Response */
10178
+ 200: {
10179
+ headers: {
10180
+ [name: string]: unknown;
10181
+ };
10182
+ content: {
10183
+ "application/json": {
10184
+ ok: boolean;
10185
+ issues: {
10186
+ code: string;
10187
+ node?: string;
10188
+ handle?: string;
10189
+ message: string;
10190
+ }[];
10191
+ };
10192
+ };
10193
+ };
10194
+ };
10195
+ };
10196
+ "loginflow/publish": {
10197
+ parameters: {
10198
+ query?: never;
10199
+ header?: never;
10200
+ path: {
10201
+ loginflow_id: string;
10202
+ };
10203
+ cookie?: never;
10204
+ };
10205
+ requestBody: {
10206
+ content: {
10207
+ "application/json": {
10208
+ client_id?: string;
10209
+ };
10210
+ };
10211
+ };
10212
+ responses: {
10213
+ /** @description LoginFlow */
10214
+ 200: {
10215
+ headers: {
10216
+ [name: string]: unknown;
10217
+ };
10218
+ content: {
10219
+ "application/json": {
10220
+ /** @description LoginFlow ID */
10221
+ id: string;
10222
+ name: string;
10223
+ /** @enum {string} */
10224
+ trigger: "login";
10225
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10226
+ graph: {
10227
+ nodes: {
10228
+ id: string;
10229
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10230
+ config?: {
10231
+ [key: string]: unknown;
10232
+ };
10233
+ }[];
10234
+ edges: {
10235
+ from: string;
10236
+ handle: string;
10237
+ to: string;
10238
+ }[];
10239
+ };
10240
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
10241
+ revision: number;
10242
+ published?: {
10243
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10244
+ graph: {
10245
+ nodes: {
10246
+ id: string;
10247
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10248
+ config?: {
10249
+ [key: string]: unknown;
10250
+ };
10251
+ }[];
10252
+ edges: {
10253
+ from: string;
10254
+ handle: string;
10255
+ to: string;
10256
+ }[];
10257
+ };
10258
+ revision: number;
10259
+ published_at: string;
10260
+ };
10261
+ /** @description Previously published graphs, newest first, for rollback. */
10262
+ history: {
10263
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10264
+ graph: {
10265
+ nodes: {
10266
+ id: string;
10267
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10268
+ config?: {
10269
+ [key: string]: unknown;
10270
+ };
10271
+ }[];
10272
+ edges: {
10273
+ from: string;
10274
+ handle: string;
10275
+ to: string;
10276
+ }[];
10277
+ };
10278
+ revision: number;
10279
+ published_at: string;
10280
+ }[];
10281
+ /** @description Node positions in the editor. Presentation only. */
10282
+ layout?: {
10283
+ [key: string]: {
10284
+ x: number;
10285
+ y: number;
10286
+ };
10287
+ };
10288
+ /** @description Object is related with this account */
10289
+ account: string;
10290
+ /**
10291
+ * @description LoginFlowMetadata
10292
+ * @default {}
10293
+ */
10294
+ metadata: {
10295
+ [key: string]: unknown;
10296
+ };
10297
+ /** @description LoginFlow creation date */
10298
+ createdAt: string;
10299
+ /** @description LoginFlow updated date */
10300
+ updatedAt?: string;
10301
+ };
10302
+ };
10303
+ };
10304
+ /** @description Default Response */
10305
+ 422: {
10306
+ headers: {
10307
+ [name: string]: unknown;
10308
+ };
10309
+ content: {
10310
+ "application/json": {
10311
+ error: string;
10312
+ issues: {
10313
+ code: string;
10314
+ node?: string;
10315
+ handle?: string;
10316
+ message: string;
10317
+ }[];
10318
+ };
10319
+ };
10320
+ };
10321
+ };
10322
+ };
10323
+ "loginflow/rollback": {
10324
+ parameters: {
10325
+ query?: never;
10326
+ header?: never;
10327
+ path: {
10328
+ loginflow_id: string;
10329
+ };
10330
+ cookie?: never;
10331
+ };
10332
+ requestBody: {
10333
+ content: {
10334
+ "application/json": {
10335
+ revision: number;
10336
+ };
10337
+ };
10338
+ };
10339
+ responses: {
10340
+ /** @description LoginFlow */
10341
+ 200: {
10342
+ headers: {
10343
+ [name: string]: unknown;
10344
+ };
10345
+ content: {
10346
+ "application/json": {
10347
+ /** @description LoginFlow ID */
10348
+ id: string;
10349
+ name: string;
10350
+ /** @enum {string} */
10351
+ trigger: "login";
10352
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10353
+ graph: {
10354
+ nodes: {
10355
+ id: string;
10356
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10357
+ config?: {
10358
+ [key: string]: unknown;
10359
+ };
10360
+ }[];
10361
+ edges: {
10362
+ from: string;
10363
+ handle: string;
10364
+ to: string;
10365
+ }[];
10366
+ };
10367
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
10368
+ revision: number;
10369
+ published?: {
10370
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10371
+ graph: {
10372
+ nodes: {
10373
+ id: string;
10374
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10375
+ config?: {
10376
+ [key: string]: unknown;
10377
+ };
10378
+ }[];
10379
+ edges: {
10380
+ from: string;
10381
+ handle: string;
10382
+ to: string;
10383
+ }[];
10384
+ };
10385
+ revision: number;
10386
+ published_at: string;
10387
+ };
10388
+ /** @description Previously published graphs, newest first, for rollback. */
10389
+ history: {
10390
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10391
+ graph: {
10392
+ nodes: {
10393
+ id: string;
10394
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10395
+ config?: {
10396
+ [key: string]: unknown;
10397
+ };
10398
+ }[];
10399
+ edges: {
10400
+ from: string;
10401
+ handle: string;
10402
+ to: string;
10403
+ }[];
10404
+ };
10405
+ revision: number;
10406
+ published_at: string;
10407
+ }[];
10408
+ /** @description Node positions in the editor. Presentation only. */
10409
+ layout?: {
10410
+ [key: string]: {
10411
+ x: number;
10412
+ y: number;
10413
+ };
10414
+ };
10415
+ /** @description Object is related with this account */
10416
+ account: string;
10417
+ /**
10418
+ * @description LoginFlowMetadata
10419
+ * @default {}
10420
+ */
10421
+ metadata: {
10422
+ [key: string]: unknown;
10423
+ };
10424
+ /** @description LoginFlow creation date */
10425
+ createdAt: string;
10426
+ /** @description LoginFlow updated date */
10427
+ updatedAt?: string;
10428
+ };
10429
+ };
10430
+ };
10431
+ };
10432
+ };
10433
+ "loginflow/previewToken": {
10434
+ parameters: {
10435
+ query?: never;
10436
+ header?: never;
10437
+ path: {
10438
+ loginflow_id: string;
10439
+ };
10440
+ cookie?: never;
10441
+ };
10442
+ requestBody?: never;
10443
+ responses: {
10444
+ /** @description Default Response */
10445
+ 200: {
10446
+ headers: {
10447
+ [name: string]: unknown;
10448
+ };
10449
+ content: {
10450
+ "application/json": {
10451
+ token: string;
10452
+ expires_in: number;
10453
+ };
10454
+ };
10455
+ };
10456
+ };
10457
+ };
10458
+ "loginflow/list": {
10459
+ parameters: {
10460
+ query?: {
10461
+ /** @description Number of items per page (max 200) */
10462
+ pageSize?: number;
10463
+ /** @description Cursor for next page */
10464
+ cursor?: string;
10465
+ /** @description Cursor returned by the previous page */
10466
+ next?: string;
10467
+ /** @description Filter using a FaableQL query */
10468
+ query?: string;
10469
+ };
10470
+ header?: never;
10471
+ path?: never;
10472
+ cookie?: never;
10473
+ };
10474
+ requestBody?: never;
10475
+ responses: {
10476
+ /** @description Default Response */
10477
+ 200: {
10478
+ headers: {
10479
+ [name: string]: unknown;
10480
+ };
10481
+ content: {
10482
+ "application/json": {
10483
+ next: string | null;
10484
+ results: components["schemas"]["LoginFlow"][];
10485
+ };
10486
+ };
10487
+ };
10488
+ };
10489
+ };
10490
+ "loginflow/create": {
10491
+ parameters: {
10492
+ query?: never;
10493
+ header?: never;
10494
+ path?: never;
10495
+ cookie?: never;
10496
+ };
10497
+ requestBody: {
10498
+ content: {
10499
+ "application/json": {
10500
+ name: string;
10501
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10502
+ graph: {
10503
+ nodes: {
10504
+ id: string;
10505
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10506
+ config?: {
10507
+ [key: string]: unknown;
10508
+ };
10509
+ }[];
10510
+ edges: {
10511
+ from: string;
10512
+ handle: string;
10513
+ to: string;
10514
+ }[];
10515
+ };
10516
+ /** @description Node positions in the editor. Presentation only. */
10517
+ layout?: {
10518
+ [key: string]: {
10519
+ x: number;
10520
+ y: number;
10521
+ };
10522
+ };
10523
+ };
10524
+ };
10525
+ };
10526
+ responses: {
10527
+ /** @description LoginFlow */
10528
+ 200: {
10529
+ headers: {
10530
+ [name: string]: unknown;
10531
+ };
10532
+ content: {
10533
+ "application/json": {
10534
+ /** @description LoginFlow ID */
10535
+ id: string;
10536
+ name: string;
10537
+ /** @enum {string} */
10538
+ trigger: "login";
10539
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10540
+ graph: {
10541
+ nodes: {
10542
+ id: string;
10543
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10544
+ config?: {
10545
+ [key: string]: unknown;
10546
+ };
10547
+ }[];
10548
+ edges: {
10549
+ from: string;
10550
+ handle: string;
10551
+ to: string;
10552
+ }[];
10553
+ };
10554
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
10555
+ revision: number;
10556
+ published?: {
10557
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10558
+ graph: {
10559
+ nodes: {
10560
+ id: string;
10561
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10562
+ config?: {
10563
+ [key: string]: unknown;
10564
+ };
10565
+ }[];
10566
+ edges: {
10567
+ from: string;
10568
+ handle: string;
10569
+ to: string;
10570
+ }[];
10571
+ };
10572
+ revision: number;
10573
+ published_at: string;
10574
+ };
10575
+ /** @description Previously published graphs, newest first, for rollback. */
10576
+ history: {
10577
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10578
+ graph: {
10579
+ nodes: {
10580
+ id: string;
10581
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10582
+ config?: {
10583
+ [key: string]: unknown;
10584
+ };
10585
+ }[];
10586
+ edges: {
10587
+ from: string;
10588
+ handle: string;
10589
+ to: string;
10590
+ }[];
10591
+ };
10592
+ revision: number;
10593
+ published_at: string;
10594
+ }[];
10595
+ /** @description Node positions in the editor. Presentation only. */
10596
+ layout?: {
10597
+ [key: string]: {
10598
+ x: number;
10599
+ y: number;
10600
+ };
10601
+ };
10602
+ /** @description Object is related with this account */
10603
+ account: string;
10604
+ /**
10605
+ * @description LoginFlowMetadata
10606
+ * @default {}
10607
+ */
10608
+ metadata: {
10609
+ [key: string]: unknown;
10610
+ };
10611
+ /** @description LoginFlow creation date */
10612
+ createdAt: string;
10613
+ /** @description LoginFlow updated date */
10614
+ updatedAt?: string;
10615
+ };
10616
+ };
10617
+ };
10618
+ };
10619
+ };
10620
+ "loginflow/get": {
10621
+ parameters: {
10622
+ query?: never;
10623
+ header?: never;
10624
+ path: {
10625
+ loginflow_id: string;
10626
+ };
10627
+ cookie?: never;
10628
+ };
10629
+ requestBody?: never;
10630
+ responses: {
10631
+ /** @description LoginFlow */
10632
+ 200: {
10633
+ headers: {
10634
+ [name: string]: unknown;
10635
+ };
10636
+ content: {
10637
+ "application/json": {
10638
+ /** @description LoginFlow ID */
10639
+ id: string;
10640
+ name: string;
10641
+ /** @enum {string} */
10642
+ trigger: "login";
10643
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10644
+ graph: {
10645
+ nodes: {
10646
+ id: string;
10647
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10648
+ config?: {
10649
+ [key: string]: unknown;
10650
+ };
10651
+ }[];
10652
+ edges: {
10653
+ from: string;
10654
+ handle: string;
10655
+ to: string;
10656
+ }[];
10657
+ };
10658
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
10659
+ revision: number;
10660
+ published?: {
10661
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10662
+ graph: {
10663
+ nodes: {
10664
+ id: string;
10665
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10666
+ config?: {
10667
+ [key: string]: unknown;
10668
+ };
10669
+ }[];
10670
+ edges: {
10671
+ from: string;
10672
+ handle: string;
10673
+ to: string;
10674
+ }[];
10675
+ };
10676
+ revision: number;
10677
+ published_at: string;
10678
+ };
10679
+ /** @description Previously published graphs, newest first, for rollback. */
10680
+ history: {
10681
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10682
+ graph: {
10683
+ nodes: {
10684
+ id: string;
10685
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10686
+ config?: {
10687
+ [key: string]: unknown;
10688
+ };
10689
+ }[];
10690
+ edges: {
10691
+ from: string;
10692
+ handle: string;
10693
+ to: string;
10694
+ }[];
10695
+ };
10696
+ revision: number;
10697
+ published_at: string;
10698
+ }[];
10699
+ /** @description Node positions in the editor. Presentation only. */
10700
+ layout?: {
10701
+ [key: string]: {
10702
+ x: number;
10703
+ y: number;
10704
+ };
10705
+ };
10706
+ /** @description Object is related with this account */
10707
+ account: string;
10708
+ /**
10709
+ * @description LoginFlowMetadata
10710
+ * @default {}
10711
+ */
10712
+ metadata: {
10713
+ [key: string]: unknown;
10714
+ };
10715
+ /** @description LoginFlow creation date */
10716
+ createdAt: string;
10717
+ /** @description LoginFlow updated date */
10718
+ updatedAt?: string;
10719
+ };
10720
+ };
10721
+ };
10722
+ };
10723
+ };
10724
+ "loginflow/update": {
10725
+ parameters: {
10726
+ query?: never;
10727
+ header?: never;
10728
+ path: {
10729
+ loginflow_id: string;
10730
+ };
10731
+ cookie?: never;
10732
+ };
10733
+ requestBody: {
10734
+ content: {
10735
+ "application/json": {
10736
+ name?: string;
10737
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10738
+ graph?: {
10739
+ nodes: {
10740
+ id: string;
10741
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10742
+ config?: {
10743
+ [key: string]: unknown;
10744
+ };
10745
+ }[];
10746
+ edges: {
10747
+ from: string;
10748
+ handle: string;
10749
+ to: string;
10750
+ }[];
10751
+ };
10752
+ /** @description Node positions in the editor. Presentation only. */
10753
+ layout?: {
10754
+ [key: string]: {
10755
+ x: number;
10756
+ y: number;
10757
+ };
10758
+ };
10759
+ };
10760
+ };
10761
+ };
10762
+ responses: {
10763
+ /** @description LoginFlow */
10764
+ 200: {
10765
+ headers: {
10766
+ [name: string]: unknown;
10767
+ };
10768
+ content: {
10769
+ "application/json": {
10770
+ /** @description LoginFlow ID */
10771
+ id: string;
10772
+ name: string;
10773
+ /** @enum {string} */
10774
+ trigger: "login";
10775
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10776
+ graph: {
10777
+ nodes: {
10778
+ id: string;
10779
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10780
+ config?: {
10781
+ [key: string]: unknown;
10782
+ };
10783
+ }[];
10784
+ edges: {
10785
+ from: string;
10786
+ handle: string;
10787
+ to: string;
10788
+ }[];
10789
+ };
10790
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
10791
+ revision: number;
10792
+ published?: {
10793
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10794
+ graph: {
10795
+ nodes: {
10796
+ id: string;
10797
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10798
+ config?: {
10799
+ [key: string]: unknown;
10800
+ };
10801
+ }[];
10802
+ edges: {
10803
+ from: string;
10804
+ handle: string;
10805
+ to: string;
10806
+ }[];
10807
+ };
10808
+ revision: number;
10809
+ published_at: string;
10810
+ };
10811
+ /** @description Previously published graphs, newest first, for rollback. */
10812
+ history: {
10813
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10814
+ graph: {
10815
+ nodes: {
10816
+ id: string;
10817
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10818
+ config?: {
10819
+ [key: string]: unknown;
10820
+ };
10821
+ }[];
10822
+ edges: {
10823
+ from: string;
10824
+ handle: string;
10825
+ to: string;
10826
+ }[];
10827
+ };
10828
+ revision: number;
10829
+ published_at: string;
10830
+ }[];
10831
+ /** @description Node positions in the editor. Presentation only. */
10832
+ layout?: {
10833
+ [key: string]: {
10834
+ x: number;
10835
+ y: number;
10836
+ };
10837
+ };
10838
+ /** @description Object is related with this account */
10839
+ account: string;
10840
+ /**
10841
+ * @description LoginFlowMetadata
10842
+ * @default {}
10843
+ */
10844
+ metadata: {
10845
+ [key: string]: unknown;
10846
+ };
10847
+ /** @description LoginFlow creation date */
10848
+ createdAt: string;
10849
+ /** @description LoginFlow updated date */
10850
+ updatedAt?: string;
10851
+ };
10852
+ };
10853
+ };
10854
+ };
10855
+ };
10856
+ "loginflow/delete": {
10857
+ parameters: {
10858
+ query?: never;
10859
+ header?: never;
10860
+ path: {
10861
+ loginflow_id: string;
10862
+ };
10863
+ cookie?: never;
10864
+ };
10865
+ requestBody?: never;
10866
+ responses: {
10867
+ /** @description LoginFlow */
10868
+ 200: {
10869
+ headers: {
10870
+ [name: string]: unknown;
10871
+ };
10872
+ content: {
10873
+ "application/json": {
10874
+ /** @description LoginFlow ID */
10875
+ id: string;
10876
+ name: string;
10877
+ /** @enum {string} */
10878
+ trigger: "login";
10879
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10880
+ graph: {
10881
+ nodes: {
10882
+ id: string;
10883
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10884
+ config?: {
10885
+ [key: string]: unknown;
10886
+ };
10887
+ }[];
10888
+ edges: {
10889
+ from: string;
10890
+ handle: string;
10891
+ to: string;
10892
+ }[];
10893
+ };
10894
+ /** @description Monotonic edit counter, bumped on every update. A publish freezes the graph under the revision it had; a login in flight pins the revision it started on. */
10895
+ revision: number;
10896
+ published?: {
10897
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10898
+ graph: {
10899
+ nodes: {
10900
+ id: string;
10901
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10902
+ config?: {
10903
+ [key: string]: unknown;
10904
+ };
10905
+ }[];
10906
+ edges: {
10907
+ from: string;
10908
+ handle: string;
10909
+ to: string;
10910
+ }[];
10911
+ };
10912
+ revision: number;
10913
+ published_at: string;
10914
+ };
10915
+ /** @description Previously published graphs, newest first, for rollback. */
10916
+ history: {
10917
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
10918
+ graph: {
10919
+ nodes: {
10920
+ id: string;
10921
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
10922
+ config?: {
10923
+ [key: string]: unknown;
10924
+ };
10925
+ }[];
10926
+ edges: {
10927
+ from: string;
10928
+ handle: string;
10929
+ to: string;
10930
+ }[];
10931
+ };
10932
+ revision: number;
10933
+ published_at: string;
10934
+ }[];
10935
+ /** @description Node positions in the editor. Presentation only. */
10936
+ layout?: {
10937
+ [key: string]: {
10938
+ x: number;
10939
+ y: number;
10940
+ };
10941
+ };
10942
+ /** @description Object is related with this account */
10943
+ account: string;
10944
+ /**
10945
+ * @description LoginFlowMetadata
10946
+ * @default {}
10947
+ */
10948
+ metadata: {
10949
+ [key: string]: unknown;
10950
+ };
10951
+ /** @description LoginFlow creation date */
10952
+ createdAt: string;
10953
+ /** @description LoginFlow updated date */
10954
+ updatedAt?: string;
10955
+ };
10956
+ };
10957
+ };
10958
+ };
10959
+ };
9249
10960
  "notificationsubscription/list": {
9250
10961
  parameters: {
9251
10962
  query?: {
@@ -10059,6 +11770,8 @@ export interface operations {
10059
11770
  otp: string;
10060
11771
  /** @description Same-origin path to return the user to after authentication, instead of the OAuth client redirect. Used by first-party interactive flows (e.g. device-code confirm). Non same-origin values are ignored. */
10061
11772
  redirect_to?: string;
11773
+ /** @description The "Remember me on this device" checkbox. Honoured only when the tenant shows one (`login_methods.remember_me: "optional"`). */
11774
+ remember_me?: boolean;
10062
11775
  };
10063
11776
  };
10064
11777
  };
@@ -10154,6 +11867,12 @@ export interface operations {
10154
11867
  email_bounced_at?: string | null;
10155
11868
  /** @description ISO 8601 timestamp of the built-in welcome email send. Set once by the platform; guarantees at most one welcome per user. */
10156
11869
  welcome_sent_at?: string | null;
11870
+ /** @description ISO 8601 timestamp of the last time the hosted "create a passkey" offer was shown to this user after a login. Drives the snooze in `login_methods.passkey_promotion_snooze_days`. */
11871
+ passkey_prompted_at?: string | null;
11872
+ /** @description How many times the passkey offer has been shown to this user. Capped by `login_methods.passkey_promotion_max_prompts`; reset by an administrator through `POST /user/:id/passkey-prompt/reset`. */
11873
+ passkey_prompt_count?: number;
11874
+ /** @description ISO 8601 timestamp of the last time the user chose "Not now" on the passkey offer, as opposed to closing the tab. */
11875
+ passkey_prompt_dismissed_at?: string | null;
10157
11876
  /** @description contact phone number */
10158
11877
  phone?: string | null;
10159
11878
  /** @description phone is verified */
@@ -10288,6 +12007,8 @@ export interface operations {
10288
12007
  connection_scope?: string;
10289
12008
  /** @description Link mode: attach the resulting provider identity to the ACTIVE session user instead of signing in or up. Requires a session; incompatible with prompt=login/consent. */
10290
12009
  link?: boolean;
12010
+ /** @description Preview token from `POST /loginflow/:id/preview-token`. This login runs the DRAFT of that flow, for this browser only; nothing is published. Invalid or expired tokens are ignored. */
12011
+ flow_preview?: string;
10291
12012
  /** @description Single-use ticket from `POST /oauth/link_ticket`. With `link=true`, establishes the cookie session for the ticket’s user before linking — for Relying Parties that hold tokens but no cookie session (direct grants such as passwordless OTP). Invalid or expired tickets are ignored. */
10292
12013
  link_ticket?: string;
10293
12014
  client_id: string;
@@ -10879,6 +12600,8 @@ export interface operations {
10879
12600
  response_type?: string;
10880
12601
  /** @description Same-origin path to return the user to after authentication, instead of the OAuth client redirect. Used by first-party interactive flows (e.g. device-code confirm). Non same-origin values are ignored. */
10881
12602
  redirect_to?: string;
12603
+ /** @description The "Remember me on this device" checkbox. Honoured only when the tenant shows one (`login_methods.remember_me: "optional"`): `true` keeps the session for `remember_me_days`, `false` ends it when the browser closes. */
12604
+ remember_me?: boolean;
10882
12605
  client_id: string;
10883
12606
  /** @description Deprecated. Use connection_id */
10884
12607
  connection?: string;