Workspace, Plans & Admin
Profiles, membership invites, entitlements and the control centre.
Workspace, membership and plan routes live under /api/tenant/ and /api/pricing/. The platform control centre is the only surface that reads across workspaces, and it is restricted to staff accounts.
Workspace profile
/api/tenant/tenants/tenant_settings/Auth requiredReturns the active workspace profile and its member rows in one response, which is what the workspace management screen renders.
Response
| Field | Type | Description |
|---|---|---|
| workspace.id | integer | Workspace identifier. |
| workspace.name | string | Display name. |
| workspace.plan | string | null | Active plan key, or null when none is provisioned. |
| workspace.type | string | `individual` or `organization`. |
| workspace.description | string | Free-text description. Empty string when unset. |
| members | array | Rows of { id, user, role }. |
/api/tenant/tenants/{id}/Auth requiredRename or re-describe a workspace. Requires the owner role or a workspace admin role; other members receive 403 and non-members receive 404.
/api/tenant/tenants/{id}/Auth requiredPermanently deletes the workspace and everything it owns. Reserved for the workspace owner and platform operators.
Membership
/api/tenant/tenant_members/invite/Auth requiredGrants an existing account access to the current workspace. The platform does not send email yet, so the invitee must already have signed up; an unknown address returns 404.
curl -X POST https://api.introzen.com/api/tenant/tenant_members/invite/ \
-H "Content-Type: application/json" \
-H "X-TENANT-ID: 42" \
-b cookies.txt \
-d '{"email": "teammate@company.com", "role": "analyst"}'Body
| Field | Type | Description |
|---|---|---|
| string | Address of an existing account. | |
| role | string | `admin`, `editor`, `analyst` or `viewer`. Defaults to `viewer`. |
| tenant_id | integer | Optional workspace override. The caller must be able to manage it. |
Existing rows are updated through PATCH /api/tenant/tenant_members/{id}/ and revoked with DELETE on the same path. The workspace owner can never be removed, and a member cannot remove themselves.
Plans and entitlements
/api/pricing/plans/Auth requiredPublic plan catalogue. features is always returned as a list of display strings, and button_text reflects whether the plan is self-service.
/api/pricing/my_membership/Auth requiredReturns the active workspace subscription, or 404 when none exists.
/api/pricing/my_membership/Auth requiredActivates a self-service plan. Only plans without a price can be activated here; a paid plan returns 402 because provisioning is an operator action. Requires the owner or workspace admin role.
Platform administration
/api/admin/overview/Auth requiredFleet-wide totals, growth deltas, execution mix, storage split, a 30-day trend, the busiest workspaces and recent executions.
Staff-only endpoints
| Field | Type | Description |
|---|---|---|
| GET /api/admin/system-health/ | string | Database latency, queue depth, 24-hour failure count and the metrics endpoint. |
| GET /api/admin/tenants/ | string | Searchable workspace directory with ownership, plan, footprint and status. |
| GET /api/admin/tenants/{id}/ | string | Single workspace with its membership rows. |
| PATCH /api/admin/tenants/{id}/ | string | Suspend or restore a workspace, and provision a plan. Only `is_active` and `plan` are accepted. |
| GET /api/admin/users/ | string | Searchable account directory with workspace counts and primary role. |
| PATCH /api/admin/users/{id}/ | string | Deactivate or reactivate an account. Self-deactivation is refused. |
| GET /api/admin/activity/ | string | Cross-workspace execution feed, filterable by workspace, status and time window. |
GET /api/admin/overview/ also returns plan_mix (workspaces grouped by assigned plan, including Unassigned and No plan) and attention (suspended, dormant and planless workspaces, inactive accounts, queued runs and failures in the last 24 hours).
Directory query parameters
The workspace and account directories accept the same query-string vocabulary the control centre links to, so any filtered view can be shared, bookmarked or opened straight from a dashboard tile. Unknown values are ignored rather than rejected.
GET /api/admin/tenants/
| Field | Type | Description |
|---|---|---|
| search | string | Matches the workspace name or the owner's email. |
| status | string | `active` or `suspended`. |
| plan | string | A plan name, or `none` for workspaces with no plan assigned. |
| activity | string | `dormant` for workspaces that never produced a run, `active` for the rest. |
| ordering | string | `name`, `created_at`, `member_count`, `pipeline_count`, `source_count` or `execution_count`, each optionally prefixed with `-` for descending. Anything else falls back to `-created_at`. |
| page, page_size | string | Page number and page size (default 25, maximum 200). |
GET /api/admin/users/
| Field | Type | Description |
|---|---|---|
| search | string | Matches email, first name or last name. |
| status | string | `active`, `inactive` or `staff`. |
| ordering | string | `date_joined`, `email`, `first_name` or `last_login`, each optionally prefixed with `-`. |
| page, page_size | string | Page number and page size (default 25, maximum 200). |
GET /api/admin/activity/
| Field | Type | Description |
|---|---|---|
| status | string | `pending`, `running`, `success`, `failed` or `cancelled`. |
| tenant | string | Restrict the feed to a single workspace id. |
| since_hours | string | Look-back window in hours, capped at 720 (30 days). A non-numeric value is ignored. |
| page, page_size | string | Page number and page size (default 25, maximum 200). |
Last reviewed October 2026.