| Field | Type | Label | Description |
| token | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| membership | Membership |
|
| Field | Type | Label | Description |
| group_id | string |
|
|
| member | GroupMember |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| user_id | string |
|
|
| role | Role |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| membership | Membership |
|
| Field | Type | Label | Description |
| project_id | string |
|
|
| tenant_id | string |
|
|
| sku | string |
|
|
| user_id | string |
|
| Field | Type | Label | Description |
| already_held | bool | already_held is true when the user already had a seat (idempotent no-op). |
BatchCheck answers many Check questions in one round-trip — the list/grid hot
path (filter N documents/lessons to those a user can see). Results are
index-aligned to items; a per-item validation error is reported in that
item's result rather than failing the whole batch. Every item shares the
request's project_id and tenant_id.
NOTE: BatchCheck carries NO request context, so CONDITIONAL grants (caveats:
scope_in / not_after / ip_in_cidrs / consent_granted / age_at_least) cannot be
evaluated through it and a conditioned grant is denied. Use Check (which takes
`context`) for conditional grants.
| Field | Type | Label | Description |
| namespace | string |
|
|
| object_id | string |
|
|
| relation | string |
|
|
| subject_user_id | string |
|
| Field | Type | Label | Description |
| project_id | string |
|
|
| tenant_id | string |
|
|
| items | BatchCheckItem | repeated |
|
| at_least_consistency_token | string | at_least_consistency_token, when set, demands the batch observe state at least as fresh as the token (from a prior WriteRelationTuples). Empty = read latest. A malformed or foreign-shard token is rejected. |
| Field | Type | Label | Description |
| results | BatchCheckResult | repeated |
|
| Field | Type | Label | Description |
| allowed | bool |
|
|
| error | string | error is non-empty when the item could not be evaluated (e.g. invalid arguments); allowed is then false. |
Check answers "does subject have relation on namespace:object_id?",
evaluating the namespace's userset rewrite rules transitively.
| Field | Type | Label | Description |
| namespace | string |
|
|
| object_id | string |
|
|
| relation | string |
|
|
| subject_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
|
| subject_set | SubjectSet | subject_set asks whether a USERSET (e.g. group:cohort-7#member, or a service-account set) has the relation, rather than a concrete user. It is used iff subject_user_id is empty; exactly one of the two must be set. The answer is "does the queried userset intersect the relation's effective userset" — true if the set is structurally included, or if any concrete member of the set has the relation. |
|
| context | google.protobuf.Struct | context carries request-time attributes that CONDITIONAL grants are evaluated against (e.g. {"age": 9, "consent": true, "ip": "1.2.3.4", "now": "2026-06-16T00:00:00Z"}). Unset = no context; conditional grants then fail closed, while unconditional grants are unaffected. |
|
| at_least_consistency_token | string | at_least_consistency_token, when set, demands the check observe state at least as fresh as the token (from a prior WriteRelationTuples). Empty = read latest. A malformed or foreign-shard token is rejected. |
| Field | Type | Label | Description |
| allowed | bool |
|
| Field | Type | Label | Description |
| display_name | string |
|
|
| slug | string |
|
|
| workspace_id | string | optional owning workspace; empty for a standalone group. |
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| group | Group |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| string |
|
||
| role | Role |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| invitation | Invitation |
|
| Field | Type | Label | Description |
| id | string |
|
|
| name | string |
|
|
| model_json | string |
|
|
| data_region | string |
|
|
| max_check_reads | int32 | max_check_reads: 0 leaves the project on the global default budget. A positive value overrides it and must be >= the same floor as the global (see GATEWAY_MAX_CHECK_READS). |
| Field | Type | Label | Description |
| project | Project |
|
| Field | Type | Label | Description |
| display_name | string |
|
|
| slug | string | slug is optional; the server derives one from display_name when empty. |
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspace | Workspace |
|
| Field | Type | Label | Description |
| group_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
DeprovisionUser revokes ALL of a user's ACCESS GRANTS: it deletes every
relation tuple whose concrete subject is user_id, across all namespaces AND
ALL TENANTS of the project, so a leaving user cannot retain live access in a
sibling tenant; tenant_id is therefore ignored here. It does NOT delete the
user's PII (membership/invitation/workspace rows) — full subject erasure and
data-subject export are a separate concern (issue #14), so this RPC alone is
not a GDPR/COPPA "right to erasure".
| Field | Type | Label | Description |
| project_id | string |
|
|
| tenant_id | string | tenant_id is accepted for call-shape symmetry but IGNORED: erasure spans every tenant of the project. |
|
| user_id | string |
|
| Field | Type | Label | Description |
| deleted_count | int64 |
|
| Field | Type | Label | Description |
| group_id | string |
|
|
| member | GroupMember |
|
|
| state | EnrollmentState |
|
|
| created_at | google.protobuf.Timestamp |
|
|
| updated_at | google.protobuf.Timestamp |
|
Expand returns the effective userset tree for namespace:object_id#relation.
| Field | Type | Label | Description |
| namespace | string |
|
|
| object_id | string |
|
|
| relation | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
|
| at_least_consistency_token | string | at_least_consistency_token, when set, demands the expansion reflect state at least as fresh as the token (from a prior WriteRelationTuples). Empty = read latest. A malformed or foreign-shard token is rejected. |
| Field | Type | Label | Description |
| tree | UsersetTree |
|
ExportSubjectGrants returns every authorization grant a user holds in a
project — across ALL tenants (mirroring DeprovisionUser's erase scope) — for
GDPR/COPPA data-subject access requests. Read-only.
| Field | Type | Label | Description |
| project_id | string |
|
|
| user_id | string |
|
| Field | Type | Label | Description |
| grants | SubjectGrant | repeated |
|
| Field | Type | Label | Description |
| group_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| group | Group |
|
| Field | Type | Label | Description |
| id | string |
|
| Field | Type | Label | Description |
| project | Project |
|
| Field | Type | Label | Description |
| project_id | string |
|
|
| tenant_id | string |
|
|
| sku | string |
|
| Field | Type | Label | Description |
| sku | string |
|
|
| used | int32 |
|
|
| limit | int32 |
|
|
| limited | bool | limited is false when no limit is configured for the sku (unlimited). |
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspace | Workspace |
|
| Field | Type | Label | Description |
| id | string |
|
|
| project_id | string |
|
|
| workspace_id | string | workspace_id optionally scopes the group to a workspace (a company's internal groups). Empty for project-level / standalone groups (a B2C user's "family" list). |
|
| slug | string |
|
|
| display_name | string |
|
|
| created_by_user_id | string |
|
|
| created_at | google.protobuf.Timestamp |
|
|
| updated_at | google.protobuf.Timestamp |
|
|
| tenant_id | string |
|
GroupMember is either a user or a nested group.
| Field | Type | Label | Description |
| user_id | string |
|
|
| group_id | string |
|
| Field | Type | Label | Description |
| id | string |
|
|
| workspace_id | string |
|
|
| string |
|
||
| role | Role |
|
|
| status | InvitationStatus |
|
|
| invited_by_user_id | string |
|
|
| created_at | google.protobuf.Timestamp |
|
|
| expires_at | google.protobuf.Timestamp |
|
|
| token | string | token is returned ONLY from CreateInvitation so the caller can deliver it out of band; it is never echoed by ListInvitations. |
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| group_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| enrollments | Enrollment | repeated |
|
| Field | Type | Label | Description |
| group_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| members | GroupMember | repeated |
|
| Field | Type | Label | Description |
| workspace_id | string | optional: restrict to groups owned by this workspace. |
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| groups | Group | repeated |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| invitations | Invitation | repeated |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| members | Membership | repeated |
|
ListObjects returns the object_ids in a namespace where subject_user_id has
the relation, for the given project/tenant. The reverse of Check: "which
courses can this learner see?".
| Field | Type | Label | Description |
| namespace | string |
|
|
| relation | string |
|
|
| subject_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
|
| at_least_consistency_token | string | at_least_consistency_token, when set, demands the listing reflect state at least as fresh as the token (from a prior WriteRelationTuples). Empty = read latest. A malformed or foreign-shard token is rejected. |
| Field | Type | Label | Description |
| object_ids | string | repeated |
|
| Field | Type | Label | Description |
| projects | Project | repeated |
|
| Field | Type | Label | Description |
| project_id | string |
|
|
| tenant_id | string |
|
|
| sku | string |
|
| Field | Type | Label | Description |
| seats | SeatAssignment | repeated |
|
ListWorkspaces returns every workspace acting_user_id is an active member
of, auto-provisioning their PERSONAL workspace on first call.
| Field | Type | Label | Description |
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspaces | Workspace | repeated |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| user_id | string |
|
|
| role | Role |
|
|
| status | MembershipStatus |
|
|
| created_at | google.protobuf.Timestamp |
|
|
| updated_at | google.protobuf.Timestamp |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| id | string |
|
|
| name | string |
|
|
| status | ProjectStatus |
|
|
| model_json | string | model_json is the project's authorization model as a JSON document. Empty means the project uses the built-in default model. |
|
| created_at | google.protobuf.Timestamp |
|
|
| updated_at | google.protobuf.Timestamp |
|
|
| data_region | string | data_region, when set, pins the project's data to a region/storage target. An instance configured for a different region refuses to serve it (fail closed). Empty means unpinned. Multi-region storage ROUTING is forward- compat; today this is recorded, validated, and enforced as a serving guard. |
|
| max_check_reads | int32 | max_check_reads, when > 0, overrides the global per-request read budget (GATEWAY_MAX_CHECK_READS) for this project's Check/Expand/ListObjects evaluations. 0 means unset: the project uses the fleet-wide default. |
ReadRelationTuples returns stored tuples matching the non-empty filter
fields (exact match). It does NOT evaluate userset rewrites — it is the
raw store read. Use Check for permission decisions.
| Field | Type | Label | Description |
| namespace | string |
|
|
| object_id | string |
|
|
| relation | string |
|
|
| subject_user_id | string | optional: restrict to tuples whose subject is this concrete user. |
|
| project_id | string |
|
|
| tenant_id | string |
|
|
| at_least_consistency_token | string | at_least_consistency_token, when set, demands the read reflect state at least as fresh as the token (from a prior WriteRelationTuples). Empty = read latest. A malformed or foreign-shard token is rejected. |
| Field | Type | Label | Description |
| tuples | RelationTuple | repeated |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| user_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| membership | Membership |
|
| Field | Type | Label | Description |
| project_id | string |
|
|
| namespace | string |
|
|
| object_id | string |
|
|
| relation | string |
|
|
| subject | Subject |
|
|
| tenant_id | string |
|
|
| expires_at | google.protobuf.Timestamp | expires_at, when set, makes the grant time-bounded: the tuple stops granting access once this instant passes (enforced at read time, so Check and tuple-to-userset walks both honor it). Unset = never expires. Expiry is mutable metadata, NOT part of tuple identity: re-writing the same tuple with a new expires_at updates it; deletes still match by identity. |
|
| condition_name | string | condition_name, when set, makes the grant CONDITIONAL: it applies only if the named built-in condition (e.g. consent_granted, age_at_least, ip_in_cidrs, not_after) evaluates true against condition_params (bound here) and the request-time CheckRequest.context. Unset = unconditional. The condition is grant metadata, not part of tuple identity: re-writing the tuple replaces it; deletes still match by identity. Unknown name / missing input / ill-typed value all DENY (fail closed). |
|
| condition_params | google.protobuf.Struct | condition_params are the static parameters bound to the condition at write time (e.g. {"min_age": 13} for age_at_least). |
| Field | Type | Label | Description |
| group_id | string |
|
|
| member | GroupMember |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| user_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| invitation_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| project_id | string |
|
|
| tenant_id | string |
|
|
| sku | string |
|
|
| user_id | string |
|
| Field | Type | Label | Description |
| sku | string |
|
|
| user_id | string |
|
|
| assigned_at | google.protobuf.Timestamp |
|
| Field | Type | Label | Description |
| sku | string |
|
|
| limit | int32 | optional | limit is absent when the sku is unlimited (no cap configured); present (including 0, which admits no seats) when a cap is set. |
| Field | Type | Label | Description |
| group_id | string |
|
|
| member | GroupMember |
|
|
| state | EnrollmentState |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| enrollment | Enrollment |
|
| Field | Type | Label | Description |
| project_id | string |
|
|
| tenant_id | string |
|
|
| sku | string |
|
|
| limit | int32 | optional | limit, when present, sets the cap (must be >= 0; 0 admits no seats). When ABSENT, the sku's limit is CLEARED, returning it to unlimited — this is the only way to undo a previously-set cap. |
| Field | Type | Label | Description |
| limit | SeatLimit |
|
Subject is the right-hand side of a tuple: a concrete user, a userset, or
the public wildcard (matches every user — link-sharing / published
content).
| Field | Type | Label | Description |
| user_id | string |
|
|
| set | SubjectSet |
|
|
| wildcard | bool |
|
SubjectGrant is one access grant the subject holds. via_group is empty for a
DIRECT grant (a tuple whose subject is the user, including the user's group
memberships); otherwise it is the group id whose membership confers the grant.
| Field | Type | Label | Description |
| tenant_id | string |
|
|
| namespace | string |
|
|
| object_id | string |
|
|
| relation | string |
|
|
| via_group | string |
|
SubjectSet references the set of subjects related to another object — the
userset `namespace:object_id#relation`. When relation is empty it denotes
the object itself (rarely needed).
| Field | Type | Label | Description |
| namespace | string |
|
|
| object_id | string |
|
|
| relation | string |
|
SuspendMember revokes a member's live access WITHOUT deleting their
membership: it removes the backing role tuple (so every Check denies) and
marks the membership suspended. ReinstateMember restores both. This is the
safe way to pause access — denial is by tuple absence, not a status read on
the hot path.
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| user_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| membership | Membership |
|
TransferOwnership hands a TEAM workspace's ownership to another user. Only
the current owner (acting_user_id) may transfer; the new owner is granted the
`owner` role (added as a member if needed) and the former owner is demoted to
`admin` (kept, not orphaned). Personal workspaces cannot be transferred.
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| new_owner_user_id | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspace | Workspace |
|
| Field | Type | Label | Description |
| op | TupleUpdate.Op |
|
|
| tuple | RelationTuple |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| user_id | string |
|
|
| role | Role |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| membership | Membership |
|
| Field | Type | Label | Description |
| id | string |
|
|
| name | string |
|
|
| status | ProjectStatus |
|
|
| model_json | string |
|
|
| data_region | string | data_region: empty leaves it unchanged (like name/model). Setting it repins the project; a repin converges across a horizontally-scaled fleet only after the resolver TTL (~30s), so it is not instantaneous. |
|
| clear_data_region | bool | clear_data_region, when true, reverts the project to region-agnostic (unpinned). Mutually exclusive with a non-empty data_region. This is the explicit "unpin" path, since an empty data_region means "leave unchanged". |
|
| max_check_reads | int32 | max_check_reads: 0 leaves it unchanged (like name/model). A positive value overrides the global per-request read budget and must be >= the same floor as the global default. The override converges across a horizontally-scaled fleet only after the resolver TTL (~30s), so it is not instantaneous. |
|
| clear_max_check_reads | bool | clear_max_check_reads, when true, reverts the project to the global default budget. Mutually exclusive with a positive max_check_reads. This is the explicit "reset" path, since a 0 max_check_reads means "leave unchanged". |
| Field | Type | Label | Description |
| project | Project |
|
| Field | Type | Label | Description |
| workspace_id | string |
|
|
| display_name | string |
|
|
| acting_user_id | string |
|
|
| project_id | string |
|
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| workspace | Workspace |
|
| Field | Type | Label | Description |
| type | UsersetTree.NodeType |
|
|
| user_ids | string | repeated | For LEAF nodes: the concrete subjects and usersets at this node. |
| sets | SubjectSet | repeated |
|
| children | UsersetTree | repeated | For UNION / INTERSECTION nodes: the child subtrees. Empty for EXCLUSION (which uses `include` / `exclude` instead). |
| expanded | SubjectSet | The userset this node expands. |
|
| wildcard | bool | For LEAF nodes: true if the public wildcard subject is present. |
|
| include | UsersetTree | For EXCLUSION nodes only: the include leg (the base set) and the exclude leg (subjects removed from it). The effective set is `include` minus `exclude`. Unset for every other node type. |
|
| exclude | UsersetTree |
|
| Field | Type | Label | Description |
| id | string |
|
|
| project_id | string | project_id is the configuration/model shard (identity ADR-0002). |
|
| slug | string |
|
|
| display_name | string |
|
|
| type | WorkspaceType |
|
|
| owner_user_id | string |
|
|
| created_at | google.protobuf.Timestamp |
|
|
| updated_at | google.protobuf.Timestamp |
|
|
| tenant_id | string | tenant_id is the data-isolation shard within the project; empty = default. |
| Field | Type | Label | Description |
| updates | TupleUpdate | repeated |
|
| project_id | string | project_id scopes every tuple in the batch; empty = default project. |
|
| tenant_id | string |
|
| Field | Type | Label | Description |
| consistency_token | string | consistency_token is an opaque "zookie" naming the shard's write sequence reached by this batch. Pass it to a later Check/Expand/ListObjects/ BatchCheck/ReadRelationTuples as at_least_consistency_token to demand read-after-write (observe at least this write). Optional to use. |
─── Enrollment lifecycle overlay ──────────────────────────────────────
An enrollment overlays a lifecycle STATE on a group membership, so a group
used as a cohort/class can track each member's progress. Only the
access-bearing states (ENROLLED, ACTIVE) place the member in the group's
`member` userset (the backing `group:
others (WAITLISTED, COMPLETED, DROPPED) record the state WITHOUT granting
access (no tuple). Access is therefore revoked/granted purely by tuple
presence — the same mechanism as workspace member suspend/reinstate — so
Check/CheckSet over `group:
dropped, or waitlisted enrollee. The enrollment row and its tuple move
atomically. The overlay is additive: AddGroupMember/RemoveGroupMember still
work for plain (un-tracked) membership.
| Name | Number | Description |
| ENROLLMENT_STATE_UNSPECIFIED | 0 | |
| ENROLLMENT_STATE_WAITLISTED | 1 | WAITLISTED: applied but not admitted — no access. |
| ENROLLMENT_STATE_ENROLLED | 2 | ENROLLED: admitted/registered — access (in the `member` set). |
| ENROLLMENT_STATE_ACTIVE | 3 | ACTIVE: actively participating — access (in the `member` set). |
| ENROLLMENT_STATE_COMPLETED | 4 | COMPLETED: finished — access ends. |
| ENROLLMENT_STATE_DROPPED | 5 | DROPPED: withdrew/removed — access ends. |
| Name | Number | Description |
| INVITATION_STATUS_UNSPECIFIED | 0 | |
| INVITATION_STATUS_PENDING | 1 | |
| INVITATION_STATUS_ACCEPTED | 2 | |
| INVITATION_STATUS_REVOKED | 3 | |
| INVITATION_STATUS_EXPIRED | 4 |
| Name | Number | Description |
| MEMBERSHIP_STATUS_UNSPECIFIED | 0 | |
| MEMBERSHIP_STATUS_ACTIVE | 1 | |
| MEMBERSHIP_STATUS_INVITED | 2 | |
| MEMBERSHIP_STATUS_SUSPENDED | 3 |
| Name | Number | Description |
| PROJECT_STATUS_UNSPECIFIED | 0 | |
| PROJECT_STATUS_ACTIVE | 1 | |
| PROJECT_STATUS_SUSPENDED | 2 |
Role is the coarse membership grade. It maps 1:1 onto a relation in the
`workspace` authz namespace, ordered owner ⊃ admin ⊃ member ⊃ guest.
| Name | Number | Description |
| ROLE_UNSPECIFIED | 0 | |
| ROLE_OWNER | 1 | |
| ROLE_ADMIN | 2 | |
| ROLE_MEMBER | 3 | |
| ROLE_GUEST | 4 |
| Name | Number | Description |
| OP_UNSPECIFIED | 0 | |
| OP_INSERT | 1 | |
| OP_DELETE | 2 |
| Name | Number | Description |
| NODE_TYPE_UNSPECIFIED | 0 | |
| NODE_TYPE_UNION | 1 | |
| NODE_TYPE_LEAF | 2 | |
| NODE_TYPE_INTERSECTION | 3 | |
| NODE_TYPE_EXCLUSION | 4 | EXCLUSION encodes its operands EXPLICITLY in `include` / `exclude`, NOT in `children`: the effective set is `include` minus `exclude`. `children` is empty for EXCLUSION nodes. |
| Name | Number | Description |
| WORKSPACE_TYPE_UNSPECIFIED | 0 | |
| WORKSPACE_TYPE_PERSONAL | 1 | PERSONAL is the single auto-provisioned workspace every user owns. It cannot be deleted and admits exactly one member (the owner). |
| WORKSPACE_TYPE_TEAM | 2 | TEAM is any workspace a user creates to collaborate with others — a family, a project group, or a whole company. |
| Method Name | Request Type | Response Type | Description |
| CreateProject | CreateProjectRequest | CreateProjectResponse | |
| GetProject | GetProjectRequest | GetProjectResponse | |
| UpdateProject | UpdateProjectRequest | UpdateProjectResponse | |
| ListProjects | ListProjectsRequest | ListProjectsResponse |
| Method Name | Request Type | Response Type | Description |
| WriteRelationTuples | WriteRelationTuplesRequest | WriteRelationTuplesResponse | |
| ReadRelationTuples | ReadRelationTuplesRequest | ReadRelationTuplesResponse | |
| Check | CheckRequest | CheckResponse | |
| BatchCheck | BatchCheckRequest | BatchCheckResponse | |
| Expand | ExpandRequest | ExpandResponse | |
| ListObjects | ListObjectsRequest | ListObjectsResponse | |
| DeprovisionUser | DeprovisionUserRequest | DeprovisionUserResponse | |
| ExportSubjectGrants | ExportSubjectGrantsRequest | ExportSubjectGrantsResponse |
| Method Name | Request Type | Response Type | Description |
| CreateGroup | CreateGroupRequest | CreateGroupResponse | |
| GetGroup | GetGroupRequest | GetGroupResponse | |
| ListGroups | ListGroupsRequest | ListGroupsResponse | |
| DeleteGroup | DeleteGroupRequest | DeleteGroupResponse | |
| AddGroupMember | AddGroupMemberRequest | AddGroupMemberResponse | |
| RemoveGroupMember | RemoveGroupMemberRequest | RemoveGroupMemberResponse | |
| ListGroupMembers | ListGroupMembersRequest | ListGroupMembersResponse | |
| SetEnrollmentState | SetEnrollmentStateRequest | SetEnrollmentStateResponse | SetEnrollmentState upserts a member's enrollment state and moves the backing `member` tuple accordingly (present iff the state grants access). |
| ListEnrollments | ListEnrollmentsRequest | ListEnrollmentsResponse |
| Method Name | Request Type | Response Type | Description |
| SetSeatLimit | SetSeatLimitRequest | SetSeatLimitResponse | |
| GetSeatUsage | GetSeatUsageRequest | GetSeatUsageResponse | |
| AssignSeat | AssignSeatRequest | AssignSeatResponse | |
| RevokeSeat | RevokeSeatRequest | RevokeSeatResponse | |
| ListSeats | ListSeatsRequest | ListSeatsResponse |
| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby |
| double | double | double | float | float64 | double | float | Float | |
| float | float | float | float | float32 | float | float | Float | |
| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum |
| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) |
| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) |
| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum |
| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) |
| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum |
| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum |
| bool | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | |
| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) |
| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) |