Every space belongs to a team. Each person in a team has one role: owner, admin or member. Owners and admins manage the team; members use its spaces.
Roles
| Action | Owner | Admin | Member |
|---|---|---|---|
| See the team's spaces, runs, snapshots and members | Yes | Yes | Yes |
| Start runs, sleep and wake spaces | Yes | Yes | Yes |
| Browse and download files from snapshots | Yes | Yes | Yes |
| Turn command and process history on or off for one space | Yes | Yes | Yes |
| Leave the team | Yes, unless last owner | Yes | Yes |
| Create, fork and delete spaces; restore them from the trash | Yes | Yes | No |
| Change a space's settings | Yes | Yes | No |
| Reset, restore and undo; save, delete and share snapshots | Yes | Yes | No |
| Set the team's privacy policy and a space's privacy | Yes | Yes | No |
| Change environments and team-wide credentials | Yes | Yes | No |
| Manage billing and the spend cap | Yes | Yes | No |
| Manage webhooks and telemetry | Yes | Yes | No |
| Connect GitHub for CI and change CI settings | Yes | Yes | No |
| Link machines; connect a space to a tailnet | Yes | Yes | No |
| Invite people and revoke invites | Yes | Yes | No |
| Remove members and admins | Yes | Yes | No |
| Remove an owner | Yes | No | No |
| Change roles | Yes | No | No |
| See the whole audit log | Yes | Yes | Own actions and space events |
A team always keeps at least one owner. moatbox refuses to demote or remove the last owner, and the last owner cannot leave.
Invite people
Inviting needs the Team plan. An owner or admin types an email in Settings > Team and presses Invite.
The person gets an email from moatbox with an Accept invite link. The link opens Team invite in the dashboard, where they press Join the team. They must sign in with the address you invited. The invite expires after 7 days. New people join as members.
An invite stops working when:
- an owner or admin revokes it
- the person who sent it becomes a member or leaves the team
- the person who sent it closes their account
Remove people and change roles
Owners and admins remove people. Admins can remove members and other admins; only owners can remove an owner. Anyone can remove themselves to leave.
When someone leaves or is removed, moatbox revokes their API keys for that team and the pending invites they sent or received.
Only owners change roles. When an owner makes someone a member, moatbox revokes the invites that person sent.
The dashboard lists members and sends invites. Role changes, removals and invite revokes go through the API, from a signed-in browser session. No API key can call them.
| Method and path | Body | Does |
|---|---|---|
POST /api/v1/teams/{team}/invites |
{"email": "..."} |
Invite someone |
DELETE /api/v1/invites/{id} |
Revoke an invite | |
POST /api/v1/invites/accept |
{"token": "..."} |
Accept an invite |
PATCH /api/v1/teams/{team}/members/{user} |
{"role": "owner" | "admin" | "member"} |
Change a role |
DELETE /api/v1/teams/{team}/members/{user} |
Remove someone, or leave | |
GET /api/v1/teams/{team}/members |
List members with roles and join dates |
Seats
On the Team plan, the plan includes a number of seats. Each member past that number is an extra seat on the team's subscription. moatbox updates the seat count when someone joins or leaves, with proration. Each extra seat also raises the team's included space-hours and the number of boxes the team can run at once.
Settings > Team shows how many seats you use and how many the plan includes.
The audit log
moatbox records who did what in the team: invites, joins, removals and role changes, space creates, deletes, forks, resets and restores, snapshot saves, downloads and shares, privacy and monitoring changes, CI connects and refused jobs, API key writes, and more. Each entry has a time, the actor, the space if there is one, a kind such as member.invited or snapshot.restored, and a short summary. If an API key did it, the entry names the key.
Open Audit in the dashboard. Filter by person, space, event type (Approvals, Runs, SSH sessions, File transfers, Credentials, Integration rules, Members, Invites, Logins) and time frame. Export CSV downloads what the filters show.
Owners and admins see every entry. Members see entries about a space and their own actions.
moatbox keeps the audit log while the team exists, also under zero data retention. See Privacy.
Audit API
curl "https://app.moatbox.dev/api/v1/teams/$TEAM_ID/audit?kind=member&since=2026-11-01T00:00:00Z" \
-H "Authorization: Bearer $MOATBOX_API_KEY"
The key needs the team.read action. Query parameters:
| Parameter | Meaning |
|---|---|
space |
A space's slug |
actor |
A user id |
kind |
An exact kind, such as member.removed, or the part before the dot, such as member |
key |
An API key id |
since, until |
RFC 3339 times |
limit |
1 to 200; 50 by default |
before |
The next cursor from the previous page |
format=csv |
CSV with up to 10,000 rows per request |
The JSON answer has events and next. A CSV answer sends the next cursor in the X-Next-Cursor header and a Link header with rel="next". CSV columns: id, at, space, actor, kind, summary, key_id, key_name.
API keys are covered in API keys.