Security
What owners, admins, members, viewers and billing users can do in a workspace, and how API keys and OAuth tokens are limited.
Every person in a workspace has exactly one role. The role decides what they can see and change in the dashboard, and in anything that acts as them: the dashboard itself and AI assistants connected to the MCP server. API keys have their own permissions instead. Pozy checks the role on the server for every request, so a blocked action fails even if someone calls the API directly with their session.
#The five roles
| Role | Meant for |
|---|---|
| Owner | The person responsible for the workspace, its billing and its sign-in rules. |
| Admin | Team leads and developers who run the workspace day to day. |
| Member | People who publish, reply, run ads and automations. |
| Viewer | Clients, stakeholders and anyone who only needs to look. |
| Billing | Finance staff who handle invoices and payment methods. |
#What each role can do
| Area | Owner | Admin | Member | Viewer | Billing |
|---|---|---|---|---|---|
| Posts, accounts, inbox, analytics, ads, automations: view | Yes | Yes | Yes | Yes | No |
| Posts, accounts, inbox, analytics, ads, automations: create and change | Yes | Yes | Yes | No | No |
| API keys, webhooks, logs, connected apps: view | Yes | Yes | Yes | No | No |
| API keys, webhooks: create, change, revoke | Yes | Yes | No | No | No |
| Team: see members | Yes | Yes | Yes | Yes | No |
| Team: invite, remove, change roles | Yes | Yes | No | No | No |
| Activity log | Yes | Yes | No | No | No |
| Welcome screen branding, your own platform apps | Yes | Yes | No | No | No |
| Usage and invoices: view | Yes | Yes | No | No | Yes |
| Payment methods and plan changes | Yes | No | No | No | Yes |
| Single sign-on setup | Yes | No | No | No | No |
| Delete the workspace | Yes | No | No | No | No |
A request a role cannot make returns 403 with code: "role_forbidden" and a message that names the role, for example "Your role (viewer) cannot change this."
#Change someone's role
Owners and admins change roles on the Users page. Role changes, invites and removals are written to the activity log.
Invitations are sent by email and expire after 7 days. People who join through single sign-on start as members.
Invitation emails are capped per workspace, team and creator invitations together: 20 a day without a payment method (with at most 50 waiting to be accepted), and 500 a day with one. Without a payment method, the person inviting also needs a confirmed email address. One invitation can be emailed again once an hour. Past a cap you get 429 with code: "invite_limit_reached" or "invite_resend_too_soon"; create an invite link and share it yourself instead. POST /v1/invite/tokens returns emailSent: false when the email could not go out, so you know to share the link.
#API keys
API keys are not tied to a role. A key acts for the workspace and is limited by its own settings:
| Setting | Effect |
|---|---|
scope: "profiles" with profileIds |
Only those profiles and their accounts. Anything else returns 403 profile_out_of_scope. |
permission: "read" |
Every write returns 403 read_only_key. |
disabledResourceGroups |
Endpoints in those groups return 403 resource_group_disabled. |
expiresIn |
The key stops working after that many days. |
Some actions need a full-scope, read-write key: managing API keys and changing the welcome screen. See Authentication.
#OAuth tokens (MCP)
When someone connects an AI assistant through the MCP server, the token acts as that person and carries their role. A viewer's token is read-only, and so is any token the person approved as read-only. Removing someone from the workspace stops their tokens from working there.
#Choosing roles
- Give developers admin if they create keys and webhooks. A member can see keys and webhooks but not create them.
- Give agency clients viewer so they can follow their posts and analytics without changing anything.
- Keep owner with one accountable person. Ownership controls billing and single sign-on.
#Endpoints
| Endpoint | What it does |
|---|---|
POST /v1/invite/tokens |
Create invite token |
GET /v1/users |
List users |
GET /v1/users/{userId} |
Get user |