@canopy-io/node 0.1.1 → 0.3.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.cts CHANGED
@@ -327,6 +327,26 @@ interface paths {
327
327
  patch: operations["ApiPermissionsController_updatePermission"];
328
328
  trace?: never;
329
329
  };
330
+ "/api/v1/permissions/{id}/usage": {
331
+ parameters: {
332
+ query?: never;
333
+ header?: never;
334
+ path?: never;
335
+ cookie?: never;
336
+ };
337
+ /**
338
+ * Get where a permission is used
339
+ * @description Returns the roles that grant a permission, each with the number of distinct identities holding that role, plus `role_count` and the distinct `identity_count` the permission reaches overall. Because a permission is only ever held through a role, this is the full blast radius of deleting it — the listed roles are exactly the ones a delete would strip it from. Deactivated roles are included; `identity_count` is not the sum of the per-role counts, since one identity may hold several granting roles. Returns `404` when no permission with that id exists in the Environment. Requires the `rbac.view_roles` permission.
340
+ */
341
+ get: operations["ApiPermissionsController_getPermissionUsage"];
342
+ put?: never;
343
+ post?: never;
344
+ delete?: never;
345
+ options?: never;
346
+ head?: never;
347
+ patch?: never;
348
+ trace?: never;
349
+ };
330
350
  "/api/v1/permissions/evaluate": {
331
351
  parameters: {
332
352
  query?: never;
@@ -878,7 +898,7 @@ interface paths {
878
898
  put?: never;
879
899
  /**
880
900
  * Create a hierarchy node
881
- * @description Creates a hierarchy node in the active Application's current Environment. Authorization is evaluated against `hierarchy.manage` on the parent node when `parent_node_id` is supplied, or Application-wide when creating the root. The node type and the parent/child relationship are validated against the Environment's hierarchy schema, only one root node is permitted per Environment (a second returns `409`), and the configured `max_depth` is enforced; a missing `slug` is derived from the name. Returns `201` with the created node and writes a `node.created` audit row.
901
+ * @description Creates a hierarchy node in the active Application's current Environment. Prerequisite: the Environment must have a hierarchy schema — define it first via `PATCH /api/v1/hierarchy-schema` (or the Console's enable-hierarchy wizard), or this endpoint returns `400` ("Hierarchy schema is not configured"). Authorization is evaluated against `hierarchy.manage` on the parent node when `parent_node_id` is supplied, or Application-wide when creating the root. The node type and the parent/child relationship are validated against the schema, only one root node is permitted per Environment (a second returns `409`), and the configured `max_depth` is enforced; a missing `slug` is derived from the name. Returns `201` with the created node and writes a `node.created` audit row.
882
902
  */
883
903
  post: operations["ApiNodesController_createNode"];
884
904
  delete?: never;
@@ -1055,6 +1075,222 @@ interface paths {
1055
1075
  patch?: never;
1056
1076
  trace?: never;
1057
1077
  };
1078
+ "/api/v1/organizations": {
1079
+ parameters: {
1080
+ query?: never;
1081
+ header?: never;
1082
+ path?: never;
1083
+ cookie?: never;
1084
+ };
1085
+ /**
1086
+ * List organizations
1087
+ * @description Lists the Environment's organizations with `member_count` and `pending_invite_count` per row, paginated and searchable by name or slug (`q`). Empty while the Environment has organizations disabled. Requires the `hierarchy.view` permission.
1088
+ */
1089
+ get: operations["ApiOrganizationsController_listOrganizations"];
1090
+ put?: never;
1091
+ /**
1092
+ * Create an organization
1093
+ * @description Creates an organization from a `name` (slug auto-derived, display-only) with optional `description` and `metadata`. The Environment must have organizations enabled (`409 organization.not_enabled` otherwise); the container is independent of the access model, so flat and hierarchy Environments both hold organizations. Requires the `hierarchy.manage` permission and emits `organization.created`.
1094
+ */
1095
+ post: operations["ApiOrganizationsController_createOrganization"];
1096
+ /**
1097
+ * Delete every organization
1098
+ * @description Deletes every live organization in the Environment the way the single delete does: memberships and every assignment beneath each organization are removed, pending invitations bound to the organization or its tree are revoked, and each organization is soft-deleted with its subtree. Member identities are untouched. This is the step before switching the container off. Responds `204 No Content`, requires the `hierarchy.manage` permission, and emits `organization.deleted_all` with the counts.
1099
+ */
1100
+ delete: operations["ApiOrganizationsController_deleteAllOrganizations"];
1101
+ options?: never;
1102
+ head?: never;
1103
+ patch?: never;
1104
+ trace?: never;
1105
+ };
1106
+ "/api/v1/organizations/{id}": {
1107
+ parameters: {
1108
+ query?: never;
1109
+ header?: never;
1110
+ path?: never;
1111
+ cookie?: never;
1112
+ };
1113
+ /**
1114
+ * Get an organization
1115
+ * @description Returns a single organization by `id` with `member_count` and `pending_invite_count`. Returns `404` when the id does not name a live organization in the current Environment. Requires the `hierarchy.view` permission at the organization.
1116
+ */
1117
+ get: operations["ApiOrganizationsController_getOrganization"];
1118
+ put?: never;
1119
+ post?: never;
1120
+ /**
1121
+ * Delete an organization
1122
+ * @description Deletes an organization by `id`: removes every membership and every assignment beneath the organization, revokes every pending invitation bound to it or its tree, and soft-deletes the organization with its subtree. Member identities themselves are untouched and keep their memberships in other organizations. Supports optimistic concurrency via the `If-Match` header (`409` on a version mismatch). Responds `204 No Content`, requires the `hierarchy.manage` permission at the organization, and emits `organization.deleted`.
1123
+ */
1124
+ delete: operations["ApiOrganizationsController_deleteOrganization"];
1125
+ options?: never;
1126
+ head?: never;
1127
+ /**
1128
+ * Update an organization
1129
+ * @description Updates an organization's `name`, `description`, and/or `metadata` by `id`. The slug is frozen at create and never changes. Supports optimistic concurrency via the `If-Match` header carrying the organization's current version (`409` on a version mismatch). Requires the `hierarchy.manage` permission at the organization and emits `organization.updated`.
1130
+ */
1131
+ patch: operations["ApiOrganizationsController_updateOrganization"];
1132
+ trace?: never;
1133
+ };
1134
+ "/api/v1/organizations/{id}/policy": {
1135
+ parameters: {
1136
+ query?: never;
1137
+ header?: never;
1138
+ path?: never;
1139
+ cookie?: never;
1140
+ };
1141
+ /**
1142
+ * Get an organization's authentication policy
1143
+ * @description Returns the organization's own authentication policy (null fields inherit the Environment) alongside the effective policy its members sign in under. Requires the `hierarchy.view` permission at the organization.
1144
+ */
1145
+ get: operations["ApiOrganizationsController_getPolicy"];
1146
+ put?: never;
1147
+ post?: never;
1148
+ delete?: never;
1149
+ options?: never;
1150
+ head?: never;
1151
+ /**
1152
+ * Update an organization's authentication policy
1153
+ * @description Sets the organization's own authentication policy. A field set to `null` inherits the Environment again. The policy can only tighten the Environment's settings: `mfa_required` can be true where the Environment leaves MFA optional, `mfa_factor_allowlist` must be a subset of the Environment's, `mfa_after_sso` can be `require` where the Environment exempts, and `require_sso` refuses password and code logins for members. Returns `400` (`organization.policy_loosens`) when a value would loosen the Environment, `409` when `If-Match` does not match the policy version. Requires the `hierarchy.manage` permission at the organization and emits `organization.policy.updated`.
1154
+ */
1155
+ patch: operations["ApiOrganizationsController_updatePolicy"];
1156
+ trace?: never;
1157
+ };
1158
+ "/api/v1/organizations/{id}/sso-connections": {
1159
+ parameters: {
1160
+ query?: never;
1161
+ header?: never;
1162
+ path?: never;
1163
+ cookie?: never;
1164
+ };
1165
+ /**
1166
+ * List an organization's SSO connections
1167
+ * @description Lists the end-user SSO connections bound to this organization, oldest first, each with the membership role a just-in-time provisioned login receives. Requires the `hierarchy.view` permission at the organization. The response is an unpaginated `{ items }` array.
1168
+ */
1169
+ get: operations["ApiOrganizationsController_listSsoConnections"];
1170
+ put?: never;
1171
+ /**
1172
+ * Bind an SSO connection to an organization
1173
+ * @description Binds an `end_user` SSO connection to the organization: a login through the connection lands in this organization, joining as a member with `default_role_id` when the identity is provisioned or is not yet a member, and the session starts here. The connection must already be bound to the organization's Environment (that binding routes the email domain), and the role must belong to the Environment (`400` otherwise). A connection binds to one organization per Environment (`409`). Requires the `hierarchy.manage` permission at the organization and emits `organization.sso_connection.bound`.
1174
+ */
1175
+ post: operations["ApiOrganizationsController_bindSsoConnection"];
1176
+ delete?: never;
1177
+ options?: never;
1178
+ head?: never;
1179
+ patch?: never;
1180
+ trace?: never;
1181
+ };
1182
+ "/api/v1/organizations/{id}/sso-connections/{connectionId}": {
1183
+ parameters: {
1184
+ query?: never;
1185
+ header?: never;
1186
+ path?: never;
1187
+ cookie?: never;
1188
+ };
1189
+ get?: never;
1190
+ put?: never;
1191
+ post?: never;
1192
+ /**
1193
+ * Unbind an SSO connection from an organization
1194
+ * @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`.
1195
+ */
1196
+ delete: operations["ApiOrganizationsController_unbindSsoConnection"];
1197
+ options?: never;
1198
+ head?: never;
1199
+ patch?: never;
1200
+ trace?: never;
1201
+ };
1202
+ "/api/v1/organizations/{id}/members": {
1203
+ parameters: {
1204
+ query?: never;
1205
+ header?: never;
1206
+ path?: never;
1207
+ cookie?: never;
1208
+ };
1209
+ /**
1210
+ * List an organization's members
1211
+ * @description Lists the organization's members: each row is the member's identity, their single role in this organization, effective dates, when they joined, and `node_assignments`, the grants the member also holds at nodes beneath the organization (empty in a flat Environment). Paginated; `q` searches name and email. Requires the `rbac.view_assignments` permission at the organization.
1212
+ */
1213
+ get: operations["ApiOrganizationsController_listMembers"];
1214
+ put?: never;
1215
+ /**
1216
+ * Add a member to an organization
1217
+ * @description Adds a member: assigns `role_id` to `identity_id` at the organization. The identity must already hold an active membership in this Environment (invite by email instead for someone who does not). A member holds exactly one role per organization, so an identity that is already a member returns `409` — use the change-role operation. Requires the `rbac.manage_assignments` permission at the organization and emits `organization.member.added`.
1218
+ */
1219
+ post: operations["ApiOrganizationsController_addMember"];
1220
+ delete?: never;
1221
+ options?: never;
1222
+ head?: never;
1223
+ patch?: never;
1224
+ trace?: never;
1225
+ };
1226
+ "/api/v1/organizations/{id}/members/{identityId}": {
1227
+ parameters: {
1228
+ query?: never;
1229
+ header?: never;
1230
+ path?: never;
1231
+ cookie?: never;
1232
+ };
1233
+ get?: never;
1234
+ put?: never;
1235
+ post?: never;
1236
+ /**
1237
+ * Remove a member from an organization
1238
+ * @description Removes the member from this organization, revoking their role here and nothing else — the identity and its memberships in other organizations are untouched. Returns `404` when the identity is not a member. Responds `204 No Content`, requires the `rbac.manage_assignments` permission at the organization, and emits `organization.member.removed`.
1239
+ */
1240
+ delete: operations["ApiOrganizationsController_removeMember"];
1241
+ options?: never;
1242
+ head?: never;
1243
+ /**
1244
+ * Change a member's role
1245
+ * @description Replaces the member's role in this organization with `role_id`. A member holds exactly one role per organization, so this updates the existing membership in place; changing to the role already held is a no-op. Returns `404` when the identity is not a member. Requires the `rbac.manage_assignments` permission at the organization and emits `organization.member.role_changed`.
1246
+ */
1247
+ patch: operations["ApiOrganizationsController_changeMemberRole"];
1248
+ trace?: never;
1249
+ };
1250
+ "/api/v1/organizations/{id}/invites": {
1251
+ parameters: {
1252
+ query?: never;
1253
+ header?: never;
1254
+ path?: never;
1255
+ cookie?: never;
1256
+ };
1257
+ /**
1258
+ * List an organization's invitations
1259
+ * @description Lists the organization's invitations (pending, accepted, revoked, and expired — filter with `status`), paginated. Requires the `identity.view` permission.
1260
+ */
1261
+ get: operations["ApiOrganizationsController_listInvites"];
1262
+ put?: never;
1263
+ /**
1264
+ * Invite a member into an organization
1265
+ * @description Invites an email into the organization with the role bound to the invitation; acceptance creates the Environment membership and the organization membership in one step. Works for emails with no identity in the Environment — one is created on acceptance. Requires the `identity.manage` permission and emits `invite.created`.
1266
+ */
1267
+ post: operations["ApiOrganizationsController_createInvite"];
1268
+ delete?: never;
1269
+ options?: never;
1270
+ head?: never;
1271
+ patch?: never;
1272
+ trace?: never;
1273
+ };
1274
+ "/api/v1/organizations/{id}/invites/{inviteId}": {
1275
+ parameters: {
1276
+ query?: never;
1277
+ header?: never;
1278
+ path?: never;
1279
+ cookie?: never;
1280
+ };
1281
+ get?: never;
1282
+ put?: never;
1283
+ post?: never;
1284
+ /**
1285
+ * Revoke an organization invitation
1286
+ * @description Revokes an invitation on this organization; the emailed link stops working immediately. Returns `404` when the invitation does not belong to this organization. Requires the `identity.manage` permission and emits `invite.revoked`.
1287
+ */
1288
+ delete: operations["ApiOrganizationsController_revokeInvite"];
1289
+ options?: never;
1290
+ head?: never;
1291
+ patch?: never;
1292
+ trace?: never;
1293
+ };
1058
1294
  "/api/v1/roles": {
1059
1295
  parameters: {
1060
1296
  query?: never;
@@ -1598,6 +1834,24 @@ interface components {
1598
1834
  /** @description One or more permissions to register */
1599
1835
  permissions: components["schemas"]["PermissionItemDto"][];
1600
1836
  };
1837
+ PermissionUsageRoleDto: {
1838
+ id: string;
1839
+ name: string;
1840
+ description?: string | null;
1841
+ is_system_role: boolean;
1842
+ /** @description Deactivated roles still carry the grant, so they are listed too — deleting the permission strips it from them as well. */
1843
+ is_active: boolean;
1844
+ /** @description Number of distinct identities assigned this role, across all nodes. */
1845
+ member_count: number;
1846
+ };
1847
+ PermissionUsageDto: {
1848
+ permission_id: string;
1849
+ /** @description Number of roles that grant this permission. */
1850
+ role_count: number;
1851
+ /** @description Distinct identities that hold this permission through any granting role. Lower than the sum of `member_count` when an identity holds more than one granting role. */
1852
+ identity_count: number;
1853
+ roles: components["schemas"]["PermissionUsageRoleDto"][];
1854
+ };
1601
1855
  UpdatePermissionDto: {
1602
1856
  /** @description Updated name */
1603
1857
  name?: string;
@@ -1606,18 +1860,6 @@ interface components {
1606
1860
  /** @description Updated category */
1607
1861
  category?: string;
1608
1862
  };
1609
- EvaluatePermissionDto: {
1610
- /** @description Identity ID (from the `identities` table — the end user being evaluated, not an admin). */
1611
- identity_id: string;
1612
- permission: string;
1613
- /**
1614
- * @description Required. `node` asks 'does this identity have the permission *at* `node_id`?' (lineage walk). `app_wide` asks the coarse-grained 'does this identity have the permission *anywhere* in the org?' question — useful for UI gating, **never** for resource-scoped enforcement. `node` requires `node_id`; `app_wide` forbids it.
1615
- * @enum {string}
1616
- */
1617
- scope: "node" | "app_wide";
1618
- /** @description Required when `scope` is `node`; must be omitted when `scope` is `app_wide`. */
1619
- node_id?: string;
1620
- };
1621
1863
  EvaluateResponseDto: {
1622
1864
  allowed: boolean;
1623
1865
  permission: string;
@@ -1631,6 +1873,18 @@ interface components {
1631
1873
  granting_roles: string[];
1632
1874
  denial_reason?: string | null;
1633
1875
  };
1876
+ EvaluatePermissionDto: {
1877
+ /** @description Identity ID (from the `identities` table — the end user being evaluated, not an admin). */
1878
+ identity_id: string;
1879
+ permission: string;
1880
+ /**
1881
+ * @description Required. `node` asks 'does this identity have the permission *at* `node_id`?' (lineage walk). `app_wide` asks the coarse-grained 'does this identity have the permission *anywhere* in the org?' question — useful for UI gating, **never** for resource-scoped enforcement. `node` requires `node_id`; `app_wide` forbids it.
1882
+ * @enum {string}
1883
+ */
1884
+ scope: "node" | "app_wide";
1885
+ /** @description Required when `scope` is `node`; must be omitted when `scope` is `app_wide`. */
1886
+ node_id?: string;
1887
+ };
1634
1888
  EvaluateCheckDto: {
1635
1889
  /** @description Identity ID (from the `identities` table — the end user being evaluated, not an admin). */
1636
1890
  identity_id: string;
@@ -1646,13 +1900,6 @@ interface components {
1646
1900
  BulkEvaluatePermissionDto: {
1647
1901
  checks: components["schemas"]["EvaluateCheckDto"][];
1648
1902
  };
1649
- ExplainPermissionDto: {
1650
- /** @description Identity ID (from the `identities` table — the end user being explained, not an admin). */
1651
- identity_id: string;
1652
- permission: string;
1653
- /** @description The hierarchy node to explain the decision at. The lineage from the root to this node is walked and returned in the trace. */
1654
- node_id: string;
1655
- };
1656
1903
  PermissionTraceAssignmentDto: {
1657
1904
  assignment_id: string;
1658
1905
  role_id: string;
@@ -1688,6 +1935,13 @@ interface components {
1688
1935
  /** @description Root-first lineage of the target node, each with the identity's assignments observed at that node. */
1689
1936
  lineage: components["schemas"]["PermissionTraceNodeDto"][];
1690
1937
  };
1938
+ ExplainPermissionDto: {
1939
+ /** @description Identity ID (from the `identities` table — the end user being explained, not an admin). */
1940
+ identity_id: string;
1941
+ permission: string;
1942
+ /** @description The hierarchy node to explain the decision at. The lineage from the root to this node is walked and returned in the trace. */
1943
+ node_id: string;
1944
+ };
1691
1945
  PageMetaDto: {
1692
1946
  /** @description Current page number (1-based) */
1693
1947
  page: number;
@@ -1720,6 +1974,10 @@ interface components {
1720
1974
  name: string;
1721
1975
  node_id: string;
1722
1976
  node_name: string;
1977
+ /** @description When this assignment starts; null means it is already active */
1978
+ effective_from: string | null;
1979
+ /** @description When this assignment expires; null means it never does */
1980
+ effective_to: string | null;
1723
1981
  };
1724
1982
  IdentityRowDto: {
1725
1983
  id: string;
@@ -1891,29 +2149,6 @@ interface components {
1891
2149
  expired_count: number;
1892
2150
  revoked_count: number;
1893
2151
  };
1894
- CreateIdentityInviteDto: {
1895
- /** @description OAuth client ID — determines which app the invite links to. If omitted, uses Canopy hosted fallback. */
1896
- client_id?: string;
1897
- /**
1898
- * @description Optional. `activate` (default) creates a net-new identity OR — if an identity with this email already exists in the Account but has no active membership in this App — auto-derives an `add_to_app` invite that adds them to this App without touching their existing password. `password_reset` is the explicit admin-driven credential-rotation flow for an existing identity; it cannot carry a role/node assignment. The legacy `onboard` value is accepted and treated as `activate`.
1899
- * @enum {string}
1900
- */
1901
- intent?: "activate" | "password_reset" | "onboard";
1902
- email: string;
1903
- /** @description Required for `activate`. Ignored for `add_to_app` (the existing identity's name wins) and for `password_reset`. */
1904
- first_name?: string;
1905
- /** @description Required for `activate`. Ignored for `add_to_app` and `password_reset`. */
1906
- last_name?: string;
1907
- /** @description Role ID — required if node_id is provided */
1908
- role_id?: string;
1909
- /** @description Node ID — required if role_id is provided */
1910
- node_id?: string;
1911
- /**
1912
- * @description Whether Canopy should send the invite email. Set false to suppress delivery and handle it yourself — the API response includes accept_url with the tokenized link. Defaults to true.
1913
- * @default true
1914
- */
1915
- send_email: boolean;
1916
- };
1917
2152
  ApiIdentityInviteResponseDto: {
1918
2153
  id: string;
1919
2154
  email: string;
@@ -1942,27 +2177,36 @@ interface components {
1942
2177
  /** @description Tokenized URL the invitee would land on. Returned so callers that pass send_email=false can deliver it themselves. */
1943
2178
  accept_url: string;
1944
2179
  };
1945
- BulkCreateIdentityInvitesDto: {
1946
- invites: components["schemas"]["CreateIdentityInviteDto"][];
1947
- };
1948
- ApiIdentityInviteResendResponseDto: {
1949
- message: string;
1950
- /** @description Tokenized URL for the regenerated invite. Resend rotates the token, which invalidates any accept_url returned from the original create call. Self-delivery callers must replace the stored URL with this one. */
1951
- accept_url: string;
1952
- };
1953
- CreateNodeDto: {
1954
- /** @description Parent node ID (null for root) */
1955
- parent_node_id?: string;
1956
- /** @description Node type (org-defined, e.g. 'department', 'team') */
1957
- node_type: string;
1958
- /** @description Display name for the node */
1959
- name: string;
1960
- /** @description Optional free-text description shown under the node name */
1961
- description?: string;
1962
- /** @description URL-friendly slug (auto-generated if omitted) */
1963
- slug?: string;
1964
- /** @description Arbitrary metadata */
1965
- metadata?: Record<string, unknown>;
2180
+ CreateIdentityInviteDto: {
2181
+ /** @description OAuth client ID — determines which app the invite links to. If omitted, uses Canopy hosted fallback. */
2182
+ client_id?: string;
2183
+ /**
2184
+ * @description Optional. `activate` (default) creates a net-new identity OR — if an identity with this email already exists in the Account but has no active membership in this App — auto-derives an `add_to_app` invite that adds them to this App without touching their existing password. `password_reset` is the explicit admin-driven credential-rotation flow for an existing identity; it cannot carry a role/node assignment. The legacy `onboard` value is accepted and treated as `activate`.
2185
+ * @enum {string}
2186
+ */
2187
+ intent?: "activate" | "password_reset" | "onboard";
2188
+ email: string;
2189
+ /** @description Required for `activate`. Ignored for `add_to_app` (the existing identity's name wins) and for `password_reset`. */
2190
+ first_name?: string;
2191
+ /** @description Required for `activate`. Ignored for `add_to_app` and `password_reset`. */
2192
+ last_name?: string;
2193
+ /** @description Role ID required if node_id is provided */
2194
+ role_id?: string;
2195
+ /** @description Node ID required if role_id is provided */
2196
+ node_id?: string;
2197
+ /**
2198
+ * @description Whether Canopy should send the invite email. Set false to suppress delivery and handle it yourself — the API response includes accept_url with the tokenized link. Defaults to true.
2199
+ * @default true
2200
+ */
2201
+ send_email: boolean;
2202
+ };
2203
+ BulkCreateIdentityInvitesDto: {
2204
+ invites: components["schemas"]["CreateIdentityInviteDto"][];
2205
+ };
2206
+ ApiIdentityInviteResendResponseDto: {
2207
+ message: string;
2208
+ /** @description Tokenized URL for the regenerated invite. Resend rotates the token, which invalidates any accept_url returned from the original create call. Self-delivery callers must replace the stored URL with this one. */
2209
+ accept_url: string;
1966
2210
  };
1967
2211
  NodeResponseDto: {
1968
2212
  id: string;
@@ -1982,6 +2226,20 @@ interface components {
1982
2226
  /** @description Optimistic-lock version. Send back as the `If-Match` header when updating, moving, or deleting to detect concurrent edits. */
1983
2227
  version: number;
1984
2228
  };
2229
+ CreateNodeDto: {
2230
+ /** @description Parent node ID (null for root) */
2231
+ parent_node_id?: string;
2232
+ /** @description Node type (org-defined, e.g. 'department', 'team') */
2233
+ node_type: string;
2234
+ /** @description Display name for the node */
2235
+ name: string;
2236
+ /** @description Optional free-text description shown under the node name */
2237
+ description?: string;
2238
+ /** @description URL-friendly slug (auto-generated if omitted) */
2239
+ slug?: string;
2240
+ /** @description Arbitrary metadata */
2241
+ metadata?: Record<string, unknown>;
2242
+ };
1985
2243
  HierarchyTreeNodeDto: {
1986
2244
  id: string;
1987
2245
  name: string;
@@ -2107,6 +2365,163 @@ interface components {
2107
2365
  distinct_role_count: number;
2108
2366
  recent_identities: components["schemas"]["RecentIdentityDto"][];
2109
2367
  };
2368
+ OrganizationResponseDto: {
2369
+ id: string;
2370
+ name: string;
2371
+ description?: string | null;
2372
+ /** @description Display label derived from the name at create; frozen afterwards. Organizations are addressed by `id`. */
2373
+ slug: string;
2374
+ metadata: Record<string, unknown>;
2375
+ /** @description Members (one role each) in this organization. */
2376
+ member_count: number;
2377
+ /** @description Unexpired, unaccepted, unrevoked invitations. */
2378
+ pending_invite_count: number;
2379
+ /** Format: date-time */
2380
+ created_at: string;
2381
+ /** Format: date-time */
2382
+ updated_at: string;
2383
+ /** @description Optimistic-lock version. Send back as the `If-Match` header when updating or deleting to detect concurrent edits. */
2384
+ version: number;
2385
+ };
2386
+ CreateOrganizationDto: {
2387
+ /** @description Organization name. The slug is auto-derived from it at create and never changes afterwards. */
2388
+ name: string;
2389
+ /** @description Organization description */
2390
+ description?: string;
2391
+ /** @description Free-form metadata stored on the organization, returned as sent. */
2392
+ metadata?: Record<string, unknown>;
2393
+ };
2394
+ UpdateOrganizationDto: {
2395
+ /** @description New organization name. The slug does not change. */
2396
+ name?: string;
2397
+ /** @description Organization description */
2398
+ description?: string;
2399
+ /** @description Free-form metadata stored on the organization, returned as sent. */
2400
+ metadata?: Record<string, unknown>;
2401
+ };
2402
+ EffectiveOrganizationPolicyDto: {
2403
+ mfa_required: boolean;
2404
+ mfa_factor_allowlist: ("totp" | "webauthn" | "email_otp")[];
2405
+ /** @enum {string} */
2406
+ mfa_after_sso: "exempt" | "require";
2407
+ require_sso: boolean;
2408
+ };
2409
+ OrganizationPolicyResponseDto: {
2410
+ /** @description The organization this policy belongs to. */
2411
+ organization_id: string;
2412
+ mfa_required?: boolean | null;
2413
+ mfa_factor_allowlist?: ("totp" | "webauthn" | "email_otp")[] | null;
2414
+ /** @enum {string|null} */
2415
+ mfa_after_sso?: "exempt" | "require" | null;
2416
+ require_sso: boolean;
2417
+ /** @description The Environment's own settings, the floor this organization's policy tightens from. */
2418
+ environment: components["schemas"]["EffectiveOrganizationPolicyDto"];
2419
+ /** @description The policy the organization's members sign in under. */
2420
+ effective: components["schemas"]["EffectiveOrganizationPolicyDto"];
2421
+ /** @description Optimistic-concurrency version. 0 until the organization sets a policy of its own. */
2422
+ version: number;
2423
+ };
2424
+ UpdateOrganizationPolicyDto: {
2425
+ /** @description Require MFA for this organization's members. `true` tightens an Environment that leaves MFA optional; `false` is only accepted where the Environment does not require MFA; `null` inherits. */
2426
+ mfa_required?: boolean | null;
2427
+ /** @description Factors this organization's members may enroll and use. Must be a non-empty subset of the Environment's allowlist; `null` inherits. */
2428
+ mfa_factor_allowlist?: ("totp" | "webauthn" | "email_otp")[] | null;
2429
+ /**
2430
+ * @description Whether an SSO login still owes an MFA challenge. `require` tightens an Environment that exempts SSO; `exempt` is only accepted where the Environment exempts; `null` inherits.
2431
+ * @enum {string|null}
2432
+ */
2433
+ mfa_after_sso?: "exempt" | "require" | null;
2434
+ /** @description Members must sign in through SSO. Password and email-code logins are refused for the organization's members and for any email whose domain routes to a connection bound to this organization. */
2435
+ require_sso?: boolean;
2436
+ };
2437
+ OrganizationSsoConnectionSummaryDto: {
2438
+ id: string;
2439
+ name: string;
2440
+ /** @enum {string} */
2441
+ type: "saml" | "oidc";
2442
+ status: string;
2443
+ };
2444
+ OrganizationSsoRoleSummaryDto: {
2445
+ id: string;
2446
+ name: string;
2447
+ };
2448
+ OrganizationSsoConnectionResponseDto: {
2449
+ organization_node_id: string;
2450
+ sso_connection_id: string;
2451
+ sso_connection: components["schemas"]["OrganizationSsoConnectionSummaryDto"];
2452
+ /** @description The membership role a login through this connection receives when it joins the organization. */
2453
+ default_role_id: string;
2454
+ default_role: components["schemas"]["OrganizationSsoRoleSummaryDto"];
2455
+ /** Format: date-time */
2456
+ created_at: string;
2457
+ };
2458
+ BindOrganizationSsoConnectionDto: {
2459
+ /** @description An end-user SSO connection already bound to the organization's Environment. */
2460
+ sso_connection_id: string;
2461
+ /** @description The membership role a login through this connection receives when it joins the organization. Must belong to the organization's Environment. */
2462
+ default_role_id: string;
2463
+ };
2464
+ OrganizationMemberIdentityDto: {
2465
+ id: string;
2466
+ email: string;
2467
+ first_name?: string | null;
2468
+ last_name?: string | null;
2469
+ };
2470
+ OrganizationMemberRoleDto: {
2471
+ id: string;
2472
+ name: string;
2473
+ };
2474
+ OrganizationMemberNodeDto: {
2475
+ id: string;
2476
+ name: string;
2477
+ node_type: string;
2478
+ };
2479
+ OrganizationMemberNodeAssignmentDto: {
2480
+ /** @description The assignment id. */
2481
+ id: string;
2482
+ application_node: components["schemas"]["OrganizationMemberNodeDto"];
2483
+ role: components["schemas"]["OrganizationMemberRoleDto"];
2484
+ };
2485
+ OrganizationMemberResponseDto: {
2486
+ /** @description The membership (role assignment) id. */
2487
+ id: string;
2488
+ identity: components["schemas"]["OrganizationMemberIdentityDto"];
2489
+ role: components["schemas"]["OrganizationMemberRoleDto"];
2490
+ /** Format: date-time */
2491
+ effective_from?: string | null;
2492
+ /** Format: date-time */
2493
+ effective_to?: string | null;
2494
+ /**
2495
+ * Format: date-time
2496
+ * @description When the membership was created.
2497
+ */
2498
+ created_at: string;
2499
+ /** @description Assignments the member also holds at nodes beneath the organization. Empty in a flat Environment. */
2500
+ node_assignments: components["schemas"]["OrganizationMemberNodeAssignmentDto"][];
2501
+ };
2502
+ AddOrganizationMemberDto: {
2503
+ /** @description Identity to add. Must already hold an active membership in this Environment; invite by email instead for someone who does not. */
2504
+ identity_id: string;
2505
+ /** @description The single role the member holds in this organization, from the Environment's roles. */
2506
+ role_id: string;
2507
+ };
2508
+ ChangeOrganizationMemberRoleDto: {
2509
+ /** @description The replacement role. A member holds exactly one role per organization, so this updates the existing membership in place. */
2510
+ role_id: string;
2511
+ };
2512
+ CreateOrganizationInviteDto: {
2513
+ /** @description Email to invite. Works for people with no identity in this Environment — one is created when they accept. */
2514
+ email: string;
2515
+ /** @description The role the member will hold in this organization on acceptance. */
2516
+ role_id: string;
2517
+ first_name?: string;
2518
+ last_name?: string;
2519
+ /**
2520
+ * @description Set false to skip the email and deliver the returned accept URL yourself.
2521
+ * @default true
2522
+ */
2523
+ send_email: boolean;
2524
+ };
2110
2525
  RoleResponseDto: {
2111
2526
  id: string;
2112
2527
  application_id: string;
@@ -2210,7 +2625,7 @@ interface components {
2210
2625
  * @description Broad classification from the action catalog (e.g. `auth`, `rbac`). NULL on legacy rows whose action key was unknown at backfill time — those carry the `unknown` value in storage.
2211
2626
  * @enum {string|null}
2212
2627
  */
2213
- category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown" | null;
2628
+ category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "organization" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown" | null;
2214
2629
  /**
2215
2630
  * @description `info` for normal-flow events, `notice` for important state changes, `warning` for failures, `critical` for security events.
2216
2631
  * @enum {string}
@@ -2221,6 +2636,44 @@ interface components {
2221
2636
  /** @description Whether this row should appear on a future end-user `My security activity` surface. Not consumed by current reads. */
2222
2637
  identity_visible: boolean;
2223
2638
  };
2639
+ ExportJobDto: {
2640
+ /** Format: uuid */
2641
+ id: string;
2642
+ /**
2643
+ * @description `pending` (enqueued), `processing` (worker rendering), `completed` (file ready), or `failed` (see `error`).
2644
+ * @enum {string}
2645
+ */
2646
+ status: "pending" | "processing" | "completed" | "failed";
2647
+ /**
2648
+ * @description The audit surface the export was taken from.
2649
+ * @enum {string}
2650
+ */
2651
+ surface: "admin" | "identities";
2652
+ /**
2653
+ * @description Wire format of the rendered file.
2654
+ * @enum {string}
2655
+ */
2656
+ format: "csv" | "ndjson";
2657
+ /** Format: uuid */
2658
+ application_id?: string | null;
2659
+ /** Format: uuid */
2660
+ environment_id?: string | null;
2661
+ /** @description Rows written, set once the job completes. */
2662
+ row_count?: number | null;
2663
+ /** @description Failure detail, present only when `status` is `failed`. */
2664
+ error?: string | null;
2665
+ /** Format: date-time */
2666
+ created_at: string;
2667
+ /** Format: date-time */
2668
+ completed_at?: string | null;
2669
+ /**
2670
+ * Format: date-time
2671
+ * @description When the stored file + this record become eligible for sweep.
2672
+ */
2673
+ expires_at?: string | null;
2674
+ /** @description Short-lived signed download URL. Present only on the single-job read of a completed job; `null` otherwise. */
2675
+ download_url?: string | null;
2676
+ };
2224
2677
  AuditExportQueryDto: {
2225
2678
  /**
2226
2679
  * Format: date-time
@@ -2235,7 +2688,7 @@ interface components {
2235
2688
  /** @description Filter by one or more action keys. Repeat the query param (`?action=a&action=b`) or pass a comma-separated string. */
2236
2689
  action?: string[];
2237
2690
  /** @enum {string} */
2238
- category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown";
2691
+ category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "organization" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown";
2239
2692
  /** @enum {string} */
2240
2693
  severity?: "info" | "notice" | "warning" | "critical";
2241
2694
  /** @enum {string} */
@@ -2269,44 +2722,6 @@ interface components {
2269
2722
  */
2270
2723
  format: "csv" | "ndjson";
2271
2724
  };
2272
- ExportJobDto: {
2273
- /** Format: uuid */
2274
- id: string;
2275
- /**
2276
- * @description `pending` (enqueued), `processing` (worker rendering), `completed` (file ready), or `failed` (see `error`).
2277
- * @enum {string}
2278
- */
2279
- status: "pending" | "processing" | "completed" | "failed";
2280
- /**
2281
- * @description The audit surface the export was taken from.
2282
- * @enum {string}
2283
- */
2284
- surface: "admin" | "identities";
2285
- /**
2286
- * @description Wire format of the rendered file.
2287
- * @enum {string}
2288
- */
2289
- format: "csv" | "ndjson";
2290
- /** Format: uuid */
2291
- application_id?: string | null;
2292
- /** Format: uuid */
2293
- environment_id?: string | null;
2294
- /** @description Rows written, set once the job completes. */
2295
- row_count?: number | null;
2296
- /** @description Failure detail, present only when `status` is `failed`. */
2297
- error?: string | null;
2298
- /** Format: date-time */
2299
- created_at: string;
2300
- /** Format: date-time */
2301
- completed_at?: string | null;
2302
- /**
2303
- * Format: date-time
2304
- * @description When the stored file + this record become eligible for sweep.
2305
- */
2306
- expires_at?: string | null;
2307
- /** @description Short-lived signed download URL. Present only on the single-job read of a completed job; `null` otherwise. */
2308
- download_url?: string | null;
2309
- };
2310
2725
  AuditLogDetailResponseDto: {
2311
2726
  id: string;
2312
2727
  account_id?: string | null;
@@ -2338,7 +2753,7 @@ interface components {
2338
2753
  * @description Broad classification from the action catalog (e.g. `auth`, `rbac`). NULL on legacy rows whose action key was unknown at backfill time — those carry the `unknown` value in storage.
2339
2754
  * @enum {string|null}
2340
2755
  */
2341
- category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown" | null;
2756
+ category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "organization" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown" | null;
2342
2757
  /**
2343
2758
  * @description `info` for normal-flow events, `notice` for important state changes, `warning` for failures, `critical` for security events.
2344
2759
  * @enum {string}
@@ -2399,11 +2814,6 @@ interface components {
2399
2814
  /** @description Node type used when the root node is auto-created. Must be one of `node_types`. */
2400
2815
  root_node_type: string;
2401
2816
  };
2402
- CreateWebhookDto: {
2403
- url: string;
2404
- event_types: string[];
2405
- description?: string;
2406
- };
2407
2817
  WebhookCreatedResponseDto: {
2408
2818
  id: string;
2409
2819
  /** @enum {string} */
@@ -2417,6 +2827,11 @@ interface components {
2417
2827
  /** @description HMAC secret — only shown once on creation */
2418
2828
  secret: string;
2419
2829
  };
2830
+ CreateWebhookDto: {
2831
+ url: string;
2832
+ event_types: string[];
2833
+ description?: string;
2834
+ };
2420
2835
  WebhookResponseDto: {
2421
2836
  id: string;
2422
2837
  /** @enum {string} */
@@ -2452,21 +2867,6 @@ interface components {
2452
2867
  description?: string | null;
2453
2868
  is_active?: boolean;
2454
2869
  };
2455
- CreateApiKeyDto: {
2456
- /** @description API key name */
2457
- name: string;
2458
- /** @description API key description */
2459
- description?: string;
2460
- /**
2461
- * @description Required. `scoped` enforces the `scopes` array on every authorization check (deny if the requested permission isn't listed). `full_access` bypasses RBAC entirely within the key's Application — every permission is granted. Pick `scoped` whenever possible; `full_access` should be a deliberate choice (use cases: bootstrap automation, trusted backend services that legitimately need App-wide access). `scoped` requires a non-empty `scopes` array; `full_access` forbids `scopes`.
2462
- * @enum {string}
2463
- */
2464
- access_mode: "scoped" | "full_access";
2465
- /** @description Permission scopes this key is authorized for. Required and must be non-empty when `access_mode` is `scoped`. Must be omitted when `access_mode` is `full_access`. */
2466
- scopes?: string[];
2467
- /** @description Expiration date (ISO 8601). Omit for no expiration. */
2468
- expires_at?: string;
2469
- };
2470
2870
  ApiKeyCreatedResponseDto: {
2471
2871
  id: string;
2472
2872
  name: string;
@@ -2485,6 +2885,21 @@ interface components {
2485
2885
  /** Format: date-time */
2486
2886
  created_at: string;
2487
2887
  };
2888
+ CreateApiKeyDto: {
2889
+ /** @description API key name */
2890
+ name: string;
2891
+ /** @description API key description */
2892
+ description?: string;
2893
+ /**
2894
+ * @description Required. `scoped` enforces the `scopes` array on every authorization check (deny if the requested permission isn't listed). `full_access` bypasses RBAC entirely within the key's Application — every permission is granted. Pick `scoped` whenever possible; `full_access` should be a deliberate choice (use cases: bootstrap automation, trusted backend services that legitimately need App-wide access). `scoped` requires a non-empty `scopes` array; `full_access` forbids `scopes`.
2895
+ * @enum {string}
2896
+ */
2897
+ access_mode: "scoped" | "full_access";
2898
+ /** @description Permission scopes this key is authorized for. Required and must be non-empty when `access_mode` is `scoped`. Must be omitted when `access_mode` is `full_access`. */
2899
+ scopes?: string[];
2900
+ /** @description Expiration date (ISO 8601). Omit for no expiration. */
2901
+ expires_at?: string;
2902
+ };
2488
2903
  ApiKeyResponseDto: {
2489
2904
  id: string;
2490
2905
  client_id: string;
@@ -2563,7 +2978,8 @@ interface operations {
2563
2978
  ApiPermissionsController_listPermissions: {
2564
2979
  parameters: {
2565
2980
  query?: {
2566
- source?: string;
2981
+ /** @description Filter by permission origin. */
2982
+ source?: "system" | "custom";
2567
2983
  };
2568
2984
  header?: never;
2569
2985
  path?: never;
@@ -2645,7 +3061,9 @@ interface operations {
2645
3061
  [name: string]: unknown;
2646
3062
  };
2647
3063
  content: {
2648
- "application/json": components["schemas"]["PermissionResponseDto"];
3064
+ "application/json": {
3065
+ data: components["schemas"]["PermissionResponseDto"];
3066
+ };
2649
3067
  };
2650
3068
  };
2651
3069
  /** @description Invalid or expired token */
@@ -2709,7 +3127,9 @@ interface operations {
2709
3127
  [name: string]: unknown;
2710
3128
  };
2711
3129
  content: {
2712
- "application/json": components["schemas"]["PermissionResponseDto"];
3130
+ "application/json": {
3131
+ data: components["schemas"]["PermissionResponseDto"];
3132
+ };
2713
3133
  };
2714
3134
  };
2715
3135
  /** @description Invalid or expired token */
@@ -2868,7 +3288,9 @@ interface operations {
2868
3288
  [name: string]: unknown;
2869
3289
  };
2870
3290
  content: {
2871
- "application/json": components["schemas"]["PermissionResponseDto"];
3291
+ "application/json": {
3292
+ data: components["schemas"]["PermissionResponseDto"];
3293
+ };
2872
3294
  };
2873
3295
  };
2874
3296
  /** @description Invalid or expired token */
@@ -2936,26 +3358,115 @@ interface operations {
2936
3358
  };
2937
3359
  };
2938
3360
  };
2939
- ApiPermissionsController_evaluate: {
3361
+ ApiPermissionsController_getPermissionUsage: {
2940
3362
  parameters: {
2941
3363
  query?: never;
2942
3364
  header?: never;
2943
- path?: never;
2944
- cookie?: never;
2945
- };
2946
- requestBody: {
2947
- content: {
2948
- "application/json": components["schemas"]["EvaluatePermissionDto"];
3365
+ path: {
3366
+ id: string;
2949
3367
  };
3368
+ cookie?: never;
2950
3369
  };
3370
+ requestBody?: never;
2951
3371
  responses: {
2952
- /** @description Authorization decision returned */
3372
+ /** @description Granting roles and identity reach returned */
2953
3373
  200: {
2954
3374
  headers: {
2955
3375
  [name: string]: unknown;
2956
3376
  };
2957
3377
  content: {
2958
- "application/json": components["schemas"]["EvaluateResponseDto"];
3378
+ "application/json": {
3379
+ data: components["schemas"]["PermissionUsageDto"];
3380
+ };
3381
+ };
3382
+ };
3383
+ /** @description Invalid or expired token */
3384
+ 401: {
3385
+ headers: {
3386
+ [name: string]: unknown;
3387
+ };
3388
+ content: {
3389
+ /**
3390
+ * @example {
3391
+ * "error": {
3392
+ * "statusCode": 401,
3393
+ * "code": null,
3394
+ * "message": "Invalid or expired token",
3395
+ * "timestamp": "2026-04-20T12:00:00.000Z",
3396
+ * "path": "/api/v1/permissions",
3397
+ * "method": "GET"
3398
+ * }
3399
+ * }
3400
+ */
3401
+ "application/json": components["schemas"]["ErrorResponseDto"];
3402
+ };
3403
+ };
3404
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
3405
+ 403: {
3406
+ headers: {
3407
+ [name: string]: unknown;
3408
+ };
3409
+ content: {
3410
+ /**
3411
+ * @example {
3412
+ * "error": {
3413
+ * "statusCode": 403,
3414
+ * "code": null,
3415
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
3416
+ * "timestamp": "2026-04-20T12:00:00.000Z",
3417
+ * "path": "/api/v1/permissions",
3418
+ * "method": "GET"
3419
+ * }
3420
+ * }
3421
+ */
3422
+ "application/json": components["schemas"]["ErrorResponseDto"];
3423
+ };
3424
+ };
3425
+ /** @description No permission with that id exists in this Environment */
3426
+ 404: {
3427
+ headers: {
3428
+ [name: string]: unknown;
3429
+ };
3430
+ content: {
3431
+ /**
3432
+ * @example {
3433
+ * "error": {
3434
+ * "statusCode": 404,
3435
+ * "code": null,
3436
+ * "message": "No permission with that id exists in this Environment",
3437
+ * "timestamp": "2026-04-20T12:00:00.000Z",
3438
+ * "path": "/api/v1/permissions/{id}/usage",
3439
+ * "method": "GET"
3440
+ * }
3441
+ * }
3442
+ */
3443
+ "application/json": components["schemas"]["ErrorResponseDto"];
3444
+ };
3445
+ };
3446
+ };
3447
+ };
3448
+ ApiPermissionsController_evaluate: {
3449
+ parameters: {
3450
+ query?: never;
3451
+ header?: never;
3452
+ path?: never;
3453
+ cookie?: never;
3454
+ };
3455
+ requestBody: {
3456
+ content: {
3457
+ "application/json": components["schemas"]["EvaluatePermissionDto"];
3458
+ };
3459
+ };
3460
+ responses: {
3461
+ /** @description Authorization decision returned */
3462
+ 200: {
3463
+ headers: {
3464
+ [name: string]: unknown;
3465
+ };
3466
+ content: {
3467
+ "application/json": {
3468
+ data: components["schemas"]["EvaluateResponseDto"];
3469
+ };
2959
3470
  };
2960
3471
  };
2961
3472
  /** @description Invalid or expired token */
@@ -3089,7 +3600,9 @@ interface operations {
3089
3600
  [name: string]: unknown;
3090
3601
  };
3091
3602
  content: {
3092
- "application/json": components["schemas"]["PermissionTraceDto"];
3603
+ "application/json": {
3604
+ data: components["schemas"]["PermissionTraceDto"];
3605
+ };
3093
3606
  };
3094
3607
  };
3095
3608
  /** @description Invalid or expired token */
@@ -3252,7 +3765,9 @@ interface operations {
3252
3765
  [name: string]: unknown;
3253
3766
  };
3254
3767
  content: {
3255
- "application/json": components["schemas"]["IdentityResponseDto"];
3768
+ "application/json": {
3769
+ data: components["schemas"]["IdentityResponseDto"];
3770
+ };
3256
3771
  };
3257
3772
  };
3258
3773
  /** @description Password rejected — appeared in a known data breach (HaveIBeenPwned check) */
@@ -3436,7 +3951,9 @@ interface operations {
3436
3951
  [name: string]: unknown;
3437
3952
  };
3438
3953
  content: {
3439
- "application/json": components["schemas"]["IdentitiesSummaryDto"];
3954
+ "application/json": {
3955
+ data: components["schemas"]["IdentitiesSummaryDto"];
3956
+ };
3440
3957
  };
3441
3958
  };
3442
3959
  /** @description Invalid or expired token */
@@ -3624,7 +4141,9 @@ interface operations {
3624
4141
  [name: string]: unknown;
3625
4142
  };
3626
4143
  content: {
3627
- "application/json": components["schemas"]["IdentityResponseDto"];
4144
+ "application/json": {
4145
+ data: components["schemas"]["IdentityResponseDto"];
4146
+ };
3628
4147
  };
3629
4148
  };
3630
4149
  /** @description Invalid or expired token */
@@ -3796,7 +4315,9 @@ interface operations {
3796
4315
  [name: string]: unknown;
3797
4316
  };
3798
4317
  content: {
3799
- "application/json": components["schemas"]["IdentityResponseDto"];
4318
+ "application/json": {
4319
+ data: components["schemas"]["IdentityResponseDto"];
4320
+ };
3800
4321
  };
3801
4322
  };
3802
4323
  /** @description Invalid or expired token */
@@ -3881,7 +4402,9 @@ interface operations {
3881
4402
  [name: string]: unknown;
3882
4403
  };
3883
4404
  content: {
3884
- "application/json": components["schemas"]["IdentityDetailResponseDto"];
4405
+ "application/json": {
4406
+ data: components["schemas"]["IdentityDetailResponseDto"];
4407
+ };
3885
4408
  };
3886
4409
  };
3887
4410
  /** @description Invalid or expired token */
@@ -3966,7 +4489,9 @@ interface operations {
3966
4489
  [name: string]: unknown;
3967
4490
  };
3968
4491
  content: {
3969
- "application/json": components["schemas"]["MessageResponseDto"];
4492
+ "application/json": {
4493
+ data: components["schemas"]["MessageResponseDto"];
4494
+ };
3970
4495
  };
3971
4496
  };
3972
4497
  /** @description Invalid or expired token */
@@ -4051,7 +4576,9 @@ interface operations {
4051
4576
  [name: string]: unknown;
4052
4577
  };
4053
4578
  content: {
4054
- "application/json": components["schemas"]["MessageResponseDto"];
4579
+ "application/json": {
4580
+ data: components["schemas"]["MessageResponseDto"];
4581
+ };
4055
4582
  };
4056
4583
  };
4057
4584
  /** @description Invalid or expired token */
@@ -4410,7 +4937,9 @@ interface operations {
4410
4937
  [name: string]: unknown;
4411
4938
  };
4412
4939
  content: {
4413
- "application/json": components["schemas"]["AccountIdentityMfaResponseDto"];
4940
+ "application/json": {
4941
+ data: components["schemas"]["AccountIdentityMfaResponseDto"];
4942
+ };
4414
4943
  };
4415
4944
  };
4416
4945
  /** @description Invalid or expired token */
@@ -4578,7 +5107,9 @@ interface operations {
4578
5107
  [name: string]: unknown;
4579
5108
  };
4580
5109
  content: {
4581
- "application/json": components["schemas"]["IdentityAuthStateResponseDto"];
5110
+ "application/json": {
5111
+ data: components["schemas"]["IdentityAuthStateResponseDto"];
5112
+ };
4582
5113
  };
4583
5114
  };
4584
5115
  /** @description Invalid or expired token */
@@ -5080,7 +5611,9 @@ interface operations {
5080
5611
  [name: string]: unknown;
5081
5612
  };
5082
5613
  content: {
5083
- "application/json": components["schemas"]["ApiIdentityInviteResponseDto"];
5614
+ "application/json": {
5615
+ data: components["schemas"]["ApiIdentityInviteResponseDto"];
5616
+ };
5084
5617
  };
5085
5618
  };
5086
5619
  /** @description Invalid or expired token */
@@ -5142,7 +5675,9 @@ interface operations {
5142
5675
  [name: string]: unknown;
5143
5676
  };
5144
5677
  content: {
5145
- "application/json": components["schemas"]["IdentityInvitesSummaryDto"];
5678
+ "application/json": {
5679
+ data: components["schemas"]["IdentityInvitesSummaryDto"];
5680
+ };
5146
5681
  };
5147
5682
  };
5148
5683
  /** @description Invalid or expired token */
@@ -5330,7 +5865,9 @@ interface operations {
5330
5865
  [name: string]: unknown;
5331
5866
  };
5332
5867
  content: {
5333
- "application/json": components["schemas"]["ApiIdentityInviteResendResponseDto"];
5868
+ "application/json": {
5869
+ data: components["schemas"]["ApiIdentityInviteResendResponseDto"];
5870
+ };
5334
5871
  };
5335
5872
  };
5336
5873
  /** @description Invite is no longer pending */
@@ -5541,7 +6078,9 @@ interface operations {
5541
6078
  [name: string]: unknown;
5542
6079
  };
5543
6080
  content: {
5544
- "application/json": components["schemas"]["ScopedHierarchyTreeResponseDto"];
6081
+ "application/json": {
6082
+ data: components["schemas"]["ScopedHierarchyTreeResponseDto"];
6083
+ };
5545
6084
  };
5546
6085
  };
5547
6086
  /** @description The hierarchy is unchanged since the supplied `ETag`. No body; keep using the cached tree. */
@@ -5614,7 +6153,9 @@ interface operations {
5614
6153
  [name: string]: unknown;
5615
6154
  };
5616
6155
  content: {
5617
- "application/json": components["schemas"]["NodeResponseDto"];
6156
+ "application/json": {
6157
+ data: components["schemas"]["NodeResponseDto"];
6158
+ };
5618
6159
  };
5619
6160
  };
5620
6161
  /** @description Invalid parent-child relationship */
@@ -5794,7 +6335,9 @@ interface operations {
5794
6335
  [name: string]: unknown;
5795
6336
  };
5796
6337
  content: {
5797
- "application/json": components["schemas"]["NodeAccessResponseDto"];
6338
+ "application/json": {
6339
+ data: components["schemas"]["NodeAccessResponseDto"];
6340
+ };
5798
6341
  };
5799
6342
  };
5800
6343
  /** @description Invalid or expired token */
@@ -5995,7 +6538,9 @@ interface operations {
5995
6538
  [name: string]: unknown;
5996
6539
  };
5997
6540
  content: {
5998
- "application/json": components["schemas"]["NodeResponseDto"];
6541
+ "application/json": {
6542
+ data: components["schemas"]["NodeResponseDto"];
6543
+ };
5999
6544
  };
6000
6545
  };
6001
6546
  /** @description Invalid parent-child relationship */
@@ -6122,7 +6667,141 @@ interface operations {
6122
6667
  [name: string]: unknown;
6123
6668
  };
6124
6669
  content: {
6125
- "application/json": components["schemas"]["HierarchyTreeNodeDto"];
6670
+ "application/json": {
6671
+ data: components["schemas"]["HierarchyTreeNodeDto"];
6672
+ };
6673
+ };
6674
+ };
6675
+ /** @description Invalid or expired token */
6676
+ 401: {
6677
+ headers: {
6678
+ [name: string]: unknown;
6679
+ };
6680
+ content: {
6681
+ /**
6682
+ * @example {
6683
+ * "error": {
6684
+ * "statusCode": 401,
6685
+ * "code": null,
6686
+ * "message": "Invalid or expired token",
6687
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6688
+ * "path": "/api/v1/nodes",
6689
+ * "method": "GET"
6690
+ * }
6691
+ * }
6692
+ */
6693
+ "application/json": components["schemas"]["ErrorResponseDto"];
6694
+ };
6695
+ };
6696
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
6697
+ 403: {
6698
+ headers: {
6699
+ [name: string]: unknown;
6700
+ };
6701
+ content: {
6702
+ /**
6703
+ * @example {
6704
+ * "error": {
6705
+ * "statusCode": 403,
6706
+ * "code": null,
6707
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6708
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6709
+ * "path": "/api/v1/nodes",
6710
+ * "method": "GET"
6711
+ * }
6712
+ * }
6713
+ */
6714
+ "application/json": components["schemas"]["ErrorResponseDto"];
6715
+ };
6716
+ };
6717
+ };
6718
+ };
6719
+ ApiNodesController_getAncestors: {
6720
+ parameters: {
6721
+ query?: never;
6722
+ header?: never;
6723
+ path: {
6724
+ id: string;
6725
+ };
6726
+ cookie?: never;
6727
+ };
6728
+ requestBody?: never;
6729
+ responses: {
6730
+ /** @description Ancestors returned root-first */
6731
+ 200: {
6732
+ headers: {
6733
+ [name: string]: unknown;
6734
+ };
6735
+ content: {
6736
+ "application/json": {
6737
+ items: components["schemas"]["NodeResponseDto"][];
6738
+ };
6739
+ };
6740
+ };
6741
+ /** @description Invalid or expired token */
6742
+ 401: {
6743
+ headers: {
6744
+ [name: string]: unknown;
6745
+ };
6746
+ content: {
6747
+ /**
6748
+ * @example {
6749
+ * "error": {
6750
+ * "statusCode": 401,
6751
+ * "code": null,
6752
+ * "message": "Invalid or expired token",
6753
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6754
+ * "path": "/api/v1/nodes",
6755
+ * "method": "GET"
6756
+ * }
6757
+ * }
6758
+ */
6759
+ "application/json": components["schemas"]["ErrorResponseDto"];
6760
+ };
6761
+ };
6762
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
6763
+ 403: {
6764
+ headers: {
6765
+ [name: string]: unknown;
6766
+ };
6767
+ content: {
6768
+ /**
6769
+ * @example {
6770
+ * "error": {
6771
+ * "statusCode": 403,
6772
+ * "code": null,
6773
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6774
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6775
+ * "path": "/api/v1/nodes",
6776
+ * "method": "GET"
6777
+ * }
6778
+ * }
6779
+ */
6780
+ "application/json": components["schemas"]["ErrorResponseDto"];
6781
+ };
6782
+ };
6783
+ };
6784
+ };
6785
+ ApiNodesController_getChildren: {
6786
+ parameters: {
6787
+ query?: never;
6788
+ header?: never;
6789
+ path: {
6790
+ id: string;
6791
+ };
6792
+ cookie?: never;
6793
+ };
6794
+ requestBody?: never;
6795
+ responses: {
6796
+ /** @description Children returned */
6797
+ 200: {
6798
+ headers: {
6799
+ [name: string]: unknown;
6800
+ };
6801
+ content: {
6802
+ "application/json": {
6803
+ items: components["schemas"]["NodeResponseDto"][];
6804
+ };
6126
6805
  };
6127
6806
  };
6128
6807
  /** @description Invalid or expired token */
@@ -6155,12 +6834,1601 @@ interface operations {
6155
6834
  /**
6156
6835
  * @example {
6157
6836
  * "error": {
6158
- * "statusCode": 403,
6837
+ * "statusCode": 403,
6838
+ * "code": null,
6839
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6840
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6841
+ * "path": "/api/v1/nodes",
6842
+ * "method": "GET"
6843
+ * }
6844
+ * }
6845
+ */
6846
+ "application/json": components["schemas"]["ErrorResponseDto"];
6847
+ };
6848
+ };
6849
+ };
6850
+ };
6851
+ ApiNodesController_moveNode: {
6852
+ parameters: {
6853
+ query?: never;
6854
+ header: {
6855
+ "if-match": string;
6856
+ /** @description Optimistic-lock version of the resource. Send the `version` field returned on read; the server rejects with 409 if the row has changed since. */
6857
+ "If-Match"?: string;
6858
+ };
6859
+ path: {
6860
+ id: string;
6861
+ };
6862
+ cookie?: never;
6863
+ };
6864
+ requestBody: {
6865
+ content: {
6866
+ "application/json": components["schemas"]["MoveNodeDto"];
6867
+ };
6868
+ };
6869
+ responses: {
6870
+ /** @description Node moved successfully */
6871
+ 200: {
6872
+ headers: {
6873
+ [name: string]: unknown;
6874
+ };
6875
+ content: {
6876
+ "application/json": {
6877
+ data: components["schemas"]["NodeResponseDto"];
6878
+ };
6879
+ };
6880
+ };
6881
+ /** @description Invalid or expired token */
6882
+ 401: {
6883
+ headers: {
6884
+ [name: string]: unknown;
6885
+ };
6886
+ content: {
6887
+ /**
6888
+ * @example {
6889
+ * "error": {
6890
+ * "statusCode": 401,
6891
+ * "code": null,
6892
+ * "message": "Invalid or expired token",
6893
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6894
+ * "path": "/api/v1/nodes",
6895
+ * "method": "GET"
6896
+ * }
6897
+ * }
6898
+ */
6899
+ "application/json": components["schemas"]["ErrorResponseDto"];
6900
+ };
6901
+ };
6902
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
6903
+ 403: {
6904
+ headers: {
6905
+ [name: string]: unknown;
6906
+ };
6907
+ content: {
6908
+ /**
6909
+ * @example {
6910
+ * "error": {
6911
+ * "statusCode": 403,
6912
+ * "code": null,
6913
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6914
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6915
+ * "path": "/api/v1/nodes",
6916
+ * "method": "GET"
6917
+ * }
6918
+ * }
6919
+ */
6920
+ "application/json": components["schemas"]["ErrorResponseDto"];
6921
+ };
6922
+ };
6923
+ /** @description Node not found */
6924
+ 404: {
6925
+ headers: {
6926
+ [name: string]: unknown;
6927
+ };
6928
+ content: {
6929
+ /**
6930
+ * @example {
6931
+ * "error": {
6932
+ * "statusCode": 404,
6933
+ * "code": null,
6934
+ * "message": "Node not found",
6935
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6936
+ * "path": "/api/v1/nodes/{id}/move",
6937
+ * "method": "POST"
6938
+ * }
6939
+ * }
6940
+ */
6941
+ "application/json": components["schemas"]["ErrorResponseDto"];
6942
+ };
6943
+ };
6944
+ /** @description Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry. */
6945
+ 409: {
6946
+ headers: {
6947
+ [name: string]: unknown;
6948
+ };
6949
+ content: {
6950
+ /**
6951
+ * @example {
6952
+ * "error": {
6953
+ * "statusCode": 409,
6954
+ * "code": null,
6955
+ * "message": "Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry.",
6956
+ * "timestamp": "2026-04-20T12:00:00.000Z",
6957
+ * "path": "/api/v1/nodes/{id}/move",
6958
+ * "method": "POST"
6959
+ * }
6960
+ * }
6961
+ */
6962
+ "application/json": components["schemas"]["ErrorResponseDto"];
6963
+ };
6964
+ };
6965
+ };
6966
+ };
6967
+ ApiNodesController_listIdentityAssignments: {
6968
+ parameters: {
6969
+ query?: {
6970
+ /** @description Page number (1-based) */
6971
+ page?: number;
6972
+ /** @description Items per page (1-100, default 20) */
6973
+ take?: number;
6974
+ /** @description Search term */
6975
+ q?: string;
6976
+ /** @description Sort field */
6977
+ sort_by?: "name" | "role" | "access_type" | "created_at";
6978
+ /** @description Sort order */
6979
+ order?: "asc" | "desc";
6980
+ /** @description Filter by role ID */
6981
+ role_id?: string;
6982
+ /** @description Filter by access type */
6983
+ access_type?: "direct" | "inherited";
6984
+ /** @description Filter by assignment status */
6985
+ status?: "active" | "scheduled" | "expired";
6986
+ /** @description Filter by source node ID */
6987
+ source_node_id?: string;
6988
+ };
6989
+ header?: never;
6990
+ path: {
6991
+ id: string;
6992
+ };
6993
+ cookie?: never;
6994
+ };
6995
+ requestBody?: never;
6996
+ responses: {
6997
+ /** @description Paginated list */
6998
+ 200: {
6999
+ headers: {
7000
+ [name: string]: unknown;
7001
+ };
7002
+ content: {
7003
+ "application/json": {
7004
+ items: components["schemas"]["IdentityAssignmentRowDto"][];
7005
+ pagination: components["schemas"]["PageMetaDto"];
7006
+ };
7007
+ };
7008
+ };
7009
+ /** @description Invalid or expired token */
7010
+ 401: {
7011
+ headers: {
7012
+ [name: string]: unknown;
7013
+ };
7014
+ content: {
7015
+ /**
7016
+ * @example {
7017
+ * "error": {
7018
+ * "statusCode": 401,
7019
+ * "code": null,
7020
+ * "message": "Invalid or expired token",
7021
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7022
+ * "path": "/api/v1/nodes",
7023
+ * "method": "GET"
7024
+ * }
7025
+ * }
7026
+ */
7027
+ "application/json": components["schemas"]["ErrorResponseDto"];
7028
+ };
7029
+ };
7030
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7031
+ 403: {
7032
+ headers: {
7033
+ [name: string]: unknown;
7034
+ };
7035
+ content: {
7036
+ /**
7037
+ * @example {
7038
+ * "error": {
7039
+ * "statusCode": 403,
7040
+ * "code": null,
7041
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7042
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7043
+ * "path": "/api/v1/nodes",
7044
+ * "method": "GET"
7045
+ * }
7046
+ * }
7047
+ */
7048
+ "application/json": components["schemas"]["ErrorResponseDto"];
7049
+ };
7050
+ };
7051
+ /** @description Node not found */
7052
+ 404: {
7053
+ headers: {
7054
+ [name: string]: unknown;
7055
+ };
7056
+ content: {
7057
+ /**
7058
+ * @example {
7059
+ * "error": {
7060
+ * "statusCode": 404,
7061
+ * "code": null,
7062
+ * "message": "Node not found",
7063
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7064
+ * "path": "/api/v1/nodes/{id}/identities",
7065
+ * "method": "GET"
7066
+ * }
7067
+ * }
7068
+ */
7069
+ "application/json": components["schemas"]["ErrorResponseDto"];
7070
+ };
7071
+ };
7072
+ };
7073
+ };
7074
+ ApiNodesController_getIdentityAssignmentsSummary: {
7075
+ parameters: {
7076
+ query?: never;
7077
+ header?: never;
7078
+ path: {
7079
+ id: string;
7080
+ };
7081
+ cookie?: never;
7082
+ };
7083
+ requestBody?: never;
7084
+ responses: {
7085
+ /** @description Identity counts by status returned */
7086
+ 200: {
7087
+ headers: {
7088
+ [name: string]: unknown;
7089
+ };
7090
+ content: {
7091
+ "application/json": {
7092
+ data: components["schemas"]["NodeIdentitiesSummaryDto"];
7093
+ };
7094
+ };
7095
+ };
7096
+ /** @description Invalid or expired token */
7097
+ 401: {
7098
+ headers: {
7099
+ [name: string]: unknown;
7100
+ };
7101
+ content: {
7102
+ /**
7103
+ * @example {
7104
+ * "error": {
7105
+ * "statusCode": 401,
7106
+ * "code": null,
7107
+ * "message": "Invalid or expired token",
7108
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7109
+ * "path": "/api/v1/nodes",
7110
+ * "method": "GET"
7111
+ * }
7112
+ * }
7113
+ */
7114
+ "application/json": components["schemas"]["ErrorResponseDto"];
7115
+ };
7116
+ };
7117
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7118
+ 403: {
7119
+ headers: {
7120
+ [name: string]: unknown;
7121
+ };
7122
+ content: {
7123
+ /**
7124
+ * @example {
7125
+ * "error": {
7126
+ * "statusCode": 403,
7127
+ * "code": null,
7128
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7129
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7130
+ * "path": "/api/v1/nodes",
7131
+ * "method": "GET"
7132
+ * }
7133
+ * }
7134
+ */
7135
+ "application/json": components["schemas"]["ErrorResponseDto"];
7136
+ };
7137
+ };
7138
+ /** @description Node not found */
7139
+ 404: {
7140
+ headers: {
7141
+ [name: string]: unknown;
7142
+ };
7143
+ content: {
7144
+ /**
7145
+ * @example {
7146
+ * "error": {
7147
+ * "statusCode": 404,
7148
+ * "code": null,
7149
+ * "message": "Node not found",
7150
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7151
+ * "path": "/api/v1/nodes/{id}/identities/summary",
7152
+ * "method": "GET"
7153
+ * }
7154
+ * }
7155
+ */
7156
+ "application/json": components["schemas"]["ErrorResponseDto"];
7157
+ };
7158
+ };
7159
+ };
7160
+ };
7161
+ ApiOrganizationsController_listOrganizations: {
7162
+ parameters: {
7163
+ query?: {
7164
+ /** @description Page number (1-based) */
7165
+ page?: number;
7166
+ /** @description Items per page (1-100, default 20) */
7167
+ take?: number;
7168
+ /** @description Search term */
7169
+ q?: string;
7170
+ /** @description Column to sort by. Allowed values depend on the endpoint. */
7171
+ sort_by?: string;
7172
+ /** @description Sort direction */
7173
+ order?: "asc" | "desc";
7174
+ };
7175
+ header?: never;
7176
+ path?: never;
7177
+ cookie?: never;
7178
+ };
7179
+ requestBody?: never;
7180
+ responses: {
7181
+ /** @description Paginated list */
7182
+ 200: {
7183
+ headers: {
7184
+ [name: string]: unknown;
7185
+ };
7186
+ content: {
7187
+ "application/json": {
7188
+ items: components["schemas"]["OrganizationResponseDto"][];
7189
+ pagination: components["schemas"]["PageMetaDto"];
7190
+ };
7191
+ };
7192
+ };
7193
+ /** @description Invalid or expired token */
7194
+ 401: {
7195
+ headers: {
7196
+ [name: string]: unknown;
7197
+ };
7198
+ content: {
7199
+ /**
7200
+ * @example {
7201
+ * "error": {
7202
+ * "statusCode": 401,
7203
+ * "code": null,
7204
+ * "message": "Invalid or expired token",
7205
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7206
+ * "path": "/api/v1/organizations",
7207
+ * "method": "GET"
7208
+ * }
7209
+ * }
7210
+ */
7211
+ "application/json": components["schemas"]["ErrorResponseDto"];
7212
+ };
7213
+ };
7214
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7215
+ 403: {
7216
+ headers: {
7217
+ [name: string]: unknown;
7218
+ };
7219
+ content: {
7220
+ /**
7221
+ * @example {
7222
+ * "error": {
7223
+ * "statusCode": 403,
7224
+ * "code": null,
7225
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7226
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7227
+ * "path": "/api/v1/organizations",
7228
+ * "method": "GET"
7229
+ * }
7230
+ * }
7231
+ */
7232
+ "application/json": components["schemas"]["ErrorResponseDto"];
7233
+ };
7234
+ };
7235
+ };
7236
+ };
7237
+ ApiOrganizationsController_createOrganization: {
7238
+ parameters: {
7239
+ query?: never;
7240
+ header?: never;
7241
+ path?: never;
7242
+ cookie?: never;
7243
+ };
7244
+ requestBody: {
7245
+ content: {
7246
+ "application/json": components["schemas"]["CreateOrganizationDto"];
7247
+ };
7248
+ };
7249
+ responses: {
7250
+ /** @description Organization created */
7251
+ 201: {
7252
+ headers: {
7253
+ [name: string]: unknown;
7254
+ };
7255
+ content: {
7256
+ "application/json": {
7257
+ data: components["schemas"]["OrganizationResponseDto"];
7258
+ };
7259
+ };
7260
+ };
7261
+ /** @description Invalid or expired token */
7262
+ 401: {
7263
+ headers: {
7264
+ [name: string]: unknown;
7265
+ };
7266
+ content: {
7267
+ /**
7268
+ * @example {
7269
+ * "error": {
7270
+ * "statusCode": 401,
7271
+ * "code": null,
7272
+ * "message": "Invalid or expired token",
7273
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7274
+ * "path": "/api/v1/organizations",
7275
+ * "method": "GET"
7276
+ * }
7277
+ * }
7278
+ */
7279
+ "application/json": components["schemas"]["ErrorResponseDto"];
7280
+ };
7281
+ };
7282
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7283
+ 403: {
7284
+ headers: {
7285
+ [name: string]: unknown;
7286
+ };
7287
+ content: {
7288
+ /**
7289
+ * @example {
7290
+ * "error": {
7291
+ * "statusCode": 403,
7292
+ * "code": null,
7293
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7294
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7295
+ * "path": "/api/v1/organizations",
7296
+ * "method": "GET"
7297
+ * }
7298
+ * }
7299
+ */
7300
+ "application/json": components["schemas"]["ErrorResponseDto"];
7301
+ };
7302
+ };
7303
+ /** @description Organizations are not enabled on this Environment; switch the container on first */
7304
+ 409: {
7305
+ headers: {
7306
+ [name: string]: unknown;
7307
+ };
7308
+ content: {
7309
+ /**
7310
+ * @example {
7311
+ * "error": {
7312
+ * "statusCode": 409,
7313
+ * "code": null,
7314
+ * "message": "Organizations are not enabled on this Environment; switch the container on first",
7315
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7316
+ * "path": "/api/v1/organizations",
7317
+ * "method": "POST"
7318
+ * }
7319
+ * }
7320
+ */
7321
+ "application/json": components["schemas"]["ErrorResponseDto"];
7322
+ };
7323
+ };
7324
+ };
7325
+ };
7326
+ ApiOrganizationsController_deleteAllOrganizations: {
7327
+ parameters: {
7328
+ query?: never;
7329
+ header?: never;
7330
+ path?: never;
7331
+ cookie?: never;
7332
+ };
7333
+ requestBody?: never;
7334
+ responses: {
7335
+ /** @description Every organization deleted with its memberships, pending invitations, and subtree */
7336
+ 204: {
7337
+ headers: {
7338
+ [name: string]: unknown;
7339
+ };
7340
+ content?: never;
7341
+ };
7342
+ /** @description Invalid or expired token */
7343
+ 401: {
7344
+ headers: {
7345
+ [name: string]: unknown;
7346
+ };
7347
+ content: {
7348
+ /**
7349
+ * @example {
7350
+ * "error": {
7351
+ * "statusCode": 401,
7352
+ * "code": null,
7353
+ * "message": "Invalid or expired token",
7354
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7355
+ * "path": "/api/v1/organizations",
7356
+ * "method": "GET"
7357
+ * }
7358
+ * }
7359
+ */
7360
+ "application/json": components["schemas"]["ErrorResponseDto"];
7361
+ };
7362
+ };
7363
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7364
+ 403: {
7365
+ headers: {
7366
+ [name: string]: unknown;
7367
+ };
7368
+ content: {
7369
+ /**
7370
+ * @example {
7371
+ * "error": {
7372
+ * "statusCode": 403,
7373
+ * "code": null,
7374
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7375
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7376
+ * "path": "/api/v1/organizations",
7377
+ * "method": "GET"
7378
+ * }
7379
+ * }
7380
+ */
7381
+ "application/json": components["schemas"]["ErrorResponseDto"];
7382
+ };
7383
+ };
7384
+ };
7385
+ };
7386
+ ApiOrganizationsController_getOrganization: {
7387
+ parameters: {
7388
+ query?: never;
7389
+ header?: never;
7390
+ path: {
7391
+ id: string;
7392
+ };
7393
+ cookie?: never;
7394
+ };
7395
+ requestBody?: never;
7396
+ responses: {
7397
+ /** @description Organization returned */
7398
+ 200: {
7399
+ headers: {
7400
+ [name: string]: unknown;
7401
+ };
7402
+ content: {
7403
+ "application/json": {
7404
+ data: components["schemas"]["OrganizationResponseDto"];
7405
+ };
7406
+ };
7407
+ };
7408
+ /** @description Invalid or expired token */
7409
+ 401: {
7410
+ headers: {
7411
+ [name: string]: unknown;
7412
+ };
7413
+ content: {
7414
+ /**
7415
+ * @example {
7416
+ * "error": {
7417
+ * "statusCode": 401,
7418
+ * "code": null,
7419
+ * "message": "Invalid or expired token",
7420
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7421
+ * "path": "/api/v1/organizations",
7422
+ * "method": "GET"
7423
+ * }
7424
+ * }
7425
+ */
7426
+ "application/json": components["schemas"]["ErrorResponseDto"];
7427
+ };
7428
+ };
7429
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7430
+ 403: {
7431
+ headers: {
7432
+ [name: string]: unknown;
7433
+ };
7434
+ content: {
7435
+ /**
7436
+ * @example {
7437
+ * "error": {
7438
+ * "statusCode": 403,
7439
+ * "code": null,
7440
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7441
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7442
+ * "path": "/api/v1/organizations",
7443
+ * "method": "GET"
7444
+ * }
7445
+ * }
7446
+ */
7447
+ "application/json": components["schemas"]["ErrorResponseDto"];
7448
+ };
7449
+ };
7450
+ /** @description Organization not found */
7451
+ 404: {
7452
+ headers: {
7453
+ [name: string]: unknown;
7454
+ };
7455
+ content: {
7456
+ /**
7457
+ * @example {
7458
+ * "error": {
7459
+ * "statusCode": 404,
7460
+ * "code": null,
7461
+ * "message": "Organization not found",
7462
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7463
+ * "path": "/api/v1/organizations/{id}",
7464
+ * "method": "GET"
7465
+ * }
7466
+ * }
7467
+ */
7468
+ "application/json": components["schemas"]["ErrorResponseDto"];
7469
+ };
7470
+ };
7471
+ };
7472
+ };
7473
+ ApiOrganizationsController_deleteOrganization: {
7474
+ parameters: {
7475
+ query?: never;
7476
+ header: {
7477
+ "if-match": string;
7478
+ /** @description Optimistic-lock version of the resource. Send the `version` field returned on read; the server rejects with 409 if the row has changed since. */
7479
+ "If-Match"?: string;
7480
+ };
7481
+ path: {
7482
+ id: string;
7483
+ };
7484
+ cookie?: never;
7485
+ };
7486
+ requestBody?: never;
7487
+ responses: {
7488
+ /** @description Organization deleted */
7489
+ 204: {
7490
+ headers: {
7491
+ [name: string]: unknown;
7492
+ };
7493
+ content?: never;
7494
+ };
7495
+ /** @description Invalid or expired token */
7496
+ 401: {
7497
+ headers: {
7498
+ [name: string]: unknown;
7499
+ };
7500
+ content: {
7501
+ /**
7502
+ * @example {
7503
+ * "error": {
7504
+ * "statusCode": 401,
7505
+ * "code": null,
7506
+ * "message": "Invalid or expired token",
7507
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7508
+ * "path": "/api/v1/organizations",
7509
+ * "method": "GET"
7510
+ * }
7511
+ * }
7512
+ */
7513
+ "application/json": components["schemas"]["ErrorResponseDto"];
7514
+ };
7515
+ };
7516
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7517
+ 403: {
7518
+ headers: {
7519
+ [name: string]: unknown;
7520
+ };
7521
+ content: {
7522
+ /**
7523
+ * @example {
7524
+ * "error": {
7525
+ * "statusCode": 403,
7526
+ * "code": null,
7527
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7528
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7529
+ * "path": "/api/v1/organizations",
7530
+ * "method": "GET"
7531
+ * }
7532
+ * }
7533
+ */
7534
+ "application/json": components["schemas"]["ErrorResponseDto"];
7535
+ };
7536
+ };
7537
+ /** @description Organization not found */
7538
+ 404: {
7539
+ headers: {
7540
+ [name: string]: unknown;
7541
+ };
7542
+ content: {
7543
+ /**
7544
+ * @example {
7545
+ * "error": {
7546
+ * "statusCode": 404,
7547
+ * "code": null,
7548
+ * "message": "Organization not found",
7549
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7550
+ * "path": "/api/v1/organizations/{id}",
7551
+ * "method": "DELETE"
7552
+ * }
7553
+ * }
7554
+ */
7555
+ "application/json": components["schemas"]["ErrorResponseDto"];
7556
+ };
7557
+ };
7558
+ /** @description Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry. */
7559
+ 409: {
7560
+ headers: {
7561
+ [name: string]: unknown;
7562
+ };
7563
+ content: {
7564
+ /**
7565
+ * @example {
7566
+ * "error": {
7567
+ * "statusCode": 409,
7568
+ * "code": null,
7569
+ * "message": "Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry.",
7570
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7571
+ * "path": "/api/v1/organizations/{id}",
7572
+ * "method": "DELETE"
7573
+ * }
7574
+ * }
7575
+ */
7576
+ "application/json": components["schemas"]["ErrorResponseDto"];
7577
+ };
7578
+ };
7579
+ };
7580
+ };
7581
+ ApiOrganizationsController_updateOrganization: {
7582
+ parameters: {
7583
+ query?: never;
7584
+ header: {
7585
+ "if-match": string;
7586
+ /** @description Optimistic-lock version of the resource. Send the `version` field returned on read; the server rejects with 409 if the row has changed since. */
7587
+ "If-Match"?: string;
7588
+ };
7589
+ path: {
7590
+ id: string;
7591
+ };
7592
+ cookie?: never;
7593
+ };
7594
+ requestBody: {
7595
+ content: {
7596
+ "application/json": components["schemas"]["UpdateOrganizationDto"];
7597
+ };
7598
+ };
7599
+ responses: {
7600
+ /** @description Organization updated */
7601
+ 200: {
7602
+ headers: {
7603
+ [name: string]: unknown;
7604
+ };
7605
+ content: {
7606
+ "application/json": {
7607
+ data: components["schemas"]["OrganizationResponseDto"];
7608
+ };
7609
+ };
7610
+ };
7611
+ /** @description Invalid or expired token */
7612
+ 401: {
7613
+ headers: {
7614
+ [name: string]: unknown;
7615
+ };
7616
+ content: {
7617
+ /**
7618
+ * @example {
7619
+ * "error": {
7620
+ * "statusCode": 401,
7621
+ * "code": null,
7622
+ * "message": "Invalid or expired token",
7623
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7624
+ * "path": "/api/v1/organizations",
7625
+ * "method": "GET"
7626
+ * }
7627
+ * }
7628
+ */
7629
+ "application/json": components["schemas"]["ErrorResponseDto"];
7630
+ };
7631
+ };
7632
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7633
+ 403: {
7634
+ headers: {
7635
+ [name: string]: unknown;
7636
+ };
7637
+ content: {
7638
+ /**
7639
+ * @example {
7640
+ * "error": {
7641
+ * "statusCode": 403,
7642
+ * "code": null,
7643
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7644
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7645
+ * "path": "/api/v1/organizations",
7646
+ * "method": "GET"
7647
+ * }
7648
+ * }
7649
+ */
7650
+ "application/json": components["schemas"]["ErrorResponseDto"];
7651
+ };
7652
+ };
7653
+ /** @description Organization not found */
7654
+ 404: {
7655
+ headers: {
7656
+ [name: string]: unknown;
7657
+ };
7658
+ content: {
7659
+ /**
7660
+ * @example {
7661
+ * "error": {
7662
+ * "statusCode": 404,
7663
+ * "code": null,
7664
+ * "message": "Organization not found",
7665
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7666
+ * "path": "/api/v1/organizations/{id}",
7667
+ * "method": "PATCH"
7668
+ * }
7669
+ * }
7670
+ */
7671
+ "application/json": components["schemas"]["ErrorResponseDto"];
7672
+ };
7673
+ };
7674
+ /** @description Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry. */
7675
+ 409: {
7676
+ headers: {
7677
+ [name: string]: unknown;
7678
+ };
7679
+ content: {
7680
+ /**
7681
+ * @example {
7682
+ * "error": {
7683
+ * "statusCode": 409,
7684
+ * "code": null,
7685
+ * "message": "Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry.",
7686
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7687
+ * "path": "/api/v1/organizations/{id}",
7688
+ * "method": "PATCH"
7689
+ * }
7690
+ * }
7691
+ */
7692
+ "application/json": components["schemas"]["ErrorResponseDto"];
7693
+ };
7694
+ };
7695
+ };
7696
+ };
7697
+ ApiOrganizationsController_getPolicy: {
7698
+ parameters: {
7699
+ query?: never;
7700
+ header?: never;
7701
+ path: {
7702
+ id: string;
7703
+ };
7704
+ cookie?: never;
7705
+ };
7706
+ requestBody?: never;
7707
+ responses: {
7708
+ /** @description Policy returned */
7709
+ 200: {
7710
+ headers: {
7711
+ [name: string]: unknown;
7712
+ };
7713
+ content: {
7714
+ "application/json": {
7715
+ data: components["schemas"]["OrganizationPolicyResponseDto"];
7716
+ };
7717
+ };
7718
+ };
7719
+ /** @description Invalid or expired token */
7720
+ 401: {
7721
+ headers: {
7722
+ [name: string]: unknown;
7723
+ };
7724
+ content: {
7725
+ /**
7726
+ * @example {
7727
+ * "error": {
7728
+ * "statusCode": 401,
7729
+ * "code": null,
7730
+ * "message": "Invalid or expired token",
7731
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7732
+ * "path": "/api/v1/organizations",
7733
+ * "method": "GET"
7734
+ * }
7735
+ * }
7736
+ */
7737
+ "application/json": components["schemas"]["ErrorResponseDto"];
7738
+ };
7739
+ };
7740
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7741
+ 403: {
7742
+ headers: {
7743
+ [name: string]: unknown;
7744
+ };
7745
+ content: {
7746
+ /**
7747
+ * @example {
7748
+ * "error": {
7749
+ * "statusCode": 403,
7750
+ * "code": null,
7751
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7752
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7753
+ * "path": "/api/v1/organizations",
7754
+ * "method": "GET"
7755
+ * }
7756
+ * }
7757
+ */
7758
+ "application/json": components["schemas"]["ErrorResponseDto"];
7759
+ };
7760
+ };
7761
+ /** @description Organization not found */
7762
+ 404: {
7763
+ headers: {
7764
+ [name: string]: unknown;
7765
+ };
7766
+ content: {
7767
+ /**
7768
+ * @example {
7769
+ * "error": {
7770
+ * "statusCode": 404,
7771
+ * "code": null,
7772
+ * "message": "Organization not found",
7773
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7774
+ * "path": "/api/v1/organizations/{id}/policy",
7775
+ * "method": "GET"
7776
+ * }
7777
+ * }
7778
+ */
7779
+ "application/json": components["schemas"]["ErrorResponseDto"];
7780
+ };
7781
+ };
7782
+ };
7783
+ };
7784
+ ApiOrganizationsController_updatePolicy: {
7785
+ parameters: {
7786
+ query?: never;
7787
+ header: {
7788
+ "if-match": string;
7789
+ /** @description Optimistic-lock version of the resource. Send the `version` field returned on read; the server rejects with 409 if the row has changed since. */
7790
+ "If-Match"?: string;
7791
+ };
7792
+ path: {
7793
+ id: string;
7794
+ };
7795
+ cookie?: never;
7796
+ };
7797
+ requestBody: {
7798
+ content: {
7799
+ "application/json": components["schemas"]["UpdateOrganizationPolicyDto"];
7800
+ };
7801
+ };
7802
+ responses: {
7803
+ /** @description Policy updated */
7804
+ 200: {
7805
+ headers: {
7806
+ [name: string]: unknown;
7807
+ };
7808
+ content: {
7809
+ "application/json": {
7810
+ data: components["schemas"]["OrganizationPolicyResponseDto"];
7811
+ };
7812
+ };
7813
+ };
7814
+ /** @description The policy would loosen the Environment's authentication settings */
7815
+ 400: {
7816
+ headers: {
7817
+ [name: string]: unknown;
7818
+ };
7819
+ content: {
7820
+ /**
7821
+ * @example {
7822
+ * "error": {
7823
+ * "statusCode": 400,
7824
+ * "code": null,
7825
+ * "message": "The policy would loosen the Environment's authentication settings",
7826
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7827
+ * "path": "/api/v1/organizations/{id}/policy",
7828
+ * "method": "PATCH"
7829
+ * }
7830
+ * }
7831
+ */
7832
+ "application/json": components["schemas"]["ErrorResponseDto"];
7833
+ };
7834
+ };
7835
+ /** @description Invalid or expired token */
7836
+ 401: {
7837
+ headers: {
7838
+ [name: string]: unknown;
7839
+ };
7840
+ content: {
7841
+ /**
7842
+ * @example {
7843
+ * "error": {
7844
+ * "statusCode": 401,
7845
+ * "code": null,
7846
+ * "message": "Invalid or expired token",
7847
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7848
+ * "path": "/api/v1/organizations",
7849
+ * "method": "GET"
7850
+ * }
7851
+ * }
7852
+ */
7853
+ "application/json": components["schemas"]["ErrorResponseDto"];
7854
+ };
7855
+ };
7856
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7857
+ 403: {
7858
+ headers: {
7859
+ [name: string]: unknown;
7860
+ };
7861
+ content: {
7862
+ /**
7863
+ * @example {
7864
+ * "error": {
7865
+ * "statusCode": 403,
7866
+ * "code": null,
7867
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7868
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7869
+ * "path": "/api/v1/organizations",
7870
+ * "method": "GET"
7871
+ * }
7872
+ * }
7873
+ */
7874
+ "application/json": components["schemas"]["ErrorResponseDto"];
7875
+ };
7876
+ };
7877
+ /** @description Organization not found */
7878
+ 404: {
7879
+ headers: {
7880
+ [name: string]: unknown;
7881
+ };
7882
+ content: {
7883
+ /**
7884
+ * @example {
7885
+ * "error": {
7886
+ * "statusCode": 404,
7887
+ * "code": null,
7888
+ * "message": "Organization not found",
7889
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7890
+ * "path": "/api/v1/organizations/{id}/policy",
7891
+ * "method": "PATCH"
7892
+ * }
7893
+ * }
7894
+ */
7895
+ "application/json": components["schemas"]["ErrorResponseDto"];
7896
+ };
7897
+ };
7898
+ /** @description Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry. */
7899
+ 409: {
7900
+ headers: {
7901
+ [name: string]: unknown;
7902
+ };
7903
+ content: {
7904
+ /**
7905
+ * @example {
7906
+ * "error": {
7907
+ * "statusCode": 409,
7908
+ * "code": null,
7909
+ * "message": "Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry.",
7910
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7911
+ * "path": "/api/v1/organizations/{id}/policy",
7912
+ * "method": "PATCH"
7913
+ * }
7914
+ * }
7915
+ */
7916
+ "application/json": components["schemas"]["ErrorResponseDto"];
7917
+ };
7918
+ };
7919
+ };
7920
+ };
7921
+ ApiOrganizationsController_listSsoConnections: {
7922
+ parameters: {
7923
+ query?: never;
7924
+ header?: never;
7925
+ path: {
7926
+ id: string;
7927
+ };
7928
+ cookie?: never;
7929
+ };
7930
+ requestBody?: never;
7931
+ responses: {
7932
+ /** @description Bindings returned */
7933
+ 200: {
7934
+ headers: {
7935
+ [name: string]: unknown;
7936
+ };
7937
+ content: {
7938
+ "application/json": {
7939
+ items: components["schemas"]["OrganizationSsoConnectionResponseDto"][];
7940
+ };
7941
+ };
7942
+ };
7943
+ /** @description Invalid or expired token */
7944
+ 401: {
7945
+ headers: {
7946
+ [name: string]: unknown;
7947
+ };
7948
+ content: {
7949
+ /**
7950
+ * @example {
7951
+ * "error": {
7952
+ * "statusCode": 401,
7953
+ * "code": null,
7954
+ * "message": "Invalid or expired token",
7955
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7956
+ * "path": "/api/v1/organizations",
7957
+ * "method": "GET"
7958
+ * }
7959
+ * }
7960
+ */
7961
+ "application/json": components["schemas"]["ErrorResponseDto"];
7962
+ };
7963
+ };
7964
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
7965
+ 403: {
7966
+ headers: {
7967
+ [name: string]: unknown;
7968
+ };
7969
+ content: {
7970
+ /**
7971
+ * @example {
7972
+ * "error": {
7973
+ * "statusCode": 403,
7974
+ * "code": null,
7975
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
7976
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7977
+ * "path": "/api/v1/organizations",
7978
+ * "method": "GET"
7979
+ * }
7980
+ * }
7981
+ */
7982
+ "application/json": components["schemas"]["ErrorResponseDto"];
7983
+ };
7984
+ };
7985
+ /** @description Organization not found */
7986
+ 404: {
7987
+ headers: {
7988
+ [name: string]: unknown;
7989
+ };
7990
+ content: {
7991
+ /**
7992
+ * @example {
7993
+ * "error": {
7994
+ * "statusCode": 404,
7995
+ * "code": null,
7996
+ * "message": "Organization not found",
7997
+ * "timestamp": "2026-04-20T12:00:00.000Z",
7998
+ * "path": "/api/v1/organizations/{id}/sso-connections",
7999
+ * "method": "GET"
8000
+ * }
8001
+ * }
8002
+ */
8003
+ "application/json": components["schemas"]["ErrorResponseDto"];
8004
+ };
8005
+ };
8006
+ };
8007
+ };
8008
+ ApiOrganizationsController_bindSsoConnection: {
8009
+ parameters: {
8010
+ query?: never;
8011
+ header?: never;
8012
+ path: {
8013
+ id: string;
8014
+ };
8015
+ cookie?: never;
8016
+ };
8017
+ requestBody: {
8018
+ content: {
8019
+ "application/json": components["schemas"]["BindOrganizationSsoConnectionDto"];
8020
+ };
8021
+ };
8022
+ responses: {
8023
+ /** @description Connection bound */
8024
+ 201: {
8025
+ headers: {
8026
+ [name: string]: unknown;
8027
+ };
8028
+ content: {
8029
+ "application/json": {
8030
+ data: components["schemas"]["OrganizationSsoConnectionResponseDto"];
8031
+ };
8032
+ };
8033
+ };
8034
+ /** @description The connection is not an end-user connection bound to the organization's Environment, or the role is not in that Environment */
8035
+ 400: {
8036
+ headers: {
8037
+ [name: string]: unknown;
8038
+ };
8039
+ content: {
8040
+ /**
8041
+ * @example {
8042
+ * "error": {
8043
+ * "statusCode": 400,
8044
+ * "code": null,
8045
+ * "message": "The connection is not an end-user connection bound to the organization's Environment, or the role is not in that Environment",
8046
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8047
+ * "path": "/api/v1/organizations/{id}/sso-connections",
8048
+ * "method": "POST"
8049
+ * }
8050
+ * }
8051
+ */
8052
+ "application/json": components["schemas"]["ErrorResponseDto"];
8053
+ };
8054
+ };
8055
+ /** @description Invalid or expired token */
8056
+ 401: {
8057
+ headers: {
8058
+ [name: string]: unknown;
8059
+ };
8060
+ content: {
8061
+ /**
8062
+ * @example {
8063
+ * "error": {
8064
+ * "statusCode": 401,
8065
+ * "code": null,
8066
+ * "message": "Invalid or expired token",
8067
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8068
+ * "path": "/api/v1/organizations",
8069
+ * "method": "GET"
8070
+ * }
8071
+ * }
8072
+ */
8073
+ "application/json": components["schemas"]["ErrorResponseDto"];
8074
+ };
8075
+ };
8076
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
8077
+ 403: {
8078
+ headers: {
8079
+ [name: string]: unknown;
8080
+ };
8081
+ content: {
8082
+ /**
8083
+ * @example {
8084
+ * "error": {
8085
+ * "statusCode": 403,
8086
+ * "code": null,
8087
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
8088
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8089
+ * "path": "/api/v1/organizations",
8090
+ * "method": "GET"
8091
+ * }
8092
+ * }
8093
+ */
8094
+ "application/json": components["schemas"]["ErrorResponseDto"];
8095
+ };
8096
+ };
8097
+ /** @description Organization not found */
8098
+ 404: {
8099
+ headers: {
8100
+ [name: string]: unknown;
8101
+ };
8102
+ content: {
8103
+ /**
8104
+ * @example {
8105
+ * "error": {
8106
+ * "statusCode": 404,
8107
+ * "code": null,
8108
+ * "message": "Organization not found",
8109
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8110
+ * "path": "/api/v1/organizations/{id}/sso-connections",
8111
+ * "method": "POST"
8112
+ * }
8113
+ * }
8114
+ */
8115
+ "application/json": components["schemas"]["ErrorResponseDto"];
8116
+ };
8117
+ };
8118
+ /** @description The connection is already bound to an organization in this Environment */
8119
+ 409: {
8120
+ headers: {
8121
+ [name: string]: unknown;
8122
+ };
8123
+ content: {
8124
+ /**
8125
+ * @example {
8126
+ * "error": {
8127
+ * "statusCode": 409,
8128
+ * "code": null,
8129
+ * "message": "The connection is already bound to an organization in this Environment",
8130
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8131
+ * "path": "/api/v1/organizations/{id}/sso-connections",
8132
+ * "method": "POST"
8133
+ * }
8134
+ * }
8135
+ */
8136
+ "application/json": components["schemas"]["ErrorResponseDto"];
8137
+ };
8138
+ };
8139
+ };
8140
+ };
8141
+ ApiOrganizationsController_unbindSsoConnection: {
8142
+ parameters: {
8143
+ query?: never;
8144
+ header?: never;
8145
+ path: {
8146
+ id: string;
8147
+ connectionId: string;
8148
+ };
8149
+ cookie?: never;
8150
+ };
8151
+ requestBody?: never;
8152
+ responses: {
8153
+ /** @description Connection unbound */
8154
+ 204: {
8155
+ headers: {
8156
+ [name: string]: unknown;
8157
+ };
8158
+ content?: never;
8159
+ };
8160
+ /** @description Invalid or expired token */
8161
+ 401: {
8162
+ headers: {
8163
+ [name: string]: unknown;
8164
+ };
8165
+ content: {
8166
+ /**
8167
+ * @example {
8168
+ * "error": {
8169
+ * "statusCode": 401,
8170
+ * "code": null,
8171
+ * "message": "Invalid or expired token",
8172
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8173
+ * "path": "/api/v1/organizations",
8174
+ * "method": "GET"
8175
+ * }
8176
+ * }
8177
+ */
8178
+ "application/json": components["schemas"]["ErrorResponseDto"];
8179
+ };
8180
+ };
8181
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
8182
+ 403: {
8183
+ headers: {
8184
+ [name: string]: unknown;
8185
+ };
8186
+ content: {
8187
+ /**
8188
+ * @example {
8189
+ * "error": {
8190
+ * "statusCode": 403,
8191
+ * "code": null,
8192
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
8193
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8194
+ * "path": "/api/v1/organizations",
8195
+ * "method": "GET"
8196
+ * }
8197
+ * }
8198
+ */
8199
+ "application/json": components["schemas"]["ErrorResponseDto"];
8200
+ };
8201
+ };
8202
+ /** @description This SSO connection is not bound to the organization */
8203
+ 404: {
8204
+ headers: {
8205
+ [name: string]: unknown;
8206
+ };
8207
+ content: {
8208
+ /**
8209
+ * @example {
8210
+ * "error": {
8211
+ * "statusCode": 404,
8212
+ * "code": null,
8213
+ * "message": "This SSO connection is not bound to the organization",
8214
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8215
+ * "path": "/api/v1/organizations/{id}/sso-connections/{connectionId}",
8216
+ * "method": "DELETE"
8217
+ * }
8218
+ * }
8219
+ */
8220
+ "application/json": components["schemas"]["ErrorResponseDto"];
8221
+ };
8222
+ };
8223
+ };
8224
+ };
8225
+ ApiOrganizationsController_listMembers: {
8226
+ parameters: {
8227
+ query?: {
8228
+ /** @description Page number (1-based) */
8229
+ page?: number;
8230
+ /** @description Items per page (1-100, default 20) */
8231
+ take?: number;
8232
+ /** @description Search term */
8233
+ q?: string;
8234
+ /** @description Column to sort by. Allowed values depend on the endpoint. */
8235
+ sort_by?: string;
8236
+ /** @description Sort direction */
8237
+ order?: "asc" | "desc";
8238
+ /** @description Only members holding this role */
8239
+ role_id?: string;
8240
+ /** @description Filter by the membership's effective window: active now, scheduled to start, or already expired */
8241
+ status?: "active" | "scheduled" | "expired";
8242
+ };
8243
+ header?: never;
8244
+ path: {
8245
+ id: string;
8246
+ };
8247
+ cookie?: never;
8248
+ };
8249
+ requestBody?: never;
8250
+ responses: {
8251
+ /** @description Paginated list */
8252
+ 200: {
8253
+ headers: {
8254
+ [name: string]: unknown;
8255
+ };
8256
+ content: {
8257
+ "application/json": {
8258
+ items: components["schemas"]["OrganizationMemberResponseDto"][];
8259
+ pagination: components["schemas"]["PageMetaDto"];
8260
+ };
8261
+ };
8262
+ };
8263
+ /** @description Invalid or expired token */
8264
+ 401: {
8265
+ headers: {
8266
+ [name: string]: unknown;
8267
+ };
8268
+ content: {
8269
+ /**
8270
+ * @example {
8271
+ * "error": {
8272
+ * "statusCode": 401,
8273
+ * "code": null,
8274
+ * "message": "Invalid or expired token",
8275
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8276
+ * "path": "/api/v1/organizations",
8277
+ * "method": "GET"
8278
+ * }
8279
+ * }
8280
+ */
8281
+ "application/json": components["schemas"]["ErrorResponseDto"];
8282
+ };
8283
+ };
8284
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
8285
+ 403: {
8286
+ headers: {
8287
+ [name: string]: unknown;
8288
+ };
8289
+ content: {
8290
+ /**
8291
+ * @example {
8292
+ * "error": {
8293
+ * "statusCode": 403,
8294
+ * "code": null,
8295
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
8296
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8297
+ * "path": "/api/v1/organizations",
8298
+ * "method": "GET"
8299
+ * }
8300
+ * }
8301
+ */
8302
+ "application/json": components["schemas"]["ErrorResponseDto"];
8303
+ };
8304
+ };
8305
+ /** @description Organization not found */
8306
+ 404: {
8307
+ headers: {
8308
+ [name: string]: unknown;
8309
+ };
8310
+ content: {
8311
+ /**
8312
+ * @example {
8313
+ * "error": {
8314
+ * "statusCode": 404,
8315
+ * "code": null,
8316
+ * "message": "Organization not found",
8317
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8318
+ * "path": "/api/v1/organizations/{id}/members",
8319
+ * "method": "GET"
8320
+ * }
8321
+ * }
8322
+ */
8323
+ "application/json": components["schemas"]["ErrorResponseDto"];
8324
+ };
8325
+ };
8326
+ };
8327
+ };
8328
+ ApiOrganizationsController_addMember: {
8329
+ parameters: {
8330
+ query?: never;
8331
+ header?: never;
8332
+ path: {
8333
+ id: string;
8334
+ };
8335
+ cookie?: never;
8336
+ };
8337
+ requestBody: {
8338
+ content: {
8339
+ "application/json": components["schemas"]["AddOrganizationMemberDto"];
8340
+ };
8341
+ };
8342
+ responses: {
8343
+ /** @description Member added */
8344
+ 201: {
8345
+ headers: {
8346
+ [name: string]: unknown;
8347
+ };
8348
+ content: {
8349
+ "application/json": {
8350
+ data: components["schemas"]["OrganizationMemberResponseDto"];
8351
+ };
8352
+ };
8353
+ };
8354
+ /** @description Invalid or expired token */
8355
+ 401: {
8356
+ headers: {
8357
+ [name: string]: unknown;
8358
+ };
8359
+ content: {
8360
+ /**
8361
+ * @example {
8362
+ * "error": {
8363
+ * "statusCode": 401,
8364
+ * "code": null,
8365
+ * "message": "Invalid or expired token",
8366
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8367
+ * "path": "/api/v1/organizations",
8368
+ * "method": "GET"
8369
+ * }
8370
+ * }
8371
+ */
8372
+ "application/json": components["schemas"]["ErrorResponseDto"];
8373
+ };
8374
+ };
8375
+ /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
8376
+ 403: {
8377
+ headers: {
8378
+ [name: string]: unknown;
8379
+ };
8380
+ content: {
8381
+ /**
8382
+ * @example {
8383
+ * "error": {
8384
+ * "statusCode": 403,
8385
+ * "code": null,
8386
+ * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
8387
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8388
+ * "path": "/api/v1/organizations",
8389
+ * "method": "GET"
8390
+ * }
8391
+ * }
8392
+ */
8393
+ "application/json": components["schemas"]["ErrorResponseDto"];
8394
+ };
8395
+ };
8396
+ /** @description Organization not found */
8397
+ 404: {
8398
+ headers: {
8399
+ [name: string]: unknown;
8400
+ };
8401
+ content: {
8402
+ /**
8403
+ * @example {
8404
+ * "error": {
8405
+ * "statusCode": 404,
8406
+ * "code": null,
8407
+ * "message": "Organization not found",
8408
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8409
+ * "path": "/api/v1/organizations/{id}/members",
8410
+ * "method": "POST"
8411
+ * }
8412
+ * }
8413
+ */
8414
+ "application/json": components["schemas"]["ErrorResponseDto"];
8415
+ };
8416
+ };
8417
+ /** @description The identity is already a member of this organization */
8418
+ 409: {
8419
+ headers: {
8420
+ [name: string]: unknown;
8421
+ };
8422
+ content: {
8423
+ /**
8424
+ * @example {
8425
+ * "error": {
8426
+ * "statusCode": 409,
6159
8427
  * "code": null,
6160
- * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
8428
+ * "message": "The identity is already a member of this organization",
6161
8429
  * "timestamp": "2026-04-20T12:00:00.000Z",
6162
- * "path": "/api/v1/nodes",
6163
- * "method": "GET"
8430
+ * "path": "/api/v1/organizations/{id}/members",
8431
+ * "method": "POST"
6164
8432
  * }
6165
8433
  * }
6166
8434
  */
@@ -6169,27 +8437,24 @@ interface operations {
6169
8437
  };
6170
8438
  };
6171
8439
  };
6172
- ApiNodesController_getAncestors: {
8440
+ ApiOrganizationsController_removeMember: {
6173
8441
  parameters: {
6174
8442
  query?: never;
6175
8443
  header?: never;
6176
8444
  path: {
6177
8445
  id: string;
8446
+ identityId: string;
6178
8447
  };
6179
8448
  cookie?: never;
6180
8449
  };
6181
8450
  requestBody?: never;
6182
8451
  responses: {
6183
- /** @description Ancestors returned root-first */
6184
- 200: {
8452
+ /** @description Member removed */
8453
+ 204: {
6185
8454
  headers: {
6186
8455
  [name: string]: unknown;
6187
8456
  };
6188
- content: {
6189
- "application/json": {
6190
- items: components["schemas"]["NodeResponseDto"][];
6191
- };
6192
- };
8457
+ content?: never;
6193
8458
  };
6194
8459
  /** @description Invalid or expired token */
6195
8460
  401: {
@@ -6204,7 +8469,7 @@ interface operations {
6204
8469
  * "code": null,
6205
8470
  * "message": "Invalid or expired token",
6206
8471
  * "timestamp": "2026-04-20T12:00:00.000Z",
6207
- * "path": "/api/v1/nodes",
8472
+ * "path": "/api/v1/organizations",
6208
8473
  * "method": "GET"
6209
8474
  * }
6210
8475
  * }
@@ -6225,7 +8490,7 @@ interface operations {
6225
8490
  * "code": null,
6226
8491
  * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6227
8492
  * "timestamp": "2026-04-20T12:00:00.000Z",
6228
- * "path": "/api/v1/nodes",
8493
+ * "path": "/api/v1/organizations",
6229
8494
  * "method": "GET"
6230
8495
  * }
6231
8496
  * }
@@ -6233,27 +8498,53 @@ interface operations {
6233
8498
  "application/json": components["schemas"]["ErrorResponseDto"];
6234
8499
  };
6235
8500
  };
8501
+ /** @description The identity is not a member of this organization */
8502
+ 404: {
8503
+ headers: {
8504
+ [name: string]: unknown;
8505
+ };
8506
+ content: {
8507
+ /**
8508
+ * @example {
8509
+ * "error": {
8510
+ * "statusCode": 404,
8511
+ * "code": null,
8512
+ * "message": "The identity is not a member of this organization",
8513
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8514
+ * "path": "/api/v1/organizations/{id}/members/{identityId}",
8515
+ * "method": "DELETE"
8516
+ * }
8517
+ * }
8518
+ */
8519
+ "application/json": components["schemas"]["ErrorResponseDto"];
8520
+ };
8521
+ };
6236
8522
  };
6237
8523
  };
6238
- ApiNodesController_getChildren: {
8524
+ ApiOrganizationsController_changeMemberRole: {
6239
8525
  parameters: {
6240
8526
  query?: never;
6241
8527
  header?: never;
6242
8528
  path: {
6243
8529
  id: string;
8530
+ identityId: string;
6244
8531
  };
6245
8532
  cookie?: never;
6246
8533
  };
6247
- requestBody?: never;
8534
+ requestBody: {
8535
+ content: {
8536
+ "application/json": components["schemas"]["ChangeOrganizationMemberRoleDto"];
8537
+ };
8538
+ };
6248
8539
  responses: {
6249
- /** @description Children returned */
8540
+ /** @description Member role changed */
6250
8541
  200: {
6251
8542
  headers: {
6252
8543
  [name: string]: unknown;
6253
8544
  };
6254
8545
  content: {
6255
8546
  "application/json": {
6256
- items: components["schemas"]["NodeResponseDto"][];
8547
+ data: components["schemas"]["OrganizationMemberResponseDto"];
6257
8548
  };
6258
8549
  };
6259
8550
  };
@@ -6270,7 +8561,7 @@ interface operations {
6270
8561
  * "code": null,
6271
8562
  * "message": "Invalid or expired token",
6272
8563
  * "timestamp": "2026-04-20T12:00:00.000Z",
6273
- * "path": "/api/v1/nodes",
8564
+ * "path": "/api/v1/organizations",
6274
8565
  * "method": "GET"
6275
8566
  * }
6276
8567
  * }
@@ -6291,7 +8582,7 @@ interface operations {
6291
8582
  * "code": null,
6292
8583
  * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6293
8584
  * "timestamp": "2026-04-20T12:00:00.000Z",
6294
- * "path": "/api/v1/nodes",
8585
+ * "path": "/api/v1/organizations",
6295
8586
  * "method": "GET"
6296
8587
  * }
6297
8588
  * }
@@ -6299,34 +8590,63 @@ interface operations {
6299
8590
  "application/json": components["schemas"]["ErrorResponseDto"];
6300
8591
  };
6301
8592
  };
8593
+ /** @description The identity is not a member of this organization */
8594
+ 404: {
8595
+ headers: {
8596
+ [name: string]: unknown;
8597
+ };
8598
+ content: {
8599
+ /**
8600
+ * @example {
8601
+ * "error": {
8602
+ * "statusCode": 404,
8603
+ * "code": null,
8604
+ * "message": "The identity is not a member of this organization",
8605
+ * "timestamp": "2026-04-20T12:00:00.000Z",
8606
+ * "path": "/api/v1/organizations/{id}/members/{identityId}",
8607
+ * "method": "PATCH"
8608
+ * }
8609
+ * }
8610
+ */
8611
+ "application/json": components["schemas"]["ErrorResponseDto"];
8612
+ };
8613
+ };
6302
8614
  };
6303
8615
  };
6304
- ApiNodesController_moveNode: {
8616
+ ApiOrganizationsController_listInvites: {
6305
8617
  parameters: {
6306
- query?: never;
6307
- header: {
6308
- "if-match": string;
6309
- /** @description Optimistic-lock version of the resource. Send the `version` field returned on read; the server rejects with 409 if the row has changed since. */
6310
- "If-Match"?: string;
8618
+ query?: {
8619
+ /** @description Page number (1-based) */
8620
+ page?: number;
8621
+ /** @description Items per page (1-100, default 20) */
8622
+ take?: number;
8623
+ /** @description Search term */
8624
+ q?: string;
8625
+ /** @description Column to sort by. Allowed values depend on the endpoint. */
8626
+ sort_by?: string;
8627
+ /** @description Sort direction */
8628
+ order?: "asc" | "desc";
8629
+ /** @description Filter by invitation status */
8630
+ status?: "pending" | "accepted" | "revoked" | "expired";
6311
8631
  };
8632
+ header?: never;
6312
8633
  path: {
6313
8634
  id: string;
6314
8635
  };
6315
8636
  cookie?: never;
6316
8637
  };
6317
- requestBody: {
6318
- content: {
6319
- "application/json": components["schemas"]["MoveNodeDto"];
6320
- };
6321
- };
8638
+ requestBody?: never;
6322
8639
  responses: {
6323
- /** @description Node moved successfully */
8640
+ /** @description Paginated list */
6324
8641
  200: {
6325
8642
  headers: {
6326
8643
  [name: string]: unknown;
6327
8644
  };
6328
8645
  content: {
6329
- "application/json": components["schemas"]["NodeResponseDto"];
8646
+ "application/json": {
8647
+ items: components["schemas"]["IdentityInviteResponseDto"][];
8648
+ pagination: components["schemas"]["PageMetaDto"];
8649
+ };
6330
8650
  };
6331
8651
  };
6332
8652
  /** @description Invalid or expired token */
@@ -6342,7 +8662,7 @@ interface operations {
6342
8662
  * "code": null,
6343
8663
  * "message": "Invalid or expired token",
6344
8664
  * "timestamp": "2026-04-20T12:00:00.000Z",
6345
- * "path": "/api/v1/nodes",
8665
+ * "path": "/api/v1/organizations",
6346
8666
  * "method": "GET"
6347
8667
  * }
6348
8668
  * }
@@ -6363,7 +8683,7 @@ interface operations {
6363
8683
  * "code": null,
6364
8684
  * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6365
8685
  * "timestamp": "2026-04-20T12:00:00.000Z",
6366
- * "path": "/api/v1/nodes",
8686
+ * "path": "/api/v1/organizations",
6367
8687
  * "method": "GET"
6368
8688
  * }
6369
8689
  * }
@@ -6371,7 +8691,7 @@ interface operations {
6371
8691
  "application/json": components["schemas"]["ErrorResponseDto"];
6372
8692
  };
6373
8693
  };
6374
- /** @description Node not found */
8694
+ /** @description Organization not found */
6375
8695
  404: {
6376
8696
  headers: {
6377
8697
  [name: string]: unknown;
@@ -6382,31 +8702,10 @@ interface operations {
6382
8702
  * "error": {
6383
8703
  * "statusCode": 404,
6384
8704
  * "code": null,
6385
- * "message": "Node not found",
6386
- * "timestamp": "2026-04-20T12:00:00.000Z",
6387
- * "path": "/api/v1/nodes/{id}/move",
6388
- * "method": "POST"
6389
- * }
6390
- * }
6391
- */
6392
- "application/json": components["schemas"]["ErrorResponseDto"];
6393
- };
6394
- };
6395
- /** @description Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry. */
6396
- 409: {
6397
- headers: {
6398
- [name: string]: unknown;
6399
- };
6400
- content: {
6401
- /**
6402
- * @example {
6403
- * "error": {
6404
- * "statusCode": 409,
6405
- * "code": null,
6406
- * "message": "Version mismatch — the resource was modified since the version supplied in If-Match. Refresh and retry.",
8705
+ * "message": "Organization not found",
6407
8706
  * "timestamp": "2026-04-20T12:00:00.000Z",
6408
- * "path": "/api/v1/nodes/{id}/move",
6409
- * "method": "POST"
8707
+ * "path": "/api/v1/organizations/{id}/invites",
8708
+ * "method": "GET"
6410
8709
  * }
6411
8710
  * }
6412
8711
  */
@@ -6415,45 +8714,29 @@ interface operations {
6415
8714
  };
6416
8715
  };
6417
8716
  };
6418
- ApiNodesController_listIdentityAssignments: {
8717
+ ApiOrganizationsController_createInvite: {
6419
8718
  parameters: {
6420
- query?: {
6421
- /** @description Page number (1-based) */
6422
- page?: number;
6423
- /** @description Items per page (1-100, default 20) */
6424
- take?: number;
6425
- /** @description Search term */
6426
- q?: string;
6427
- /** @description Sort field */
6428
- sort_by?: "name" | "role" | "access_type" | "created_at";
6429
- /** @description Sort order */
6430
- order?: "asc" | "desc";
6431
- /** @description Filter by role ID */
6432
- role_id?: string;
6433
- /** @description Filter by access type */
6434
- access_type?: "direct" | "inherited";
6435
- /** @description Filter by assignment status */
6436
- status?: "active" | "scheduled" | "expired";
6437
- /** @description Filter by source node ID */
6438
- source_node_id?: string;
6439
- };
8719
+ query?: never;
6440
8720
  header?: never;
6441
8721
  path: {
6442
8722
  id: string;
6443
8723
  };
6444
8724
  cookie?: never;
6445
8725
  };
6446
- requestBody?: never;
8726
+ requestBody: {
8727
+ content: {
8728
+ "application/json": components["schemas"]["CreateOrganizationInviteDto"];
8729
+ };
8730
+ };
6447
8731
  responses: {
6448
- /** @description Paginated list */
6449
- 200: {
8732
+ /** @description Invitation created */
8733
+ 201: {
6450
8734
  headers: {
6451
8735
  [name: string]: unknown;
6452
8736
  };
6453
8737
  content: {
6454
8738
  "application/json": {
6455
- items: components["schemas"]["IdentityAssignmentRowDto"][];
6456
- pagination: components["schemas"]["PageMetaDto"];
8739
+ data: components["schemas"]["ApiIdentityInviteResponseDto"];
6457
8740
  };
6458
8741
  };
6459
8742
  };
@@ -6470,7 +8753,7 @@ interface operations {
6470
8753
  * "code": null,
6471
8754
  * "message": "Invalid or expired token",
6472
8755
  * "timestamp": "2026-04-20T12:00:00.000Z",
6473
- * "path": "/api/v1/nodes",
8756
+ * "path": "/api/v1/organizations",
6474
8757
  * "method": "GET"
6475
8758
  * }
6476
8759
  * }
@@ -6491,7 +8774,7 @@ interface operations {
6491
8774
  * "code": null,
6492
8775
  * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6493
8776
  * "timestamp": "2026-04-20T12:00:00.000Z",
6494
- * "path": "/api/v1/nodes",
8777
+ * "path": "/api/v1/organizations",
6495
8778
  * "method": "GET"
6496
8779
  * }
6497
8780
  * }
@@ -6499,7 +8782,7 @@ interface operations {
6499
8782
  "application/json": components["schemas"]["ErrorResponseDto"];
6500
8783
  };
6501
8784
  };
6502
- /** @description Node not found */
8785
+ /** @description Organization not found */
6503
8786
  404: {
6504
8787
  headers: {
6505
8788
  [name: string]: unknown;
@@ -6510,10 +8793,10 @@ interface operations {
6510
8793
  * "error": {
6511
8794
  * "statusCode": 404,
6512
8795
  * "code": null,
6513
- * "message": "Node not found",
8796
+ * "message": "Organization not found",
6514
8797
  * "timestamp": "2026-04-20T12:00:00.000Z",
6515
- * "path": "/api/v1/nodes/{id}/identities",
6516
- * "method": "GET"
8798
+ * "path": "/api/v1/organizations/{id}/invites",
8799
+ * "method": "POST"
6517
8800
  * }
6518
8801
  * }
6519
8802
  */
@@ -6522,25 +8805,24 @@ interface operations {
6522
8805
  };
6523
8806
  };
6524
8807
  };
6525
- ApiNodesController_getIdentityAssignmentsSummary: {
8808
+ ApiOrganizationsController_revokeInvite: {
6526
8809
  parameters: {
6527
8810
  query?: never;
6528
8811
  header?: never;
6529
8812
  path: {
6530
8813
  id: string;
8814
+ inviteId: string;
6531
8815
  };
6532
8816
  cookie?: never;
6533
8817
  };
6534
8818
  requestBody?: never;
6535
8819
  responses: {
6536
- /** @description Identity counts by status returned */
6537
- 200: {
8820
+ /** @description Invitation revoked */
8821
+ 204: {
6538
8822
  headers: {
6539
8823
  [name: string]: unknown;
6540
8824
  };
6541
- content: {
6542
- "application/json": components["schemas"]["NodeIdentitiesSummaryDto"];
6543
- };
8825
+ content?: never;
6544
8826
  };
6545
8827
  /** @description Invalid or expired token */
6546
8828
  401: {
@@ -6555,7 +8837,7 @@ interface operations {
6555
8837
  * "code": null,
6556
8838
  * "message": "Invalid or expired token",
6557
8839
  * "timestamp": "2026-04-20T12:00:00.000Z",
6558
- * "path": "/api/v1/nodes",
8840
+ * "path": "/api/v1/organizations",
6559
8841
  * "method": "GET"
6560
8842
  * }
6561
8843
  * }
@@ -6576,7 +8858,7 @@ interface operations {
6576
8858
  * "code": null,
6577
8859
  * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
6578
8860
  * "timestamp": "2026-04-20T12:00:00.000Z",
6579
- * "path": "/api/v1/nodes",
8861
+ * "path": "/api/v1/organizations",
6580
8862
  * "method": "GET"
6581
8863
  * }
6582
8864
  * }
@@ -6584,7 +8866,7 @@ interface operations {
6584
8866
  "application/json": components["schemas"]["ErrorResponseDto"];
6585
8867
  };
6586
8868
  };
6587
- /** @description Node not found */
8869
+ /** @description No such invitation on this organization */
6588
8870
  404: {
6589
8871
  headers: {
6590
8872
  [name: string]: unknown;
@@ -6595,10 +8877,10 @@ interface operations {
6595
8877
  * "error": {
6596
8878
  * "statusCode": 404,
6597
8879
  * "code": null,
6598
- * "message": "Node not found",
8880
+ * "message": "No such invitation on this organization",
6599
8881
  * "timestamp": "2026-04-20T12:00:00.000Z",
6600
- * "path": "/api/v1/nodes/{id}/identities/summary",
6601
- * "method": "GET"
8882
+ * "path": "/api/v1/organizations/{id}/invites/{inviteId}",
8883
+ * "method": "DELETE"
6602
8884
  * }
6603
8885
  * }
6604
8886
  */
@@ -6610,8 +8892,10 @@ interface operations {
6610
8892
  ApiRolesController_listRoles: {
6611
8893
  parameters: {
6612
8894
  query?: {
6613
- include_inactive?: string;
6614
- type?: string;
8895
+ /** @description Include deactivated roles in the list. */
8896
+ include_inactive?: "true" | "false";
8897
+ /** @description Filter by role origin. */
8898
+ type?: "system" | "custom";
6615
8899
  };
6616
8900
  header?: never;
6617
8901
  path?: never;
@@ -6693,7 +8977,9 @@ interface operations {
6693
8977
  [name: string]: unknown;
6694
8978
  };
6695
8979
  content: {
6696
- "application/json": components["schemas"]["RoleResponseDto"];
8980
+ "application/json": {
8981
+ data: components["schemas"]["RoleResponseDto"];
8982
+ };
6697
8983
  };
6698
8984
  };
6699
8985
  /** @description Invalid or expired token */
@@ -6778,7 +9064,9 @@ interface operations {
6778
9064
  [name: string]: unknown;
6779
9065
  };
6780
9066
  content: {
6781
- "application/json": components["schemas"]["RoleResponseDto"];
9067
+ "application/json": {
9068
+ data: components["schemas"]["RoleResponseDto"];
9069
+ };
6782
9070
  };
6783
9071
  };
6784
9072
  /** @description Invalid or expired token */
@@ -6979,7 +9267,9 @@ interface operations {
6979
9267
  [name: string]: unknown;
6980
9268
  };
6981
9269
  content: {
6982
- "application/json": components["schemas"]["RoleResponseDto"];
9270
+ "application/json": {
9271
+ data: components["schemas"]["RoleResponseDto"];
9272
+ };
6983
9273
  };
6984
9274
  };
6985
9275
  /** @description Invalid or expired token */
@@ -7176,7 +9466,9 @@ interface operations {
7176
9466
  [name: string]: unknown;
7177
9467
  };
7178
9468
  content: {
7179
- "application/json": components["schemas"]["MessageResponseDto"];
9469
+ "application/json": {
9470
+ data: components["schemas"]["MessageResponseDto"];
9471
+ };
7180
9472
  };
7181
9473
  };
7182
9474
  /** @description Invalid or expired token */
@@ -7341,7 +9633,9 @@ interface operations {
7341
9633
  [name: string]: unknown;
7342
9634
  };
7343
9635
  content: {
7344
- "application/json": components["schemas"]["AssignmentsSummaryDto"];
9636
+ "application/json": {
9637
+ data: components["schemas"]["AssignmentsSummaryDto"];
9638
+ };
7345
9639
  };
7346
9640
  };
7347
9641
  /** @description Invalid or expired token */
@@ -7407,7 +9701,9 @@ interface operations {
7407
9701
  [name: string]: unknown;
7408
9702
  };
7409
9703
  content: {
7410
- "application/json": components["schemas"]["AssignmentResponseDto"];
9704
+ "application/json": {
9705
+ data: components["schemas"]["AssignmentResponseDto"];
9706
+ };
7411
9707
  };
7412
9708
  };
7413
9709
  /** @description System roles cannot be assigned to identities — they are reserved for platform administration */
@@ -7600,7 +9896,9 @@ interface operations {
7600
9896
  [name: string]: unknown;
7601
9897
  };
7602
9898
  content: {
7603
- "application/json": components["schemas"]["AssignmentResponseDto"];
9899
+ "application/json": {
9900
+ data: components["schemas"]["AssignmentResponseDto"];
9901
+ };
7604
9902
  };
7605
9903
  };
7606
9904
  /** @description System roles cannot be assigned to identities — they are reserved for platform administration */
@@ -7772,7 +10070,9 @@ interface operations {
7772
10070
  [name: string]: unknown;
7773
10071
  };
7774
10072
  content: {
7775
- "application/json": components["schemas"]["MessageResponseDto"];
10073
+ "application/json": {
10074
+ data: components["schemas"]["MessageResponseDto"];
10075
+ };
7776
10076
  };
7777
10077
  };
7778
10078
  /** @description System roles cannot be assigned to identities — they are reserved for platform administration */
@@ -7970,7 +10270,7 @@ interface operations {
7970
10270
  to?: string;
7971
10271
  /** @description Filter by one or more action keys. Repeat the query param (`?action=a&action=b`) or pass a comma-separated string. */
7972
10272
  action?: string[];
7973
- category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown";
10273
+ category?: "auth" | "identity" | "admin_user" | "tenancy" | "hierarchy" | "organization" | "rbac" | "authorization" | "api_keys" | "oauth" | "webhooks" | "invites" | "mfa" | "audit" | "billing" | "sso" | "unknown";
7974
10274
  severity?: "info" | "notice" | "warning" | "critical";
7975
10275
  outcome?: "success" | "failure" | "denied";
7976
10276
  actor_id?: string;
@@ -8160,7 +10460,9 @@ interface operations {
8160
10460
  [name: string]: unknown;
8161
10461
  };
8162
10462
  content: {
8163
- "application/json": components["schemas"]["ExportJobDto"];
10463
+ "application/json": {
10464
+ data: components["schemas"]["ExportJobDto"];
10465
+ };
8164
10466
  };
8165
10467
  };
8166
10468
  /** @description Invalid or expired token */
@@ -8224,7 +10526,9 @@ interface operations {
8224
10526
  [name: string]: unknown;
8225
10527
  };
8226
10528
  content: {
8227
- "application/json": components["schemas"]["ExportJobDto"];
10529
+ "application/json": {
10530
+ data: components["schemas"]["ExportJobDto"];
10531
+ };
8228
10532
  };
8229
10533
  };
8230
10534
  /** @description Invalid or expired token */
@@ -8392,7 +10696,9 @@ interface operations {
8392
10696
  [name: string]: unknown;
8393
10697
  };
8394
10698
  content: {
8395
- "application/json": components["schemas"]["AuditLogDetailResponseDto"];
10699
+ "application/json": {
10700
+ data: components["schemas"]["AuditLogDetailResponseDto"];
10701
+ };
8396
10702
  };
8397
10703
  };
8398
10704
  /** @description Invalid or expired token */
@@ -8569,7 +10875,9 @@ interface operations {
8569
10875
  [name: string]: unknown;
8570
10876
  };
8571
10877
  content: {
8572
- "application/json": components["schemas"]["HierarchySchemaResponseDto"];
10878
+ "application/json": {
10879
+ data: components["schemas"]["HierarchySchemaResponseDto"];
10880
+ };
8573
10881
  };
8574
10882
  };
8575
10883
  /** @description Invalid or expired token */
@@ -8639,7 +10947,9 @@ interface operations {
8639
10947
  [name: string]: unknown;
8640
10948
  };
8641
10949
  content: {
8642
- "application/json": components["schemas"]["HierarchySchemaResponseDto"];
10950
+ "application/json": {
10951
+ data: components["schemas"]["HierarchySchemaResponseDto"];
10952
+ };
8643
10953
  };
8644
10954
  };
8645
10955
  /** @description Invalid or expired token */
@@ -8802,7 +11112,9 @@ interface operations {
8802
11112
  [name: string]: unknown;
8803
11113
  };
8804
11114
  content: {
8805
- "application/json": components["schemas"]["WebhookCreatedResponseDto"];
11115
+ "application/json": {
11116
+ data: components["schemas"]["WebhookCreatedResponseDto"];
11117
+ };
8806
11118
  };
8807
11119
  };
8808
11120
  /** @description One or more event types are not supported */
@@ -9050,7 +11362,9 @@ interface operations {
9050
11362
  [name: string]: unknown;
9051
11363
  };
9052
11364
  content: {
9053
- "application/json": components["schemas"]["WebhookResponseDto"];
11365
+ "application/json": {
11366
+ data: components["schemas"]["WebhookResponseDto"];
11367
+ };
9054
11368
  };
9055
11369
  };
9056
11370
  /** @description Invalid or expired token */
@@ -9222,7 +11536,9 @@ interface operations {
9222
11536
  [name: string]: unknown;
9223
11537
  };
9224
11538
  content: {
9225
- "application/json": components["schemas"]["WebhookResponseDto"];
11539
+ "application/json": {
11540
+ data: components["schemas"]["WebhookResponseDto"];
11541
+ };
9226
11542
  };
9227
11543
  };
9228
11544
  /** @description One or more event types are not supported */
@@ -9406,7 +11722,9 @@ interface operations {
9406
11722
  [name: string]: unknown;
9407
11723
  };
9408
11724
  content: {
9409
- "application/json": components["schemas"]["ApiKeyCreatedResponseDto"];
11725
+ "application/json": {
11726
+ data: components["schemas"]["ApiKeyCreatedResponseDto"];
11727
+ };
9410
11728
  };
9411
11729
  };
9412
11730
  /** @description Invalid or expired token */
@@ -9557,7 +11875,9 @@ interface operations {
9557
11875
  [name: string]: unknown;
9558
11876
  };
9559
11877
  content: {
9560
- "application/json": components["schemas"]["ApiKeyResponseDto"];
11878
+ "application/json": {
11879
+ data: components["schemas"]["ApiKeyResponseDto"];
11880
+ };
9561
11881
  };
9562
11882
  };
9563
11883
  /** @description Invalid or expired token */
@@ -9642,7 +11962,9 @@ interface operations {
9642
11962
  [name: string]: unknown;
9643
11963
  };
9644
11964
  content: {
9645
- "application/json": components["schemas"]["ApiKeyCreatedResponseDto"];
11965
+ "application/json": {
11966
+ data: components["schemas"]["ApiKeyCreatedResponseDto"];
11967
+ };
9646
11968
  };
9647
11969
  };
9648
11970
  /** @description Invalid or expired token */
@@ -9829,8 +12151,8 @@ declare class Assignments {
9829
12151
  /** Same partial-success contract as `bulkCreate`. */
9830
12152
  bulkChangeRole(input: RequestBody<"ApiAssignmentsController_bulkChangeRole">): Promise<ResponseBody<"ApiAssignmentsController_bulkChangeRole">>;
9831
12153
  }
9832
- type AssignmentItem = ItemOf$3<ResponseBody<"ApiAssignmentsController_listAppWideAssignments">>;
9833
- type ItemOf$3<T> = T extends {
12154
+ type AssignmentItem = ItemOf$4<ResponseBody<"ApiAssignmentsController_listAppWideAssignments">>;
12155
+ type ItemOf$4<T> = T extends {
9834
12156
  items: (infer Item)[];
9835
12157
  } ? Item : never;
9836
12158
 
@@ -9871,9 +12193,71 @@ declare class Identities {
9871
12193
  */
9872
12194
  permissions(id: string): Promise<ResponseBody<"ApiIdentitiesController_getIdentityPermissions">>;
9873
12195
  }
9874
- type IdentityItem = ItemOf$2<ResponseBody<"ApiIdentitiesController_listIdentities">>;
12196
+ type IdentityItem = ItemOf$3<ResponseBody<"ApiIdentitiesController_listIdentities">>;
9875
12197
  /** One role grant from an identity's assignments collection. */
9876
- type IdentityAssignmentItem = ItemOf$2<ResponseBody<"ApiIdentitiesController_getIdentityAssignments">>;
12198
+ type IdentityAssignmentItem = ItemOf$3<ResponseBody<"ApiIdentitiesController_getIdentityAssignments">>;
12199
+ type ItemOf$3<T> = T extends {
12200
+ items: (infer Item)[];
12201
+ } ? Item : never;
12202
+
12203
+ /**
12204
+ * Tenant organizations: one per business customer, a role per membership,
12205
+ * each with its own authentication policy and identity provider. Every
12206
+ * call here needs the Environment's organizations container switched on.
12207
+ */
12208
+ declare class Organizations {
12209
+ private readonly client;
12210
+ constructor(client: CanopyClient);
12211
+ list(query?: QueryParams<"ApiOrganizationsController_listOrganizations">): Paginator<OrganizationItem>;
12212
+ get(id: string): Promise<ResponseBody<"ApiOrganizationsController_getOrganization">>;
12213
+ create(input: RequestBody<"ApiOrganizationsController_createOrganization">): Promise<ResponseBody<"ApiOrganizationsController_createOrganization">>;
12214
+ /**
12215
+ * Pass `ifMatch` with the organization's current `version` to make a
12216
+ * read-modify-write safe — a concurrent edit answers 409 instead of being
12217
+ * silently overwritten.
12218
+ */
12219
+ update(id: string, input: RequestBody<"ApiOrganizationsController_updateOrganization">, options?: ConcurrencyOptions): Promise<ResponseBody<"ApiOrganizationsController_updateOrganization">>;
12220
+ /**
12221
+ * Removes the organization with its memberships, pending invitations,
12222
+ * policy, connection bindings, and the tree beneath it. Member identities
12223
+ * survive.
12224
+ */
12225
+ delete(id: string, options?: ConcurrencyOptions): Promise<void>;
12226
+ /** Empties the container: every organization goes, the step before switching it off. */
12227
+ deleteAll(): Promise<void>;
12228
+ listMembers(id: string, query?: QueryParams<"ApiOrganizationsController_listMembers">): Paginator<OrganizationMemberItem>;
12229
+ addMember(id: string, input: RequestBody<"ApiOrganizationsController_addMember">): Promise<ResponseBody<"ApiOrganizationsController_addMember">>;
12230
+ changeMemberRole(id: string, identityId: string, input: RequestBody<"ApiOrganizationsController_changeMemberRole">): Promise<ResponseBody<"ApiOrganizationsController_changeMemberRole">>;
12231
+ /** Revokes that organization's one role; the identity and its other memberships are untouched. */
12232
+ removeMember(id: string, identityId: string): Promise<void>;
12233
+ listInvites(id: string, query?: QueryParams<"ApiOrganizationsController_listInvites">): Paginator<OrganizationInviteItem>;
12234
+ createInvite(id: string, input: RequestBody<"ApiOrganizationsController_createInvite">): Promise<ResponseBody<"ApiOrganizationsController_createInvite">>;
12235
+ revokeInvite(id: string, inviteId: string): Promise<void>;
12236
+ /**
12237
+ * The organization's own values (null inherits), the Environment baseline
12238
+ * they tighten from, and the effective policy its members sign in under.
12239
+ */
12240
+ getPolicy(id: string): Promise<ResponseBody<"ApiOrganizationsController_getPolicy">>;
12241
+ /**
12242
+ * Can only tighten the Environment: a value that would loosen it answers
12243
+ * 400 `organization.policy_loosens`. Pass `ifMatch` with the policy's
12244
+ * `version` (0 until the organization sets one) for a safe
12245
+ * read-modify-write.
12246
+ */
12247
+ updatePolicy(id: string, input: RequestBody<"ApiOrganizationsController_updatePolicy">, options?: ConcurrencyOptions): Promise<ResponseBody<"ApiOrganizationsController_updatePolicy">>;
12248
+ listSsoConnections(id: string): Promise<ResponseBody<"ApiOrganizationsController_listSsoConnections">>;
12249
+ /**
12250
+ * Sign-ins through the connection then land in this organization, joining
12251
+ * as a member with `default_role_id`. The connection must already be bound
12252
+ * to the organization's Environment, and a connection binds to one
12253
+ * organization per Environment.
12254
+ */
12255
+ bindSsoConnection(id: string, input: RequestBody<"ApiOrganizationsController_bindSsoConnection">): Promise<ResponseBody<"ApiOrganizationsController_bindSsoConnection">>;
12256
+ unbindSsoConnection(id: string, connectionId: string): Promise<void>;
12257
+ }
12258
+ type OrganizationItem = ItemOf$2<ResponseBody<"ApiOrganizationsController_listOrganizations">>;
12259
+ type OrganizationMemberItem = ItemOf$2<ResponseBody<"ApiOrganizationsController_listMembers">>;
12260
+ type OrganizationInviteItem = ItemOf$2<ResponseBody<"ApiOrganizationsController_listInvites">>;
9877
12261
  type ItemOf$2<T> = T extends {
9878
12262
  items: (infer Item)[];
9879
12263
  } ? Item : never;
@@ -9980,7 +12364,7 @@ type ItemOf<T> = T extends {
9980
12364
  * ```
9981
12365
  *
9982
12366
  * `client` is public because the wrapped resources cover the paths integrators
9983
- * hit most, not all 81 operations. Anything not wrapped is still reachable —
12367
+ * hit most, not all 102 operations. Anything not wrapped is still reachable —
9984
12368
  * `canopy.client.request("GET", "/api/v1/audit-events")` — with the same
9985
12369
  * envelope handling, typed errors and retry policy, so no endpoint is a dead
9986
12370
  * end while the ergonomic surface catches up.
@@ -9991,6 +12375,7 @@ declare class Canopy {
9991
12375
  readonly identities: Identities;
9992
12376
  readonly roles: Roles;
9993
12377
  readonly assignments: Assignments;
12378
+ readonly organizations: Organizations;
9994
12379
  constructor(options: CanopyClientOptions);
9995
12380
  }
9996
12381
 
@@ -10075,10 +12460,26 @@ declare class LocalAuthorizer {
10075
12460
  /** Counters for observability — how much traffic the cache is actually saving. */
10076
12461
  snapshot(): LocalAuthorizerStats;
10077
12462
  /**
10078
- * Drop everything held. Not needed in normal operation, where entries expire
10079
- * on their own; useful in tests and after a known change.
12463
+ * Drop what is held so the next evaluate refetches.
12464
+ *
12465
+ * With an `identityId`, only that identity's grants are dropped — the
12466
+ * cached hierarchy and every other identity's entries stay warm. This is
12467
+ * the shape an assignment webhook wants: the event names the identity
12468
+ * whose authority moved, and nothing else needs to pay a refetch for it.
12469
+ *
12470
+ * With no argument, everything goes: grants and the hierarchy tree. Not
12471
+ * needed in normal operation, where entries expire on their own; useful in
12472
+ * tests and after a change whose reach you cannot name (a role's
12473
+ * permissions edited, a node moved).
12474
+ *
12475
+ * Multi-instance honesty: an invalidation reaches THIS process only. A
12476
+ * webhook lands on one instance behind a load balancer; the others serve
12477
+ * their cached grants until their own TTL expires. Unless the app fans the
12478
+ * event out over its own pub/sub, the fleet-wide revocation guarantee is
12479
+ * the TTL, and webhook-driven invalidation is a latency optimization on
12480
+ * top of it — size the TTL to the revocation latency you can promise.
10080
12481
  */
10081
- invalidate(): void;
12482
+ invalidate(identityId?: string): void;
10082
12483
  /** Climb from `nodeId` and look for a grant root among its ancestors. */
10083
12484
  private holdsAtNode;
10084
12485
  private grantRootsFor;
@@ -10315,8 +12716,54 @@ interface CanopyTokenClaims {
10315
12716
  permissions?: string[];
10316
12717
  /** True when `permissions` was truncated; query the API for the full set. */
10317
12718
  permissions_overflow?: boolean;
12719
+ /**
12720
+ * How the session was proven: `pwd`, `otp`, or `sso`, plus `mfa` once a
12721
+ * second factor was verified. Identity tokens carry it; check for `mfa`
12722
+ * before allowing a sensitive action.
12723
+ */
12724
+ amr?: string[];
12725
+ /**
12726
+ * The organization this session is acting in — present only on identity
12727
+ * tokens from an Environment with the organizations container on, for an
12728
+ * identity that belongs to at least one organization. Always minted
12729
+ * together with `org_role`; read the pair through {@link orgContext}
12730
+ * rather than separately.
12731
+ */
12732
+ org_id?: string;
12733
+ /** The name of the single role the identity holds in `org_id`. */
12734
+ org_role?: string;
10318
12735
  [claim: string]: unknown;
10319
12736
  }
12737
+ /**
12738
+ * The organization context a verified token carries: which organization the
12739
+ * session is acting in, and the one role it holds there.
12740
+ */
12741
+ interface CanopyOrgContext {
12742
+ /** The organization's id — also a hierarchy node id, usable as `node_id`. */
12743
+ orgId: string;
12744
+ /** The role's name (not its id): what `org_role` carries. */
12745
+ orgRole: string;
12746
+ }
12747
+ /**
12748
+ * The organization context of a verified token, or `null` when it has none.
12749
+ *
12750
+ * `null` is an ordinary answer, not a failure: it is every token from an
12751
+ * Environment without the organizations container on, and every identity
12752
+ * that belongs to no organization yet. Branch on it rather than on the raw claims —
12753
+ * Canopy mints `org_id` and `org_role` together, and this helper refuses a
12754
+ * half-present pair instead of letting one claim be read as though the other
12755
+ * were there.
12756
+ *
12757
+ * ```ts
12758
+ * const claims = await verifier.verify(token);
12759
+ * const org = orgContext(claims);
12760
+ *
12761
+ * if (org) {
12762
+ * // acting inside org.orgId as org.orgRole
12763
+ * }
12764
+ * ```
12765
+ */
12766
+ declare function orgContext(claims: CanopyTokenClaims): CanopyOrgContext | null;
10320
12767
  declare class TokenVerifier {
10321
12768
  private readonly issuer;
10322
12769
  private readonly audience;
@@ -10376,4 +12823,4 @@ declare class TokenVerifier {
10376
12823
  private fetchKeys;
10377
12824
  }
10378
12825
 
10379
- export { type AssignmentItem, Assignments, type CallOptions, Canopy, CanopyAuthorizerError, CanopyClient, type CanopyClientOptions, CanopyConnectionError, CanopyError, type CanopyErrorBody, type CanopyTokenClaims, CanopyTokenError, type Collection, type ConcurrencyOptions, type ConditionalResult, type CursorPagination, Identities, type IdentityAssignmentItem, type IdentityItem, type LocalAuthorizationQuery, LocalAuthorizer, type LocalAuthorizerOptions, type LocalAuthorizerStats, type OffsetPagination, type OperationId, type PageFetcher, type PageParams, type PaginateOptions, type Pagination, Paginator, type PartialSuccess, type PermissionItem, Permissions, type QueryParams, type RequestBody, type RequestOptions, type ResponseBody, type RoleItem, Roles, type Schema, TokenVerifier, type TokenVerifierOptions, type components, isCanopyAuthorizerError, isCanopyConnectionError, isCanopyError, isCanopyTokenError, isCursorPagination, type operations, paginate, type paths, withConcurrency };
12826
+ export { type AssignmentItem, Assignments, type CallOptions, Canopy, CanopyAuthorizerError, CanopyClient, type CanopyClientOptions, CanopyConnectionError, CanopyError, type CanopyErrorBody, type CanopyOrgContext, type CanopyTokenClaims, CanopyTokenError, type Collection, type ConcurrencyOptions, type ConditionalResult, type CursorPagination, Identities, type IdentityAssignmentItem, type IdentityItem, type LocalAuthorizationQuery, LocalAuthorizer, type LocalAuthorizerOptions, type LocalAuthorizerStats, type OffsetPagination, type OperationId, type OrganizationInviteItem, type OrganizationItem, type OrganizationMemberItem, Organizations, type PageFetcher, type PageParams, type PaginateOptions, type Pagination, Paginator, type PartialSuccess, type PermissionItem, Permissions, type QueryParams, type RequestBody, type RequestOptions, type ResponseBody, type RoleItem, Roles, type Schema, TokenVerifier, type TokenVerifierOptions, type components, isCanopyAuthorizerError, isCanopyConnectionError, isCanopyError, isCanopyTokenError, isCursorPagination, type operations, orgContext, paginate, type paths, withConcurrency };