GET /api/v1/admin/orgs/:slug/members
This page is auto-generated from
src/admin/routes.ts. Do not edit by hand — seedocs/dev/docs-auto-sync.md.
:warning: Heuristic extraction — not a contract. Response shapes below are mined from
c.json(...)literals in the handler via an AST walker. Computed fields, ternaries, and non-literal returns are shown as placeholders. Refer to the linked source file for the authoritative behaviour.
GET /api/v1/admin/orgs/:slug/members
Section titled “GET /api/v1/admin/orgs/:slug/members”Authentication
Section titled “Authentication”Requires the following capability(ies):
members:r
Middleware
Section titled “Middleware”Other middleware observed on this route (heuristic):
requireCapability
Description
Section titled “Description”GET /api/v1/admin/orgs/:slug/members — list the org’s members.
#422 / #398b — surface the Upwarden-side directory (tenant_members) plus
the synthetic admin-token owner row. The directory rows carry the
lifecycle state (active / suspended / removed) the dashboard renders;
the synthetic owner row marks the admin-token / cookie principal as
source: "admin_token" with role: "owner" and status: "active" so
the dashboard’s “you are here” indicator works without a directory
entry for the platform admin. The synthetic row is suppressed when the
caller already has a tenant_members row (post-#423 / accept flow), since
in that case the directory row is the canonical “you are here” target.
Seats accounting: counts (active | suspended) tenant_members rows toward the tier’s seat cap. Removed rows are NOT counted (they’re history). The synthetic admin-token owner does NOT count toward the cap — they’re the platform operator, not a tenant seat.
Gated on members:r.
Responses
Section titled “Responses”HTTP 404
Section titled “HTTP 404”{ "error": "Org not found"}HTTP 200 (default)
Section titled “HTTP 200 (default)”{ "members": <members>, "seats": { "consumed": <consumed>, "cap": <cap>, "tier": <member-expr> }}Source
Section titled “Source”- File:
src/admin/routes.ts - Line: 2788