The matrix
Roles are cut by how much they widen Peeve’s reach, not by seniority.
Two details that catch people out:
Responder holds the kill switch. The safe direction must be available to
whoever is on shift, not only to an owner who may be asleep.
Developer holds none of the gated capabilities. It is a reach-restricted,
technical-setup role: the install, the snippet, the CLI, widget appearance,
connectors, and viewing the dashboard — none of which are gated by this matrix.
It widens Peeve’s reach the least of any role that can still do setup.A Developer can see the workspace publishable and secret keys, which an Admin
cannot. That is a different axis — see
Credentials.
Which role each endpoint needs
The API maps onto the capability the dashboard already requires for the same act, so the two cannot drift.PATCH /v1/contacts/{id}/token sits on grant rather than something weaker
because it is the same class of act as the contact page’s “issue access”: it
puts a credential for one of your users into Peeve. A credential that may only
read must not be able to do that.The per-contact MCP endpoint needs
reply when called with a user token —
a teammate pointing their assistant at one customer is the same act as picking
up that customer’s hand-off in the console, so it needs the same reach and no
more. Viewer and Developer are refused outright.POST /v1/users and POST /v1/answer take a
secret key rather than a user token, so the role
matrix does not apply to them.
When a role is insufficient
A403 that names both the role you resolved to and the capability you lacked —
the two facts needed to fix it.
Unrecognised roles fail closed
Any stored role value that is not one of the five folds to Viewer, the least-privilege role, so a bad value can never widen reach. The legacymember
value maps to responder, which is the reach it historically carried.
Every call is attributed
Each API and MCP call is logged with the token id — never the token — plus the user, the role that resolved, the action, the filters used and the result count. Configuration writes also record before and after. That is what lets a workspace answer “who changed this”, and it is why MCP requires a named credential rather than a shared one. Free-text and email lookups are recorded as<redacted>: they would otherwise
carry your own customers’ personal data into the log.