Get started pages

Auth, invites, and roles

How teammates get project access — People settings, invite lifecycle, and owner vs member.

Invite flow (shipped)

  1. A project owner opens Settings → People and clicks Invite.
  2. POST /api/projects/{slug}/members creates a pending invitations row (requires owner via getProjectForOwner).
  3. Invite email is sent with an accept URL. On email failure the invite row is deleted.
  4. The invitee signs in and accepts (/api/invites/{inviteId}/accept).
  5. Accept fails if the signed-in email does not match the invite email.
  6. On success they become a project_members row and can open the project.

Invite operations

ActionHTTPWho
Create invitePOST /api/projects/{slug}/membersOwner
CSV import invitesPOST /api/projects/{slug}/members/import-csvOwner
List peopleGET /api/projects/{slug}/membersProject member
ResendPOST /api/projects/{slug}/invites/{inviteId}(UI from People)
RevokeDELETE same invite path(UI from People)
Remove memberDELETE /api/projects/{slug}/members/{userId}Owner; cannot remove last member
Accept/api/invites/{inviteId}/acceptInvitee (matching email)

Expiry

  • New invites set expiresAt to now + 14 days.
  • Rows past expiry are ignored at lookup (expiresAt null or future required).
  • Expired invites show unavailable to the invitee — create or resend from People.

Default invite / membership role when unset: member.

Roles

People UI options:

ValueLabel
ownerProject owner
memberMember

Owner-gated actions (verified)

AreaGate
Invite / CSV invite / remove membersgetProjectForOwner → 403 otherwise
Connectors connect/disconnectisProjectOwner / role === "owner"
Creating agents / owner-only agent fieldsOwner checks in agents API
Some Home / Stripe / project mutation routesOwner access required messages

Members can still use most analytics surfaces (Replays, Dashboard, Issues, etc.). Treat owner as required for people administration and connector/agent integration changes.

Not every route’s role check is listed here — use UI disablement and 403 responses as the practical guide.

General access control (People UI)

Settings → People shows General access (Restricted / Anyone with the link / domain). Changing the select updates local React state only in the current frontend; persistence and server enforcement are not verified as wired. Rely on membership + invites for access control.

Wizard approval vs People invites

MechanismGrants
People inviteDashboard membership for a human email
Wizard device flow (wizard_sessions)Approved project API key for CLI install

Approving the wizard does not invite a teammate to the project UI.