@faable/auth-sdk 2.7.104 → 2.7.105

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.
@@ -4532,7 +4532,7 @@ export interface paths {
4532
4532
  head?: never;
4533
4533
  /**
4534
4534
  * Update current User profile
4535
- * @description Updates the profile of the User behind the current session or bearer token. Only `name`, `company_name` and `country_iso` can be changed; `company_name` is merged into `user_metadata` without touching its other keys. A Bearer token must belong to this Account.
4535
+ * @description Updates the profile of the User behind the current session or bearer token. Only `name`, `company_name`, `country_iso` and the custom `fields` the application declares (`profile_fields`) can be changed; `company_name` and `fields` are merged into `user_metadata` without touching its other keys. A Bearer token must belong to this Account.
4536
4536
  */
4537
4537
  patch: operations["session/me_update"];
4538
4538
  trace?: never;
@@ -4577,6 +4577,46 @@ export interface paths {
4577
4577
  patch?: never;
4578
4578
  trace?: never;
4579
4579
  };
4580
+ "/me/credentials": {
4581
+ parameters: {
4582
+ query?: never;
4583
+ header?: never;
4584
+ path?: never;
4585
+ cookie?: never;
4586
+ };
4587
+ /**
4588
+ * How the current User signs in
4589
+ * @description Whether the User behind the session or bearer token has a password, and which connections they are linked to. A Bearer token must belong to this Account and be a user token.
4590
+ */
4591
+ get: operations["session/me_credentials"];
4592
+ put?: never;
4593
+ post?: never;
4594
+ delete?: never;
4595
+ options?: never;
4596
+ head?: never;
4597
+ patch?: never;
4598
+ trace?: never;
4599
+ };
4600
+ "/me/password": {
4601
+ parameters: {
4602
+ query?: never;
4603
+ header?: never;
4604
+ path?: never;
4605
+ cookie?: never;
4606
+ };
4607
+ get?: never;
4608
+ put?: never;
4609
+ /**
4610
+ * Set or change the current User password
4611
+ * @description Sets the password of the User behind the session or bearer token, creating their `database` credential if they have none (e.g. they signed up with Google). Changing an existing password needs `current_password`. Setting the first one needs a verified email and a recent sign-in: `auth_time` within 5 minutes and, when the User has a second factor, a sign-in that completed it (`acr` = `urn:faable:loa:2`); otherwise `reauth_required`, and the app signs in again with `max_age=0`. The connection's password policy applies. Every other session of the User is revoked, and the User gets a security email. A Bearer token must belong to this Account and be a user token.
4612
+ */
4613
+ post: operations["session/me_password"];
4614
+ delete?: never;
4615
+ options?: never;
4616
+ head?: never;
4617
+ patch?: never;
4618
+ trace?: never;
4619
+ };
4580
4620
  "/logout": {
4581
4621
  parameters: {
4582
4622
  query?: never;
@@ -5585,6 +5625,17 @@ export interface components {
5585
5625
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
5586
5626
  theme?: "system" | "light" | "dark";
5587
5627
  };
5628
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
5629
+ profile_fields?: {
5630
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
5631
+ key: string;
5632
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
5633
+ type: "string" | "enum";
5634
+ /** @description The accepted values when `type` is `enum`. */
5635
+ options?: string[];
5636
+ /** @description Longest accepted value for a `string` field. Default 200. */
5637
+ max_length?: number;
5638
+ }[];
5588
5639
  /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
5589
5640
  login_flow?: string | null;
5590
5641
  /** @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. */
@@ -5920,6 +5971,17 @@ export interface components {
5920
5971
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
5921
5972
  theme?: "system" | "light" | "dark";
5922
5973
  };
5974
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
5975
+ profile_fields?: {
5976
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
5977
+ key: string;
5978
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
5979
+ type: "string" | "enum";
5980
+ /** @description The accepted values when `type` is `enum`. */
5981
+ options?: string[];
5982
+ /** @description Longest accepted value for a `string` field. Default 200. */
5983
+ max_length?: number;
5984
+ }[];
5923
5985
  /** @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. */
5924
5986
  mfa_policy?: {
5925
5987
  /** @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. */
@@ -6063,6 +6125,17 @@ export interface components {
6063
6125
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
6064
6126
  theme?: "system" | "light" | "dark";
6065
6127
  } | null;
6128
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
6129
+ profile_fields?: {
6130
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
6131
+ key: string;
6132
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
6133
+ type: "string" | "enum";
6134
+ /** @description The accepted values when `type` is `enum`. */
6135
+ options?: string[];
6136
+ /** @description Longest accepted value for a `string` field. Default 200. */
6137
+ max_length?: number;
6138
+ }[] | null;
6066
6139
  mfa_policy?: {
6067
6140
  /** @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. */
6068
6141
  mode?: "off" | "optional" | "required";
@@ -7650,8 +7723,8 @@ export interface components {
7650
7723
  expires_at: string;
7651
7724
  /** Format: date-time */
7652
7725
  revoked_at?: string;
7653
- /** @description `admin`: revoked through the Management API. `logout`: the user signed out. `user`: the user revoked it from another device. */
7654
- revoked_reason?: "admin" | "logout" | "user";
7726
+ /** @description `admin`: revoked through the Management API. `logout`: the user signed out. `user`: the user revoked it from another device. `password_change`: the user set or changed their password, which ends every other session. */
7727
+ revoked_reason?: "admin" | "logout" | "user" | "password_change";
7655
7728
  /** @description Object is related with this account */
7656
7729
  account: string;
7657
7730
  /**
@@ -7926,6 +7999,17 @@ export interface components {
7926
7999
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
7927
8000
  theme?: "system" | "light" | "dark";
7928
8001
  } | null;
8002
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
8003
+ profile_fields?: {
8004
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
8005
+ key: string;
8006
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
8007
+ type: "string" | "enum";
8008
+ /** @description The accepted values when `type` is `enum`. */
8009
+ options?: string[];
8010
+ /** @description Longest accepted value for a `string` field. Default 200. */
8011
+ max_length?: number;
8012
+ }[] | null;
7929
8013
  mfa_policy?: {
7930
8014
  /** @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. */
7931
8015
  mode?: "off" | "optional" | "required";
@@ -8136,6 +8220,10 @@ export interface components {
8136
8220
  * - `login_flow_misconfigured` (500): The login flow of this account cannot run. `message` carries the node error.
8137
8221
  * - `mfa_required` (403): The login needs a second factor that this flow cannot collect, or one is still pending on the session.
8138
8222
  * - `step_up_required` (403): Confirm an existing factor before changing your factors.
8223
+ * - `reauth_required` (403): The operation needs a recent sign-in (and the second factor, when the user has one). Sign in again with `max_age=0` and retry with the new token.
8224
+ * - `invalid_current_password` (400): The current password is wrong.
8225
+ * - `email_not_verified` (403): The user's email is not verified, and the operation needs it to be.
8226
+ * - `invalid_profile_field` (400): A profile field is not declared for this application, or its value does not match the declaration. `message` names the key.
8139
8227
  * - `interaction_required` (403): An Action asked for a redirect on a non-interactive flow.
8140
8228
  * - `passkey_login_disabled` (400): Sign in with a passkey is not enabled for this client.
8141
8229
  * - `mfa_pending` (401): A second-factor challenge is pending; answer it before continuing.
@@ -8190,7 +8278,7 @@ export interface components {
8190
8278
  * - `delivery_in_progress` (409): The delivery is being attempted right now; retry the redeliver in a minute.
8191
8279
  * @enum {string}
8192
8280
  */
8193
- ErrorCode: "bad_request" | "validation_error" | "unauthorized" | "payment_required" | "forbidden" | "not_found" | "method_not_allowed" | "conflict" | "payload_too_large" | "unsupported_media_type" | "unprocessable_entity" | "too_many_requests" | "internal_error" | "already_exists" | "invalid_id" | "account_not_found" | "invalid_query" | "search_not_supported" | "invalid_expand" | "access_denied" | "insufficient_scope" | "team_required" | "account_limit_reached" | "invalid_project_id" | "account_transfer_refused" | "email_sender_domain_not_allowed" | "plan_required" | "invalid_canonical_host" | "canonical_host_breaks_passkeys" | "not_logged_in" | "session_already_revoked" | "invalid_token" | "not_owner" | "user_suspended" | "invalid_credentials" | "login_denied" | "signup_denied" | "client_credentials_denied" | "m2m_quota_exceeded" | "signup_disabled" | "email_taken" | "username_taken" | "invalid_username" | "invalid_email" | "invalid_name" | "same_email" | "user_has_no_email" | "password_too_weak" | "invalid_password_hash" | "weak_password_hash" | "invalid_code" | "invalid_phone" | "phone_changed" | "phone_already_verified" | "sms_unavailable" | "sms_failed" | "invalid_state" | "state_mismatch" | "invalid_ticket" | "ticket_used" | "ticket_expired" | "ticket_not_found" | "credential_not_found" | "invalid_link" | "expired_link" | "invalid_otp" | "invalid_client" | "client_not_found" | "client_mismatch" | "invalid_client_metadata" | "invalid_connection" | "no_database_connection" | "connection_required" | "connection_misconfigured" | "passwordless_unavailable" | "ambiguous_connection" | "invalid_redirect_uri" | "invalid_saml_request" | "saml_sp_mismatch" | "saml_not_enabled" | "invalid_saml_sp" | "origin_not_allowed" | "audience_not_found" | "system_resource" | "invalid_request" | "invalid_device_code" | "provider_error" | "identity_already_linked" | "identity_link_denied" | "identity_conflict" | "identity_orphaned" | "no_provider_token" | "no_refresh_token" | "action_unavailable" | "login_flow_misconfigured" | "mfa_required" | "step_up_required" | "interaction_required" | "passkey_login_disabled" | "mfa_pending" | "mfa_invalid_code" | "mfa_invalid_recovery_code" | "too_many_attempts" | "too_many_login_attempts" | "totp_not_allowed" | "no_usable_factor" | "factor_not_found" | "factor_already_confirmed" | "invalid_factor" | "session_missing" | "passkey_verification_failed" | "no_passkey_enrolled" | "malformed_credential" | "unknown_passkey" | "invalid_passkey" | "invalid_invite_url" | "invite_email_mismatch" | "invite_email_unverified" | "invite_not_found" | "invite_used" | "already_member" | "not_a_member" | "consent_options_unavailable" | "consent_choice_invalid" | "registration_disabled" | "invalid_email_domain" | "public_email_domain" | "organization_domain_not_found" | "organization_domain_taken" | "organization_domain_unverified" | "plan_unavailable" | "organization_domain_mismatch" | "team_not_in_organization" | "organization_has_no_idp" | "organization_not_found" | "invalid_user" | "not_an_organization_admin" | "last_organization_admin" | "team_id_unavailable" | "use_team_member_route" | "role_not_found" | "invalid_role" | "flow_not_found" | "revision_not_found" | "invalid_webhook_event" | "invalid_webhook_url" | "not_a_webhook" | "delivery_not_found" | "delivery_in_progress";
8281
+ ErrorCode: "bad_request" | "validation_error" | "unauthorized" | "payment_required" | "forbidden" | "not_found" | "method_not_allowed" | "conflict" | "payload_too_large" | "unsupported_media_type" | "unprocessable_entity" | "too_many_requests" | "internal_error" | "already_exists" | "invalid_id" | "account_not_found" | "invalid_query" | "search_not_supported" | "invalid_expand" | "access_denied" | "insufficient_scope" | "team_required" | "account_limit_reached" | "invalid_project_id" | "account_transfer_refused" | "email_sender_domain_not_allowed" | "plan_required" | "invalid_canonical_host" | "canonical_host_breaks_passkeys" | "not_logged_in" | "session_already_revoked" | "invalid_token" | "not_owner" | "user_suspended" | "invalid_credentials" | "login_denied" | "signup_denied" | "client_credentials_denied" | "m2m_quota_exceeded" | "signup_disabled" | "email_taken" | "username_taken" | "invalid_username" | "invalid_email" | "invalid_name" | "same_email" | "user_has_no_email" | "password_too_weak" | "invalid_password_hash" | "weak_password_hash" | "invalid_code" | "invalid_phone" | "phone_changed" | "phone_already_verified" | "sms_unavailable" | "sms_failed" | "invalid_state" | "state_mismatch" | "invalid_ticket" | "ticket_used" | "ticket_expired" | "ticket_not_found" | "credential_not_found" | "invalid_link" | "expired_link" | "invalid_otp" | "invalid_client" | "client_not_found" | "client_mismatch" | "invalid_client_metadata" | "invalid_connection" | "no_database_connection" | "connection_required" | "connection_misconfigured" | "passwordless_unavailable" | "ambiguous_connection" | "invalid_redirect_uri" | "invalid_saml_request" | "saml_sp_mismatch" | "saml_not_enabled" | "invalid_saml_sp" | "origin_not_allowed" | "audience_not_found" | "system_resource" | "invalid_request" | "invalid_device_code" | "provider_error" | "identity_already_linked" | "identity_link_denied" | "identity_conflict" | "identity_orphaned" | "no_provider_token" | "no_refresh_token" | "action_unavailable" | "login_flow_misconfigured" | "mfa_required" | "step_up_required" | "reauth_required" | "invalid_current_password" | "email_not_verified" | "invalid_profile_field" | "interaction_required" | "passkey_login_disabled" | "mfa_pending" | "mfa_invalid_code" | "mfa_invalid_recovery_code" | "too_many_attempts" | "too_many_login_attempts" | "totp_not_allowed" | "no_usable_factor" | "factor_not_found" | "factor_already_confirmed" | "invalid_factor" | "session_missing" | "passkey_verification_failed" | "no_passkey_enrolled" | "malformed_credential" | "unknown_passkey" | "invalid_passkey" | "invalid_invite_url" | "invite_email_mismatch" | "invite_email_unverified" | "invite_not_found" | "invite_used" | "already_member" | "not_a_member" | "consent_options_unavailable" | "consent_choice_invalid" | "registration_disabled" | "invalid_email_domain" | "public_email_domain" | "organization_domain_not_found" | "organization_domain_taken" | "organization_domain_unverified" | "plan_unavailable" | "organization_domain_mismatch" | "team_not_in_organization" | "organization_has_no_idp" | "organization_not_found" | "invalid_user" | "not_an_organization_admin" | "last_organization_admin" | "team_id_unavailable" | "use_team_member_route" | "role_not_found" | "invalid_role" | "flow_not_found" | "revision_not_found" | "invalid_webhook_event" | "invalid_webhook_url" | "not_a_webhook" | "delivery_not_found" | "delivery_in_progress";
8194
8282
  /** @description Every error response has this shape. Branch on `error_code`, never on `message`: the message is written for a person and may change. */
8195
8283
  ErrorResponse: {
8196
8284
  /** @description The HTTP status, repeated. */
@@ -8324,6 +8412,17 @@ export interface operations {
8324
8412
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
8325
8413
  theme?: "system" | "light" | "dark";
8326
8414
  };
8415
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
8416
+ profile_fields?: {
8417
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
8418
+ key: string;
8419
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
8420
+ type: "string" | "enum";
8421
+ /** @description The accepted values when `type` is `enum`. */
8422
+ options?: string[];
8423
+ /** @description Longest accepted value for a `string` field. Default 200. */
8424
+ max_length?: number;
8425
+ }[];
8327
8426
  /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
8328
8427
  login_flow?: string | null;
8329
8428
  /** @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. */
@@ -8683,6 +8782,17 @@ export interface operations {
8683
8782
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
8684
8783
  theme?: "system" | "light" | "dark";
8685
8784
  };
8785
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
8786
+ profile_fields?: {
8787
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
8788
+ key: string;
8789
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
8790
+ type: "string" | "enum";
8791
+ /** @description The accepted values when `type` is `enum`. */
8792
+ options?: string[];
8793
+ /** @description Longest accepted value for a `string` field. Default 200. */
8794
+ max_length?: number;
8795
+ }[];
8686
8796
  /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
8687
8797
  login_flow?: string | null;
8688
8798
  /** @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. */
@@ -8930,6 +9040,17 @@ export interface operations {
8930
9040
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
8931
9041
  theme?: "system" | "light" | "dark";
8932
9042
  };
9043
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
9044
+ profile_fields?: {
9045
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
9046
+ key: string;
9047
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
9048
+ type: "string" | "enum";
9049
+ /** @description The accepted values when `type` is `enum`. */
9050
+ options?: string[];
9051
+ /** @description Longest accepted value for a `string` field. Default 200. */
9052
+ max_length?: number;
9053
+ }[];
8933
9054
  /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
8934
9055
  login_flow?: string | null;
8935
9056
  /** @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. */
@@ -9133,6 +9254,17 @@ export interface operations {
9133
9254
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
9134
9255
  theme?: "system" | "light" | "dark";
9135
9256
  } | null;
9257
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
9258
+ profile_fields?: {
9259
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
9260
+ key: string;
9261
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
9262
+ type: "string" | "enum";
9263
+ /** @description The accepted values when `type` is `enum`. */
9264
+ options?: string[];
9265
+ /** @description Longest accepted value for a `string` field. Default 200. */
9266
+ max_length?: number;
9267
+ }[] | null;
9136
9268
  mfa_policy?: {
9137
9269
  /** @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. */
9138
9270
  mode?: "off" | "optional" | "required";
@@ -9254,6 +9386,17 @@ export interface operations {
9254
9386
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
9255
9387
  theme?: "system" | "light" | "dark";
9256
9388
  };
9389
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
9390
+ profile_fields?: {
9391
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
9392
+ key: string;
9393
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
9394
+ type: "string" | "enum";
9395
+ /** @description The accepted values when `type` is `enum`. */
9396
+ options?: string[];
9397
+ /** @description Longest accepted value for a `string` field. Default 200. */
9398
+ max_length?: number;
9399
+ }[];
9257
9400
  /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
9258
9401
  login_flow?: string | null;
9259
9402
  /** @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. */
@@ -10624,6 +10767,17 @@ export interface operations {
10624
10767
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
10625
10768
  theme?: "system" | "light" | "dark";
10626
10769
  };
10770
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
10771
+ profile_fields?: {
10772
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
10773
+ key: string;
10774
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
10775
+ type: "string" | "enum";
10776
+ /** @description The accepted values when `type` is `enum`. */
10777
+ options?: string[];
10778
+ /** @description Longest accepted value for a `string` field. Default 200. */
10779
+ max_length?: number;
10780
+ }[];
10627
10781
  /** @description The login flow bound to this account (`loginflow_xxx`). Absent = the flow compiled from the settings. A Client may bind its own. */
10628
10782
  login_flow?: string | null;
10629
10783
  /** @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. */
@@ -12244,6 +12398,17 @@ export interface operations {
12244
12398
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
12245
12399
  theme?: "system" | "light" | "dark";
12246
12400
  };
12401
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
12402
+ profile_fields?: {
12403
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
12404
+ key: string;
12405
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
12406
+ type: "string" | "enum";
12407
+ /** @description The accepted values when `type` is `enum`. */
12408
+ options?: string[];
12409
+ /** @description Longest accepted value for a `string` field. Default 200. */
12410
+ max_length?: number;
12411
+ }[];
12247
12412
  /** @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. */
12248
12413
  mfa_policy?: {
12249
12414
  /** @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. */
@@ -12468,6 +12633,17 @@ export interface operations {
12468
12633
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
12469
12634
  theme?: "system" | "light" | "dark";
12470
12635
  };
12636
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
12637
+ profile_fields?: {
12638
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
12639
+ key: string;
12640
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
12641
+ type: "string" | "enum";
12642
+ /** @description The accepted values when `type` is `enum`. */
12643
+ options?: string[];
12644
+ /** @description Longest accepted value for a `string` field. Default 200. */
12645
+ max_length?: number;
12646
+ }[];
12471
12647
  /** @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. */
12472
12648
  mfa_policy?: {
12473
12649
  /** @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. */
@@ -12688,6 +12864,17 @@ export interface operations {
12688
12864
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
12689
12865
  theme?: "system" | "light" | "dark";
12690
12866
  } | null;
12867
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
12868
+ profile_fields?: {
12869
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
12870
+ key: string;
12871
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
12872
+ type: "string" | "enum";
12873
+ /** @description The accepted values when `type` is `enum`. */
12874
+ options?: string[];
12875
+ /** @description Longest accepted value for a `string` field. Default 200. */
12876
+ max_length?: number;
12877
+ }[] | null;
12691
12878
  mfa_policy?: {
12692
12879
  /** @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. */
12693
12880
  mode?: "off" | "optional" | "required";
@@ -12806,6 +12993,17 @@ export interface operations {
12806
12993
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
12807
12994
  theme?: "system" | "light" | "dark";
12808
12995
  };
12996
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
12997
+ profile_fields?: {
12998
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
12999
+ key: string;
13000
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
13001
+ type: "string" | "enum";
13002
+ /** @description The accepted values when `type` is `enum`. */
13003
+ options?: string[];
13004
+ /** @description Longest accepted value for a `string` field. Default 200. */
13005
+ max_length?: number;
13006
+ }[];
12809
13007
  /** @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. */
12810
13008
  mfa_policy?: {
12811
13009
  /** @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. */
@@ -13036,6 +13234,17 @@ export interface operations {
13036
13234
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
13037
13235
  theme?: "system" | "light" | "dark";
13038
13236
  };
13237
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
13238
+ profile_fields?: {
13239
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
13240
+ key: string;
13241
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
13242
+ type: "string" | "enum";
13243
+ /** @description The accepted values when `type` is `enum`. */
13244
+ options?: string[];
13245
+ /** @description Longest accepted value for a `string` field. Default 200. */
13246
+ max_length?: number;
13247
+ }[];
13039
13248
  /** @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. */
13040
13249
  mfa_policy?: {
13041
13250
  /** @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. */
@@ -13264,6 +13473,17 @@ export interface operations {
13264
13473
  /** @description Colour theme of the hosted login screens. `system` (the default): the visitor's OS decides, and the visitor can switch it from the screen. `light` / `dark`: forced, and the switch is hidden — for applications whose own pages are only one of the two. A `theme` query parameter on `/authorize` overrides this for that login. */
13265
13474
  theme?: "system" | "light" | "dark";
13266
13475
  };
13476
+ /** @description Profile fields the user may write on themselves with `PATCH /me` (`fields`), stored in `user_metadata["faable.com/fields"]`. On a Client it replaces the account's list entirely; absent = inherit. */
13477
+ profile_fields?: {
13478
+ /** @description The field key, as it is stored in `user_metadata["faable.com/fields"]`. */
13479
+ key: string;
13480
+ /** @description `string`: free text up to `max_length`. `enum`: one of `options`. */
13481
+ type: "string" | "enum";
13482
+ /** @description The accepted values when `type` is `enum`. */
13483
+ options?: string[];
13484
+ /** @description Longest accepted value for a `string` field. Default 200. */
13485
+ max_length?: number;
13486
+ }[];
13267
13487
  /** @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. */
13268
13488
  mfa_policy?: {
13269
13489
  /** @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. */
@@ -30061,8 +30281,8 @@ export interface operations {
30061
30281
  expires_at: string;
30062
30282
  /** Format: date-time */
30063
30283
  revoked_at?: string;
30064
- /** @description `admin`: revoked through the Management API. `logout`: the user signed out. `user`: the user revoked it from another device. */
30065
- revoked_reason?: "admin" | "logout" | "user";
30284
+ /** @description `admin`: revoked through the Management API. `logout`: the user signed out. `user`: the user revoked it from another device. `password_change`: the user set or changed their password, which ends every other session. */
30285
+ revoked_reason?: "admin" | "logout" | "user" | "password_change";
30066
30286
  /** @description Object is related with this account */
30067
30287
  account: string;
30068
30288
  /**
@@ -30216,8 +30436,8 @@ export interface operations {
30216
30436
  expires_at: string;
30217
30437
  /** Format: date-time */
30218
30438
  revoked_at?: string;
30219
- /** @description `admin`: revoked through the Management API. `logout`: the user signed out. `user`: the user revoked it from another device. */
30220
- revoked_reason?: "admin" | "logout" | "user";
30439
+ /** @description `admin`: revoked through the Management API. `logout`: the user signed out. `user`: the user revoked it from another device. `password_change`: the user set or changed their password, which ends every other session. */
30440
+ revoked_reason?: "admin" | "logout" | "user" | "password_change";
30221
30441
  /** @description Object is related with this account */
30222
30442
  account: string;
30223
30443
  /**
@@ -31686,6 +31906,18 @@ export interface operations {
31686
31906
  };
31687
31907
  };
31688
31908
  };
31909
+ /** @description `forbidden` — The credentials are valid but do not allow this operation. */
31910
+ 403: {
31911
+ headers: {
31912
+ [name: string]: unknown;
31913
+ };
31914
+ content: {
31915
+ "application/json": components["schemas"]["ErrorResponse"] & {
31916
+ /** @enum {string} */
31917
+ error_code?: "forbidden";
31918
+ };
31919
+ };
31920
+ };
31689
31921
  /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
31690
31922
  404: {
31691
31923
  headers: {
@@ -31813,13 +32045,18 @@ export interface operations {
31813
32045
  path?: never;
31814
32046
  cookie?: never;
31815
32047
  };
31816
- /** @description Profile fields the current User may edit on themselves. `company_name` is stored in `user_metadata`, merged with whatever else is there. */
32048
+ /** @description Profile fields the current User may edit on themselves. `company_name` and `fields` are stored in `user_metadata`, merged with whatever else is there. */
31817
32049
  requestBody: {
31818
32050
  content: {
31819
32051
  "application/json": {
31820
32052
  name?: string;
31821
32053
  company_name?: string;
31822
32054
  country_iso?: string;
32055
+ /** @description Custom profile fields, stored in `user_metadata["faable.com/fields"]` and merged by key: keys not named here are kept, `null` removes one. Only the keys the application declares in `profile_fields` (Client, else Account) are accepted; any other key fails the whole request with `invalid_profile_field`. */
32056
+ fields?: {
32057
+ key: string;
32058
+ value: string | null;
32059
+ }[];
31823
32060
  };
31824
32061
  };
31825
32062
  };
@@ -31960,6 +32197,8 @@ export interface operations {
31960
32197
  /**
31961
32198
  * @description `bad_request` — The request is malformed. `message` says what is wrong.
31962
32199
  *
32200
+ * `invalid_profile_field` — A profile field is not declared for this application, or its value does not match the declaration. `message` names the key.
32201
+ *
31963
32202
  * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
31964
32203
  */
31965
32204
  400: {
@@ -31969,7 +32208,7 @@ export interface operations {
31969
32208
  content: {
31970
32209
  "application/json": components["schemas"]["ErrorResponse"] & {
31971
32210
  /** @enum {string} */
31972
- error_code?: "bad_request" | "validation_error";
32211
+ error_code?: "bad_request" | "invalid_profile_field" | "validation_error";
31973
32212
  };
31974
32213
  };
31975
32214
  };
@@ -32190,6 +32429,238 @@ export interface operations {
32190
32429
  };
32191
32430
  };
32192
32431
  };
32432
+ "session/me_credentials": {
32433
+ parameters: {
32434
+ query?: never;
32435
+ header?: never;
32436
+ path?: never;
32437
+ cookie?: never;
32438
+ };
32439
+ requestBody?: never;
32440
+ responses: {
32441
+ /** @description Default Response */
32442
+ 200: {
32443
+ headers: {
32444
+ [name: string]: unknown;
32445
+ };
32446
+ content: {
32447
+ "application/json": {
32448
+ /** @description Whether the user can sign in with a password: they have a `database` credential with a password set. */
32449
+ has_password: boolean;
32450
+ /** @description Every connection the user is linked to: the database one when they have a password, and each social or enterprise identity. Never the provider tokens or profile. */
32451
+ connections: {
32452
+ /** @description The Connection id (`connection_xxx`). */
32453
+ id: string;
32454
+ /** @description The Connection name. */
32455
+ name: string;
32456
+ /** @description The Connection type: `database`, `google`, `github`, … */
32457
+ type: string;
32458
+ }[];
32459
+ };
32460
+ };
32461
+ };
32462
+ /**
32463
+ * @description `mfa_pending` — A second-factor challenge is pending; answer it before continuing.
32464
+ *
32465
+ * `not_logged_in` — There is no signed-in session for this request.
32466
+ */
32467
+ 401: {
32468
+ headers: {
32469
+ [name: string]: unknown;
32470
+ };
32471
+ content: {
32472
+ "application/json": components["schemas"]["ErrorResponse"] & {
32473
+ /** @enum {string} */
32474
+ error_code?: "mfa_pending" | "not_logged_in";
32475
+ };
32476
+ };
32477
+ };
32478
+ /** @description `forbidden` — The credentials are valid but do not allow this operation. */
32479
+ 403: {
32480
+ headers: {
32481
+ [name: string]: unknown;
32482
+ };
32483
+ content: {
32484
+ "application/json": components["schemas"]["ErrorResponse"] & {
32485
+ /** @enum {string} */
32486
+ error_code?: "forbidden";
32487
+ };
32488
+ };
32489
+ };
32490
+ /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
32491
+ 404: {
32492
+ headers: {
32493
+ [name: string]: unknown;
32494
+ };
32495
+ content: {
32496
+ "application/json": components["schemas"]["ErrorResponse"] & {
32497
+ /** @enum {string} */
32498
+ error_code?: "account_not_found";
32499
+ };
32500
+ };
32501
+ };
32502
+ /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
32503
+ 429: {
32504
+ headers: {
32505
+ [name: string]: unknown;
32506
+ };
32507
+ content: {
32508
+ "application/json": components["schemas"]["ErrorResponse"] & {
32509
+ /** @enum {string} */
32510
+ error_code?: "too_many_requests";
32511
+ };
32512
+ };
32513
+ };
32514
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
32515
+ 500: {
32516
+ headers: {
32517
+ [name: string]: unknown;
32518
+ };
32519
+ content: {
32520
+ "application/json": components["schemas"]["ErrorResponse"] & {
32521
+ /** @enum {string} */
32522
+ error_code?: "internal_error";
32523
+ };
32524
+ };
32525
+ };
32526
+ };
32527
+ };
32528
+ "session/me_password": {
32529
+ parameters: {
32530
+ query?: never;
32531
+ header?: never;
32532
+ path?: never;
32533
+ cookie?: never;
32534
+ };
32535
+ requestBody: {
32536
+ content: {
32537
+ "application/json": {
32538
+ password: string;
32539
+ current_password?: string;
32540
+ };
32541
+ };
32542
+ };
32543
+ responses: {
32544
+ /** @description Default Response */
32545
+ 200: {
32546
+ headers: {
32547
+ [name: string]: unknown;
32548
+ };
32549
+ content: {
32550
+ "application/json": {
32551
+ /** @description How many other sessions of the user were ended. */
32552
+ revoked_sessions: number;
32553
+ };
32554
+ };
32555
+ };
32556
+ /**
32557
+ * @description `invalid_current_password` — The current password is wrong.
32558
+ *
32559
+ * `password_too_weak` — The password does not meet the connection policy. `message` lists each unmet rule.
32560
+ *
32561
+ * `no_database_connection` — The tenant has no database connection, so there is nowhere to store a password. Create one and retry.
32562
+ *
32563
+ * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
32564
+ */
32565
+ 400: {
32566
+ headers: {
32567
+ [name: string]: unknown;
32568
+ };
32569
+ content: {
32570
+ "application/json": components["schemas"]["ErrorResponse"] & {
32571
+ /** @enum {string} */
32572
+ error_code?: "invalid_current_password" | "password_too_weak" | "no_database_connection" | "validation_error";
32573
+ };
32574
+ };
32575
+ };
32576
+ /**
32577
+ * @description `mfa_pending` — A second-factor challenge is pending; answer it before continuing.
32578
+ *
32579
+ * `not_logged_in` — There is no signed-in session for this request.
32580
+ */
32581
+ 401: {
32582
+ headers: {
32583
+ [name: string]: unknown;
32584
+ };
32585
+ content: {
32586
+ "application/json": components["schemas"]["ErrorResponse"] & {
32587
+ /** @enum {string} */
32588
+ error_code?: "mfa_pending" | "not_logged_in";
32589
+ };
32590
+ };
32591
+ };
32592
+ /**
32593
+ * @description `forbidden` — The credentials are valid but do not allow this operation.
32594
+ *
32595
+ * `reauth_required` — The operation needs a recent sign-in (and the second factor, when the user has one). Sign in again with `max_age=0` and retry with the new token.
32596
+ *
32597
+ * `email_not_verified` — The user's email is not verified, and the operation needs it to be.
32598
+ */
32599
+ 403: {
32600
+ headers: {
32601
+ [name: string]: unknown;
32602
+ };
32603
+ content: {
32604
+ "application/json": components["schemas"]["ErrorResponse"] & {
32605
+ /** @enum {string} */
32606
+ error_code?: "forbidden" | "reauth_required" | "email_not_verified";
32607
+ };
32608
+ };
32609
+ };
32610
+ /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
32611
+ 404: {
32612
+ headers: {
32613
+ [name: string]: unknown;
32614
+ };
32615
+ content: {
32616
+ "application/json": components["schemas"]["ErrorResponse"] & {
32617
+ /** @enum {string} */
32618
+ error_code?: "account_not_found";
32619
+ };
32620
+ };
32621
+ };
32622
+ /** @description `conflict` — The request conflicts with the current state of the resource. */
32623
+ 409: {
32624
+ headers: {
32625
+ [name: string]: unknown;
32626
+ };
32627
+ content: {
32628
+ "application/json": components["schemas"]["ErrorResponse"] & {
32629
+ /** @enum {string} */
32630
+ error_code?: "conflict";
32631
+ };
32632
+ };
32633
+ };
32634
+ /**
32635
+ * @description `too_many_login_attempts` — Too many failed sign-in attempts for this email or username from this network. Wait a few minutes and try again.
32636
+ *
32637
+ * `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header.
32638
+ */
32639
+ 429: {
32640
+ headers: {
32641
+ [name: string]: unknown;
32642
+ };
32643
+ content: {
32644
+ "application/json": components["schemas"]["ErrorResponse"] & {
32645
+ /** @enum {string} */
32646
+ error_code?: "too_many_login_attempts" | "too_many_requests";
32647
+ };
32648
+ };
32649
+ };
32650
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
32651
+ 500: {
32652
+ headers: {
32653
+ [name: string]: unknown;
32654
+ };
32655
+ content: {
32656
+ "application/json": components["schemas"]["ErrorResponse"] & {
32657
+ /** @enum {string} */
32658
+ error_code?: "internal_error";
32659
+ };
32660
+ };
32661
+ };
32662
+ };
32663
+ };
32193
32664
  "session/logout": {
32194
32665
  parameters: {
32195
32666
  query?: {