Two-layer role model
Account roles (tenancy_role)
Account roles govern tenant administration — adding and removing members, managing billing. They say nothing about what a principal can do with subjects or grants.
Account roles are independent capabilities, not a ranked hierarchy.
Data-access roles (api_functional_role)
Data-access roles control what a principal can do with subjects belonging to (or accessible via grants held by) their own tenant. These form a ranked hierarchy — a higher rank includes all permissions of lower ranks.
A principal may hold both a
tenancy_role and an api_functional_role simultaneously, or just one, depending on their responsibilities.
The tenant_owner role
tenant_owner is the accountability anchor for the Tenant↔Subject relationship. It is not simply a higher-privilege version of tenant_admin — it carries legal and compliance significance and may only be held by a human principal.
Ownership of a subject (the Tenant↔Subject pairing) is permanent and structural. What transfers via the ownership transfer offer flow is the tenant_owner role within the owning tenant — not the subject itself.
Counterparty access (allow_counterparty_access)
Grants operate at the tenant level, but accessing counterparty subjects also requires a per-principal flag. A principal with allow_counterparty_access: false (the default) receives 403 on counterparty endpoints even if their tenant holds active grants.
The flag is set by an account_admin and may only be enabled by a human caller. See Access Grants for the full workflow.
Setting roles
All role and flag management goes throughPUT /v1/tenants/{tenant_id}/principals/{principal_id}. The endpoint uses PATCH semantics — omitted fields are unchanged.
principal_type and human-only constraints.