@faable/auth-sdk 2.7.93 → 2.7.95

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.
@@ -1716,6 +1716,46 @@ export interface paths {
1716
1716
  patch?: never;
1717
1717
  trace?: never;
1718
1718
  };
1719
+ "/account/keys/saml": {
1720
+ parameters: {
1721
+ query?: never;
1722
+ header?: never;
1723
+ path?: never;
1724
+ cookie?: never;
1725
+ };
1726
+ /**
1727
+ * Get the SAML signing certificates
1728
+ * @description The X.509 certificate this Account signs SAML assertions with, and the next one when a rotation is staged. Separate from the JWKS keys: rotating tokens never touches SAML. Created on first use.
1729
+ */
1730
+ get: operations["account/getSamlKeys"];
1731
+ put?: never;
1732
+ post?: never;
1733
+ delete?: never;
1734
+ options?: never;
1735
+ head?: never;
1736
+ patch?: never;
1737
+ trace?: never;
1738
+ };
1739
+ "/account/keys/saml/rotate": {
1740
+ parameters: {
1741
+ query?: never;
1742
+ header?: never;
1743
+ path?: never;
1744
+ cookie?: never;
1745
+ };
1746
+ get?: never;
1747
+ put?: never;
1748
+ /**
1749
+ * Rotate the SAML signing certificate
1750
+ * @description Two steps. The first call stages a new certificate: the IdP metadata publishes both and signing continues with the current one, so each Service Provider can be updated. The second call promotes it: assertions are signed with the new certificate and the old one is dropped.
1751
+ */
1752
+ post: operations["account/rotateSamlKeys"];
1753
+ delete?: never;
1754
+ options?: never;
1755
+ head?: never;
1756
+ patch?: never;
1757
+ trace?: never;
1758
+ };
1719
1759
  "/account/keys": {
1720
1760
  parameters: {
1721
1761
  query?: never;
@@ -5208,6 +5248,70 @@ export interface paths {
5208
5248
  patch?: never;
5209
5249
  trace?: never;
5210
5250
  };
5251
+ "/saml/metadata/{client_id}": {
5252
+ parameters: {
5253
+ query?: never;
5254
+ header?: never;
5255
+ path?: never;
5256
+ cookie?: never;
5257
+ };
5258
+ /**
5259
+ * SAML IdP metadata
5260
+ * @description This tenant's SAML 2.0 IdP metadata for one client: entity ID, single sign-on URL and signing certificates. Paste it, or its URL, into the Service Provider.
5261
+ */
5262
+ get: operations["saml/metadata"];
5263
+ put?: never;
5264
+ post?: never;
5265
+ delete?: never;
5266
+ options?: never;
5267
+ head?: never;
5268
+ patch?: never;
5269
+ trace?: never;
5270
+ };
5271
+ "/saml/sso/{client_id}": {
5272
+ parameters: {
5273
+ query?: never;
5274
+ header?: never;
5275
+ path?: never;
5276
+ cookie?: never;
5277
+ };
5278
+ /**
5279
+ * SAML single sign-on
5280
+ * @description Single sign-on service (HTTP-Redirect and HTTP-POST bindings). With a SAMLRequest it answers the Service Provider; without one it starts an IdP-initiated login. The signed response is posted to the client's configured ACS URL.
5281
+ */
5282
+ get: operations["saml/sso"];
5283
+ put?: never;
5284
+ /**
5285
+ * SAML single sign-on
5286
+ * @description Single sign-on service (HTTP-Redirect and HTTP-POST bindings). With a SAMLRequest it answers the Service Provider; without one it starts an IdP-initiated login. The signed response is posted to the client's configured ACS URL.
5287
+ */
5288
+ post: operations["saml/sso_post"];
5289
+ delete?: never;
5290
+ options?: never;
5291
+ head?: never;
5292
+ patch?: never;
5293
+ trace?: never;
5294
+ };
5295
+ "/saml/callback": {
5296
+ parameters: {
5297
+ query?: never;
5298
+ header?: never;
5299
+ path?: never;
5300
+ cookie?: never;
5301
+ };
5302
+ /**
5303
+ * SAML bridge callback
5304
+ * @description Internal: where the login flow returns to finish a SAML sign-on. Not for direct use.
5305
+ */
5306
+ get: operations["saml/callback"];
5307
+ put?: never;
5308
+ post?: never;
5309
+ delete?: never;
5310
+ options?: never;
5311
+ head?: never;
5312
+ patch?: never;
5313
+ trace?: never;
5314
+ };
5211
5315
  "/usernamepassword/login": {
5212
5316
  parameters: {
5213
5317
  query?: never;
@@ -5818,6 +5922,25 @@ export interface components {
5818
5922
  login_flow?: string | null;
5819
5923
  /** @description Audience used when a client_credentials token request sends none (e.g. `faable:management:<account_id>`). An explicit `audience` in the request wins. Absent = `${iss}/userinfo`. */
5820
5924
  default_audience?: string | null;
5925
+ saml_sp?: {
5926
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
5927
+ enabled: boolean;
5928
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
5929
+ entity_id: string;
5930
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
5931
+ acs_url: string;
5932
+ /**
5933
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
5934
+ * @enum {unknown}
5935
+ */
5936
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
5937
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
5938
+ attribute_mapping?: {
5939
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
5940
+ };
5941
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
5942
+ sign_response?: boolean;
5943
+ } | null;
5821
5944
  /** @description Object is related with this account */
5822
5945
  account: string;
5823
5946
  /**
@@ -5939,6 +6062,25 @@ export interface components {
5939
6062
  login_flow?: string | null;
5940
6063
  /** @description Audience a client_credentials token request gets when it sends none. An explicit `audience` wins. `null` removes it. */
5941
6064
  default_audience?: string | null;
6065
+ saml_sp?: {
6066
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
6067
+ enabled: boolean;
6068
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
6069
+ entity_id: string;
6070
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
6071
+ acs_url: string;
6072
+ /**
6073
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
6074
+ * @enum {unknown}
6075
+ */
6076
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
6077
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
6078
+ attribute_mapping?: {
6079
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
6080
+ };
6081
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
6082
+ sign_response?: boolean;
6083
+ } | null;
5942
6084
  /** @description Free-form client metadata. Replaces the whole object — send the full merged value, not a partial delta. Omit it to leave the metadata untouched. */
5943
6085
  metadata?: {
5944
6086
  [key: string]: unknown;
@@ -7954,6 +8096,10 @@ export interface components {
7954
8096
  * - `passwordless_unavailable` (400): No passwordless connection is configured or enabled for this client.
7955
8097
  * - `ambiguous_connection` (400): Several connections match; pass `connection_id`.
7956
8098
  * - `invalid_redirect_uri` (400): The redirect URI is not registered for the client.
8099
+ * - `invalid_saml_request` (400): The SAMLRequest is missing, too large, not well-formed or not a SAML 2.0 AuthnRequest.
8100
+ * - `saml_sp_mismatch` (400): The AuthnRequest does not match the client's SAML configuration: its Issuer is not the configured entity_id, or it asks for another Assertion Consumer Service URL or binding.
8101
+ * - `saml_not_enabled` (404): This client does not have SAML enabled.
8102
+ * - `invalid_saml_sp` (400): The `saml_sp` configuration is invalid: `acs_url` must be an absolute https URL without a fragment.
7957
8103
  * - `origin_not_allowed` (403): The request `Origin` is not in the client's Allowed Web Origins.
7958
8104
  * - `audience_not_found` (403): The `audience` does not name an API registered in this account.
7959
8105
  * - `system_resource` (403): The resource is managed by Faable and cannot be modified or deleted.
@@ -8024,7 +8170,7 @@ export interface components {
8024
8170
  * - `delivery_in_progress` (409): The delivery is being attempted right now; retry the redeliver in a minute.
8025
8171
  * @enum {string}
8026
8172
  */
8027
- 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" | "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";
8173
+ 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";
8028
8174
  /** @description Every error response has this shape. Branch on `error_code`, never on `message`: the message is written for a person and may change. */
8029
8175
  ErrorResponse: {
8030
8176
  /** @description The HTTP status, repeated. */
@@ -12000,6 +12146,25 @@ export interface operations {
12000
12146
  login_flow?: string | null;
12001
12147
  /** @description Audience used when a client_credentials token request sends none (e.g. `faable:management:<account_id>`). An explicit `audience` in the request wins. Absent = `${iss}/userinfo`. */
12002
12148
  default_audience?: string | null;
12149
+ saml_sp?: {
12150
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
12151
+ enabled: boolean;
12152
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
12153
+ entity_id: string;
12154
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
12155
+ acs_url: string;
12156
+ /**
12157
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
12158
+ * @enum {unknown}
12159
+ */
12160
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
12161
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
12162
+ attribute_mapping?: {
12163
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
12164
+ };
12165
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
12166
+ sign_response?: boolean;
12167
+ } | null;
12003
12168
  /** @description Object is related with this account */
12004
12169
  account: string;
12005
12170
  /**
@@ -12205,6 +12370,25 @@ export interface operations {
12205
12370
  login_flow?: string | null;
12206
12371
  /** @description Audience used when a client_credentials token request sends none (e.g. `faable:management:<account_id>`). An explicit `audience` in the request wins. Absent = `${iss}/userinfo`. */
12207
12372
  default_audience?: string | null;
12373
+ saml_sp?: {
12374
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
12375
+ enabled: boolean;
12376
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
12377
+ entity_id: string;
12378
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
12379
+ acs_url: string;
12380
+ /**
12381
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
12382
+ * @enum {unknown}
12383
+ */
12384
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
12385
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
12386
+ attribute_mapping?: {
12387
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
12388
+ };
12389
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
12390
+ sign_response?: boolean;
12391
+ } | null;
12208
12392
  /** @description Object is related with this account */
12209
12393
  account: string;
12210
12394
  /**
@@ -12403,6 +12587,25 @@ export interface operations {
12403
12587
  login_flow?: string | null;
12404
12588
  /** @description Audience a client_credentials token request gets when it sends none. An explicit `audience` wins. `null` removes it. */
12405
12589
  default_audience?: string | null;
12590
+ saml_sp?: {
12591
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
12592
+ enabled: boolean;
12593
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
12594
+ entity_id: string;
12595
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
12596
+ acs_url: string;
12597
+ /**
12598
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
12599
+ * @enum {unknown}
12600
+ */
12601
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
12602
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
12603
+ attribute_mapping?: {
12604
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
12605
+ };
12606
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
12607
+ sign_response?: boolean;
12608
+ } | null;
12406
12609
  /** @description Free-form client metadata. Replaces the whole object — send the full merged value, not a partial delta. Omit it to leave the metadata untouched. */
12407
12610
  metadata?: {
12408
12611
  [key: string]: unknown;
@@ -12505,6 +12708,25 @@ export interface operations {
12505
12708
  login_flow?: string | null;
12506
12709
  /** @description Audience used when a client_credentials token request sends none (e.g. `faable:management:<account_id>`). An explicit `audience` in the request wins. Absent = `${iss}/userinfo`. */
12507
12710
  default_audience?: string | null;
12711
+ saml_sp?: {
12712
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
12713
+ enabled: boolean;
12714
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
12715
+ entity_id: string;
12716
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
12717
+ acs_url: string;
12718
+ /**
12719
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
12720
+ * @enum {unknown}
12721
+ */
12722
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
12723
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
12724
+ attribute_mapping?: {
12725
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
12726
+ };
12727
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
12728
+ sign_response?: boolean;
12729
+ } | null;
12508
12730
  /** @description Object is related with this account */
12509
12731
  account: string;
12510
12732
  /**
@@ -12716,6 +12938,25 @@ export interface operations {
12716
12938
  login_flow?: string | null;
12717
12939
  /** @description Audience used when a client_credentials token request sends none (e.g. `faable:management:<account_id>`). An explicit `audience` in the request wins. Absent = `${iss}/userinfo`. */
12718
12940
  default_audience?: string | null;
12941
+ saml_sp?: {
12942
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
12943
+ enabled: boolean;
12944
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
12945
+ entity_id: string;
12946
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
12947
+ acs_url: string;
12948
+ /**
12949
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
12950
+ * @enum {unknown}
12951
+ */
12952
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
12953
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
12954
+ attribute_mapping?: {
12955
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
12956
+ };
12957
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
12958
+ sign_response?: boolean;
12959
+ } | null;
12719
12960
  /** @description Object is related with this account */
12720
12961
  account: string;
12721
12962
  /**
@@ -12925,6 +13166,25 @@ export interface operations {
12925
13166
  login_flow?: string | null;
12926
13167
  /** @description Audience used when a client_credentials token request sends none (e.g. `faable:management:<account_id>`). An explicit `audience` in the request wins. Absent = `${iss}/userinfo`. */
12927
13168
  default_audience?: string | null;
13169
+ saml_sp?: {
13170
+ /** @description Whether this client answers SAML requests. Off keeps the configuration but every /saml route of the client returns 404. */
13171
+ enabled: boolean;
13172
+ /** @description The Service Provider's Entity ID. Its AuthnRequests must carry it as Issuer, and every assertion is restricted to it as Audience. */
13173
+ entity_id: string;
13174
+ /** @description The Service Provider's Assertion Consumer Service URL (HTTP-POST binding), https. The only URL a response is ever posted to: an AuthnRequest naming another one is refused. */
13175
+ acs_url: string;
13176
+ /**
13177
+ * @description `emailAddress` (default) sends the email as NameID; `persistent` sends the stable user id; `unspecified` sends the email when the user has one, the user id otherwise.
13178
+ * @enum {unknown}
13179
+ */
13180
+ nameid_format?: "emailAddress" | "persistent" | "unspecified";
13181
+ /** @description SAML attribute name → user field. Omit for the default (email, name, given_name, family_name). Custom ID token claims set by post-login actions are added as attributes too. */
13182
+ attribute_mapping?: {
13183
+ [key: string]: "user_id" | "email" | "email_verified" | "name" | "given_name" | "family_name" | "nickname" | "picture" | "phone_number";
13184
+ };
13185
+ /** @description Also sign the Response envelope, not only the Assertion. Default true; a few SPs reject a doubly-signed message. */
13186
+ sign_response?: boolean;
13187
+ } | null;
12928
13188
  /** @description Object is related with this account */
12929
13189
  account: string;
12930
13190
  /**
@@ -24759,7 +25019,7 @@ export interface operations {
24759
25019
  };
24760
25020
  };
24761
25021
  };
24762
- "account/getKeys": {
25022
+ "account/getSamlKeys": {
24763
25023
  parameters: {
24764
25024
  query?: never;
24765
25025
  header?: never;
@@ -24775,12 +25035,20 @@ export interface operations {
24775
25035
  };
24776
25036
  content: {
24777
25037
  "application/json": {
24778
- /** @description kid currently used to sign new tokens */
24779
- production_kid: string;
24780
- /** @description kid that will be promoted on the next rotation */
24781
- next_in_queue_kid: string;
24782
- /** @description All kids currently published in the JWK Set */
24783
- kids_active: string[];
25038
+ current: {
25039
+ id: string;
25040
+ /** @description PEM X.509 certificate */
25041
+ certificate: string;
25042
+ /** Format: date-time */
25043
+ not_after: string;
25044
+ };
25045
+ next?: {
25046
+ id: string;
25047
+ /** @description PEM X.509 certificate */
25048
+ certificate: string;
25049
+ /** Format: date-time */
25050
+ not_after: string;
25051
+ };
24784
25052
  };
24785
25053
  };
24786
25054
  };
@@ -24852,18 +25120,14 @@ export interface operations {
24852
25120
  };
24853
25121
  };
24854
25122
  };
24855
- "account/rotateKeys": {
25123
+ "account/rotateSamlKeys": {
24856
25124
  parameters: {
24857
25125
  query?: never;
24858
25126
  header?: never;
24859
25127
  path?: never;
24860
25128
  cookie?: never;
24861
25129
  };
24862
- requestBody: {
24863
- content: {
24864
- "application/json": Record<string, never>;
24865
- };
24866
- };
25130
+ requestBody?: never;
24867
25131
  responses: {
24868
25132
  /** @description Default Response */
24869
25133
  200: {
@@ -24872,28 +25136,9 @@ export interface operations {
24872
25136
  };
24873
25137
  content: {
24874
25138
  "application/json": {
24875
- /** @description ISO 8601 timestamp of the rotation */
24876
- rotated_at: string;
24877
- /** @description kid that was active before rotation. Tokens signed with it are still verifiable via /.well-known/jwks.json */
24878
- previous_production_kid: string;
24879
- /** @description kid now used to sign new tokens */
24880
- production_kid: string;
24881
- /** @description kid that will be promoted on the next rotation */
24882
- next_in_queue_kid: string;
24883
- /** @description All kids currently published in the JWK Set */
24884
- kids_active: string[];
24885
- };
24886
- };
24887
- };
24888
- /** @description `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field. */
24889
- 400: {
24890
- headers: {
24891
- [name: string]: unknown;
24892
- };
24893
- content: {
24894
- "application/json": components["schemas"]["ErrorResponse"] & {
24895
- /** @enum {string} */
24896
- error_code?: "validation_error";
25139
+ step: "staged" | "promoted";
25140
+ current_id: string;
25141
+ next_id?: string;
24897
25142
  };
24898
25143
  };
24899
25144
  };
@@ -24965,20 +25210,9 @@ export interface operations {
24965
25210
  };
24966
25211
  };
24967
25212
  };
24968
- "action/list": {
25213
+ "account/getKeys": {
24969
25214
  parameters: {
24970
- query?: {
24971
- /** @description Number of items per page (max 200) */
24972
- pageSize?: number;
24973
- /** @description Cursor for next page */
24974
- cursor?: string;
24975
- /** @description Cursor returned by the previous page */
24976
- next?: string;
24977
- /** @description Also return `total`: the rows matching the whole filter, across every page. */
24978
- count?: boolean;
24979
- /** @description Filter using a FaableQL query */
24980
- query?: string;
24981
- };
25215
+ query?: never;
24982
25216
  header?: never;
24983
25217
  path?: never;
24984
25218
  cookie?: never;
@@ -24992,30 +25226,12 @@ export interface operations {
24992
25226
  };
24993
25227
  content: {
24994
25228
  "application/json": {
24995
- next: string | null;
24996
- results: components["schemas"]["Action"][];
24997
- /** @description Rows matching the whole filter, across every page. Only with `?count=true`. */
24998
- total?: number;
24999
- };
25000
- };
25001
- };
25002
- /**
25003
- * @description `invalid_query` — The `?query=` FaableQL expression could not be parsed.
25004
- *
25005
- * `invalid_expand` — An `?expand=` path is not allowed on this resource.
25006
- *
25007
- * `search_not_supported` — This resource does not support `?search=`.
25008
- *
25009
- * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
25010
- */
25011
- 400: {
25012
- headers: {
25013
- [name: string]: unknown;
25014
- };
25015
- content: {
25016
- "application/json": components["schemas"]["ErrorResponse"] & {
25017
- /** @enum {string} */
25018
- error_code?: "invalid_query" | "invalid_expand" | "search_not_supported" | "validation_error";
25229
+ /** @description kid currently used to sign new tokens */
25230
+ production_kid: string;
25231
+ /** @description kid that will be promoted on the next rotation */
25232
+ next_in_queue_kid: string;
25233
+ /** @description All kids currently published in the JWK Set */
25234
+ kids_active: string[];
25019
25235
  };
25020
25236
  };
25021
25237
  };
@@ -25087,7 +25303,7 @@ export interface operations {
25087
25303
  };
25088
25304
  };
25089
25305
  };
25090
- "action/create": {
25306
+ "account/rotateKeys": {
25091
25307
  parameters: {
25092
25308
  query?: never;
25093
25309
  header?: never;
@@ -25096,76 +25312,31 @@ export interface operations {
25096
25312
  };
25097
25313
  requestBody: {
25098
25314
  content: {
25099
- "application/json": {
25100
- /** @description Action Name */
25101
- name: string;
25102
- /** @description JavaScript code. Must export at least one hook: exports.onExecutePostLogin, exports.onExecuteContinue and/or exports.onExecuteClientCredentials. The triggers are derived from the exported hooks. */
25103
- code: string;
25104
- /**
25105
- * @description Is this action active?
25106
- * @default true
25107
- */
25108
- enabled?: boolean;
25109
- /**
25110
- * @description Execution order: lower runs first; on ties the newest action runs first
25111
- * @default 0
25112
- */
25113
- order?: number;
25114
- };
25315
+ "application/json": Record<string, never>;
25115
25316
  };
25116
25317
  };
25117
25318
  responses: {
25118
- /** @description Action */
25319
+ /** @description Default Response */
25119
25320
  200: {
25120
25321
  headers: {
25121
25322
  [name: string]: unknown;
25122
25323
  };
25123
25324
  content: {
25124
25325
  "application/json": {
25125
- /** @description Action ID */
25126
- id: string;
25127
- /** @description Action Name */
25128
- name: string;
25129
- /** @description Triggers this action runs on. Derived from the hooks the code exports (`onExecutePostLogin` → post-login, `onExecuteContinue` → continue, `onExecuteClientCredentials` → client-credentials); read-only. */
25130
- triggers: ("continue" | "post-login" | "client-credentials")[];
25131
- /** @description JavaScript Code to execute */
25132
- code: string;
25133
- /**
25134
- * @description Is this action active?
25135
- * @default true
25136
- */
25137
- enabled: boolean;
25138
- /**
25139
- * @description Execution order: lower runs first; on ties the newest action runs first
25140
- * @default 0
25141
- */
25142
- order: number;
25143
- /**
25144
- * @description Monotonic edit counter — increments on every update. Audit rows stamp the revision that produced each allow/deny (`data.action_revision`); `updatedAt` dates the current revision.
25145
- * @default 1
25146
- */
25147
- revision: number;
25148
- /** @description Object is related with this account */
25149
- account: string;
25150
- /**
25151
- * @description ActionMetadata
25152
- * @default {}
25153
- */
25154
- metadata: {
25155
- [key: string]: unknown;
25156
- };
25157
- /** @description Action creation date */
25158
- createdAt: string;
25159
- /** @description Action updated date */
25160
- updatedAt?: string;
25326
+ /** @description ISO 8601 timestamp of the rotation */
25327
+ rotated_at: string;
25328
+ /** @description kid that was active before rotation. Tokens signed with it are still verifiable via /.well-known/jwks.json */
25329
+ previous_production_kid: string;
25330
+ /** @description kid now used to sign new tokens */
25331
+ production_kid: string;
25332
+ /** @description kid that will be promoted on the next rotation */
25333
+ next_in_queue_kid: string;
25334
+ /** @description All kids currently published in the JWK Set */
25335
+ kids_active: string[];
25161
25336
  };
25162
25337
  };
25163
25338
  };
25164
- /**
25165
- * @description `already_exists` — A resource with the same unique field already exists (for a user, usually `email`). `details.fields` names the field.
25166
- *
25167
- * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
25168
- */
25339
+ /** @description `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field. */
25169
25340
  400: {
25170
25341
  headers: {
25171
25342
  [name: string]: unknown;
@@ -25173,7 +25344,7 @@ export interface operations {
25173
25344
  content: {
25174
25345
  "application/json": components["schemas"]["ErrorResponse"] & {
25175
25346
  /** @enum {string} */
25176
- error_code?: "already_exists" | "validation_error";
25347
+ error_code?: "validation_error";
25177
25348
  };
25178
25349
  };
25179
25350
  };
@@ -25245,68 +25416,47 @@ export interface operations {
25245
25416
  };
25246
25417
  };
25247
25418
  };
25248
- "action/get": {
25419
+ "action/list": {
25249
25420
  parameters: {
25250
- query?: never;
25251
- header?: never;
25252
- path: {
25253
- action_id: string;
25421
+ query?: {
25422
+ /** @description Number of items per page (max 200) */
25423
+ pageSize?: number;
25424
+ /** @description Cursor for next page */
25425
+ cursor?: string;
25426
+ /** @description Cursor returned by the previous page */
25427
+ next?: string;
25428
+ /** @description Also return `total`: the rows matching the whole filter, across every page. */
25429
+ count?: boolean;
25430
+ /** @description Filter using a FaableQL query */
25431
+ query?: string;
25254
25432
  };
25433
+ header?: never;
25434
+ path?: never;
25255
25435
  cookie?: never;
25256
25436
  };
25257
25437
  requestBody?: never;
25258
25438
  responses: {
25259
- /** @description Action */
25439
+ /** @description Default Response */
25260
25440
  200: {
25261
25441
  headers: {
25262
25442
  [name: string]: unknown;
25263
25443
  };
25264
25444
  content: {
25265
25445
  "application/json": {
25266
- /** @description Action ID */
25267
- id: string;
25268
- /** @description Action Name */
25269
- name: string;
25270
- /** @description Triggers this action runs on. Derived from the hooks the code exports (`onExecutePostLogin` → post-login, `onExecuteContinue` → continue, `onExecuteClientCredentials` → client-credentials); read-only. */
25271
- triggers: ("continue" | "post-login" | "client-credentials")[];
25272
- /** @description JavaScript Code to execute */
25273
- code: string;
25274
- /**
25275
- * @description Is this action active?
25276
- * @default true
25277
- */
25278
- enabled: boolean;
25279
- /**
25280
- * @description Execution order: lower runs first; on ties the newest action runs first
25281
- * @default 0
25282
- */
25283
- order: number;
25284
- /**
25285
- * @description Monotonic edit counter — increments on every update. Audit rows stamp the revision that produced each allow/deny (`data.action_revision`); `updatedAt` dates the current revision.
25286
- * @default 1
25287
- */
25288
- revision: number;
25289
- /** @description Object is related with this account */
25290
- account: string;
25291
- /**
25292
- * @description ActionMetadata
25293
- * @default {}
25294
- */
25295
- metadata: {
25296
- [key: string]: unknown;
25297
- };
25298
- /** @description Action creation date */
25299
- createdAt: string;
25300
- /** @description Action updated date */
25301
- updatedAt?: string;
25446
+ next: string | null;
25447
+ results: components["schemas"]["Action"][];
25448
+ /** @description Rows matching the whole filter, across every page. Only with `?count=true`. */
25449
+ total?: number;
25302
25450
  };
25303
25451
  };
25304
25452
  };
25305
25453
  /**
25306
- * @description `invalid_id` — The id in the path is not a valid id for this resource.
25454
+ * @description `invalid_query` — The `?query=` FaableQL expression could not be parsed.
25307
25455
  *
25308
25456
  * `invalid_expand` — An `?expand=` path is not allowed on this resource.
25309
25457
  *
25458
+ * `search_not_supported` — This resource does not support `?search=`.
25459
+ *
25310
25460
  * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
25311
25461
  */
25312
25462
  400: {
@@ -25316,7 +25466,7 @@ export interface operations {
25316
25466
  content: {
25317
25467
  "application/json": components["schemas"]["ErrorResponse"] & {
25318
25468
  /** @enum {string} */
25319
- error_code?: "invalid_id" | "invalid_expand" | "validation_error";
25469
+ error_code?: "invalid_query" | "invalid_expand" | "search_not_supported" | "validation_error";
25320
25470
  };
25321
25471
  };
25322
25472
  };
@@ -25350,11 +25500,7 @@ export interface operations {
25350
25500
  };
25351
25501
  };
25352
25502
  };
25353
- /**
25354
- * @description `not_found` — The resource does not exist in this account.
25355
- *
25356
- * `account_not_found` — No Auth Account matches the request (domain, header or token).
25357
- */
25503
+ /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
25358
25504
  404: {
25359
25505
  headers: {
25360
25506
  [name: string]: unknown;
@@ -25362,7 +25508,7 @@ export interface operations {
25362
25508
  content: {
25363
25509
  "application/json": components["schemas"]["ErrorResponse"] & {
25364
25510
  /** @enum {string} */
25365
- error_code?: "not_found" | "account_not_found";
25511
+ error_code?: "account_not_found";
25366
25512
  };
25367
25513
  };
25368
25514
  };
@@ -25392,26 +25538,29 @@ export interface operations {
25392
25538
  };
25393
25539
  };
25394
25540
  };
25395
- "action/update": {
25541
+ "action/create": {
25396
25542
  parameters: {
25397
25543
  query?: never;
25398
25544
  header?: never;
25399
- path: {
25400
- action_id: string;
25401
- };
25545
+ path?: never;
25402
25546
  cookie?: never;
25403
25547
  };
25404
- /** @description Partial update for an Action. Only the supplied fields are modified; `triggers` is read-only and follows `code`. */
25405
25548
  requestBody: {
25406
25549
  content: {
25407
25550
  "application/json": {
25408
25551
  /** @description Action Name */
25409
- name?: string;
25410
- /** @description JavaScript code. The triggers are re-derived from the hooks it exports. */
25411
- code?: string;
25412
- /** @description Is this action active? */
25552
+ name: string;
25553
+ /** @description JavaScript code. Must export at least one hook: exports.onExecutePostLogin, exports.onExecuteContinue and/or exports.onExecuteClientCredentials. The triggers are derived from the exported hooks. */
25554
+ code: string;
25555
+ /**
25556
+ * @description Is this action active?
25557
+ * @default true
25558
+ */
25413
25559
  enabled?: boolean;
25414
- /** @description Execution order */
25560
+ /**
25561
+ * @description Execution order: lower runs first; on ties the newest action runs first
25562
+ * @default 0
25563
+ */
25415
25564
  order?: number;
25416
25565
  };
25417
25566
  };
@@ -25464,9 +25613,7 @@ export interface operations {
25464
25613
  };
25465
25614
  };
25466
25615
  /**
25467
- * @description `invalid_id` — The id in the path is not a valid id for this resource.
25468
- *
25469
- * `already_exists` — A resource with the same unique field already exists (for a user, usually `email`). `details.fields` names the field.
25616
+ * @description `already_exists` — A resource with the same unique field already exists (for a user, usually `email`). `details.fields` names the field.
25470
25617
  *
25471
25618
  * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
25472
25619
  */
@@ -25477,7 +25624,7 @@ export interface operations {
25477
25624
  content: {
25478
25625
  "application/json": components["schemas"]["ErrorResponse"] & {
25479
25626
  /** @enum {string} */
25480
- error_code?: "invalid_id" | "already_exists" | "validation_error";
25627
+ error_code?: "already_exists" | "validation_error";
25481
25628
  };
25482
25629
  };
25483
25630
  };
@@ -25511,11 +25658,7 @@ export interface operations {
25511
25658
  };
25512
25659
  };
25513
25660
  };
25514
- /**
25515
- * @description `not_found` — The resource does not exist in this account.
25516
- *
25517
- * `account_not_found` — No Auth Account matches the request (domain, header or token).
25518
- */
25661
+ /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
25519
25662
  404: {
25520
25663
  headers: {
25521
25664
  [name: string]: unknown;
@@ -25523,7 +25666,7 @@ export interface operations {
25523
25666
  content: {
25524
25667
  "application/json": components["schemas"]["ErrorResponse"] & {
25525
25668
  /** @enum {string} */
25526
- error_code?: "not_found" | "account_not_found";
25669
+ error_code?: "account_not_found";
25527
25670
  };
25528
25671
  };
25529
25672
  };
@@ -25553,7 +25696,7 @@ export interface operations {
25553
25696
  };
25554
25697
  };
25555
25698
  };
25556
- "action/delete": {
25699
+ "action/get": {
25557
25700
  parameters: {
25558
25701
  query?: never;
25559
25702
  header?: never;
@@ -25613,6 +25756,8 @@ export interface operations {
25613
25756
  /**
25614
25757
  * @description `invalid_id` — The id in the path is not a valid id for this resource.
25615
25758
  *
25759
+ * `invalid_expand` — An `?expand=` path is not allowed on this resource.
25760
+ *
25616
25761
  * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
25617
25762
  */
25618
25763
  400: {
@@ -25622,7 +25767,7 @@ export interface operations {
25622
25767
  content: {
25623
25768
  "application/json": components["schemas"]["ErrorResponse"] & {
25624
25769
  /** @enum {string} */
25625
- error_code?: "invalid_id" | "validation_error";
25770
+ error_code?: "invalid_id" | "invalid_expand" | "validation_error";
25626
25771
  };
25627
25772
  };
25628
25773
  };
@@ -25698,76 +25843,84 @@ export interface operations {
25698
25843
  };
25699
25844
  };
25700
25845
  };
25701
- "loginflow/resolved": {
25846
+ "action/update": {
25702
25847
  parameters: {
25703
- query?: {
25704
- client_id?: string;
25705
- };
25848
+ query?: never;
25706
25849
  header?: never;
25707
- path?: never;
25850
+ path: {
25851
+ action_id: string;
25852
+ };
25708
25853
  cookie?: never;
25709
25854
  };
25710
- requestBody?: never;
25855
+ /** @description Partial update for an Action. Only the supplied fields are modified; `triggers` is read-only and follows `code`. */
25856
+ requestBody: {
25857
+ content: {
25858
+ "application/json": {
25859
+ /** @description Action Name */
25860
+ name?: string;
25861
+ /** @description JavaScript code. The triggers are re-derived from the hooks it exports. */
25862
+ code?: string;
25863
+ /** @description Is this action active? */
25864
+ enabled?: boolean;
25865
+ /** @description Execution order */
25866
+ order?: number;
25867
+ };
25868
+ };
25869
+ };
25711
25870
  responses: {
25712
- /** @description Default Response */
25871
+ /** @description Action */
25713
25872
  200: {
25714
25873
  headers: {
25715
25874
  [name: string]: unknown;
25716
25875
  };
25717
25876
  content: {
25718
25877
  "application/json": {
25719
- source: "compiled" | "published";
25720
- flow_id: string | null;
25878
+ /** @description Action ID */
25879
+ id: string;
25880
+ /** @description Action Name */
25881
+ name: string;
25882
+ /** @description Triggers this action runs on. Derived from the hooks the code exports (`onExecutePostLogin` → post-login, `onExecuteContinue` → continue, `onExecuteClientCredentials` → client-credentials); read-only. */
25883
+ triggers: ("continue" | "post-login" | "client-credentials")[];
25884
+ /** @description JavaScript Code to execute */
25885
+ code: string;
25886
+ /**
25887
+ * @description Is this action active?
25888
+ * @default true
25889
+ */
25890
+ enabled: boolean;
25891
+ /**
25892
+ * @description Execution order: lower runs first; on ties the newest action runs first
25893
+ * @default 0
25894
+ */
25895
+ order: number;
25896
+ /**
25897
+ * @description Monotonic edit counter — increments on every update. Audit rows stamp the revision that produced each allow/deny (`data.action_revision`); `updatedAt` dates the current revision.
25898
+ * @default 1
25899
+ */
25721
25900
  revision: number;
25722
- /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
25723
- graph: {
25724
- nodes: {
25725
- id: string;
25726
- type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
25727
- config?: {
25728
- [key: string]: unknown;
25729
- };
25730
- }[];
25731
- edges: {
25732
- from: string;
25733
- handle: string;
25734
- to: string;
25735
- }[];
25901
+ /** @description Object is related with this account */
25902
+ account: string;
25903
+ /**
25904
+ * @description ActionMetadata
25905
+ * @default {}
25906
+ */
25907
+ metadata: {
25908
+ [key: string]: unknown;
25736
25909
  };
25737
- bound: {
25738
- flow_id: string;
25739
- bound_to: "account" | "client";
25740
- name: string;
25741
- revision: number;
25742
- published_revision: number | null;
25743
- /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
25744
- draft: {
25745
- nodes: {
25746
- id: string;
25747
- type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
25748
- config?: {
25749
- [key: string]: unknown;
25750
- };
25751
- }[];
25752
- edges: {
25753
- from: string;
25754
- handle: string;
25755
- to: string;
25756
- }[];
25757
- };
25758
- /** @description Node positions in the editor. Presentation only. */
25759
- layout?: {
25760
- [key: string]: {
25761
- x: number;
25762
- y: number;
25763
- };
25764
- };
25765
- history: number[];
25766
- } | null;
25910
+ /** @description Action creation date */
25911
+ createdAt: string;
25912
+ /** @description Action updated date */
25913
+ updatedAt?: string;
25767
25914
  };
25768
25915
  };
25769
25916
  };
25770
- /** @description `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field. */
25917
+ /**
25918
+ * @description `invalid_id` — The id in the path is not a valid id for this resource.
25919
+ *
25920
+ * `already_exists` — A resource with the same unique field already exists (for a user, usually `email`). `details.fields` names the field.
25921
+ *
25922
+ * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
25923
+ */
25771
25924
  400: {
25772
25925
  headers: {
25773
25926
  [name: string]: unknown;
@@ -25775,7 +25928,7 @@ export interface operations {
25775
25928
  content: {
25776
25929
  "application/json": components["schemas"]["ErrorResponse"] & {
25777
25930
  /** @enum {string} */
25778
- error_code?: "validation_error";
25931
+ error_code?: "invalid_id" | "already_exists" | "validation_error";
25779
25932
  };
25780
25933
  };
25781
25934
  };
@@ -25809,15 +25962,19 @@ export interface operations {
25809
25962
  };
25810
25963
  };
25811
25964
  };
25812
- /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
25813
- 404: {
25965
+ /**
25966
+ * @description `not_found` — The resource does not exist in this account.
25967
+ *
25968
+ * `account_not_found` — No Auth Account matches the request (domain, header or token).
25969
+ */
25970
+ 404: {
25814
25971
  headers: {
25815
25972
  [name: string]: unknown;
25816
25973
  };
25817
25974
  content: {
25818
25975
  "application/json": components["schemas"]["ErrorResponse"] & {
25819
25976
  /** @enum {string} */
25820
- error_code?: "account_not_found";
25977
+ error_code?: "not_found" | "account_not_found";
25821
25978
  };
25822
25979
  };
25823
25980
  };
@@ -25847,114 +26004,68 @@ export interface operations {
25847
26004
  };
25848
26005
  };
25849
26006
  };
25850
- "loginflow/materialize": {
26007
+ "action/delete": {
25851
26008
  parameters: {
25852
26009
  query?: never;
25853
26010
  header?: never;
25854
- path?: never;
25855
- cookie?: never;
25856
- };
25857
- requestBody: {
25858
- content: {
25859
- "application/json": {
25860
- client_id?: string;
25861
- name?: string;
25862
- };
26011
+ path: {
26012
+ action_id: string;
25863
26013
  };
26014
+ cookie?: never;
25864
26015
  };
26016
+ requestBody?: never;
25865
26017
  responses: {
25866
- /** @description LoginFlow */
26018
+ /** @description Action */
25867
26019
  200: {
25868
26020
  headers: {
25869
26021
  [name: string]: unknown;
25870
26022
  };
25871
26023
  content: {
25872
26024
  "application/json": {
25873
- /** @description LoginFlow ID */
26025
+ /** @description Action ID */
25874
26026
  id: string;
26027
+ /** @description Action Name */
25875
26028
  name: string;
25876
- /** @enum {string} */
25877
- trigger: "login";
25878
- /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
25879
- graph: {
25880
- nodes: {
25881
- id: string;
25882
- type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
25883
- config?: {
25884
- [key: string]: unknown;
25885
- };
25886
- }[];
25887
- edges: {
25888
- from: string;
25889
- handle: string;
25890
- to: string;
25891
- }[];
25892
- };
25893
- /** @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. */
26029
+ /** @description Triggers this action runs on. Derived from the hooks the code exports (`onExecutePostLogin` → post-login, `onExecuteContinue` → continue, `onExecuteClientCredentials` → client-credentials); read-only. */
26030
+ triggers: ("continue" | "post-login" | "client-credentials")[];
26031
+ /** @description JavaScript Code to execute */
26032
+ code: string;
26033
+ /**
26034
+ * @description Is this action active?
26035
+ * @default true
26036
+ */
26037
+ enabled: boolean;
26038
+ /**
26039
+ * @description Execution order: lower runs first; on ties the newest action runs first
26040
+ * @default 0
26041
+ */
26042
+ order: number;
26043
+ /**
26044
+ * @description Monotonic edit counter — increments on every update. Audit rows stamp the revision that produced each allow/deny (`data.action_revision`); `updatedAt` dates the current revision.
26045
+ * @default 1
26046
+ */
25894
26047
  revision: number;
25895
- published?: {
25896
- /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
25897
- graph: {
25898
- nodes: {
25899
- id: string;
25900
- type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
25901
- config?: {
25902
- [key: string]: unknown;
25903
- };
25904
- }[];
25905
- edges: {
25906
- from: string;
25907
- handle: string;
25908
- to: string;
25909
- }[];
25910
- };
25911
- revision: number;
25912
- published_at: string;
25913
- };
25914
- /** @description Previously published graphs, newest first, for rollback. */
25915
- history: {
25916
- /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
25917
- graph: {
25918
- nodes: {
25919
- id: string;
25920
- type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
25921
- config?: {
25922
- [key: string]: unknown;
25923
- };
25924
- }[];
25925
- edges: {
25926
- from: string;
25927
- handle: string;
25928
- to: string;
25929
- }[];
25930
- };
25931
- revision: number;
25932
- published_at: string;
25933
- }[];
25934
- /** @description Node positions in the editor. Presentation only. */
25935
- layout?: {
25936
- [key: string]: {
25937
- x: number;
25938
- y: number;
25939
- };
25940
- };
25941
26048
  /** @description Object is related with this account */
25942
26049
  account: string;
25943
26050
  /**
25944
- * @description LoginFlowMetadata
26051
+ * @description ActionMetadata
25945
26052
  * @default {}
25946
26053
  */
25947
26054
  metadata: {
25948
26055
  [key: string]: unknown;
25949
26056
  };
25950
- /** @description LoginFlow creation date */
26057
+ /** @description Action creation date */
25951
26058
  createdAt: string;
25952
- /** @description LoginFlow updated date */
26059
+ /** @description Action updated date */
25953
26060
  updatedAt?: string;
25954
26061
  };
25955
26062
  };
25956
26063
  };
25957
- /** @description `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field. */
26064
+ /**
26065
+ * @description `invalid_id` — The id in the path is not a valid id for this resource.
26066
+ *
26067
+ * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
26068
+ */
25958
26069
  400: {
25959
26070
  headers: {
25960
26071
  [name: string]: unknown;
@@ -25962,7 +26073,7 @@ export interface operations {
25962
26073
  content: {
25963
26074
  "application/json": components["schemas"]["ErrorResponse"] & {
25964
26075
  /** @enum {string} */
25965
- error_code?: "validation_error";
26076
+ error_code?: "invalid_id" | "validation_error";
25966
26077
  };
25967
26078
  };
25968
26079
  };
@@ -25996,7 +26107,11 @@ export interface operations {
25996
26107
  };
25997
26108
  };
25998
26109
  };
25999
- /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
26110
+ /**
26111
+ * @description `not_found` — The resource does not exist in this account.
26112
+ *
26113
+ * `account_not_found` — No Auth Account matches the request (domain, header or token).
26114
+ */
26000
26115
  404: {
26001
26116
  headers: {
26002
26117
  [name: string]: unknown;
@@ -26004,7 +26119,7 @@ export interface operations {
26004
26119
  content: {
26005
26120
  "application/json": components["schemas"]["ErrorResponse"] & {
26006
26121
  /** @enum {string} */
26007
- error_code?: "account_not_found";
26122
+ error_code?: "not_found" | "account_not_found";
26008
26123
  };
26009
26124
  };
26010
26125
  };
@@ -26034,22 +26149,16 @@ export interface operations {
26034
26149
  };
26035
26150
  };
26036
26151
  };
26037
- "loginflow/validate": {
26152
+ "loginflow/resolved": {
26038
26153
  parameters: {
26039
- query?: never;
26040
- header?: never;
26041
- path: {
26042
- loginflow_id: string;
26154
+ query?: {
26155
+ client_id?: string;
26043
26156
  };
26157
+ header?: never;
26158
+ path?: never;
26044
26159
  cookie?: never;
26045
26160
  };
26046
- requestBody: {
26047
- content: {
26048
- "application/json": {
26049
- client_id?: string;
26050
- };
26051
- };
26052
- };
26161
+ requestBody?: never;
26053
26162
  responses: {
26054
26163
  /** @description Default Response */
26055
26164
  200: {
@@ -26058,13 +26167,54 @@ export interface operations {
26058
26167
  };
26059
26168
  content: {
26060
26169
  "application/json": {
26061
- ok: boolean;
26062
- issues: {
26063
- code: string;
26064
- node?: string;
26065
- handle?: string;
26066
- message: string;
26067
- }[];
26170
+ source: "compiled" | "published";
26171
+ flow_id: string | null;
26172
+ revision: number;
26173
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
26174
+ graph: {
26175
+ nodes: {
26176
+ id: string;
26177
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
26178
+ config?: {
26179
+ [key: string]: unknown;
26180
+ };
26181
+ }[];
26182
+ edges: {
26183
+ from: string;
26184
+ handle: string;
26185
+ to: string;
26186
+ }[];
26187
+ };
26188
+ bound: {
26189
+ flow_id: string;
26190
+ bound_to: "account" | "client";
26191
+ name: string;
26192
+ revision: number;
26193
+ published_revision: number | null;
26194
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
26195
+ draft: {
26196
+ nodes: {
26197
+ id: string;
26198
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
26199
+ config?: {
26200
+ [key: string]: unknown;
26201
+ };
26202
+ }[];
26203
+ edges: {
26204
+ from: string;
26205
+ handle: string;
26206
+ to: string;
26207
+ }[];
26208
+ };
26209
+ /** @description Node positions in the editor. Presentation only. */
26210
+ layout?: {
26211
+ [key: string]: {
26212
+ x: number;
26213
+ y: number;
26214
+ };
26215
+ };
26216
+ history: number[];
26217
+ } | null;
26068
26218
  };
26069
26219
  };
26070
26220
  };
@@ -26148,19 +26298,18 @@ export interface operations {
26148
26298
  };
26149
26299
  };
26150
26300
  };
26151
- "loginflow/publish": {
26301
+ "loginflow/materialize": {
26152
26302
  parameters: {
26153
26303
  query?: never;
26154
26304
  header?: never;
26155
- path: {
26156
- loginflow_id: string;
26157
- };
26305
+ path?: never;
26158
26306
  cookie?: never;
26159
26307
  };
26160
26308
  requestBody: {
26161
26309
  content: {
26162
26310
  "application/json": {
26163
26311
  client_id?: string;
26312
+ name?: string;
26164
26313
  };
26165
26314
  };
26166
26315
  };
@@ -26310,23 +26459,6 @@ export interface operations {
26310
26459
  };
26311
26460
  };
26312
26461
  };
26313
- /** @description Default Response */
26314
- 422: {
26315
- headers: {
26316
- [name: string]: unknown;
26317
- };
26318
- content: {
26319
- "application/json": {
26320
- error: string;
26321
- issues: {
26322
- code: string;
26323
- node?: string;
26324
- handle?: string;
26325
- message: string;
26326
- }[];
26327
- };
26328
- };
26329
- };
26330
26462
  /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
26331
26463
  429: {
26332
26464
  headers: {
@@ -26353,7 +26485,7 @@ export interface operations {
26353
26485
  };
26354
26486
  };
26355
26487
  };
26356
- "loginflow/rollback": {
26488
+ "loginflow/validate": {
26357
26489
  parameters: {
26358
26490
  query?: never;
26359
26491
  header?: never;
@@ -26365,23 +26497,137 @@ export interface operations {
26365
26497
  requestBody: {
26366
26498
  content: {
26367
26499
  "application/json": {
26368
- revision: number;
26500
+ client_id?: string;
26369
26501
  };
26370
26502
  };
26371
26503
  };
26372
26504
  responses: {
26373
- /** @description LoginFlow */
26505
+ /** @description Default Response */
26374
26506
  200: {
26375
26507
  headers: {
26376
26508
  [name: string]: unknown;
26377
26509
  };
26378
26510
  content: {
26379
26511
  "application/json": {
26380
- /** @description LoginFlow ID */
26381
- id: string;
26382
- name: string;
26512
+ ok: boolean;
26513
+ issues: {
26514
+ code: string;
26515
+ node?: string;
26516
+ handle?: string;
26517
+ message: string;
26518
+ }[];
26519
+ };
26520
+ };
26521
+ };
26522
+ /** @description `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field. */
26523
+ 400: {
26524
+ headers: {
26525
+ [name: string]: unknown;
26526
+ };
26527
+ content: {
26528
+ "application/json": components["schemas"]["ErrorResponse"] & {
26383
26529
  /** @enum {string} */
26384
- trigger: "login";
26530
+ error_code?: "validation_error";
26531
+ };
26532
+ };
26533
+ };
26534
+ /** @description `unauthorized` — The request carries no valid credentials. */
26535
+ 401: {
26536
+ headers: {
26537
+ [name: string]: unknown;
26538
+ };
26539
+ content: {
26540
+ "application/json": components["schemas"]["ErrorResponse"] & {
26541
+ /** @enum {string} */
26542
+ error_code?: "unauthorized";
26543
+ };
26544
+ };
26545
+ };
26546
+ /**
26547
+ * @description `forbidden` — The credentials are valid but do not allow this operation.
26548
+ *
26549
+ * `insufficient_scope` — The token lacks a scope this operation requires. `message` names it.
26550
+ *
26551
+ * `user_suspended` — The user is suspended and cannot sign in or be modified.
26552
+ */
26553
+ 403: {
26554
+ headers: {
26555
+ [name: string]: unknown;
26556
+ };
26557
+ content: {
26558
+ "application/json": components["schemas"]["ErrorResponse"] & {
26559
+ /** @enum {string} */
26560
+ error_code?: "forbidden" | "insufficient_scope" | "user_suspended";
26561
+ };
26562
+ };
26563
+ };
26564
+ /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
26565
+ 404: {
26566
+ headers: {
26567
+ [name: string]: unknown;
26568
+ };
26569
+ content: {
26570
+ "application/json": components["schemas"]["ErrorResponse"] & {
26571
+ /** @enum {string} */
26572
+ error_code?: "account_not_found";
26573
+ };
26574
+ };
26575
+ };
26576
+ /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
26577
+ 429: {
26578
+ headers: {
26579
+ [name: string]: unknown;
26580
+ };
26581
+ content: {
26582
+ "application/json": components["schemas"]["ErrorResponse"] & {
26583
+ /** @enum {string} */
26584
+ error_code?: "too_many_requests";
26585
+ };
26586
+ };
26587
+ };
26588
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
26589
+ 500: {
26590
+ headers: {
26591
+ [name: string]: unknown;
26592
+ };
26593
+ content: {
26594
+ "application/json": components["schemas"]["ErrorResponse"] & {
26595
+ /** @enum {string} */
26596
+ error_code?: "internal_error";
26597
+ };
26598
+ };
26599
+ };
26600
+ };
26601
+ };
26602
+ "loginflow/publish": {
26603
+ parameters: {
26604
+ query?: never;
26605
+ header?: never;
26606
+ path: {
26607
+ loginflow_id: string;
26608
+ };
26609
+ cookie?: never;
26610
+ };
26611
+ requestBody: {
26612
+ content: {
26613
+ "application/json": {
26614
+ client_id?: string;
26615
+ };
26616
+ };
26617
+ };
26618
+ responses: {
26619
+ /** @description LoginFlow */
26620
+ 200: {
26621
+ headers: {
26622
+ [name: string]: unknown;
26623
+ };
26624
+ content: {
26625
+ "application/json": {
26626
+ /** @description LoginFlow ID */
26627
+ id: string;
26628
+ name: string;
26629
+ /** @enum {string} */
26630
+ trigger: "login";
26385
26631
  /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
26386
26632
  graph: {
26387
26633
  nodes: {
@@ -26503,11 +26749,7 @@ export interface operations {
26503
26749
  };
26504
26750
  };
26505
26751
  };
26506
- /**
26507
- * @description `revision_not_found` — The revision is not in the flow history.
26508
- *
26509
- * `account_not_found` — No Auth Account matches the request (domain, header or token).
26510
- */
26752
+ /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
26511
26753
  404: {
26512
26754
  headers: {
26513
26755
  [name: string]: unknown;
@@ -26515,7 +26757,24 @@ export interface operations {
26515
26757
  content: {
26516
26758
  "application/json": components["schemas"]["ErrorResponse"] & {
26517
26759
  /** @enum {string} */
26518
- error_code?: "revision_not_found" | "account_not_found";
26760
+ error_code?: "account_not_found";
26761
+ };
26762
+ };
26763
+ };
26764
+ /** @description Default Response */
26765
+ 422: {
26766
+ headers: {
26767
+ [name: string]: unknown;
26768
+ };
26769
+ content: {
26770
+ "application/json": {
26771
+ error: string;
26772
+ issues: {
26773
+ code: string;
26774
+ node?: string;
26775
+ handle?: string;
26776
+ message: string;
26777
+ }[];
26519
26778
  };
26520
26779
  };
26521
26780
  };
@@ -26545,7 +26804,7 @@ export interface operations {
26545
26804
  };
26546
26805
  };
26547
26806
  };
26548
- "loginflow/previewToken": {
26807
+ "loginflow/rollback": {
26549
26808
  parameters: {
26550
26809
  query?: never;
26551
26810
  header?: never;
@@ -26554,25 +26813,106 @@ export interface operations {
26554
26813
  };
26555
26814
  cookie?: never;
26556
26815
  };
26557
- requestBody?: never;
26816
+ requestBody: {
26817
+ content: {
26818
+ "application/json": {
26819
+ revision: number;
26820
+ };
26821
+ };
26822
+ };
26558
26823
  responses: {
26559
- /** @description Default Response */
26824
+ /** @description LoginFlow */
26560
26825
  200: {
26561
26826
  headers: {
26562
26827
  [name: string]: unknown;
26563
26828
  };
26564
26829
  content: {
26565
26830
  "application/json": {
26566
- token: string;
26567
- expires_in: number;
26831
+ /** @description LoginFlow ID */
26832
+ id: string;
26833
+ name: string;
26834
+ /** @enum {string} */
26835
+ trigger: "login";
26836
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
26837
+ graph: {
26838
+ nodes: {
26839
+ id: string;
26840
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
26841
+ config?: {
26842
+ [key: string]: unknown;
26843
+ };
26844
+ }[];
26845
+ edges: {
26846
+ from: string;
26847
+ handle: string;
26848
+ to: string;
26849
+ }[];
26850
+ };
26851
+ /** @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. */
26852
+ revision: number;
26853
+ published?: {
26854
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
26855
+ graph: {
26856
+ nodes: {
26857
+ id: string;
26858
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
26859
+ config?: {
26860
+ [key: string]: unknown;
26861
+ };
26862
+ }[];
26863
+ edges: {
26864
+ from: string;
26865
+ handle: string;
26866
+ to: string;
26867
+ }[];
26868
+ };
26869
+ revision: number;
26870
+ published_at: string;
26871
+ };
26872
+ /** @description Previously published graphs, newest first, for rollback. */
26873
+ history: {
26874
+ /** @description A login flow graph: typed nodes joined by named handles. See the validation rules on publish. */
26875
+ graph: {
26876
+ nodes: {
26877
+ id: string;
26878
+ type: "start" | "identify" | "methods" | "credential" | "action" | "mfa_gate" | "mfa_challenge" | "mfa_enroll" | "passkey_offer" | "condition" | "deny" | "end" | "consent" | "set_data";
26879
+ config?: {
26880
+ [key: string]: unknown;
26881
+ };
26882
+ }[];
26883
+ edges: {
26884
+ from: string;
26885
+ handle: string;
26886
+ to: string;
26887
+ }[];
26888
+ };
26889
+ revision: number;
26890
+ published_at: string;
26891
+ }[];
26892
+ /** @description Node positions in the editor. Presentation only. */
26893
+ layout?: {
26894
+ [key: string]: {
26895
+ x: number;
26896
+ y: number;
26897
+ };
26898
+ };
26899
+ /** @description Object is related with this account */
26900
+ account: string;
26901
+ /**
26902
+ * @description LoginFlowMetadata
26903
+ * @default {}
26904
+ */
26905
+ metadata: {
26906
+ [key: string]: unknown;
26907
+ };
26908
+ /** @description LoginFlow creation date */
26909
+ createdAt: string;
26910
+ /** @description LoginFlow updated date */
26911
+ updatedAt?: string;
26568
26912
  };
26569
26913
  };
26570
26914
  };
26571
- /**
26572
- * @description `flow_not_found` — The login flow does not exist in this account.
26573
- *
26574
- * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
26575
- */
26915
+ /** @description `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field. */
26576
26916
  400: {
26577
26917
  headers: {
26578
26918
  [name: string]: unknown;
@@ -26580,7 +26920,7 @@ export interface operations {
26580
26920
  content: {
26581
26921
  "application/json": components["schemas"]["ErrorResponse"] & {
26582
26922
  /** @enum {string} */
26583
- error_code?: "flow_not_found" | "validation_error";
26923
+ error_code?: "validation_error";
26584
26924
  };
26585
26925
  };
26586
26926
  };
@@ -26614,7 +26954,11 @@ export interface operations {
26614
26954
  };
26615
26955
  };
26616
26956
  };
26617
- /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
26957
+ /**
26958
+ * @description `revision_not_found` — The revision is not in the flow history.
26959
+ *
26960
+ * `account_not_found` — No Auth Account matches the request (domain, header or token).
26961
+ */
26618
26962
  404: {
26619
26963
  headers: {
26620
26964
  [name: string]: unknown;
@@ -26622,7 +26966,7 @@ export interface operations {
26622
26966
  content: {
26623
26967
  "application/json": components["schemas"]["ErrorResponse"] & {
26624
26968
  /** @enum {string} */
26625
- error_code?: "account_not_found";
26969
+ error_code?: "revision_not_found" | "account_not_found";
26626
26970
  };
26627
26971
  };
26628
26972
  };
@@ -26652,22 +26996,129 @@ export interface operations {
26652
26996
  };
26653
26997
  };
26654
26998
  };
26655
- "loginflow/list": {
26999
+ "loginflow/previewToken": {
26656
27000
  parameters: {
26657
- query?: {
26658
- /** @description Number of items per page (max 200) */
26659
- pageSize?: number;
26660
- /** @description Cursor for next page */
26661
- cursor?: string;
26662
- /** @description Cursor returned by the previous page */
26663
- next?: string;
26664
- /** @description Also return `total`: the rows matching the whole filter, across every page. */
26665
- count?: boolean;
26666
- /** @description Filter using a FaableQL query */
26667
- query?: string;
26668
- };
27001
+ query?: never;
26669
27002
  header?: never;
26670
- path?: never;
27003
+ path: {
27004
+ loginflow_id: string;
27005
+ };
27006
+ cookie?: never;
27007
+ };
27008
+ requestBody?: never;
27009
+ responses: {
27010
+ /** @description Default Response */
27011
+ 200: {
27012
+ headers: {
27013
+ [name: string]: unknown;
27014
+ };
27015
+ content: {
27016
+ "application/json": {
27017
+ token: string;
27018
+ expires_in: number;
27019
+ };
27020
+ };
27021
+ };
27022
+ /**
27023
+ * @description `flow_not_found` — The login flow does not exist in this account.
27024
+ *
27025
+ * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
27026
+ */
27027
+ 400: {
27028
+ headers: {
27029
+ [name: string]: unknown;
27030
+ };
27031
+ content: {
27032
+ "application/json": components["schemas"]["ErrorResponse"] & {
27033
+ /** @enum {string} */
27034
+ error_code?: "flow_not_found" | "validation_error";
27035
+ };
27036
+ };
27037
+ };
27038
+ /** @description `unauthorized` — The request carries no valid credentials. */
27039
+ 401: {
27040
+ headers: {
27041
+ [name: string]: unknown;
27042
+ };
27043
+ content: {
27044
+ "application/json": components["schemas"]["ErrorResponse"] & {
27045
+ /** @enum {string} */
27046
+ error_code?: "unauthorized";
27047
+ };
27048
+ };
27049
+ };
27050
+ /**
27051
+ * @description `forbidden` — The credentials are valid but do not allow this operation.
27052
+ *
27053
+ * `insufficient_scope` — The token lacks a scope this operation requires. `message` names it.
27054
+ *
27055
+ * `user_suspended` — The user is suspended and cannot sign in or be modified.
27056
+ */
27057
+ 403: {
27058
+ headers: {
27059
+ [name: string]: unknown;
27060
+ };
27061
+ content: {
27062
+ "application/json": components["schemas"]["ErrorResponse"] & {
27063
+ /** @enum {string} */
27064
+ error_code?: "forbidden" | "insufficient_scope" | "user_suspended";
27065
+ };
27066
+ };
27067
+ };
27068
+ /** @description `account_not_found` — No Auth Account matches the request (domain, header or token). */
27069
+ 404: {
27070
+ headers: {
27071
+ [name: string]: unknown;
27072
+ };
27073
+ content: {
27074
+ "application/json": components["schemas"]["ErrorResponse"] & {
27075
+ /** @enum {string} */
27076
+ error_code?: "account_not_found";
27077
+ };
27078
+ };
27079
+ };
27080
+ /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
27081
+ 429: {
27082
+ headers: {
27083
+ [name: string]: unknown;
27084
+ };
27085
+ content: {
27086
+ "application/json": components["schemas"]["ErrorResponse"] & {
27087
+ /** @enum {string} */
27088
+ error_code?: "too_many_requests";
27089
+ };
27090
+ };
27091
+ };
27092
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
27093
+ 500: {
27094
+ headers: {
27095
+ [name: string]: unknown;
27096
+ };
27097
+ content: {
27098
+ "application/json": components["schemas"]["ErrorResponse"] & {
27099
+ /** @enum {string} */
27100
+ error_code?: "internal_error";
27101
+ };
27102
+ };
27103
+ };
27104
+ };
27105
+ };
27106
+ "loginflow/list": {
27107
+ parameters: {
27108
+ query?: {
27109
+ /** @description Number of items per page (max 200) */
27110
+ pageSize?: number;
27111
+ /** @description Cursor for next page */
27112
+ cursor?: string;
27113
+ /** @description Cursor returned by the previous page */
27114
+ next?: string;
27115
+ /** @description Also return `total`: the rows matching the whole filter, across every page. */
27116
+ count?: boolean;
27117
+ /** @description Filter using a FaableQL query */
27118
+ query?: string;
27119
+ };
27120
+ header?: never;
27121
+ path?: never;
26671
27122
  cookie?: never;
26672
27123
  };
26673
27124
  requestBody?: never;
@@ -33597,6 +34048,334 @@ export interface operations {
33597
34048
  };
33598
34049
  };
33599
34050
  };
34051
+ "saml/metadata": {
34052
+ parameters: {
34053
+ query?: never;
34054
+ header?: never;
34055
+ path: {
34056
+ client_id: string;
34057
+ };
34058
+ cookie?: never;
34059
+ };
34060
+ requestBody?: never;
34061
+ responses: {
34062
+ /** @description Default Response */
34063
+ 200: {
34064
+ headers: {
34065
+ [name: string]: unknown;
34066
+ };
34067
+ content?: never;
34068
+ };
34069
+ /** @description `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field. */
34070
+ 400: {
34071
+ headers: {
34072
+ [name: string]: unknown;
34073
+ };
34074
+ content: {
34075
+ "application/json": components["schemas"]["ErrorResponse"] & {
34076
+ /** @enum {string} */
34077
+ error_code?: "validation_error";
34078
+ };
34079
+ };
34080
+ };
34081
+ /**
34082
+ * @description `saml_not_enabled` — This client does not have SAML enabled.
34083
+ *
34084
+ * `client_not_found` — No client with that `client_id`.
34085
+ *
34086
+ * `account_not_found` — No Auth Account matches the request (domain, header or token).
34087
+ */
34088
+ 404: {
34089
+ headers: {
34090
+ [name: string]: unknown;
34091
+ };
34092
+ content: {
34093
+ "application/json": components["schemas"]["ErrorResponse"] & {
34094
+ /** @enum {string} */
34095
+ error_code?: "saml_not_enabled" | "client_not_found" | "account_not_found";
34096
+ };
34097
+ };
34098
+ };
34099
+ /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
34100
+ 429: {
34101
+ headers: {
34102
+ [name: string]: unknown;
34103
+ };
34104
+ content: {
34105
+ "application/json": components["schemas"]["ErrorResponse"] & {
34106
+ /** @enum {string} */
34107
+ error_code?: "too_many_requests";
34108
+ };
34109
+ };
34110
+ };
34111
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
34112
+ 500: {
34113
+ headers: {
34114
+ [name: string]: unknown;
34115
+ };
34116
+ content: {
34117
+ "application/json": components["schemas"]["ErrorResponse"] & {
34118
+ /** @enum {string} */
34119
+ error_code?: "internal_error";
34120
+ };
34121
+ };
34122
+ };
34123
+ };
34124
+ };
34125
+ "saml/sso": {
34126
+ parameters: {
34127
+ query?: {
34128
+ SAMLRequest?: string;
34129
+ RelayState?: string;
34130
+ SigAlg?: string;
34131
+ Signature?: string;
34132
+ };
34133
+ header?: never;
34134
+ path: {
34135
+ client_id: string;
34136
+ };
34137
+ cookie?: never;
34138
+ };
34139
+ requestBody?: never;
34140
+ responses: {
34141
+ /** @description Default Response */
34142
+ 200: {
34143
+ headers: {
34144
+ [name: string]: unknown;
34145
+ };
34146
+ content?: never;
34147
+ };
34148
+ /**
34149
+ * @description `invalid_saml_request` — The SAMLRequest is missing, too large, not well-formed or not a SAML 2.0 AuthnRequest.
34150
+ *
34151
+ * `saml_sp_mismatch` — The AuthnRequest does not match the client's SAML configuration: its Issuer is not the configured entity_id, or it asks for another Assertion Consumer Service URL or binding.
34152
+ *
34153
+ * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
34154
+ */
34155
+ 400: {
34156
+ headers: {
34157
+ [name: string]: unknown;
34158
+ };
34159
+ content: {
34160
+ "application/json": components["schemas"]["ErrorResponse"] & {
34161
+ /** @enum {string} */
34162
+ error_code?: "invalid_saml_request" | "saml_sp_mismatch" | "validation_error";
34163
+ };
34164
+ };
34165
+ };
34166
+ /**
34167
+ * @description `saml_not_enabled` — This client does not have SAML enabled.
34168
+ *
34169
+ * `client_not_found` — No client with that `client_id`.
34170
+ *
34171
+ * `account_not_found` — No Auth Account matches the request (domain, header or token).
34172
+ */
34173
+ 404: {
34174
+ headers: {
34175
+ [name: string]: unknown;
34176
+ };
34177
+ content: {
34178
+ "application/json": components["schemas"]["ErrorResponse"] & {
34179
+ /** @enum {string} */
34180
+ error_code?: "saml_not_enabled" | "client_not_found" | "account_not_found";
34181
+ };
34182
+ };
34183
+ };
34184
+ /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
34185
+ 429: {
34186
+ headers: {
34187
+ [name: string]: unknown;
34188
+ };
34189
+ content: {
34190
+ "application/json": components["schemas"]["ErrorResponse"] & {
34191
+ /** @enum {string} */
34192
+ error_code?: "too_many_requests";
34193
+ };
34194
+ };
34195
+ };
34196
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
34197
+ 500: {
34198
+ headers: {
34199
+ [name: string]: unknown;
34200
+ };
34201
+ content: {
34202
+ "application/json": components["schemas"]["ErrorResponse"] & {
34203
+ /** @enum {string} */
34204
+ error_code?: "internal_error";
34205
+ };
34206
+ };
34207
+ };
34208
+ };
34209
+ };
34210
+ "saml/sso_post": {
34211
+ parameters: {
34212
+ query?: never;
34213
+ header?: never;
34214
+ path: {
34215
+ client_id: string;
34216
+ };
34217
+ cookie?: never;
34218
+ };
34219
+ requestBody: {
34220
+ content: {
34221
+ "application/json": {
34222
+ SAMLRequest?: string;
34223
+ RelayState?: string;
34224
+ SigAlg?: string;
34225
+ Signature?: string;
34226
+ };
34227
+ };
34228
+ };
34229
+ responses: {
34230
+ /** @description Default Response */
34231
+ 200: {
34232
+ headers: {
34233
+ [name: string]: unknown;
34234
+ };
34235
+ content?: never;
34236
+ };
34237
+ /**
34238
+ * @description `invalid_saml_request` — The SAMLRequest is missing, too large, not well-formed or not a SAML 2.0 AuthnRequest.
34239
+ *
34240
+ * `saml_sp_mismatch` — The AuthnRequest does not match the client's SAML configuration: its Issuer is not the configured entity_id, or it asks for another Assertion Consumer Service URL or binding.
34241
+ *
34242
+ * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
34243
+ */
34244
+ 400: {
34245
+ headers: {
34246
+ [name: string]: unknown;
34247
+ };
34248
+ content: {
34249
+ "application/json": components["schemas"]["ErrorResponse"] & {
34250
+ /** @enum {string} */
34251
+ error_code?: "invalid_saml_request" | "saml_sp_mismatch" | "validation_error";
34252
+ };
34253
+ };
34254
+ };
34255
+ /**
34256
+ * @description `saml_not_enabled` — This client does not have SAML enabled.
34257
+ *
34258
+ * `client_not_found` — No client with that `client_id`.
34259
+ *
34260
+ * `account_not_found` — No Auth Account matches the request (domain, header or token).
34261
+ */
34262
+ 404: {
34263
+ headers: {
34264
+ [name: string]: unknown;
34265
+ };
34266
+ content: {
34267
+ "application/json": components["schemas"]["ErrorResponse"] & {
34268
+ /** @enum {string} */
34269
+ error_code?: "saml_not_enabled" | "client_not_found" | "account_not_found";
34270
+ };
34271
+ };
34272
+ };
34273
+ /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
34274
+ 429: {
34275
+ headers: {
34276
+ [name: string]: unknown;
34277
+ };
34278
+ content: {
34279
+ "application/json": components["schemas"]["ErrorResponse"] & {
34280
+ /** @enum {string} */
34281
+ error_code?: "too_many_requests";
34282
+ };
34283
+ };
34284
+ };
34285
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
34286
+ 500: {
34287
+ headers: {
34288
+ [name: string]: unknown;
34289
+ };
34290
+ content: {
34291
+ "application/json": components["schemas"]["ErrorResponse"] & {
34292
+ /** @enum {string} */
34293
+ error_code?: "internal_error";
34294
+ };
34295
+ };
34296
+ };
34297
+ };
34298
+ };
34299
+ "saml/callback": {
34300
+ parameters: {
34301
+ query: {
34302
+ state: string;
34303
+ code?: string;
34304
+ error?: string;
34305
+ error_description?: string;
34306
+ iss?: string;
34307
+ };
34308
+ header?: never;
34309
+ path?: never;
34310
+ cookie?: never;
34311
+ };
34312
+ requestBody?: never;
34313
+ responses: {
34314
+ /** @description Default Response */
34315
+ 200: {
34316
+ headers: {
34317
+ [name: string]: unknown;
34318
+ };
34319
+ content?: never;
34320
+ };
34321
+ /**
34322
+ * @description `invalid_state` — The `state` is missing, expired, or does not describe a resumable step.
34323
+ *
34324
+ * `validation_error` — The body, query or path failed schema validation. `details.issues` lists each failing field.
34325
+ */
34326
+ 400: {
34327
+ headers: {
34328
+ [name: string]: unknown;
34329
+ };
34330
+ content: {
34331
+ "application/json": components["schemas"]["ErrorResponse"] & {
34332
+ /** @enum {string} */
34333
+ error_code?: "invalid_state" | "validation_error";
34334
+ };
34335
+ };
34336
+ };
34337
+ /**
34338
+ * @description `saml_not_enabled` — This client does not have SAML enabled.
34339
+ *
34340
+ * `account_not_found` — No Auth Account matches the request (domain, header or token).
34341
+ */
34342
+ 404: {
34343
+ headers: {
34344
+ [name: string]: unknown;
34345
+ };
34346
+ content: {
34347
+ "application/json": components["schemas"]["ErrorResponse"] & {
34348
+ /** @enum {string} */
34349
+ error_code?: "saml_not_enabled" | "account_not_found";
34350
+ };
34351
+ };
34352
+ };
34353
+ /** @description `too_many_requests` — Rate limit exceeded. Honour the `Retry-After` header. */
34354
+ 429: {
34355
+ headers: {
34356
+ [name: string]: unknown;
34357
+ };
34358
+ content: {
34359
+ "application/json": components["schemas"]["ErrorResponse"] & {
34360
+ /** @enum {string} */
34361
+ error_code?: "too_many_requests";
34362
+ };
34363
+ };
34364
+ };
34365
+ /** @description `internal_error` — Unexpected server error. Retry later; the request id is logged. */
34366
+ 500: {
34367
+ headers: {
34368
+ [name: string]: unknown;
34369
+ };
34370
+ content: {
34371
+ "application/json": components["schemas"]["ErrorResponse"] & {
34372
+ /** @enum {string} */
34373
+ error_code?: "internal_error";
34374
+ };
34375
+ };
34376
+ };
34377
+ };
34378
+ };
33600
34379
  "usernamepassword/login": {
33601
34380
  parameters: {
33602
34381
  query?: never;