Roles
| Role | Read | Edit own | Edit team | Manage members | Billing |
|---|---|---|---|---|---|
| Viewer | ✓ | ||||
| Editor | ✓ | ✓ | ✓ | ||
| Admin | ✓ | ✓ | ✓ | ✓ | |
| Owner | ✓ | ✓ | ✓ | ✓ | ✓ |
POST /v1/teams/{id}/transfer-admin to hand off.
Auth and team binding
| Principal | Team binding |
|---|---|
| Session | All teams the user belongs to. |
ak_live_* | Pinned to the team it was minted on. Cannot act on other teams. |
| OAuth 2.1 | The team the user consented under at /authorize time. |
| Figma plugin | All teams the user belongs to. |
Reading your teams
Members
Per-evaluation sharing
Beyond team membership, you can share a single evaluation with people who are not on the team. Three primitives:| Primitive | When to use it |
|---|---|
| Public share token | Mass distribution. One URL, anyone with it can rate. |
EvaluationShare | Named individuals — a specific email gets a specific permission. |
EvaluationInvite | Pre-account invitation — sends an email, becomes a Share on accept. |
EvaluationAccessRequest | Someone with the link who lacks access asks for it. |
editorsCanShare on the evaluation row —
default true. When the Owner flips it off, only Admin+ can edit
sharing.
”Not found” vs “no access”
We deliberately conflate the two. A 404 from/v1/evaluations/{id}
means either “no such row” or “you lack permission”. This avoids
leaking the existence of resources to outsiders.
The single exception: cross-team requests where the caller has a
membership on a team but not the resource’s team return a 403 with
code: evaluation_no_access and a details object containing the
resource’s team name and the caller’s email. The dashboard uses this
to render a “switch account” empty state.