@canopy-io/node 0.4.0 → 0.6.0

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.
package/dist/index.d.ts CHANGED
@@ -514,7 +514,7 @@ interface paths {
514
514
  head?: never;
515
515
  /**
516
516
  * Update an identity
517
- * @description Updates an identity's mutable profile fields (`first_name`, `last_name`, `is_active`, `metadata`) in the current Environment. `email` and `external_id` are immutable here — `external_id` is owned by the SSO/SCIM provisioning path and cannot be re-pointed through this endpoint. Returns the updated identity and writes an `identity.updated` audit row for the profile fields; a change to `is_active` writes `identity.status_set` instead, the account-wide activation switch. Returns `404` when the identity has no membership in this Environment.
517
+ * @description Updates an identity's mutable profile fields (`first_name`, `last_name`, `metadata`) in the current Environment. `email` and `external_id` are immutable here — `external_id` is owned by the SSO/SCIM provisioning path and cannot be re-pointed through this endpoint. The account-wide `is_active` switch is not settable from an Environment; to cut off access here, remove the identity from the Environment. Returns the updated identity and writes an `identity.updated` audit row. Returns `404` when the identity has no membership in this Environment.
518
518
  */
519
519
  patch: operations["ApiIdentitiesController_updateIdentity"];
520
520
  trace?: never;
@@ -539,46 +539,6 @@ interface paths {
539
539
  patch?: never;
540
540
  trace?: never;
541
541
  };
542
- "/api/v1/identities/{id}/activate": {
543
- parameters: {
544
- query?: never;
545
- header?: never;
546
- path?: never;
547
- cookie?: never;
548
- };
549
- get?: never;
550
- put?: never;
551
- /**
552
- * Activate an identity
553
- * @description Reactivates an identity by setting `is_active = true`, the account-wide switch, allowing it to authenticate again in every Environment it belongs to. Writes an `identity.status_set` audit row (the same event the Console's account route emits), delivered to the account's subscriptions and to those of every Environment the identity is a member of. Returns a `200` message envelope. Returns `404` when the identity has no membership in this Environment.
554
- */
555
- post: operations["ApiIdentitiesController_activateIdentity"];
556
- delete?: never;
557
- options?: never;
558
- head?: never;
559
- patch?: never;
560
- trace?: never;
561
- };
562
- "/api/v1/identities/{id}/deactivate": {
563
- parameters: {
564
- query?: never;
565
- header?: never;
566
- path?: never;
567
- cookie?: never;
568
- };
569
- get?: never;
570
- put?: never;
571
- /**
572
- * Deactivate an identity
573
- * @description Deactivates an identity by setting `is_active = false`, the account-wide switch, blocking future sign-in in every Environment it belongs to. Writes an `identity.status_set` audit row (the same event the Console's account route emits), delivered to the account's subscriptions and to those of every Environment the identity is a member of. Returns a `200` message envelope. Returns `404` when the identity has no membership in this Environment.
574
- */
575
- post: operations["ApiIdentitiesController_deactivateIdentity"];
576
- delete?: never;
577
- options?: never;
578
- head?: never;
579
- patch?: never;
580
- trace?: never;
581
- };
582
542
  "/api/v1/identities/{id}/password": {
583
543
  parameters: {
584
544
  query?: never;
@@ -834,7 +794,7 @@ interface paths {
834
794
  put?: never;
835
795
  /**
836
796
  * Create an invite
837
- * @description Creates a single identity invite in the active Environment and returns it along with a tokenized `accept_url`. The effective intent is derived server-side from existing identity state — a net-new email becomes `activate`, an existing identity without active access becomes `add_to_app`, and `password_reset` is honored only for an existing identity. An optional `role_id` + `node_id` pair (both or neither) seeds an initial role assignment applied at acceptance. Invites expire after 7 days; the email is sent unless `send_email: false`, in which case the caller delivers `accept_url` itself. A duplicate pending invite for the same recipient returns `409`.
797
+ * @description Creates a single identity invite in the active Environment and returns it along with a tokenized `accept_url`. The effective intent is derived server-side from existing identity state — a net-new email becomes `activate`, an existing identity without active access becomes `add_to_app`, and `password_reset` is honored only for an existing identity. An optional `role_id` + `node_id` pair (both or neither) seeds an initial role assignment applied at acceptance. Invites expire after 7 days, or 24 hours for `password_reset`; the email is sent unless `send_email: false`, in which case the caller delivers `accept_url` itself. A duplicate pending invite for the same recipient returns `409`.
838
798
  */
839
799
  post: operations["ApiIdentityInvitesController_createInvite"];
840
800
  delete?: never;
@@ -894,7 +854,7 @@ interface paths {
894
854
  put?: never;
895
855
  /**
896
856
  * Resend an invite
897
- * @description Resends the email for a `pending` invite in the active Environment, generating a fresh token, invalidating the previous one, and resetting the 7-day expiry. Returns the new tokenized `accept_url`. Subject to a 5-minute cooldown between resends. Returns `404` when the invite is not found and `400` when it is not in `pending` status or the cooldown has not elapsed.
857
+ * @description Resends the email for a `pending` invite in the active Environment, generating a fresh token, invalidating the previous one, and resetting the expiry (7 days, or 24 hours for `password_reset`). Returns the new tokenized `accept_url`. Subject to a 5-minute cooldown between resends. Returns `404` when the invite is not found and `400` when it is not in `pending` status or the cooldown has not elapsed.
898
858
  */
899
859
  post: operations["ApiIdentityInvitesController_resendInvite"];
900
860
  delete?: never;
@@ -1355,7 +1315,7 @@ interface paths {
1355
1315
  post?: never;
1356
1316
  /**
1357
1317
  * Unbind an SSO connection from an organization
1358
- * @description Removes the binding; logins through the connection fall back to the Environment's placement. Existing memberships are untouched. Returns `404` when the connection is not bound to this organization. Requires the `hierarchy.manage` permission at the organization and emits `organization.sso_connection.unbound`.
1318
+ * @description Removes the binding; logins through the connection fall back to the Environment's placement. Existing memberships are untouched. Returns `404` when the connection is not bound to this organization, and `409` (`organization.sso_connection_owned_cannot_unbind`) when the organization set the connection up itself: an owned connection stays with its organization, so disable or delete it instead. Requires the `hierarchy.manage` permission at the organization and emits `organization.sso_connection.unbound`.
1359
1319
  */
1360
1320
  delete: operations["ApiOrganizationsController_unbindSsoConnection"];
1361
1321
  options?: never;
@@ -1874,7 +1834,7 @@ interface paths {
1874
1834
  head?: never;
1875
1835
  /**
1876
1836
  * Update a role
1877
- * @description Updates a role's `name`, `description`, and/or `is_active` flag by `id`. A name that collides with another role in the Environment returns `409`, and a missing role returns `404`. Supports optimistic concurrency via the `If-Match` header carrying the role's current version (`409` on a version mismatch). Requires the `rbac.manage_roles` permission.
1837
+ * @description Updates a role's `name`, `description`, and/or `is_active` flag by `id`. Setting `is_active` to `false` hides the role from pickers, refuses new assignments to it, and withholds its permissions from every current holder until it is set back to `true`; the assignments themselves are kept. A name that collides with another role in the Environment returns `409`, and a missing role returns `404`. Supports optimistic concurrency via the `If-Match` header carrying the role's current version (`409` on a version mismatch). Requires the `rbac.manage_roles` permission.
1878
1838
  */
1879
1839
  patch: operations["ApiRolesController_updateRole"];
1880
1840
  trace?: never;
@@ -2188,7 +2148,7 @@ interface paths {
2188
2148
  };
2189
2149
  /**
2190
2150
  * Get an Environment's branding
2191
- * @description Returns the Environment's branding: the values the customer set (`branding`, null where unset) beside the effective result every hosted page and the organization admin portal render (`effective`: product name, logo, primary color, support link, and whether the attribution line stays). `brand_removal_available` says whether the Account's plan removes the attribution line.
2151
+ * @description Returns the Environment's branding: the values the customer set (`branding`, null where unset) beside the effective result every hosted page and the organization admin portal render (`effective`: product name, logo, favicon, primary and background colors, support, terms and privacy links, and whether the attribution mark stays). Only the primary color has a default; every other unset field is `null`. `brand_removal_available` says whether the Account's plan removes the attribution mark.
2192
2152
  */
2193
2153
  get: operations["ApiBrandingController_getBranding"];
2194
2154
  put?: never;
@@ -2198,7 +2158,7 @@ interface paths {
2198
2158
  head?: never;
2199
2159
  /**
2200
2160
  * Change an Environment's branding
2201
- * @description Sets the Environment's branding. Every field is optional and each one falls back on its own: send only what you want to change, send `null` to return a field to Canopy's default. The product name replaces Canopy's on every customer-facing surface, the logo shows at the top, the primary color drives buttons and links, and the support link becomes the support line. Returns `400` (`validation`) for a malformed value. Emits `environment.branding_updated`.
2161
+ * @description Sets the Environment's branding. Every field is optional and stands on its own: send only what you want to change, send `null` to clear a field (the primary color then returns to the default blue). The product name shows in the browser tab, as the logo's alt text and in place of a missing logo; the logo shows at the top and the favicon in the tab; the primary color drives buttons and links, and the hover, link and focus shades are derived from it; the background color paints the page behind the card; the support, terms and privacy links show as "Need help?", "Terms" and "Privacy" under every hosted page. Returns `400` (`validation`) for a malformed value. Emits `environment.branding_updated`.
2202
2162
  */
2203
2163
  patch: operations["ApiBrandingController_updateBranding"];
2204
2164
  trace?: never;
@@ -2430,6 +2390,7 @@ interface components {
2430
2390
  scope_evaluated: "node" | "app_wide";
2431
2391
  /** @description The hierarchy node the decision was anchored to. Always set for `scope_evaluated: "node"`; always null for `scope_evaluated: "app_wide"` because the answer is org-scoped, not node-scoped. */
2432
2392
  effective_node_id?: string | null;
2393
+ /** @description Ids of the roles whose assignments produced a node-scoped allow. Always empty for `scope_evaluated: "app_wide"`, whose answer is not tied to a node, and for a deny. */
2433
2394
  granting_roles: string[];
2434
2395
  denial_reason?: string | null;
2435
2396
  };
@@ -2464,7 +2425,7 @@ interface components {
2464
2425
  assignment_id: string;
2465
2426
  role_id: string;
2466
2427
  role_name: string;
2467
- /** @description Whether the assignment is within its effective_from/effective_to window right now. */
2428
+ /** @description Whether the assignment counts right now: within its effective_from/effective_to window, and its role is active. An inactive role's assignments are kept but grant nothing. */
2468
2429
  active: boolean;
2469
2430
  effective_from?: string | null;
2470
2431
  effective_to?: string | null;
@@ -2560,11 +2521,13 @@ interface components {
2560
2521
  email: string;
2561
2522
  first_name: string;
2562
2523
  last_name: string;
2563
- /** @description Initial password. 8-64 characters. No composition rules — NIST SP 800-63B aligned. A HaveIBeenPwned breach check runs server-side. The effective policy is published on `GET /v1/identity/auth/config`, so a client can state the rules before submit rather than after. Omit to create a passwordless identity (sign-in via SSO/social or forgot-password reset). */
2524
+ /** @description Initial password. 8-64 characters. No composition rules — NIST SP 800-63B aligned. A HaveIBeenPwned breach check runs server-side. The effective policy is published on `GET /v1/identity/auth/config`, so a client can state the rules before submit rather than after. Omit to create a passwordless identity (sign-in via SSO or a password reset). */
2564
2525
  password?: string;
2565
2526
  external_id?: string;
2566
2527
  metadata?: Record<string, unknown>;
2528
+ /** @description Role for an initial assignment — required if node_id is provided */
2567
2529
  role_id?: string;
2530
+ /** @description Node for an initial assignment — required if role_id is provided */
2568
2531
  node_id?: string;
2569
2532
  };
2570
2533
  BulkCreateIdentitiesDto: {
@@ -2588,13 +2551,9 @@ interface components {
2588
2551
  /** Format: date-time */
2589
2552
  updated_at: string;
2590
2553
  };
2591
- MessageResponseDto: {
2592
- message: string;
2593
- };
2594
2554
  UpdateIdentityDto: {
2595
2555
  first_name?: string;
2596
2556
  last_name?: string;
2597
- is_active?: boolean;
2598
2557
  metadata?: Record<string, unknown> | null;
2599
2558
  };
2600
2559
  SetIdentityPasswordDto: {
@@ -2653,7 +2612,7 @@ interface components {
2653
2612
  email_verified: boolean;
2654
2613
  /** Format: date-time */
2655
2614
  email_verified_at?: string | null;
2656
- /** @description Whether the identity has a usable password. False for passwordless (SSO/social/code-only) identities. */
2615
+ /** @description Whether the identity has a usable password. False for passwordless (SSO or email-code-only) identities. */
2657
2616
  password_set: boolean;
2658
2617
  /** @description True while the identity is in an active failed-login lockout window. */
2659
2618
  locked: boolean;
@@ -2706,10 +2665,6 @@ interface components {
2706
2665
  name: string;
2707
2666
  role_id?: string | null;
2708
2667
  node_id?: string | null;
2709
- /** @description Environment the invite targets, or null for a directory-only (account-tier) invite created with the Environment field left empty. */
2710
- environment_id?: string | null;
2711
- /** @description Display name of the target Environment, or null for a directory-only invite. */
2712
- environment_name?: string | null;
2713
2668
  has_initial_assignment: boolean;
2714
2669
  /** @enum {string} */
2715
2670
  status: "pending" | "accepted" | "revoked" | "expired";
@@ -2741,10 +2696,6 @@ interface components {
2741
2696
  name: string;
2742
2697
  role_id?: string | null;
2743
2698
  node_id?: string | null;
2744
- /** @description Environment the invite targets, or null for a directory-only (account-tier) invite created with the Environment field left empty. */
2745
- environment_id?: string | null;
2746
- /** @description Display name of the target Environment, or null for a directory-only invite. */
2747
- environment_name?: string | null;
2748
2699
  has_initial_assignment: boolean;
2749
2700
  /** @enum {string} */
2750
2701
  status: "pending" | "accepted" | "revoked" | "expired";
@@ -3106,6 +3057,8 @@ interface components {
3106
3057
  /** @enum {string} */
3107
3058
  type: "saml" | "oidc";
3108
3059
  status: string;
3060
+ /** @description The organization that set the connection up from the organization portal, or null. A connection owned by this organization cannot be unbound from it. */
3061
+ owner_organization_node_id?: string | null;
3109
3062
  };
3110
3063
  OrganizationSsoRoleSummaryDto: {
3111
3064
  id: string;
@@ -3228,7 +3181,11 @@ interface components {
3228
3181
  type: "saml" | "oidc";
3229
3182
  name: string;
3230
3183
  /** @enum {string} */
3231
- status: "configuring" | "active" | "disabled" | "failed";
3184
+ status: "configuring" | "active" | "disabled";
3185
+ /** @description The organization that owns the connection, when its administrator set it up from the organization portal; null for a connection the developer created. An owned connection cannot be moved to another organization or Environment, and its administrators are emailed when the developer changes its provider settings, disables or deletes it. */
3186
+ owner_organization_node_id?: string | null;
3187
+ /** @description True when an organization's administrator set the connection up from the organization portal. */
3188
+ owned_by_organization: boolean;
3232
3189
  /** @description The HTTPS address the identity provider's SAML metadata was last imported from. `null` when the metadata was pasted as a document or never imported. */
3233
3190
  saml_metadata_url?: string | null;
3234
3191
  /** @description The last test sign-in run against the connection. Cleared when its provider settings change, since a test no longer proves them. */
@@ -3253,11 +3210,6 @@ interface components {
3253
3210
  /** Format: date-time */
3254
3211
  last_login_at?: string | null;
3255
3212
  /** Format: date-time */
3256
- last_login_failure_at?: string | null;
3257
- consecutive_failures: number;
3258
- /** Format: date-time */
3259
- auto_disabled_at?: string | null;
3260
- /** Format: date-time */
3261
3213
  created_at: string;
3262
3214
  /** Format: date-time */
3263
3215
  updated_at: string;
@@ -3491,9 +3443,12 @@ interface components {
3491
3443
  name?: string;
3492
3444
  /** @description Updated role description */
3493
3445
  description?: string | null;
3494
- /** @description Whether the role is active */
3446
+ /** @description Whether the role is active. An inactive role is hidden from pickers, cannot be newly assigned, and grants nothing to its current holders until it is reactivated; their assignments are kept. */
3495
3447
  is_active?: boolean;
3496
3448
  };
3449
+ MessageResponseDto: {
3450
+ message: string;
3451
+ };
3497
3452
  SetRolePermissionsDto: {
3498
3453
  permission_keys: string[];
3499
3454
  };
@@ -3736,7 +3691,7 @@ interface components {
3736
3691
  /** @description Allowed node types (e.g. ['region', 'district', 'team']). Order is informational, not structural — parent/child rules are governed by `allowed_children`. Names starting with `canopy:` are reserved; with organizations enabled the list starts with `canopy:organization`. */
3737
3692
  node_types: string[];
3738
3693
  /**
3739
- * @description Map from node type to allowed child node types. Empty array means leaf-only.
3694
+ * @description Map from node type to allowed child node types. An empty array makes that type a leaf: nothing may be created or moved beneath it. A type the map does not mention accepts any child.
3740
3695
  * @example {
3741
3696
  * "region": [
3742
3697
  * "district"
@@ -3756,37 +3711,70 @@ interface components {
3756
3711
  StoredBrandingDto: {
3757
3712
  product_name: string | null;
3758
3713
  logo_url: string | null;
3714
+ /** @enum {string|null} */
3715
+ logo_kind: "full" | "icon" | null;
3716
+ favicon_url: string | null;
3759
3717
  primary_color: string | null;
3718
+ background_color: string | null;
3760
3719
  support_url: string | null;
3720
+ terms_url: string | null;
3721
+ privacy_url: string | null;
3761
3722
  };
3762
3723
  EffectiveBrandingDto: {
3763
- product_name: string;
3724
+ /** @description Null when the customer set none; surfaces then show no name. */
3725
+ product_name: string | null;
3764
3726
  logo_url: string | null;
3727
+ /**
3728
+ * @description `full`: the logo is shown alone. `icon`: it is shown at icon size with the product name beside it.
3729
+ * @enum {string}
3730
+ */
3731
+ logo_kind: "full" | "icon";
3732
+ favicon_url: string | null;
3765
3733
  /** @description Six-digit hex. */
3766
3734
  primary_color: string;
3735
+ /** @description Six-digit hex, or null for the neutral grey. */
3736
+ background_color: string | null;
3767
3737
  support_url: string | null;
3768
- /** @description Whether the attribution line stays on hosted pages and the portal. False only on a plan with brand removal. */
3738
+ terms_url: string | null;
3739
+ privacy_url: string | null;
3740
+ /** @description Whether the attribution mark stays on hosted pages and the portal. False only on a plan with brand removal. */
3769
3741
  attribution: boolean;
3770
3742
  };
3771
3743
  EnvironmentBrandingResponseDto: {
3772
3744
  environment_slug: string;
3773
3745
  branding: components["schemas"]["StoredBrandingDto"];
3774
3746
  effective: components["schemas"]["EffectiveBrandingDto"];
3775
- /** @description Whether the Account's plan removes the attribution line. When false, the line stays whatever the customer sets. */
3747
+ /** @description Whether the Account's plan removes the attribution mark. When false, the mark stays whatever the customer sets. */
3776
3748
  brand_removal_available: boolean;
3777
3749
  };
3778
3750
  UpdateEnvironmentBrandingDto: {
3779
- /** @description The product name every hosted page and the organization admin portal show in place of Canopy's. Null clears it. */
3751
+ /** @description The product name hosted pages and the organization admin portal show: in the browser tab title, beside the logo when `logo_kind` is `icon`, as a full logo's alt text, and in place of a logo when none is set. Null clears it, and the pages then show no name. */
3780
3752
  product_name?: string | null;
3781
3753
  /** @description Absolute https URL of the logo shown at the top of hosted pages and the portal. Null clears it. */
3782
3754
  logo_url?: string | null;
3783
3755
  /**
3784
- * @description Six-digit hex color for buttons and links on hosted pages and the portal. Null returns to Canopy's primary.
3756
+ * @description What the logo image is. `full`: a complete logo that already carries the product name, shown alone. `icon`: a square mark, shown at icon size with the product name beside it. Null returns to `full`.
3757
+ * @enum {string|null}
3758
+ */
3759
+ logo_kind?: "full" | "icon" | null;
3760
+ /** @description Absolute https URL of the browser-tab icon on hosted pages: a square PNG or ICO of at least 32 px. Null clears it. */
3761
+ favicon_url?: string | null;
3762
+ /**
3763
+ * @description Six-digit hex colour for buttons and links on hosted pages and the portal. Hover, link, focus and tint shades are derived from it so each meets its contrast rule. Null returns to the default blue.
3785
3764
  * @example #B93C0C
3786
3765
  */
3787
3766
  primary_color?: string | null;
3788
- /** @description Where the support line points: an https URL or a mailto: address. Null hides the line. */
3767
+ /**
3768
+ * @description Six-digit hex colour for the page behind the card on hosted pages. The card stays white; footer text is chosen to reach 4.5:1 against it. Null returns to the neutral grey.
3769
+ * @example #0B1F3A
3770
+ */
3771
+ background_color?: string | null;
3772
+ /** @description Where "Need help?" points: an https URL or a mailto: address. Null hides it. */
3789
3773
  support_url?: string | null;
3774
+ /** @description Absolute https URL of the customer's terms, linked as "Terms" in the hosted pages' footer. Null hides it. */
3775
+ terms_url?: string | null;
3776
+ /** @description Absolute https URL of the customer's privacy policy, linked as "Privacy" in the hosted pages' footer. Null hides it. */
3777
+ privacy_url?: string | null;
3790
3778
  };
3791
3779
  WebhookCreatedResponseDto: {
3792
3780
  id: string;
@@ -7088,222 +7076,6 @@ interface operations {
7088
7076
  };
7089
7077
  };
7090
7078
  };
7091
- ApiIdentitiesController_activateIdentity: {
7092
- parameters: {
7093
- query?: never;
7094
- header?: never;
7095
- path: {
7096
- id: string;
7097
- };
7098
- cookie?: never;
7099
- };
7100
- requestBody?: never;
7101
- responses: {
7102
- /** @description Identity activated */
7103
- 200: {
7104
- headers: {
7105
- [name: string]: unknown;
7106
- };
7107
- content: {
7108
- "application/json": {
7109
- data: components["schemas"]["MessageResponseDto"];
7110
- };
7111
- };
7112
- };
7113
- /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header */
7114
- 400: {
7115
- headers: {
7116
- [name: string]: unknown;
7117
- };
7118
- content: {
7119
- /**
7120
- * @example {
7121
- * "error": {
7122
- * "statusCode": 400,
7123
- * "code": null,
7124
- * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header",
7125
- * "timestamp": "2026-04-20T12:00:00.000Z",
7126
- * "path": "/api/v1/identities/{id}/activate",
7127
- * "method": "POST"
7128
- * }
7129
- * }
7130
- */
7131
- "application/json": components["schemas"]["ErrorResponseDto"];
7132
- };
7133
- };
7134
- /** @description Invalid or expired token */
7135
- 401: {
7136
- headers: {
7137
- [name: string]: unknown;
7138
- };
7139
- content: {
7140
- /**
7141
- * @example {
7142
- * "error": {
7143
- * "statusCode": 401,
7144
- * "code": null,
7145
- * "message": "Invalid or expired token",
7146
- * "timestamp": "2026-04-20T12:00:00.000Z",
7147
- * "path": "/api/v1/identities",
7148
- * "method": "GET"
7149
- * }
7150
- * }
7151
- */
7152
- "application/json": components["schemas"]["ErrorResponseDto"];
7153
- };
7154
- };
7155
- /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7156
- 403: {
7157
- headers: {
7158
- [name: string]: unknown;
7159
- };
7160
- content: {
7161
- /**
7162
- * @example {
7163
- * "error": {
7164
- * "statusCode": 403,
7165
- * "code": null,
7166
- * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7167
- * "timestamp": "2026-04-20T12:00:00.000Z",
7168
- * "path": "/api/v1/identities",
7169
- * "method": "GET"
7170
- * }
7171
- * }
7172
- */
7173
- "application/json": components["schemas"]["ErrorResponseDto"];
7174
- };
7175
- };
7176
- /** @description Identity not found */
7177
- 404: {
7178
- headers: {
7179
- [name: string]: unknown;
7180
- };
7181
- content: {
7182
- /**
7183
- * @example {
7184
- * "error": {
7185
- * "statusCode": 404,
7186
- * "code": null,
7187
- * "message": "Identity not found",
7188
- * "timestamp": "2026-04-20T12:00:00.000Z",
7189
- * "path": "/api/v1/identities/{id}/activate",
7190
- * "method": "POST"
7191
- * }
7192
- * }
7193
- */
7194
- "application/json": components["schemas"]["ErrorResponseDto"];
7195
- };
7196
- };
7197
- };
7198
- };
7199
- ApiIdentitiesController_deactivateIdentity: {
7200
- parameters: {
7201
- query?: never;
7202
- header?: never;
7203
- path: {
7204
- id: string;
7205
- };
7206
- cookie?: never;
7207
- };
7208
- requestBody?: never;
7209
- responses: {
7210
- /** @description Identity deactivated */
7211
- 200: {
7212
- headers: {
7213
- [name: string]: unknown;
7214
- };
7215
- content: {
7216
- "application/json": {
7217
- data: components["schemas"]["MessageResponseDto"];
7218
- };
7219
- };
7220
- };
7221
- /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header */
7222
- 400: {
7223
- headers: {
7224
- [name: string]: unknown;
7225
- };
7226
- content: {
7227
- /**
7228
- * @example {
7229
- * "error": {
7230
- * "statusCode": 400,
7231
- * "code": null,
7232
- * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header",
7233
- * "timestamp": "2026-04-20T12:00:00.000Z",
7234
- * "path": "/api/v1/identities/{id}/deactivate",
7235
- * "method": "POST"
7236
- * }
7237
- * }
7238
- */
7239
- "application/json": components["schemas"]["ErrorResponseDto"];
7240
- };
7241
- };
7242
- /** @description Invalid or expired token */
7243
- 401: {
7244
- headers: {
7245
- [name: string]: unknown;
7246
- };
7247
- content: {
7248
- /**
7249
- * @example {
7250
- * "error": {
7251
- * "statusCode": 401,
7252
- * "code": null,
7253
- * "message": "Invalid or expired token",
7254
- * "timestamp": "2026-04-20T12:00:00.000Z",
7255
- * "path": "/api/v1/identities",
7256
- * "method": "GET"
7257
- * }
7258
- * }
7259
- */
7260
- "application/json": components["schemas"]["ErrorResponseDto"];
7261
- };
7262
- };
7263
- /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7264
- 403: {
7265
- headers: {
7266
- [name: string]: unknown;
7267
- };
7268
- content: {
7269
- /**
7270
- * @example {
7271
- * "error": {
7272
- * "statusCode": 403,
7273
- * "code": null,
7274
- * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7275
- * "timestamp": "2026-04-20T12:00:00.000Z",
7276
- * "path": "/api/v1/identities",
7277
- * "method": "GET"
7278
- * }
7279
- * }
7280
- */
7281
- "application/json": components["schemas"]["ErrorResponseDto"];
7282
- };
7283
- };
7284
- /** @description Identity not found */
7285
- 404: {
7286
- headers: {
7287
- [name: string]: unknown;
7288
- };
7289
- content: {
7290
- /**
7291
- * @example {
7292
- * "error": {
7293
- * "statusCode": 404,
7294
- * "code": null,
7295
- * "message": "Identity not found",
7296
- * "timestamp": "2026-04-20T12:00:00.000Z",
7297
- * "path": "/api/v1/identities/{id}/deactivate",
7298
- * "method": "POST"
7299
- * }
7300
- * }
7301
- */
7302
- "application/json": components["schemas"]["ErrorResponseDto"];
7303
- };
7304
- };
7305
- };
7306
- };
7307
7079
  ApiIdentitiesController_setIdentityPassword: {
7308
7080
  parameters: {
7309
7081
  query?: never;
@@ -8602,14 +8374,12 @@ interface operations {
8602
8374
  take?: number;
8603
8375
  /** @description Search term */
8604
8376
  q?: string;
8605
- /** @description Column to sort by. Allowed values depend on the endpoint. */
8606
- sort_by?: string;
8377
+ /** @description Column to sort by. Defaults to `created`, newest first. */
8378
+ sort_by?: "name" | "email" | "created";
8607
8379
  /** @description Sort direction */
8608
8380
  order?: "asc" | "desc";
8609
8381
  /** @description Filter by invite status */
8610
8382
  status?: "pending" | "accepted" | "revoked" | "expired";
8611
- /** @description Filter by target Environment. Pass the literal `none` to return only directory-only invites (environment_id is null). */
8612
- environment_id?: string;
8613
8383
  };
8614
8384
  header?: never;
8615
8385
  path?: never;
@@ -12608,6 +12378,27 @@ interface operations {
12608
12378
  "application/json": components["schemas"]["ErrorResponseDto"];
12609
12379
  };
12610
12380
  };
12381
+ /** @description The organization set this connection up itself; it stays bound. Disable or delete the connection instead. */
12382
+ 409: {
12383
+ headers: {
12384
+ [name: string]: unknown;
12385
+ };
12386
+ content: {
12387
+ /**
12388
+ * @example {
12389
+ * "error": {
12390
+ * "statusCode": 409,
12391
+ * "code": null,
12392
+ * "message": "The organization set this connection up itself; it stays bound. Disable or delete the connection instead.",
12393
+ * "timestamp": "2026-04-20T12:00:00.000Z",
12394
+ * "path": "/api/v1/organizations/{id}/sso-connections/{connectionId}",
12395
+ * "method": "DELETE"
12396
+ * }
12397
+ * }
12398
+ */
12399
+ "application/json": components["schemas"]["ErrorResponseDto"];
12400
+ };
12401
+ };
12611
12402
  };
12612
12403
  };
12613
12404
  ApiOrganizationsController_listMembers: {
@@ -19197,7 +18988,7 @@ interface operations {
19197
18988
  };
19198
18989
  };
19199
18990
  };
19200
- /** @description A value is malformed: the logo must be an https URL, the color a six-digit hex, the support link an https URL or a mailto: address; or the request sent both an `X-API-Key` and an `Authorization` header */
18991
+ /** @description A value is malformed: the logo, favicon, terms and privacy links must be https URLs, the colors six-digit hex, the support link an https URL or a mailto: address, and the product name at most 60 characters; or the request sent both an `X-API-Key` and an `Authorization` header */
19201
18992
  400: {
19202
18993
  headers: {
19203
18994
  [name: string]: unknown;
@@ -19208,7 +18999,7 @@ interface operations {
19208
18999
  * "error": {
19209
19000
  * "statusCode": 400,
19210
19001
  * "code": null,
19211
- * "message": "A value is malformed: the logo must be an https URL, the color a six-digit hex, the support link an https URL or a mailto: address; or the request sent both an `X-API-Key` and an `Authorization` header",
19002
+ * "message": "A value is malformed: the logo, favicon, terms and privacy links must be https URLs, the colors six-digit hex, the support link an https URL or a mailto: address, and the product name at most 60 characters; or the request sent both an `X-API-Key` and an `Authorization` header",
19212
19003
  * "timestamp": "2026-04-20T12:00:00.000Z",
19213
19004
  * "path": "/api/v1/branding",
19214
19005
  * "method": "PATCH"
@@ -20661,14 +20452,14 @@ declare class Identities {
20661
20452
  get(id: string): Promise<ResponseBody<"ApiIdentitiesController_getIdentity">>;
20662
20453
  create(input: RequestBody<"ApiIdentitiesController_createIdentity">): Promise<ResponseBody<"ApiIdentitiesController_createIdentity">>;
20663
20454
  update(id: string, input: RequestBody<"ApiIdentitiesController_updateIdentity">): Promise<ResponseBody<"ApiIdentitiesController_updateIdentity">>;
20664
- delete(id: string): Promise<void>;
20665
20455
  /**
20666
- * Deactivation is the reversible counterpart to `delete` — sessions are
20667
- * revoked and sign-in refused, but the identity and its assignments survive.
20668
- * Prefer it for offboarding you may need to undo.
20456
+ * Takes the identity out of this key's Environment: its membership here is
20457
+ * deactivated and its role assignments here are dropped. The identity and
20458
+ * its access to other Environments are untouched. Deactivating an identity
20459
+ * everywhere is an Account-level action, not available to an
20460
+ * Environment-scoped key.
20669
20461
  */
20670
- deactivate(id: string): Promise<ResponseBody<"ApiIdentitiesController_deactivateIdentity">>;
20671
- activate(id: string): Promise<ResponseBody<"ApiIdentitiesController_activateIdentity">>;
20462
+ delete(id: string): Promise<void>;
20672
20463
  /**
20673
20464
  * Every role this identity holds, and where — across all pages.
20674
20465
  *
@@ -20706,7 +20497,7 @@ declare class Identities {
20706
20497
  * Ends every session the identity holds, so the next refresh on any device
20707
20498
  * fails and the person signs in again. Access tokens already issued keep
20708
20499
  * working until their short lifetime runs out. For a suspected compromise;
20709
- * `deactivate` also refuses the next sign-in.
20500
+ * `delete` also takes the identity out of this Environment.
20710
20501
  */
20711
20502
  revokeSessions(id: string): Promise<void>;
20712
20503
  }
@@ -21049,7 +20840,9 @@ declare class LocalAuthorizer {
21049
20840
  * With no argument, everything goes: grants and the hierarchy tree. Not
21050
20841
  * needed in normal operation, where entries expire on their own; useful in
21051
20842
  * tests and after a change whose reach you cannot name (a role's
21052
- * permissions edited, a node moved).
20843
+ * permissions edited, a role deactivated or reactivated, a node moved). A
20844
+ * deactivated role grants nothing to anyone holding it, so until the cache
20845
+ * is cleared or expires, its holders keep being allowed locally.
21053
20846
  *
21054
20847
  * Multi-instance honesty: an invalidation reaches THIS process only. A
21055
20848
  * webhook lands on one instance behind a load balancer; the others serve