Team
Invite teammates, assign access, and manage shared Relay configuration without sharing credentials.
A Team shares one AnchorShell workspace and Relay configuration. Each member has their own login, permissions, and API keys. Permissions control which operations a member can perform; limits separately control how much they can use.
Available seats and plan entitlements constrain membership. Inviting someone does not share your password or turn their API keys into your keys.
Dashboard
- Open Team, invite a member by email, and choose a role.
- The recipient accepts the invitation before its seven-day expiry and completes account setup.
- Open a member to review Relay and workspace permissions.
- Adjust permissions or remove the member when access is no longer needed.
Use scoped grants for provider management, Group configuration, usage, logs, queues, or limits. Owner access cannot be edited as an ordinary member permission preset.
API
Use a key with the relevant permissions; see API authentication. Replace placeholders with IDs from the corresponding list or create response.
Team reads require cloud:team:read; changes require cloud:team:manage and the user's normal role checks. Because these writes can delegate access, use a management key containing all of your current permissions.
List members
curl 'https://api.anchorshell.com/api/team/members' \
-H 'Authorization: Bearer <API_KEY>'Response — 200 OK
Selected response fields shown; IDs and values are illustrative.
{
"members": [
{
"id": "<MEMBER_ID>",
"name": "Your name",
"email": "you@example.com",
"role": "owner",
"status": "active"
}
],
"team_members": [
{
"id": "<MEMBER_ID>",
"name": "Your name",
"email": "you@example.com",
"role": "owner",
"status": "active"
}
]
}Invite a member
curl -X POST 'https://api.anchorshell.com/api/team/invitations' \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"email": "teammate@example.com",
"role": "developer"
}'Response — 201 Created
Invitation created and invitation email queued; expires_at is authoritative.
{
"invitation": {
"id": "<INVITATION_ID>",
"email": "teammate@example.com",
"role": "developer",
"expires_at": "2026-09-24T12:00:00Z",
"accepted_at": null,
"revoked_at": null
}
}Read permissions
curl 'https://api.anchorshell.com/api/team/members/<MEMBER_ID>/permissions' \
-H 'Authorization: Bearer <API_KEY>'Response — 200 OK
Selected response fields shown; IDs and values are illustrative.
{
"member": {
"id": "<MEMBER_ID>",
"name": "Your name",
"email": "you@example.com",
"role": "developer",
"status": "active"
},
"mode": "custom",
"permissions": [
"relay:request",
"relay:usage:read:self"
],
"editable": true
}Replace Relay permissions
curl -X PUT 'https://api.anchorshell.com/api/team/members/<MEMBER_ID>/permissions' \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"permissions": [
"relay:request",
"relay:usage:read:self"
]
}'Response — 200 OK
Selected response fields shown; IDs and values are illustrative.
{
"member": {
"id": "<MEMBER_ID>",
"name": "Your name",
"email": "you@example.com",
"role": "developer",
"status": "active"
},
"mode": "custom",
"permissions": [
"relay:request",
"relay:usage:read:self"
],
"editable": true
}The permissions array replaces custom Relay grants, rather than adding to them. Omit platform_permissions to leave workspace grants unchanged.
Remove a member
curl -X DELETE 'https://api.anchorshell.com/api/team/members/<MEMBER_ID>' \
-H 'Authorization: Bearer <API_KEY>'Response — 204 No Content
No response body.
Apply a user token budget
curl -X POST 'https://api.anchorshell.com/api/relay/pro/user-limit-policies' \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{
"user_uuid": "<MEMBER_ID>",
"target_type": "global",
"metric": "tokens",
"period": "day",
"limit_value": 100000,
"enabled": true
}'Response — 200 OK
No policy ID is returned. List policies to obtain its limit_uuid.
{
"ok": true
}Budget changes require relay:limits:manage; they do not change the member's permissions.