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

GET/api/tenant/tenants/tenant_settings/Auth required

Returns the active workspace profile and its member rows in one response, which is what the workspace management screen renders.

Response

FieldTypeDescription
workspace.idintegerWorkspace identifier.
workspace.namestringDisplay name.
workspace.planstring | nullActive plan key, or null when none is provisioned.
workspace.typestring`individual` or `organization`.
workspace.descriptionstringFree-text description. Empty string when unset.
membersarrayRows of { id, user, role }.
PATCH/api/tenant/tenants/{id}/Auth required

Rename or re-describe a workspace. Requires the owner role or a workspace admin role; other members receive 403 and non-members receive 404.

DELETE/api/tenant/tenants/{id}/Auth required

Permanently deletes the workspace and everything it owns. Reserved for the workspace owner and platform operators.

Membership

POST/api/tenant/tenant_members/invite/Auth required

Grants 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.

Invite a teammate
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

FieldTypeDescription
emailstringAddress of an existing account.
rolestring`admin`, `editor`, `analyst` or `viewer`. Defaults to `viewer`.
tenant_idintegerOptional 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

GET/api/pricing/plans/Auth required

Public plan catalogue. features is always returned as a list of display strings, and button_text reflects whether the plan is self-service.

GET/api/pricing/my_membership/Auth required

Returns the active workspace subscription, or 404 when none exists.

POST/api/pricing/my_membership/Auth required

Activates 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

GET/api/admin/overview/Auth required

Fleet-wide totals, growth deltas, execution mix, storage split, a 30-day trend, the busiest workspaces and recent executions.

Staff-only endpoints

FieldTypeDescription
GET /api/admin/system-health/stringDatabase latency, queue depth, 24-hour failure count and the metrics endpoint.
GET /api/admin/tenants/stringSearchable workspace directory with ownership, plan, footprint and status.
GET /api/admin/tenants/{id}/stringSingle workspace with its membership rows.
PATCH /api/admin/tenants/{id}/stringSuspend or restore a workspace, and provision a plan. Only `is_active` and `plan` are accepted.
GET /api/admin/users/stringSearchable account directory with workspace counts and primary role.
PATCH /api/admin/users/{id}/stringDeactivate or reactivate an account. Self-deactivation is refused.
GET /api/admin/activity/stringCross-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/

FieldTypeDescription
searchstringMatches the workspace name or the owner's email.
statusstring`active` or `suspended`.
planstringA plan name, or `none` for workspaces with no plan assigned.
activitystring`dormant` for workspaces that never produced a run, `active` for the rest.
orderingstring`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_sizestringPage number and page size (default 25, maximum 200).

GET /api/admin/users/

FieldTypeDescription
searchstringMatches email, first name or last name.
statusstring`active`, `inactive` or `staff`.
orderingstring`date_joined`, `email`, `first_name` or `last_login`, each optionally prefixed with `-`.
page, page_sizestringPage number and page size (default 25, maximum 200).

GET /api/admin/activity/

FieldTypeDescription
statusstring`pending`, `running`, `success`, `failed` or `cancelled`.
tenantstringRestrict the feed to a single workspace id.
since_hoursstringLook-back window in hours, capped at 720 (30 days). A non-numeric value is ignored.
page, page_sizestringPage number and page size (default 25, maximum 200).

Last reviewed October 2026.