Skip to main content

List Members

Get all members and pending invites for a workspace.
const res = await client.team.membersByWorkspaceSlug.$get({ 
  slug: "acme" 
})
const { members, invites, meId } = await res.json()
Type: Private Procedure
slug
string
required
Workspace slug
members
array
invites
array
meId
string
Current user’s ID
Results are cached for 120 seconds with stale-while-revalidate for 10 minutes.

Invite Member

Send an invitation to join the workspace.
const res = await client.team.invite.$post({
  slug: "acme",
  email: "user@example.com",
  role: "member"
})
const { ok, token } = await res.json()
Type: Private Procedure (requires member management permission)
slug
string
required
Workspace slug
email
string
required
Email address to invite
role
string
required
Role to assign: “admin”, “member”, or “viewer”
ok
boolean
Whether invite was sent successfully
token
string
Unique invitation token
Validation:
  • Email must not belong to an existing member
  • Email must not belong to the workspace owner
  • Workspace must be within member limit for current plan
  • Rate limited to prevent spam (1 minute cooldown per user)
Invite Details:
  • Invites expire after 7 days
  • Email includes workspace name and branded invitation link
  • Invitation link format: {APP_URL}/invite/{token}
Attempting to invite an existing member or exceeding plan limits will return an error.

Resend Invite

Resend an existing invitation email.
const res = await client.team.resendInvite.$post({
  slug: "acme",
  inviteId: "invite-123"
})
const { ok } = await res.json()
Type: Private Procedure (requires member management permission)
slug
string
required
Workspace slug
inviteId
string
required
ID of the invite to resend
Behavior:
  • If invite is expired, generates new token with 7-day expiration
  • Sends branded email with updated invitation link
  • Returns 404 if invite not found

Revoke Invite

Cancel a pending invitation.
const res = await client.team.revokeInvite.$post({
  slug: "acme",
  inviteId: "invite-123"
})
const { ok } = await res.json()
Type: Private Procedure (requires member management permission)
slug
string
required
Workspace slug
inviteId
string
required
ID of the invite to revoke

List Invites

Get all active invitations for a workspace.
const res = await client.team.listInvites.$get({ 
  slug: "acme" 
})
const { invites } = await res.json()
Type: Private Procedure
invites
array
Array of active (non-expired, non-accepted) invitations

Update Member Role

Change a member’s role in the workspace.
const res = await client.team.updateRole.$post({
  slug: "acme",
  userId: "user-123",
  role: "admin"
})
const { ok } = await res.json()
Type: Private Procedure (requires member management permission)
slug
string
required
Workspace slug
userId
string
required
ID of the user to update
role
string
required
New role: “admin”, “member”, or “viewer”
Cannot modify the workspace owner’s role.
Role Permissions:
  • Admin: Full workspace access, can manage members and settings
  • Member: Can create and moderate content
  • Viewer: Read-only access to workspace content

Remove Member

Remove a member from the workspace.
const res = await client.team.removeMember.$post({
  slug: "acme",
  userId: "user-123"
})
const { ok } = await res.json()
Type: Private Procedure (requires member management permission or removing self)
slug
string
required
Workspace slug
userId
string
required
ID of the user to remove
Permissions:
  • Members can remove themselves (leave workspace)
  • Admins can remove other members
  • Cannot remove the workspace owner
Side Effects:
  • Deletes all pending invites for the user’s email
  • Removes workspace membership record
The workspace owner cannot leave the workspace.

Accept Invite

Accept a workspace invitation.
const res = await client.team.acceptInvite.$post({
  token: "invite-token-123"
})
const { ok } = await res.json()
Type: Private Procedure
token
string
required
Invitation token from email
ok
boolean
Whether invite was accepted successfully
Validation:
  • Token must be valid and not expired
  • User’s email must match invited email
  • Workspace must be within member limit
  • User must not already be a member
Behavior:
  • Creates workspace membership with invited role
  • Deletes all pending invites for the email
  • Returns ok: false if invite was already accepted

Decline Invite

Decline a workspace invitation.
const res = await client.team.declineInvite.$post({
  token: "invite-token-123"
})
const { ok } = await res.json()
Type: Private Procedure
token
string
required
Invitation token to decline
Validation:
  • User’s email must match invited email
  • Token must be valid and not expired

Get Invite by Token

Retrieve invitation details by token.
const res = await client.team.inviteByToken.$get({
  token: "invite-token-123"
})
const { invite } = await res.json()
Type: Private Procedure
token
string
required
Invitation token
invite
object | null
Returns null if:
  • Token is invalid
  • Invite is expired
  • User’s email doesn’t match invited email

Add Existing Member

Add an existing user or send invite if user doesn’t exist.
const res = await client.team.addExisting.$post({
  slug: "acme",
  email: "user@example.com",
  role: "member"
})
const { ok, invited } = await res.json()
Type: Private Procedure (requires member management permission)
slug
string
required
Workspace slug
email
string
required
Email address to add
role
string
required
Role to assign
ok
boolean
Whether operation was successful
invited
boolean
true if invite was sent, false if user was added directly
token
string | undefined
Invitation token (only if invited is true)
Behavior:
  • If user exists: Adds them directly to workspace
  • If user doesn’t exist: Sends invitation email
  • Deletes any pending invites if user is added directly
  • Workspace must be within member limit

Build docs developers (and LLMs) love