Sign in

Teams

What a shared workspace adds to one account: roles, policies that bind members, quiet hours, an audit log with a scheduled export, scoped secrets, and a live activity page.

On this page13

Every rule here is off until the owner turns it on; none changes a workspace of one.

Roles

RoleCan
OwnerEverything: billing (and its email), the domain and invite link, roles, policies, quiet-hours exemptions, the audit export, removing members. No policy binds the owner; ownership never moves.
MemberEvery box, secret, snapshot and environment; reads the audit log, the activity page and the policies. Policies bind members.
ContractorA member fenced to the boxes they own. Policies bind contractors too.

The owner changes a role under Dashboard → Settings → Members (a member.role audit row). Making a member a contractor revokes the phone passwords, browser tickets and shared-port sessions they hold on boxes they do not own, closes their tunnels to those boxes, and ends the anyone and public links they made (Share a port).

A contractor:

  • sees only the boxes they created: another member's box, and its snapshots, read as not found everywhere, and a template name held by a snapshot they cannot see is 409 template_taken;
  • cannot access workspace sandboxes (not found). Demotion also blocks pending sandbox changes and monitor-ticket requests that have not yet been accepted; work already accepted may finish. Sandbox requests through API keys use the member's current role, so promotion restores access within the key's permissions. Revoke an API key explicitly when it must remain invalid after a later promotion;
  • lists environments and upgrades their own boxes, but creating, editing or deleting one is 403 not_allowed;
  • always creates Restricted (safe for third parties) boxes, which none of your credentials reach (Safe for third parties); an API create with "restricted": false is 403 policy_denied, rule contractor_restricted;
  • gets 403 not_allowed from the audit log, the members list, the policies, workspace secrets and cloud federation, and a secret only when it is granted to their box or to them.

A box belongs to the member who created it; boxes Prized creates for you belong to the owner (ownerUserId on the box object). The dashboard's Boxes page lists the boxes you own first, so a box someone else created for you is in its Team section (Dashboard: Boxes).

Policies

Dashboard → Settings → Policies: the owner edits, members read, contractors see Your role does not include the workspace policies.

RuleKeyRangeWhat it does
Spend per membermemberSpendCapUsd$1 to $1,000,000 a cycle, whole dollarsCaps what one member's boxes draw in a billing cycle; checked on create, wake and resize.
Boxes per membermemberBoxLimit1 to 100Caps a member's live boxes and pending failed-launch cleanup; checked on create, fork and wake.
Largest size per membermemberMaxTierAny sizeThe biggest size a member may create or resize to.
Auto-pause floorautoPauseFloorMin30 minutes to 7 daysMembers' boxes must auto-pause within this long of going idle; longer or off is refused.
Quiet hoursquietHoursOne window a day, per weekdayPauses every running box in the window (Quiet hours).
Audit log retentionauditRetentionDays7 to 365 days, default 90How long audit rows are kept.
Anyone linksanyoneLinksOwnerOnlyOn or offOnly the owner makes links anyone can open; links made before it was turned on keep working until stopped. Public links are the owner's either way.
  • A refusal is 403 policy_denied with rule and message; the CLI prints the message (exit 5), the dashboard shows it beside the control.
  • The spend cycle is the month ending at your plan's period end, or the UTC calendar month without a plan; spend counts against the box's owner.
  • Waking or resizing a teammate's box checks the box owner's spend, not yours. A wake checks their box count too, refusing only when they are already over the limit. The size cap still applies to every resize a member requests; workspace owners remain exempt from these policies.
  • The box limit refuses a wake only when the member is already over it. A failed launch keeps its slot until cleanup finishes, even after deletion.
  • Failed-launch cleanup also reserves four hours of that box's allowance against the member's spend cap. This is not billed usage; the reservation lifts when cleanup finishes, not when the billing cycle changes.
  • Under a floor, a new box with no auto-pause setting takes the floor, a box from before the floor is paused as if it had it, and a member's Auto-pause menu stops there. On the free credit the floor does not apply: only the box's own setting, or the credit's 2-hour default, counts.

GET /api/v1/workspace/policies reads the rules; changing them is dashboard-only and writes a policy.update row (API reference).

Quiet hours

Every box in the workspace, the owner's included, is paused in a daily window: start and end as HH:MM, the weekdays it applies to, the weekdays quiet all day, and one IANA timezone. A window that ends before it starts crosses midnight and belongs to the day it started on.

  • A box woken inside the window stays up 15 minutes, then is paused again.
  • To exempt a box, the owner marks it Exempt under Quiet hours on its box page (PATCH /api/v1/boxes/{id} with {"quietHoursExempt": true}; anyone else is 403 not_owner).

A quiet-hours pause is an ordinary pause.

Audit log

Dashboard → Settings → Audit log (Dashboard: Audit): who did what, on which box, when. Owners and members read it; contractors see Your role does not include the audit log.

Two origins

  • server: the control plane saw it.
  • client, shown as reported: the CLI or the box told us afterwards, because the control plane never sees a command run over ssh, a file copied, or a prompt started. A reported row is a claim by a credential in your workspace, not an observation: an offline or older CLI posts none, and nothing checks it against what ran.

Once deletion begins, new client reports for that box are refused; existing rows remain in the log.

Every row names the member (actorUserId) and the credential that acted (actorTokenId); browser terminal and phone sessions count as the member who opened them.

SSH certificate issued means a credential was issued, not that SSH authentication or a terminal opened successfully. Failed connection attempts can leave these rows; a certificate can also be reused, so the rows are not a count of successful sessions.

What is recorded

Server-observed kinds record names and hosts, never values, contents, keys or tokens:

KindDetail
box.createtier, region, hostname, restricted, from (a snapshot or template)
box.wake, box.delete
box.pausereason: quiet_hours, auto_pause, pause_deadline, or none for a pause you asked for
box.resize, box.move_regionfrom, to
box.settingsThe keys changed
box.envcount
box.forkfrom, fromHostname, to, toHostname, tier, snapshotId, keepSnapshot
box.connectSSH certificate issued, not a confirmed connection: keyId, and scope (terminal, monitor, mobile-ssh, port-share) for a browser, phone or shared-port session; monitor also marks the live charts of the terminal dashboard, which can only read a box's stats
box.sessionA browser terminal opened: scope, ticketId
port_share.create, port_share.revokeA port shared, or the link stopped: shareId, port, slug, access (members, anyone, public); expiresAt on an anyone or public link; reason on a revoke Prized made: replaced (shared again with another audience), member_removed (its maker left or became a contractor), staff (Share a port)
port_share.openA member opened a members link (their first visit of the day, or after signing in again), or a visitor first opened an anyone or public link in their browser: shareId, port, slug, access; the member is the actor, and a visitor shows as a browser ticket with no member
snapshot.createsnapshotId, name, kind, templateName
snapshot.delete, snapshot.template
environment.create, environment.update, environment.deleteUpdate carries change (the kind of edit) and key (the var, file, repo or toggle); never a value or a file body
secret.create, secret.update, secret.delete, secret.mount, secret.unmount, secret.grant, secret.revokeNames and hosts
member.addvia: first_contact, domain, invite
member.remove, member.leave, member.role, invite.rotate, invite.revoke
token.createname, tokenId, access; expiresAt and boxes (how many) for a key made with New key
token.revoketokenId, or all: true with count
token.rotatetokenId
policy.updatekeys
command_history.deletecommandId, or all: true with count (Command history)
audit.exportaction (set or clear), host
workspace.settings, workspace.retention, workspace.reopen
workspace.closepurgeAfter, boxesSuspended, membersRemoved, cliTokensRevoked, portSharesRevoked

Client-reported kinds never record stdout, stderr, file contents, the prompt beyond its first line, or a VNC password:

KindDetailReported by
execcommand (up to 512 characters), cwd, detached, processIdprized exec when it runs something; POST /exec
file.upload, file.downloadpath, bytes, files, inline, directoryprized cp after a copy that moved something; the edge's file routes
promptfirstLine, provider, runId, conversationId, queuedprized prompt; POST /prompts
desktop.startmode, profileprized desktop and prized browser (not --stop); the dashboard's Desktop tab

From the CLI and the API

prized team log                                   # the last 24 hours
prized team log --since 7d --kind exec,prompt --member ana@acme.com

Columns and flags are on CLI: Team. GET /api/v1/audit takes the same filters and pages by before and limit; format=csv streams up to 50,000 rows (API reference).

Scheduled export

Owners set a URL and a write-only secret in the Export section of the Audit page; its status line shows the last delivery and the last error. The copy is yours, at your endpoint; there is no hosted destination.

PartContract
URLhttps, up to 2,048 characters, on a public host, with no credentials or fragment. Private, loopback and link-local addresses are refused on save and again before every delivery.
Secret16 to 256 characters, encrypted at rest and never shown again
DeliveryOnce an hour, one POST per batch, oldest first: up to 500 events per batch and 20 batches per pass. Ten seconds per request; redirects are never followed.
Body{"v": 1, "workspaceId": "...", "events": [...]}
HeadersContent-Type: application/json, X-Prized-Signature: sha256=<hex HMAC-SHA256 of the body under your secret>, X-Prized-Event-Id-From, X-Prized-Event-Id-To
AcknowledgingAny 2xx advances the cursor; anything else lands on the status line, and the same batch is sent again next hour
OrderAt-least-once and in order, so dedupe on id; delivery starts with the rows newer than the moment you saved the destination
openssl dgst -sha256 -hmac "$SECRET" body.json   # must equal the X-Prized-Signature hex

Retention

Rows are kept 90 days by default, or 7 to 365 as the owner sets under Policies. A row outlives the API key, member and box it names, and goes when the workspace is erased (Data retention). Zero data retention does not shorten the window, but with it on the exec, file.upload, file.download and prompt rows keep no detail (shown as no detail kept (zero data retention)).

Scoped secrets

A secret is workspace-wide until you grant it to a box or a member.

GrantsWho can mount it
NoneEvery box except a contractor's
One or moreOnly the boxes named and the boxes owned by the members named; removing the last grant makes it workspace-wide again

A secret created with an Available to choice (or grants on the API) starts with those grants; a connector's secret starts granted to the box you connected it to. A box whose grant is revoked loses the value within 15 seconds, and its mount shows no longer granted until you unmount it.

Grant from the dashboard (Available to on the new-secret form, Details on a row), the CLI (prized secrets grant NAME --box BOX or --member EMAIL; CLI: Secrets), or the API (POST /api/v1/secrets/{id}/grants; API reference). Mounting a secret the box may not have is 403 secret_not_granted.

Usage

A use is one HTTPS request to an allowlisted host in which the broker swapped in the value, counted whatever the upstream answered; refused plain-HTTP requests, other hosts, and requests without the placeholder do not count. Recorded: the placeholder, the host, the count, and the first and last time; never a path, header, body or value. Counts are a floor (a box restart can lose the last batch); read them under Details on the Secrets page, with prized secrets usage NAME, or from GET /api/v1/secrets/{id}/usage.

Team activity

Dashboard → Activity (Dashboard: Activity) shows what the team is doing now; contractors see their own boxes only.

TermMeaning
Attached sessionA device (the CLI, a browser terminal, or a phone) connected to a box, counted while its tunnel is open, for at most 12 hours. It says a device is attached, never what is typed or shown.
Last prompt, last execFrom reported rows, so an older CLI leaves them blank
TodaySince UTC midnight
CycleThe plan's period, or the UTC calendar month without a plan
SpendMetered compute attributed to the box that drew it, in whole UTC-hour buckets; attribution, not billing (the workspace pays one bill)

prized team status prints the same, and --json the object GET /api/v1/team/status answers (CLI: Team, API reference).

What is not covered

  • What happens inside an ssh session. SSH certificate issuance is recorded (box.connect), not whether the connection succeeded or the commands typed in it.
  • Keys that belong to nobody. An API key from before workspaces existed is bound by no per-member policy, and its rows name no member (API keys).