@canopy-io/node 0.8.0 → 0.10.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
@@ -378,7 +378,7 @@ interface paths {
378
378
  put?: never;
379
379
  /**
380
380
  * Bulk evaluate authorization
381
- * @description Evaluates many permission checks in a single request, returning a `{ items }` array of decisions in the same order as the input `checks`, each with the same shape as the single evaluate endpoint. Every check is resolved independently against its own `identity_id`, `permission`, and `scope` (`node` lineage walk or `app_wide`). Scoped API keys must carry the evaluate scope (`403` otherwise). Rate-limited to 500 requests/minute.
381
+ * @description Evaluates up to 100 permission checks in a single request (more is refused with `400`), returning a `{ items }` array of decisions in the same order as the input `checks`, each with the same shape as the single evaluate endpoint. Every check is resolved independently against its own `identity_id`, `permission`, and `scope` (`node` lineage walk or `app_wide`). Scoped API keys must carry the evaluate scope (`403` otherwise). Rate-limited to 500 requests/minute.
382
382
  */
383
383
  post: operations["ApiPermissionsController_evaluateBulk"];
384
384
  delete?: never;
@@ -588,7 +588,7 @@ interface paths {
588
588
  };
589
589
  /**
590
590
  * List an identity's active sessions (admin)
591
- * @description Lists an identity's active sessions in the caller's Environment (server-to-server admin): the rows a customer reads to confirm from its own side that a sign-out took, or to show a person where they are signed in. Each row is a session's current refresh token, so `id` changes on every refresh. Sessions the identity holds in its other Environments are not listed. Returns `404` when the identity has no membership in this Environment.
591
+ * @description Lists one page of an identity's active sessions in the caller's Environment (server-to-server admin), newest first, taking `page` and `take` only: the rows a customer reads to confirm from its own side that a sign-out took, or to show a person where they are signed in. Each row is a session's current refresh token, so `id` changes on every refresh. Sessions the identity holds in its other Environments are not listed. Returns `404` when the identity has no membership in this Environment.
592
592
  */
593
593
  get: operations["ApiIdentitiesController_listIdentitySessions"];
594
594
  put?: never;
@@ -768,7 +768,7 @@ interface paths {
768
768
  };
769
769
  /**
770
770
  * Get where an identity holds each permission
771
- * @description Returns, for the current Environment, every permission the identity holds mapped to the hierarchy nodes its grants were made at — the nodes themselves, **not** expanded through their descendants. A grant already means "this node and everything beneath it", so a caller answers a node-scoped question by walking up from the node in question and looking for one of these roots, using a copy of the tree fetched once from `GET /api/v1/nodes` and shared across identities. Answers both scopes without a further call: the permission appearing at all is the Application-wide answer, and the walk is the node-scoped one. Scheduled assignments outside their effective window are excluded. Returns `404` when the identity has no membership in this Environment.
771
+ * @description Returns, for the current Environment, one page of `(permission, node_id)` rows: every permission the identity holds, paired with each hierarchy node its grants were made at — the nodes themselves, **not** expanded through their descendants. Rows are ordered by permission, then node; a caller building the whole map walks every page. A grant already means "this node and everything beneath it", so a caller answers a node-scoped question by walking up from the node in question and looking for one of these roots, using a copy of the parent edges fetched once from `GET /api/v1/nodes/parents` and shared across identities. Answers both scopes without a further call: the permission appearing at all is the Application-wide answer, and the walk is the node-scoped one. Scheduled assignments outside their effective window are excluded. Returns `404` when the identity has no membership in this Environment.
772
772
  */
773
773
  get: operations["ApiIdentitiesController_getIdentityGrants"];
774
774
  put?: never;
@@ -891,8 +891,8 @@ interface paths {
891
891
  cookie?: never;
892
892
  };
893
893
  /**
894
- * List hierarchy (scoped tree)
895
- * @description Returns the caller's accessible hierarchy as a nested tree for the current Environment, each node annotated with `access_state`, `can_access`, and `can_manage`. `user` principals (dashboard), which need the Console capability covering `hierarchy.view`, see the full tree; API-key principals see only the subtree their `access_mode`/scopes grant — `full_access` unlocks everything, while scoped keys see nodes reachable via `hierarchy.view`. The response also includes a `scope` block listing `accessible_node_ids`, `scope_root_node_ids`, and `entry_node_ids`.
894
+ * List hierarchy nodes (scoped, paged)
895
+ * @description Returns one page of the caller's hierarchy for the current Environment as a flat list, each node carrying its `parent_node_id` and annotated with `access_state`, `can_access`, `can_manage` and its identity counts. A caller rebuilding the tree walks every page and links each node to its parent; a node whose parent is not in the listing is a top of the caller's scope. `user` principals (dashboard), which need the Console capability covering `hierarchy.view`, see every node; API-key principals see only what their `access_mode`/scopes grant — `full_access` unlocks everything, while scoped keys see nodes reachable via `hierarchy.view`. `context_only` nodes are the ancestors shown as the path to the caller's scope. Searches names and slugs with `q`; sorts by `name` or `created` (default, oldest first).
896
896
  */
897
897
  get: operations["ApiNodesController_listNodes"];
898
898
  put?: never;
@@ -916,7 +916,7 @@ interface paths {
916
916
  };
917
917
  /**
918
918
  * List the hierarchy as parent edges
919
- * @description Returns the same hierarchy `GET /api/v1/nodes` describes, scoped identically, but as a flat list of `{ id, parent_node_id }` and nothing else. Intended for a client that evaluates authorization locally: it walks upward from a node and reads none of the tree's names, statuses, access flags or counts. At fifty thousand nodes the tree is roughly 18.6 MB against 4 MB of edges, on a read that runs at every consuming process's startup. Supports the same `If-None-Match` revalidation, with a validator distinct from the tree's — a tag from one representation never satisfies a request for the other.
919
+ * @description Returns the same hierarchy `GET /api/v1/nodes` describes, scoped identically, but as `{ id, parent_node_id }` pairs and nothing else, one page at a time, ordered by node id. Intended for a client that evaluates authorization locally: it walks every page into a child-to-parent map and reads none of the nodes' names, statuses, access flags or counts. At fifty thousand nodes the full listing is roughly 18.6 MB against 4 MB of edges, on a read that runs at every consuming process's startup. Supports the same `If-None-Match` revalidation, with a validator distinct from the node listing's and from every other page's: a tag from one representation or page never satisfies a request for another. A `304` on the first page means the whole hierarchy is unchanged.
920
920
  */
921
921
  get: operations["ApiNodesController_listNodeParents"];
922
922
  put?: never;
@@ -964,7 +964,7 @@ interface paths {
964
964
  };
965
965
  /**
966
966
  * Get subtree from a node
967
- * @description Returns the subtree rooted at the given node as a nested structure, drawn from the caller's accessible hierarchy in the current Environment. The node must be within the caller's accessible scope (otherwise `403`); a node id that resolves but is absent from the scoped tree returns `404`. Each node carries the same access annotations as the full tree listing.
967
+ * @description Returns one page of the given node and its descendants within the caller's scope in the current Environment, flat, each node carrying its `parent_node_id` and the same access annotations and counts as `GET /api/v1/nodes`. The node must be within the caller's accessible scope (otherwise `403`). Searches names and slugs with `q`; sorts by `name` or `created` (default, oldest first).
968
968
  */
969
969
  get: operations["ApiNodesController_getSubtree"];
970
970
  put?: never;
@@ -1004,7 +1004,7 @@ interface paths {
1004
1004
  };
1005
1005
  /**
1006
1006
  * Get direct children of a node
1007
- * @description Returns the direct children of a node as an `items` array (one level only, not the full subtree), scoped to the current Environment. The node must be within the caller's accessible scope, otherwise `403` is returned.
1007
+ * @description Returns one page of a node's direct children (one level only, not the full subtree) in the current Environment. The node must be within the caller's accessible scope, otherwise `403` is returned. Searches names and slugs with `q`; sorts by `name` or `created` (default, oldest first).
1008
1008
  */
1009
1009
  get: operations["ApiNodesController_getChildren"];
1010
1010
  put?: never;
@@ -1338,7 +1338,7 @@ interface paths {
1338
1338
  put?: never;
1339
1339
  /**
1340
1340
  * Add a member to an organization
1341
- * @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`.
1341
+ * @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`. An organization's own administrator, signed in with an identity token and admitted by `canopy:organization.manage` alone, is refused with `403` (`organization.member_add_requires_invite`): the person never agreed to join, so the administrator invites them instead.
1342
1342
  */
1343
1343
  post: operations["ApiOrganizationsController_addMember"];
1344
1344
  delete?: never;
@@ -1382,7 +1382,7 @@ interface paths {
1382
1382
  put?: never;
1383
1383
  /**
1384
1384
  * Reset a member's multi-factor authentication
1385
- * @description The organization's own administrator, or the developer, clears a member's multi-factor enrolment: every factor, the recovery codes and the trusted devices, so the person enrols afresh at their next sign-in. For a member who lost their authenticator. Sessions already open are left alone. Audited as `identity.mfa.admin.forced_reset`. Returns `404` when the identity is not a member. Responds `204 No Content`; requires `hierarchy.manage` or `canopy:organization.manage` at the organization.
1385
+ * @description The organization's own administrator, or the developer, clears a member's multi-factor enrolment: every factor and the recovery codes, held once per identity, and the devices trusted in this Environment, so the person enrols afresh at their next sign-in. For a member who lost their authenticator. Sessions already open are left alone. Audited as `identity.mfa.admin.forced_reset`. Returns `404` when the identity is not a member. Responds `204 No Content`; requires `hierarchy.manage` or `canopy:organization.manage` at the organization.
1386
1386
  */
1387
1387
  post: operations["ApiOrganizationsController_resetMemberMfa"];
1388
1388
  delete?: never;
@@ -1752,7 +1752,7 @@ interface paths {
1752
1752
  };
1753
1753
  /**
1754
1754
  * List the groups an organization's provider has pushed
1755
- * @description Pushed groups returned, each with its role mapping and member count
1755
+ * @description One page of pushed groups, each with its role mapping and member count, by display name unless sorted (`sort_by` `name` or `created`); `q` searches display names and external ids
1756
1756
  */
1757
1757
  get: operations["ApiOrganizationDirectoryGroupsController_list"];
1758
1758
  put?: never;
@@ -2270,7 +2270,7 @@ interface paths {
2270
2270
  put?: never;
2271
2271
  /**
2272
2272
  * Register a new OAuth client
2273
- * @description Registers a new confidential OAuth client in the current Environment with the given `name`, `redirect_uris`, and optional `scopes` (defaulting to `openid profile email`). Generates the `client_id` and a `client_secret` that is bcrypt-hashed at rest; the raw secret is returned in this response only and is never retrievable again. Responds `201 Created`.
2273
+ * @description Registers a new confidential OAuth client in the current Environment with the given `name`, `redirect_uris`, and optional `scopes` (defaulting to `openid profile email`), each one of `openid`, `profile`, `email`, `org` and `permissions`; any other value is refused with `400` (`oauth.client_scope_unknown`). Generates the `client_id` and a `client_secret` that is bcrypt-hashed at rest; the raw secret is returned in this response only and is never retrievable again. Responds `201 Created`.
2274
2274
  */
2275
2275
  post: operations["ApiOAuthClientsController_create"];
2276
2276
  delete?: never;
@@ -2322,7 +2322,7 @@ interface paths {
2322
2322
  head?: never;
2323
2323
  /**
2324
2324
  * Update OAuth client
2325
- * @description Updates an OAuth client's mutable fields (`name`, `redirect_uris`, `post_logout_redirect_uris`, `backchannel_logout_uri`, `scopes`, `is_active`, `invite_redirect_url`, `initiate_login_uri`), scoped to the current Environment. Returns the updated client, or `404` when the client is not found in this Environment. The secret is not rotated here.
2325
+ * @description Updates an OAuth client's mutable fields (`name`, `redirect_uris`, `post_logout_redirect_uris`, `backchannel_logout_uri`, `scopes`, `is_active`, `invite_redirect_url`, `initiate_login_uri`), scoped to the current Environment. A `scopes` value outside `openid`, `profile`, `email`, `org` and `permissions` is refused with `400` (`oauth.client_scope_unknown`). Returns the updated client, or `404` when the client is not found in this Environment. The secret is not rotated here.
2326
2326
  */
2327
2327
  patch: operations["ApiOAuthClientsController_update"];
2328
2328
  trace?: never;
@@ -2383,14 +2383,14 @@ interface paths {
2383
2383
  post?: never;
2384
2384
  /**
2385
2385
  * Delete an API key
2386
- * @description Permanently deletes an API key from the active Environment. The row is removed entirely rather than just disabled, so the key can never authenticate again and disappears from listings; the lifecycle remains traceable in the audit log. Returns `204 No Content` on success and `404` when no key with the given id exists in the active Environment.
2386
+ * @description Permanently deletes an API key from the active Environment. The row is removed entirely rather than just disabled, so the key can never authenticate again and disappears from listings; the lifecycle remains traceable in the audit log. Returns `204 No Content` on success and `404` when no key with the given id exists in the active Environment. A scoped API key can act only on scoped keys whose scopes it holds itself; any other key is refused with `403`.
2387
2387
  */
2388
2388
  delete: operations["ApiApiKeysController_delete"];
2389
2389
  options?: never;
2390
2390
  head?: never;
2391
2391
  /**
2392
2392
  * Activate or deactivate an API key
2393
- * @description Enables or disables an existing API key in the current Environment via the `is_active` flag. Disabling is reversible: a disabled key is rejected by authentication immediately and can be re-enabled later. Returns the key's metadata with no secret. Returns `404` when no key with the given id exists in the active Environment.
2393
+ * @description Enables or disables an existing API key in the current Environment via the `is_active` flag. Disabling is reversible: a disabled key is rejected by authentication immediately and can be re-enabled later. Returns the key's metadata with no secret. Returns `404` when no key with the given id exists in the active Environment. A scoped API key can act only on scoped keys whose scopes it holds itself; any other key is refused with `403`.
2394
2394
  */
2395
2395
  patch: operations["ApiApiKeysController_update"];
2396
2396
  trace?: never;
@@ -2406,7 +2406,7 @@ interface paths {
2406
2406
  put?: never;
2407
2407
  /**
2408
2408
  * Rotate an API key's secret
2409
- * @description Rotates the secret of an existing API key in place, minting a brand-new `cnpy_`-prefixed value for the same row while preserving its id, name, `scopes`, `access_mode`, expiry, and audit lineage. The previous secret is invalidated immediately and the new plaintext is returned exactly once in the `key` field. `is_active` is left untouched — rotating does not re-enable a disabled key. Returns `404` when no key with the given id exists in the active Environment.
2409
+ * @description Rotates the secret of an existing API key in place, minting a brand-new `cnpy_`-prefixed value for the same row while preserving its id, name, `scopes`, `access_mode`, expiry, and audit lineage. The previous secret is invalidated immediately and the new plaintext is returned exactly once in the `key` field. `is_active` is left untouched — rotating does not re-enable a disabled key. Returns `404` when no key with the given id exists in the active Environment. A scoped API key can act only on scoped keys whose scopes it holds itself; any other key is refused with `403`.
2410
2410
  */
2411
2411
  post: operations["ApiApiKeysController_rotateSecret"];
2412
2412
  delete?: never;
@@ -2476,11 +2476,11 @@ interface components {
2476
2476
  allowed: boolean;
2477
2477
  permission: string;
2478
2478
  /**
2479
- * @description Echo of the `scope` the caller asked for. `app_wide` answers are 'matched somewhere in the tree' — never treat them as scoped to a specific node.
2479
+ * @description Echo of the `scope` the caller asked for. `app_wide` answers are 'matched somewhere in the Environment' — never treat them as scoped to a specific node.
2480
2480
  * @enum {string}
2481
2481
  */
2482
2482
  scope_evaluated: "node" | "app_wide";
2483
- /** @description The hierarchy node the decision was anchored to. Always set for `scope_evaluated: "node"`; always null for `scope_evaluated: "app_wide"` because the answer is org-scoped, not node-scoped. */
2483
+ /** @description The hierarchy node the decision was anchored to. Always set for `scope_evaluated: "node"`; always null for `scope_evaluated: "app_wide"` because the answer covers the whole Environment, not one node. */
2484
2484
  effective_node_id?: string | null;
2485
2485
  /** @description Ids of the roles whose assignments produced a node-scoped allow. Always empty for `scope_evaluated: "app_wide"`, whose answer is not tied to a node, and for a deny. */
2486
2486
  granting_roles: string[];
@@ -2491,7 +2491,7 @@ interface components {
2491
2491
  identity_id: string;
2492
2492
  permission: string;
2493
2493
  /**
2494
- * @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.
2494
+ * @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 Environment?' question — useful for UI gating, **never** for resource-scoped enforcement. `node` requires `node_id`; `app_wide` forbids it.
2495
2495
  * @enum {string}
2496
2496
  */
2497
2497
  scope: "node" | "app_wide";
@@ -2503,7 +2503,7 @@ interface components {
2503
2503
  identity_id: string;
2504
2504
  permission: string;
2505
2505
  /**
2506
- * @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.
2506
+ * @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 Environment?' question — useful for UI gating, **never** for resource-scoped enforcement. `node` requires `node_id`; `app_wide` forbids it.
2507
2507
  * @enum {string}
2508
2508
  */
2509
2509
  scope: "node" | "app_wide";
@@ -2511,6 +2511,7 @@ interface components {
2511
2511
  node_id?: string;
2512
2512
  };
2513
2513
  BulkEvaluatePermissionDto: {
2514
+ /** @description Between 1 and 100 checks. More is refused with a 400. */
2514
2515
  checks: components["schemas"]["EvaluateCheckDto"][];
2515
2516
  };
2516
2517
  PermissionTraceAssignmentDto: {
@@ -2741,8 +2742,11 @@ interface components {
2741
2742
  IdentityGrantResponseDto: {
2742
2743
  /** @example reports.view */
2743
2744
  permission: string;
2744
- /** @description Hierarchy node ids the permission was granted at. Not expanded through descendants. */
2745
- nodes: string[];
2745
+ /**
2746
+ * Format: uuid
2747
+ * @description The hierarchy node the permission was granted at. Not expanded through descendants.
2748
+ */
2749
+ node_id: string;
2746
2750
  };
2747
2751
  IdentityInviteResponseDto: {
2748
2752
  id: string;
@@ -2862,7 +2866,7 @@ interface components {
2862
2866
  /** @description Arbitrary metadata */
2863
2867
  metadata?: Record<string, unknown>;
2864
2868
  };
2865
- HierarchyTreeNodeDto: {
2869
+ ScopedNodeResponseDto: {
2866
2870
  id: string;
2867
2871
  name: string;
2868
2872
  /** @description Optional free-text description shown under the node name. */
@@ -2876,7 +2880,6 @@ interface components {
2876
2880
  access_state: "accessible" | "context_only";
2877
2881
  can_access: boolean;
2878
2882
  can_manage: boolean;
2879
- children: components["schemas"]["HierarchyTreeNodeDto"][];
2880
2883
  /** @description Optimistic-lock version. Send back as the `If-Match` header when mutating this node to detect concurrent edits. */
2881
2884
  version: number;
2882
2885
  /** @description Distinct active identities directly assigned at this node (excludes inherited). */
@@ -2884,15 +2887,6 @@ interface components {
2884
2887
  /** @description Distinct active identities inherited from this node's ancestors. */
2885
2888
  inherited_count: number;
2886
2889
  };
2887
- HierarchyScopeDto: {
2888
- accessible_node_ids: string[];
2889
- scope_root_node_ids: string[];
2890
- entry_node_ids: string[];
2891
- };
2892
- ScopedHierarchyTreeResponseDto: {
2893
- tree: components["schemas"]["HierarchyTreeNodeDto"][];
2894
- scope: components["schemas"]["HierarchyScopeDto"];
2895
- };
2896
2890
  NodeParentEdgeResponseDto: {
2897
2891
  id: string;
2898
2892
  /** @description Null for the root node, which has no parent. */
@@ -6276,12 +6270,14 @@ interface operations {
6276
6270
  page?: number;
6277
6271
  /** @description Items per page (1-100, default 20) */
6278
6272
  take?: number;
6279
- /** @description Search term */
6273
+ /** @description Search names and emails */
6280
6274
  q?: string;
6281
- /** @description Column to sort by. Allowed values depend on the endpoint. */
6282
- sort_by?: string;
6275
+ /** @description Sort column. Defaults to `name`, A to Z. */
6276
+ sort_by?: "name" | "email" | "created";
6283
6277
  /** @description Sort direction */
6284
6278
  order?: "asc" | "desc";
6279
+ /** @description Filter by active/inactive status. Omit to show all. */
6280
+ status?: "active" | "inactive";
6285
6281
  };
6286
6282
  header?: never;
6287
6283
  path?: never;
@@ -6474,7 +6470,7 @@ interface operations {
6474
6470
  "application/json": components["schemas"]["ErrorResponseDto"];
6475
6471
  };
6476
6472
  };
6477
- /** @description The email or external_id already belongs to an identity in this Account, or the Account has reached its plan's identity signup ceiling */
6473
+ /** @description The email or external_id already belongs to an identity in this Account, the Account has reached its plan's identity signup ceiling, or the starting role is placed beneath an organization, where a new identity holds no membership yet */
6478
6474
  409: {
6479
6475
  headers: {
6480
6476
  [name: string]: unknown;
@@ -6485,7 +6481,7 @@ interface operations {
6485
6481
  * "error": {
6486
6482
  * "statusCode": 409,
6487
6483
  * "code": null,
6488
- * "message": "The email or external_id already belongs to an identity in this Account, or the Account has reached its plan's identity signup ceiling",
6484
+ * "message": "The email or external_id already belongs to an identity in this Account, the Account has reached its plan's identity signup ceiling, or the starting role is placed beneath an organization, where a new identity holds no membership yet",
6489
6485
  * "timestamp": "2026-04-20T12:00:00.000Z",
6490
6486
  * "path": "/api/v1/identities",
6491
6487
  * "method": "POST"
@@ -6504,16 +6500,16 @@ interface operations {
6504
6500
  page?: number;
6505
6501
  /** @description Items per page (1-100, default 20) */
6506
6502
  take?: number;
6507
- /** @description Search term */
6503
+ /** @description Search names and emails */
6508
6504
  q?: string;
6509
- /** @description Column to sort by. Allowed values depend on the endpoint. */
6510
- sort_by?: string;
6505
+ /** @description Sort column. Defaults to `name`, A to Z. */
6506
+ sort_by?: "name" | "email" | "created";
6511
6507
  /** @description Sort direction */
6512
6508
  order?: "asc" | "desc";
6513
- /** @description Filter by role ID (UUID) or "no_assignment" for unassigned identities */
6514
- role_id?: string;
6515
6509
  /** @description Filter by active/inactive status. Omit to show all. */
6516
6510
  status?: "active" | "inactive";
6511
+ /** @description Filter by role ID (UUID) or "no_assignment" for unassigned identities */
6512
+ role_id?: string;
6517
6513
  };
6518
6514
  header?: never;
6519
6515
  path?: never;
@@ -7495,7 +7491,12 @@ interface operations {
7495
7491
  };
7496
7492
  ApiIdentitiesController_listIdentitySessions: {
7497
7493
  parameters: {
7498
- query?: never;
7494
+ query?: {
7495
+ /** @description Page number (1-based) */
7496
+ page?: number;
7497
+ /** @description Items per page (1-100, default 20) */
7498
+ take?: number;
7499
+ };
7499
7500
  header?: never;
7500
7501
  path: {
7501
7502
  id: string;
@@ -7504,7 +7505,7 @@ interface operations {
7504
7505
  };
7505
7506
  requestBody?: never;
7506
7507
  responses: {
7507
- /** @description Every session the identity holds that is neither revoked nor expired, newest first: the session's current refresh token id (what the per-session revoke takes), when it was signed in and when it expires, the browser's address and user agent, and the organization it is acting in. */
7508
+ /** @description One page of the sessions the identity holds that are neither revoked nor expired, newest first: the session's current refresh token id (what the per-session revoke takes), when it was signed in and when it expires, the browser's address and user agent, and the organization it is acting in. */
7508
7509
  200: {
7509
7510
  headers: {
7510
7511
  [name: string]: unknown;
@@ -7512,6 +7513,7 @@ interface operations {
7512
7513
  content: {
7513
7514
  "application/json": {
7514
7515
  items: components["schemas"]["IdentitySessionResponseDto"][];
7516
+ pagination: components["schemas"]["PageMetaDto"];
7515
7517
  };
7516
7518
  };
7517
7519
  };
@@ -8241,10 +8243,10 @@ interface operations {
8241
8243
  page?: number;
8242
8244
  /** @description Items per page (1-100, default 20) */
8243
8245
  take?: number;
8244
- /** @description Search term */
8246
+ /** @description Search role and node names */
8245
8247
  q?: string;
8246
- /** @description Column to sort by. Allowed values depend on the endpoint. */
8247
- sort_by?: string;
8248
+ /** @description Sort column. Defaults to `created`, oldest first. */
8249
+ sort_by?: "role" | "node" | "created";
8248
8250
  /** @description Sort direction */
8249
8251
  order?: "asc" | "desc";
8250
8252
  };
@@ -8464,7 +8466,12 @@ interface operations {
8464
8466
  };
8465
8467
  ApiIdentitiesController_getIdentityGrants: {
8466
8468
  parameters: {
8467
- query?: never;
8469
+ query?: {
8470
+ /** @description Page number (1-based) */
8471
+ page?: number;
8472
+ /** @description Items per page (1-100, default 20) */
8473
+ take?: number;
8474
+ };
8468
8475
  header?: never;
8469
8476
  path: {
8470
8477
  id: string;
@@ -8473,14 +8480,17 @@ interface operations {
8473
8480
  };
8474
8481
  requestBody?: never;
8475
8482
  responses: {
8476
- /** @description Grant map returned */
8483
+ /** @description One page of grant roots, one row per permission and node, ordered by permission then node */
8477
8484
  200: {
8478
8485
  headers: {
8479
8486
  [name: string]: unknown;
8480
8487
  };
8481
8488
  content: {
8482
8489
  "application/json": {
8490
+ /** @description The version of the authorization model these rows describe. A client that evaluates from them refuses a version it does not know rather than guessing. */
8491
+ model_version: number;
8483
8492
  items: components["schemas"]["IdentityGrantResponseDto"][];
8493
+ pagination: components["schemas"]["PageMetaDto"];
8484
8494
  };
8485
8495
  };
8486
8496
  };
@@ -9244,9 +9254,20 @@ interface operations {
9244
9254
  };
9245
9255
  ApiNodesController_listNodes: {
9246
9256
  parameters: {
9247
- query?: never;
9257
+ query?: {
9258
+ /** @description Page number (1-based) */
9259
+ page?: number;
9260
+ /** @description Items per page (1-100, default 20) */
9261
+ take?: number;
9262
+ /** @description Search node names and slugs */
9263
+ q?: string;
9264
+ /** @description Sort column. Defaults to `created`, oldest first. */
9265
+ sort_by?: "name" | "created";
9266
+ /** @description Sort direction */
9267
+ order?: "asc" | "desc";
9268
+ };
9248
9269
  header?: {
9249
- /** @description An `ETag` from a previous response. Answers `304 Not Modified` when the hierarchy has not changed since, so a client holding a cached tree can revalidate on a short interval without re-reading it. */
9270
+ /** @description An `ETag` from a previous response for the same page and query. Answers `304 Not Modified` when the hierarchy has not changed since, so a client holding a cached copy can revalidate on a short interval without re-reading it. */
9250
9271
  "If-None-Match"?: string;
9251
9272
  };
9252
9273
  path?: never;
@@ -9254,25 +9275,26 @@ interface operations {
9254
9275
  };
9255
9276
  requestBody?: never;
9256
9277
  responses: {
9257
- /** @description Scoped hierarchy tree returned */
9278
+ /** @description One page of the caller's scoped nodes */
9258
9279
  200: {
9259
9280
  headers: {
9260
9281
  [name: string]: unknown;
9261
9282
  };
9262
9283
  content: {
9263
9284
  "application/json": {
9264
- data: components["schemas"]["ScopedHierarchyTreeResponseDto"];
9285
+ items: components["schemas"]["ScopedNodeResponseDto"][];
9286
+ pagination: components["schemas"]["PageMetaDto"];
9265
9287
  };
9266
9288
  };
9267
9289
  };
9268
- /** @description The hierarchy is unchanged since the supplied `ETag`. No body; keep using the cached tree. */
9290
+ /** @description The hierarchy is unchanged since the supplied `ETag`. No body; keep using the cached copy. */
9269
9291
  304: {
9270
9292
  headers: {
9271
9293
  [name: string]: unknown;
9272
9294
  };
9273
9295
  content?: never;
9274
9296
  };
9275
- /** @description The request sent both an `X-API-Key` and an `Authorization` header; send one */
9297
+ /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header */
9276
9298
  400: {
9277
9299
  headers: {
9278
9300
  [name: string]: unknown;
@@ -9283,7 +9305,7 @@ interface operations {
9283
9305
  * "error": {
9284
9306
  * "statusCode": 400,
9285
9307
  * "code": null,
9286
- * "message": "The request sent both an `X-API-Key` and an `Authorization` header; send one",
9308
+ * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header",
9287
9309
  * "timestamp": "2026-04-20T12:00:00.000Z",
9288
9310
  * "path": "/api/v1/nodes",
9289
9311
  * "method": "GET"
@@ -9449,9 +9471,14 @@ interface operations {
9449
9471
  };
9450
9472
  ApiNodesController_listNodeParents: {
9451
9473
  parameters: {
9452
- query?: never;
9474
+ query?: {
9475
+ /** @description Page number (1-based) */
9476
+ page?: number;
9477
+ /** @description Items per page (1-100, default 20) */
9478
+ take?: number;
9479
+ };
9453
9480
  header?: {
9454
- /** @description An `ETag` from a previous response. Answers `304 Not Modified` when the hierarchy has not changed since, so a client holding a cached tree can revalidate on a short interval without re-reading it. */
9481
+ /** @description An `ETag` from a previous response for the same page and query. Answers `304 Not Modified` when the hierarchy has not changed since, so a client holding a cached copy can revalidate on a short interval without re-reading it. */
9455
9482
  "If-None-Match"?: string;
9456
9483
  };
9457
9484
  path?: never;
@@ -9459,25 +9486,28 @@ interface operations {
9459
9486
  };
9460
9487
  requestBody?: never;
9461
9488
  responses: {
9462
- /** @description Parent edges returned */
9489
+ /** @description One page of parent edges, by node id */
9463
9490
  200: {
9464
9491
  headers: {
9465
9492
  [name: string]: unknown;
9466
9493
  };
9467
9494
  content: {
9468
9495
  "application/json": {
9496
+ /** @description The version of the authorization model these rows describe. A client that evaluates from them refuses a version it does not know rather than guessing. */
9497
+ model_version: number;
9469
9498
  items: components["schemas"]["NodeParentEdgeResponseDto"][];
9499
+ pagination: components["schemas"]["PageMetaDto"];
9470
9500
  };
9471
9501
  };
9472
9502
  };
9473
- /** @description The hierarchy is unchanged since the supplied `ETag`. No body; keep using the cached tree. */
9503
+ /** @description The hierarchy is unchanged since the supplied `ETag`. No body; keep using the cached copy. */
9474
9504
  304: {
9475
9505
  headers: {
9476
9506
  [name: string]: unknown;
9477
9507
  };
9478
9508
  content?: never;
9479
9509
  };
9480
- /** @description The request sent both an `X-API-Key` and an `Authorization` header; send one */
9510
+ /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header */
9481
9511
  400: {
9482
9512
  headers: {
9483
9513
  [name: string]: unknown;
@@ -9488,7 +9518,7 @@ interface operations {
9488
9518
  * "error": {
9489
9519
  * "statusCode": 400,
9490
9520
  * "code": null,
9491
- * "message": "The request sent both an `X-API-Key` and an `Authorization` header; send one",
9521
+ * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header",
9492
9522
  * "timestamp": "2026-04-20T12:00:00.000Z",
9493
9523
  * "path": "/api/v1/nodes/parents",
9494
9524
  * "method": "GET"
@@ -9577,7 +9607,7 @@ interface operations {
9577
9607
  * "code": null,
9578
9608
  * "message": "The request sent both an `X-API-Key` and an `Authorization` header; send one",
9579
9609
  * "timestamp": "2026-04-20T12:00:00.000Z",
9580
- * "path": "/api/v1/nodes",
9610
+ * "path": "/api/v1/nodes/{id}",
9581
9611
  * "method": "GET"
9582
9612
  * }
9583
9613
  * }
@@ -9918,7 +9948,18 @@ interface operations {
9918
9948
  };
9919
9949
  ApiNodesController_getSubtree: {
9920
9950
  parameters: {
9921
- query?: never;
9951
+ query?: {
9952
+ /** @description Page number (1-based) */
9953
+ page?: number;
9954
+ /** @description Items per page (1-100, default 20) */
9955
+ take?: number;
9956
+ /** @description Search node names and slugs */
9957
+ q?: string;
9958
+ /** @description Sort column. Defaults to `created`, oldest first. */
9959
+ sort_by?: "name" | "created";
9960
+ /** @description Sort direction */
9961
+ order?: "asc" | "desc";
9962
+ };
9922
9963
  header?: never;
9923
9964
  path: {
9924
9965
  id: string;
@@ -9927,18 +9968,19 @@ interface operations {
9927
9968
  };
9928
9969
  requestBody?: never;
9929
9970
  responses: {
9930
- /** @description Subtree returned */
9971
+ /** @description One page of the node and its descendants in scope */
9931
9972
  200: {
9932
9973
  headers: {
9933
9974
  [name: string]: unknown;
9934
9975
  };
9935
9976
  content: {
9936
9977
  "application/json": {
9937
- data: components["schemas"]["HierarchyTreeNodeDto"];
9978
+ items: components["schemas"]["ScopedNodeResponseDto"][];
9979
+ pagination: components["schemas"]["PageMetaDto"];
9938
9980
  };
9939
9981
  };
9940
9982
  };
9941
- /** @description The request sent both an `X-API-Key` and an `Authorization` header; send one */
9983
+ /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header */
9942
9984
  400: {
9943
9985
  headers: {
9944
9986
  [name: string]: unknown;
@@ -9949,9 +9991,9 @@ interface operations {
9949
9991
  * "error": {
9950
9992
  * "statusCode": 400,
9951
9993
  * "code": null,
9952
- * "message": "The request sent both an `X-API-Key` and an `Authorization` header; send one",
9994
+ * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header",
9953
9995
  * "timestamp": "2026-04-20T12:00:00.000Z",
9954
- * "path": "/api/v1/nodes",
9996
+ * "path": "/api/v1/nodes/{id}/tree",
9955
9997
  * "method": "GET"
9956
9998
  * }
9957
9999
  * }
@@ -10038,7 +10080,7 @@ interface operations {
10038
10080
  * "code": null,
10039
10081
  * "message": "The request sent both an `X-API-Key` and an `Authorization` header; send one",
10040
10082
  * "timestamp": "2026-04-20T12:00:00.000Z",
10041
- * "path": "/api/v1/nodes",
10083
+ * "path": "/api/v1/nodes/{id}",
10042
10084
  * "method": "GET"
10043
10085
  * }
10044
10086
  * }
@@ -10092,7 +10134,18 @@ interface operations {
10092
10134
  };
10093
10135
  ApiNodesController_getChildren: {
10094
10136
  parameters: {
10095
- query?: never;
10137
+ query?: {
10138
+ /** @description Page number (1-based) */
10139
+ page?: number;
10140
+ /** @description Items per page (1-100, default 20) */
10141
+ take?: number;
10142
+ /** @description Search node names and slugs */
10143
+ q?: string;
10144
+ /** @description Sort column. Defaults to `created`, oldest first. */
10145
+ sort_by?: "name" | "created";
10146
+ /** @description Sort direction */
10147
+ order?: "asc" | "desc";
10148
+ };
10096
10149
  header?: never;
10097
10150
  path: {
10098
10151
  id: string;
@@ -10101,7 +10154,7 @@ interface operations {
10101
10154
  };
10102
10155
  requestBody?: never;
10103
10156
  responses: {
10104
- /** @description Children returned */
10157
+ /** @description One page of the node's children */
10105
10158
  200: {
10106
10159
  headers: {
10107
10160
  [name: string]: unknown;
@@ -10109,10 +10162,11 @@ interface operations {
10109
10162
  content: {
10110
10163
  "application/json": {
10111
10164
  items: components["schemas"]["NodeResponseDto"][];
10165
+ pagination: components["schemas"]["PageMetaDto"];
10112
10166
  };
10113
10167
  };
10114
10168
  };
10115
- /** @description The request sent both an `X-API-Key` and an `Authorization` header; send one */
10169
+ /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header */
10116
10170
  400: {
10117
10171
  headers: {
10118
10172
  [name: string]: unknown;
@@ -10123,9 +10177,9 @@ interface operations {
10123
10177
  * "error": {
10124
10178
  * "statusCode": 400,
10125
10179
  * "code": null,
10126
- * "message": "The request sent both an `X-API-Key` and an `Authorization` header; send one",
10180
+ * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range; or the request sent both an `X-API-Key` and an `Authorization` header",
10127
10181
  * "timestamp": "2026-04-20T12:00:00.000Z",
10128
- * "path": "/api/v1/nodes",
10182
+ * "path": "/api/v1/nodes/{id}/children",
10129
10183
  * "method": "GET"
10130
10184
  * }
10131
10185
  * }
@@ -10557,10 +10611,10 @@ interface operations {
10557
10611
  page?: number;
10558
10612
  /** @description Items per page (1-100, default 20) */
10559
10613
  take?: number;
10560
- /** @description Search term */
10614
+ /** @description Search organization names and slugs */
10561
10615
  q?: string;
10562
- /** @description Column to sort by. Allowed values depend on the endpoint. */
10563
- sort_by?: string;
10616
+ /** @description Sort column. Defaults to `name`, A to Z. */
10617
+ sort_by?: "name" | "created";
10564
10618
  /** @description Sort direction */
10565
10619
  order?: "asc" | "desc";
10566
10620
  /** @description Exact match on the organization's `external_id` (your own id for it). Answers one organization or none. */
@@ -12634,10 +12688,10 @@ interface operations {
12634
12688
  page?: number;
12635
12689
  /** @description Items per page (1-100, default 20) */
12636
12690
  take?: number;
12637
- /** @description Search term */
12691
+ /** @description Search member names and emails */
12638
12692
  q?: string;
12639
- /** @description Column to sort by. Allowed values depend on the endpoint. */
12640
- sort_by?: string;
12693
+ /** @description Sort column. Defaults to `created`, oldest membership first. */
12694
+ sort_by?: "name" | "email" | "role" | "created";
12641
12695
  /** @description Sort direction */
12642
12696
  order?: "asc" | "desc";
12643
12697
  /** @description Only members holding this role */
@@ -12819,7 +12873,7 @@ interface operations {
12819
12873
  "application/json": components["schemas"]["ErrorResponseDto"];
12820
12874
  };
12821
12875
  };
12822
- /** @description This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa) */
12876
+ /** @description The caller is an organization administrator signed in as an identity and holds no `rbac.manage_assignments` at the organization; an organization administrator adds people by invitation (`organization.member_add_requires_invite`). Also a caller without the permissions the route needs */
12823
12877
  403: {
12824
12878
  headers: {
12825
12879
  [name: string]: unknown;
@@ -12830,10 +12884,10 @@ interface operations {
12830
12884
  * "error": {
12831
12885
  * "statusCode": 403,
12832
12886
  * "code": null,
12833
- * "message": "This token is not authorized for this endpoint (wrong principal type — e.g., admin token on identity-only endpoint, or vice versa)",
12887
+ * "message": "The caller is an organization administrator signed in as an identity and holds no `rbac.manage_assignments` at the organization; an organization administrator adds people by invitation (`organization.member_add_requires_invite`). Also a caller without the permissions the route needs",
12834
12888
  * "timestamp": "2026-04-20T12:00:00.000Z",
12835
- * "path": "/api/v1/organizations",
12836
- * "method": "GET"
12889
+ * "path": "/api/v1/organizations/{id}/members",
12890
+ * "method": "POST"
12837
12891
  * }
12838
12892
  * }
12839
12893
  */
@@ -13156,7 +13210,7 @@ interface operations {
13156
13210
  };
13157
13211
  requestBody?: never;
13158
13212
  responses: {
13159
- /** @description Factors, recovery codes and trusted devices cleared; the member enrols again at their next sign-in */
13213
+ /** @description Factors and recovery codes cleared, and the devices trusted in this Environment; the member enrols again at their next sign-in */
13160
13214
  204: {
13161
13215
  headers: {
13162
13216
  [name: string]: unknown;
@@ -13247,7 +13301,7 @@ interface operations {
13247
13301
  "application/json": components["schemas"]["ErrorResponseDto"];
13248
13302
  };
13249
13303
  };
13250
- /** @description The caller is an organization administrator and the member also belongs to another organization in the Environment; the second factor is held once per identity, so only the application's administrators may reset it (`organization.member_mfa_shared`) */
13304
+ /** @description The caller is an organization administrator and the member also belongs to another organization, or holds an active membership in another Environment of the Account; the second factor is held once per identity, so only the application's administrators may reset it (`organization.member_mfa_shared`) */
13251
13305
  409: {
13252
13306
  headers: {
13253
13307
  [name: string]: unknown;
@@ -13258,7 +13312,7 @@ interface operations {
13258
13312
  * "error": {
13259
13313
  * "statusCode": 409,
13260
13314
  * "code": null,
13261
- * "message": "The caller is an organization administrator and the member also belongs to another organization in the Environment; the second factor is held once per identity, so only the application's administrators may reset it (`organization.member_mfa_shared`)",
13315
+ * "message": "The caller is an organization administrator and the member also belongs to another organization, or holds an active membership in another Environment of the Account; the second factor is held once per identity, so only the application's administrators may reset it (`organization.member_mfa_shared`)",
13262
13316
  * "timestamp": "2026-04-20T12:00:00.000Z",
13263
13317
  * "path": "/api/v1/organizations/{id}/members/{identityId}/mfa/reset",
13264
13318
  * "method": "POST"
@@ -13279,11 +13333,11 @@ interface operations {
13279
13333
  take?: number;
13280
13334
  /** @description Search term */
13281
13335
  q?: string;
13282
- /** @description Column to sort by. Allowed values depend on the endpoint. */
13283
- sort_by?: string;
13336
+ /** @description Column to sort by. Defaults to `created`, newest first. */
13337
+ sort_by?: "name" | "email" | "created";
13284
13338
  /** @description Sort direction */
13285
13339
  order?: "asc" | "desc";
13286
- /** @description Filter by invitation status */
13340
+ /** @description Filter by invite status */
13287
13341
  status?: "pending" | "accepted" | "revoked" | "expired";
13288
13342
  };
13289
13343
  header?: never;
@@ -16145,7 +16199,18 @@ interface operations {
16145
16199
  };
16146
16200
  ApiOrganizationDirectoryGroupsController_list: {
16147
16201
  parameters: {
16148
- query?: never;
16202
+ query?: {
16203
+ /** @description Page number (1-based) */
16204
+ page?: number;
16205
+ /** @description Items per page (1-100, default 20) */
16206
+ take?: number;
16207
+ /** @description Search group display names and external ids */
16208
+ q?: string;
16209
+ /** @description Sort column. Defaults to `name`, A to Z. */
16210
+ sort_by?: "name" | "created";
16211
+ /** @description Sort direction */
16212
+ order?: "asc" | "desc";
16213
+ };
16149
16214
  header?: never;
16150
16215
  path: {
16151
16216
  id: string;
@@ -16154,7 +16219,7 @@ interface operations {
16154
16219
  };
16155
16220
  requestBody?: never;
16156
16221
  responses: {
16157
- /** @description Pushed groups returned, each with its role mapping and member count */
16222
+ /** @description One page of pushed groups, each with its role mapping and member count, by display name unless sorted (`sort_by` `name` or `created`); `q` searches display names and external ids */
16158
16223
  200: {
16159
16224
  headers: {
16160
16225
  [name: string]: unknown;
@@ -16162,6 +16227,7 @@ interface operations {
16162
16227
  content: {
16163
16228
  "application/json": {
16164
16229
  items: components["schemas"]["ScimGroupResponseDto"][];
16230
+ pagination: components["schemas"]["PageMetaDto"];
16165
16231
  };
16166
16232
  };
16167
16233
  };
@@ -17584,7 +17650,7 @@ interface operations {
17584
17650
  "application/json": components["schemas"]["ErrorResponseDto"];
17585
17651
  };
17586
17652
  };
17587
- /** @description The identity already has this role at this node, or the node belongs to an organization the identity is not a member of */
17653
+ /** @description The identity already has this role at this node, already holds its one role at this organization, or the node sits beneath an organization the identity has no membership in effect at */
17588
17654
  409: {
17589
17655
  headers: {
17590
17656
  [name: string]: unknown;
@@ -17595,7 +17661,7 @@ interface operations {
17595
17661
  * "error": {
17596
17662
  * "statusCode": 409,
17597
17663
  * "code": null,
17598
- * "message": "The identity already has this role at this node, or the node belongs to an organization the identity is not a member of",
17664
+ * "message": "The identity already has this role at this node, already holds its one role at this organization, or the node sits beneath an organization the identity has no membership in effect at",
17599
17665
  * "timestamp": "2026-04-20T12:00:00.000Z",
17600
17666
  * "path": "/api/v1/assignments",
17601
17667
  * "method": "POST"
@@ -19307,10 +19373,10 @@ interface operations {
19307
19373
  page?: number;
19308
19374
  /** @description Items per page (1-100, default 20) */
19309
19375
  take?: number;
19310
- /** @description Search term */
19376
+ /** @description Search the endpoint URL */
19311
19377
  q?: string;
19312
- /** @description Column to sort by. Allowed values depend on the endpoint. */
19313
- sort_by?: string;
19378
+ /** @description Sort column. Defaults to `created`, newest first. */
19379
+ sort_by?: "url" | "created";
19314
19380
  /** @description Sort direction */
19315
19381
  order?: "asc" | "desc";
19316
19382
  };
@@ -19578,10 +19644,10 @@ interface operations {
19578
19644
  page?: number;
19579
19645
  /** @description Items per page (1-100, default 20) */
19580
19646
  take?: number;
19581
- /** @description Search term */
19647
+ /** @description Search the event type */
19582
19648
  q?: string;
19583
- /** @description Column to sort by. Allowed values depend on the endpoint. */
19584
- sort_by?: string;
19649
+ /** @description Sort column. Defaults to `created`, newest first. */
19650
+ sort_by?: "created" | "event_type" | "status";
19585
19651
  /** @description Sort direction */
19586
19652
  order?: "asc" | "desc";
19587
19653
  };
@@ -20022,10 +20088,10 @@ interface operations {
20022
20088
  page?: number;
20023
20089
  /** @description Items per page (1-100, default 20) */
20024
20090
  take?: number;
20025
- /** @description Search term */
20091
+ /** @description Search client names */
20026
20092
  q?: string;
20027
- /** @description Column to sort by. Allowed values depend on the endpoint. */
20028
- sort_by?: string;
20093
+ /** @description Sort column. Defaults to `created`, newest first. */
20094
+ sort_by?: "name" | "created";
20029
20095
  /** @description Sort direction */
20030
20096
  order?: "asc" | "desc";
20031
20097
  };
@@ -20136,7 +20202,7 @@ interface operations {
20136
20202
  };
20137
20203
  };
20138
20204
  };
20139
- /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, or `initiate_login_uri` is malformed or not `https` (loopback hosts excepted); or the request sent both an `X-API-Key` and an `Authorization` header */
20205
+ /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, `initiate_login_uri` is malformed or not `https` (loopback hosts excepted), or `scopes` names a scope Canopy does not issue (`oauth.client_scope_unknown`); or the request sent both an `X-API-Key` and an `Authorization` header */
20140
20206
  400: {
20141
20207
  headers: {
20142
20208
  [name: string]: unknown;
@@ -20147,7 +20213,7 @@ interface operations {
20147
20213
  * "error": {
20148
20214
  * "statusCode": 400,
20149
20215
  * "code": null,
20150
- * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, or `initiate_login_uri` is malformed or not `https` (loopback hosts excepted); or the request sent both an `X-API-Key` and an `Authorization` header",
20216
+ * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, `initiate_login_uri` is malformed or not `https` (loopback hosts excepted), or `scopes` names a scope Canopy does not issue (`oauth.client_scope_unknown`); or the request sent both an `X-API-Key` and an `Authorization` header",
20151
20217
  * "timestamp": "2026-04-20T12:00:00.000Z",
20152
20218
  * "path": "/api/v1/oauth-clients",
20153
20219
  * "method": "POST"
@@ -20547,7 +20613,7 @@ interface operations {
20547
20613
  };
20548
20614
  };
20549
20615
  };
20550
- /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, or `initiate_login_uri` is malformed or not `https` (loopback hosts excepted); or the request sent both an `X-API-Key` and an `Authorization` header */
20616
+ /** @description The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, `initiate_login_uri` is malformed or not `https` (loopback hosts excepted), or `scopes` names a scope Canopy does not issue (`oauth.client_scope_unknown`); or the request sent both an `X-API-Key` and an `Authorization` header */
20551
20617
  400: {
20552
20618
  headers: {
20553
20619
  [name: string]: unknown;
@@ -20558,7 +20624,7 @@ interface operations {
20558
20624
  * "error": {
20559
20625
  * "statusCode": 400,
20560
20626
  * "code": null,
20561
- * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, or `initiate_login_uri` is malformed or not `https` (loopback hosts excepted); or the request sent both an `X-API-Key` and an `Authorization` header",
20627
+ * "message": "The request failed validation: a body field, a query parameter or an id in the path is missing, malformed or out of range, `backchannel_logout_uri` names an address Canopy's servers will not call, `initiate_login_uri` is malformed or not `https` (loopback hosts excepted), or `scopes` names a scope Canopy does not issue (`oauth.client_scope_unknown`); or the request sent both an `X-API-Key` and an `Authorization` header",
20562
20628
  * "timestamp": "2026-04-20T12:00:00.000Z",
20563
20629
  * "path": "/api/v1/oauth-clients/{id}",
20564
20630
  * "method": "PATCH"
@@ -20748,10 +20814,10 @@ interface operations {
20748
20814
  page?: number;
20749
20815
  /** @description Items per page (1-100, default 20) */
20750
20816
  take?: number;
20751
- /** @description Search term */
20817
+ /** @description Search key names */
20752
20818
  q?: string;
20753
- /** @description Column to sort by. Allowed values depend on the endpoint. */
20754
- sort_by?: string;
20819
+ /** @description Sort column. Defaults to `created`, newest first. */
20820
+ sort_by?: "name" | "created";
20755
20821
  /** @description Sort direction */
20756
20822
  order?: "asc" | "desc";
20757
20823
  };
@@ -21050,7 +21116,7 @@ interface operations {
21050
21116
  "application/json": components["schemas"]["ErrorResponseDto"];
21051
21117
  };
21052
21118
  };
21053
- /** @description The bearer token is not an admin or platform token, or the caller lacks the permission this operation checks: a scoped API key without that scope, an admin without the Account capability that covers it, or, for a node-scoped check, a node outside this Environment */
21119
+ /** @description The caller lacks `api_key.manage` (a scoped API key without that scope, or an admin without the Account capability that covers it), or is a scoped API key acting on a key with more access than its own: a `full_access` key, or one holding a scope outside its own (`api_key.access_exceeds_caller`) */
21054
21120
  403: {
21055
21121
  headers: {
21056
21122
  [name: string]: unknown;
@@ -21061,10 +21127,10 @@ interface operations {
21061
21127
  * "error": {
21062
21128
  * "statusCode": 403,
21063
21129
  * "code": null,
21064
- * "message": "The bearer token is not an admin or platform token, or the caller lacks the permission this operation checks: a scoped API key without that scope, an admin without the Account capability that covers it, or, for a node-scoped check, a node outside this Environment",
21130
+ * "message": "The caller lacks `api_key.manage` (a scoped API key without that scope, or an admin without the Account capability that covers it), or is a scoped API key acting on a key with more access than its own: a `full_access` key, or one holding a scope outside its own (`api_key.access_exceeds_caller`)",
21065
21131
  * "timestamp": "2026-04-20T12:00:00.000Z",
21066
- * "path": "/api/v1/api-keys",
21067
- * "method": "GET"
21132
+ * "path": "/api/v1/api-keys/{id}",
21133
+ * "method": "DELETE"
21068
21134
  * }
21069
21135
  * }
21070
21136
  */
@@ -21162,7 +21228,7 @@ interface operations {
21162
21228
  "application/json": components["schemas"]["ErrorResponseDto"];
21163
21229
  };
21164
21230
  };
21165
- /** @description The bearer token is not an admin or platform token, or the caller lacks the permission this operation checks: a scoped API key without that scope, an admin without the Account capability that covers it, or, for a node-scoped check, a node outside this Environment */
21231
+ /** @description The caller lacks `api_key.manage` (a scoped API key without that scope, or an admin without the Account capability that covers it), or is a scoped API key acting on a key with more access than its own: a `full_access` key, or one holding a scope outside its own (`api_key.access_exceeds_caller`) */
21166
21232
  403: {
21167
21233
  headers: {
21168
21234
  [name: string]: unknown;
@@ -21173,10 +21239,10 @@ interface operations {
21173
21239
  * "error": {
21174
21240
  * "statusCode": 403,
21175
21241
  * "code": null,
21176
- * "message": "The bearer token is not an admin or platform token, or the caller lacks the permission this operation checks: a scoped API key without that scope, an admin without the Account capability that covers it, or, for a node-scoped check, a node outside this Environment",
21242
+ * "message": "The caller lacks `api_key.manage` (a scoped API key without that scope, or an admin without the Account capability that covers it), or is a scoped API key acting on a key with more access than its own: a `full_access` key, or one holding a scope outside its own (`api_key.access_exceeds_caller`)",
21177
21243
  * "timestamp": "2026-04-20T12:00:00.000Z",
21178
- * "path": "/api/v1/api-keys",
21179
- * "method": "GET"
21244
+ * "path": "/api/v1/api-keys/{id}",
21245
+ * "method": "PATCH"
21180
21246
  * }
21181
21247
  * }
21182
21248
  */
@@ -21270,7 +21336,7 @@ interface operations {
21270
21336
  "application/json": components["schemas"]["ErrorResponseDto"];
21271
21337
  };
21272
21338
  };
21273
- /** @description The bearer token is not an admin or platform token, or the caller lacks the permission this operation checks: a scoped API key without that scope, an admin without the Account capability that covers it, or, for a node-scoped check, a node outside this Environment */
21339
+ /** @description The caller lacks `api_key.manage` (a scoped API key without that scope, or an admin without the Account capability that covers it), or is a scoped API key acting on a key with more access than its own: a `full_access` key, or one holding a scope outside its own (`api_key.access_exceeds_caller`) */
21274
21340
  403: {
21275
21341
  headers: {
21276
21342
  [name: string]: unknown;
@@ -21281,10 +21347,10 @@ interface operations {
21281
21347
  * "error": {
21282
21348
  * "statusCode": 403,
21283
21349
  * "code": null,
21284
- * "message": "The bearer token is not an admin or platform token, or the caller lacks the permission this operation checks: a scoped API key without that scope, an admin without the Account capability that covers it, or, for a node-scoped check, a node outside this Environment",
21350
+ * "message": "The caller lacks `api_key.manage` (a scoped API key without that scope, or an admin without the Account capability that covers it), or is a scoped API key acting on a key with more access than its own: a `full_access` key, or one holding a scope outside its own (`api_key.access_exceeds_caller`)",
21285
21351
  * "timestamp": "2026-04-20T12:00:00.000Z",
21286
- * "path": "/api/v1/api-keys",
21287
- * "method": "GET"
21352
+ * "path": "/api/v1/api-keys/{id}/rotate-secret",
21353
+ * "method": "POST"
21288
21354
  * }
21289
21355
  * }
21290
21356
  */
@@ -21479,8 +21545,16 @@ declare class Identities {
21479
21545
  * newest first: when and where it was signed in, when it expires, and the
21480
21546
  * organization it is acting in. Read it back after a revoke to confirm,
21481
21547
  * from your own side, that a sign-out took.
21548
+ *
21549
+ * Paginated (20 per page by default, `take` up to 100), so this returns a
21550
+ * `Paginator`: iterate it for every session, or call `.first()` for the
21551
+ * newest. The list takes `page` and `take` only; its order is fixed.
21552
+ *
21553
+ * ```ts
21554
+ * for await (const session of canopy.identities.sessions(id)) { … }
21555
+ * ```
21482
21556
  */
21483
- sessions(id: string): Promise<ResponseBody<"ApiIdentitiesController_listIdentitySessions">>;
21557
+ sessions(id: string, query?: QueryParams<"ApiIdentitiesController_listIdentitySessions">): Paginator<IdentitySessionItem>;
21484
21558
  /**
21485
21559
  * Ends one session and leaves the identity's others signed in. `sessionId`
21486
21560
  * is the session's `id` from `sessions`: its current refresh token, which
@@ -21608,8 +21682,18 @@ declare class Organizations {
21608
21682
  revokeDirectoryToken(id: string, tokenId: string): Promise<void>;
21609
21683
  /** The organization's own provisioning events, newest first. */
21610
21684
  listDirectoryActivity(id: string): Promise<ResponseBody<"ApiOrganizationDirectoryController_activity">>;
21611
- /** The groups the provider has pushed, each with its role mapping. */
21612
- listDirectoryGroups(id: string): Promise<ResponseBody<"ApiOrganizationDirectoryGroupsController_list">>;
21685
+ /**
21686
+ * The groups the provider has pushed, each with its role mapping.
21687
+ *
21688
+ * Paginated (20 per page by default, `take` up to 100), so this returns a
21689
+ * `Paginator`. Sorted by display name unless `sort_by: "created"`; `q`
21690
+ * searches display names and external ids.
21691
+ *
21692
+ * ```ts
21693
+ * for await (const group of canopy.organizations.listDirectoryGroups(id)) { … }
21694
+ * ```
21695
+ */
21696
+ listDirectoryGroups(id: string, query?: QueryParams<"ApiOrganizationDirectoryGroupsController_list">): Paginator<OrganizationDirectoryGroupItem>;
21613
21697
  /**
21614
21698
  * Grant a listed role to every member of a pushed group, at the
21615
21699
  * organization. A role not on the organization's list is refused with
@@ -21622,6 +21706,8 @@ declare class Organizations {
21622
21706
  type OrganizationItem = ItemOf$2<ResponseBody<"ApiOrganizationsController_listOrganizations">>;
21623
21707
  type OrganizationMemberItem = ItemOf$2<ResponseBody<"ApiOrganizationsController_listMembers">>;
21624
21708
  type OrganizationInviteItem = ItemOf$2<ResponseBody<"ApiOrganizationsController_listInvites">>;
21709
+ /** One pushed group from an organization's directory. */
21710
+ type OrganizationDirectoryGroupItem = ItemOf$2<ResponseBody<"ApiOrganizationDirectoryGroupsController_list">>;
21625
21711
  type ItemOf$2<T> = T extends {
21626
21712
  items: (infer Item)[];
21627
21713
  } ? Item : never;
@@ -21655,6 +21741,10 @@ declare class Permissions {
21655
21741
  *
21656
21742
  * Prefer this to a loop over `evaluate` when rendering a screen: the checks
21657
21743
  * are answered together instead of paying request latency for each.
21744
+ *
21745
+ * One request carries between 1 and 100 checks. More is refused with a
21746
+ * `400` (`CanopyError`, `statusCode` 400) and nothing is evaluated, so split
21747
+ * a larger set into batches of 100.
21658
21748
  */
21659
21749
  evaluateBulk(input: RequestBody<"ApiPermissionsController_evaluateBulk">, options?: CallOptions): Promise<ResponseBody<"ApiPermissionsController_evaluateBulk">>;
21660
21750
  /**
@@ -21792,10 +21882,18 @@ interface LocalAuthorizationQuery {
21792
21882
  node_id?: string;
21793
21883
  }
21794
21884
  interface LocalAuthorizerStats {
21795
- /** Calls made to read an identity's grant roots. */
21885
+ /** Reads of an identity's grant roots, one per refresh however many pages it took. */
21796
21886
  grantFetches: number;
21797
- /** Calls made to read the hierarchy, including revalidations. */
21887
+ /** Page requests those reads made: at least one per read, one more per further 100 grants. */
21888
+ grantPages: number;
21889
+ /** Reads of the hierarchy, one per refresh, including revalidations. */
21798
21890
  treeRequests: number;
21891
+ /**
21892
+ * Page requests those reads made: one for a revalidation the server answers
21893
+ * `304`, otherwise one per page of 100 nodes, plus the request that confirms
21894
+ * a walk of several pages was not torn by a change made during it.
21895
+ */
21896
+ treePages: number;
21799
21897
  /** Revalidations the server answered `304`, so no tree was transferred. */
21800
21898
  treeNotModified: number;
21801
21899
  }
@@ -21859,14 +21957,39 @@ declare class LocalAuthorizer {
21859
21957
  /** Climb from `nodeId` and look for a grant root among its ancestors. */
21860
21958
  private holdsAtNode;
21861
21959
  private grantRootsFor;
21960
+ /**
21961
+ * Every page of the identity's grant roots, folded into permission → nodes.
21962
+ *
21963
+ * Each row is one permission at one node, so a permission granted at three
21964
+ * nodes arrives as three rows, possibly on different pages. Stopping after
21965
+ * the first page would under-report what the identity holds: a false deny,
21966
+ * the safe direction, but a wrong answer all the same.
21967
+ */
21862
21968
  private fetchGrantRoots;
21863
21969
  private parents;
21864
21970
  /**
21865
21971
  * Revalidate rather than re-read. The hierarchy is the expensive half and
21866
21972
  * the one that changes least, so the common case is a `304` and no transfer
21867
21973
  * at all — the tree stays in memory and only its expiry moves.
21974
+ *
21975
+ * The edges come a page at a time, so only the first page is conditional:
21976
+ * its validator covers the whole hierarchy, and a `304` to it means no page
21977
+ * has changed. On a `200` the remaining pages are read plainly and the map
21978
+ * is rebuilt from every page.
21979
+ *
21980
+ * A walk over several pages is not one snapshot. A node added or removed
21981
+ * between two page reads shifts the rows under the offset, so a row can be
21982
+ * skipped, which would leave a node out of the map until the next refresh.
21983
+ * So the walk is confirmed by asking for the first page again with the
21984
+ * validator it came with: a `304` proves nothing changed while the pages
21985
+ * were read. A `200` is a fresh first page, and the walk starts again from
21986
+ * it, up to {@link MAX_TREE_WALKS} times.
21868
21987
  */
21869
21988
  private fetchTree;
21989
+ private parentsFirstPage;
21990
+ /** The first page's edges followed by every later page's. */
21991
+ private parentsRemainingPages;
21992
+ private keepTree;
21870
21993
  }
21871
21994
 
21872
21995
  /**
@@ -22309,4 +22432,4 @@ type WebhookEventData<Name extends WebhookEventName> = WebhookEvent<Name>["data"
22309
22432
  */
22310
22433
  declare function isWebhookEvent<Name extends WebhookEventName>(delivery: WebhookDelivery, name: Name): delivery is WebhookEvent<Name>;
22311
22434
 
22312
- 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, type FailureStatus, Identities, type IdentityAssignmentItem, type IdentityItem, type IdentitySessionItem, type LocalAuthorizationQuery, LocalAuthorizer, type LocalAuthorizerOptions, type LocalAuthorizerStats, MAX_TTL_MS, 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 WebhookDelivery, type WebhookEvent, type WebhookEventData, type WebhookEventName, authorizationErrorStatus, type components, isCanopyAuthorizerError, isCanopyConnectionError, isCanopyError, isCanopyTokenError, isCursorPagination, isWebhookEvent, type operations, orgContext, paginate, type paths, tokenErrorStatus, withConcurrency };
22435
+ 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, type FailureStatus, Identities, type IdentityAssignmentItem, type IdentityItem, type IdentitySessionItem, type LocalAuthorizationQuery, LocalAuthorizer, type LocalAuthorizerOptions, type LocalAuthorizerStats, MAX_TTL_MS, type OffsetPagination, type OperationId, type OrganizationDirectoryGroupItem, 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 WebhookDelivery, type WebhookEvent, type WebhookEventData, type WebhookEventName, authorizationErrorStatus, type components, isCanopyAuthorizerError, isCanopyConnectionError, isCanopyError, isCanopyTokenError, isCursorPagination, isWebhookEvent, type operations, orgContext, paginate, type paths, tokenErrorStatus, withConcurrency };