Team Members API
Team members are the users who have access to your Synapse workspace. Each member has a role that determines their permissions within the workspace. You can invite new members by email, update roles, deactivate access, and manage pending invitations through this API.
For a user guide on managing team members in the dashboard, see Team Roles & Permissions.
Endpoints
| Method | Path | Description |
|---|---|---|
GET | /v1/workspace/members | List team members |
POST | /v1/workspace/members/invite | Invite a new member |
PUT | /v1/workspace/members/{member_id}/role | Update a member's role |
DELETE | /v1/workspace/members/{member_id} | Deactivate a member |
POST | /v1/workspace/members/{member_id}/activate | Re-activate a member |
GET | /v1/workspace/members/invitations | List pending invitations for current user |
POST | /v1/workspace/members/invitations/{invitation_id}/accept | Accept a pending invitation |
List Members
Returns all team members for the current workspace, including both active members and pending invitations by default.
Auth: JWT (dashboard). Requires members:read permission.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
include_inactive | boolean | true | Include inactive members (pending invitations, deactivated members) |
Response
Members with is_active: false and invite_accepted_at: null are pending invitations that have not yet been accepted.
Invite a Member
Sends an invitation to a new team member. The invited user appears as an inactive member until they accept. Plan limits on member count are enforced at invite time.
An invitation is acceptable for 14 days from when it is sent. After that it expires: it can no longer be accepted (the accept endpoint returns 410 Gone), it is excluded from the pending-invitations list, and its seat is freed (an expired invite no longer counts toward the members plan limit). Re-inviting the same email resets the 14-day window.
Auth: JWT (dashboard). Requires members:write permission.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
email | string | Yes | Email address of the person to invite (must be a valid email) |
role | string | Yes | Role to assign: admin, developer, marketing, operations, or viewer |
name | string | No | Display name for the invited member (max 255 characters) |
You cannot invite someone with the owner role. Each workspace has exactly one owner, enforced at the database level.
Response (201 Created)
Error: Duplicate Invite (409 Conflict)
Error: Plan Limit Reached (403 Forbidden)
Update Member Role
Change the role of an existing team member. You cannot change your own role, and you cannot assign the owner role.
Auth: JWT (dashboard). Requires members:write permission.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
role | string | Yes | New role: admin, developer, marketing, operations, or viewer |
Response (200 OK)
Error: Invalid Operation (400 Bad Request)
Returned when attempting to change your own role or change the owner's role:
Deactivate a Member
Soft-deactivates a team member, revoking their access to the workspace. The member record is retained for audit purposes. You cannot deactivate yourself or the workspace owner.
Auth: JWT (dashboard). Requires members:write permission.
Response
Returns 204 No Content on success.
Error: Invalid Operation (400 Bad Request)
Re-activate a Member
Restores access for a previously deactivated member, returning them to their original role. Only a member who was previously active and then deactivated can be reactivated. Reactivation consumes a seat, so it is subject to the members plan limit just like a new invite.
Auth: JWT (dashboard). Requires members:write permission.
Response (200 OK)
Error: Plan Limit Reached (403 Forbidden)
Reactivating would take the workspace over its members plan limit. Free a seat (remove a member or let a stale invitation expire) or upgrade the plan, then retry.
Error: Never Accepted (400 Bad Request)
The target never accepted an invitation, so there is no prior access to restore. A member who is still a pending invite cannot be reactivated — invite them again instead.
List Pending Invitations
Lists pending workspace invitations for the currently authenticated user across all workspaces. This is used by the dashboard to show the user which workspaces they have been invited to join.
Auth: JWT (dashboard). No specific permission required beyond authentication.
Response
If the user has no pending invitations, invitations is an empty array. Expired invitations (past their 14-day window) are excluded — only invitations that can still be accepted are returned.
Accept an Invitation
Accepts a pending invitation, activating the membership and linking the current user's identity to the new workspace. After accepting, the frontend should switch the workspace context.
Auth: JWT (dashboard). The invitation must belong to the current user's email address.
Response (200 OK)
Error: Not Found (404)
Returned when no matching pending invitation exists for the current user — the invitation never existed, was revoked, or was already accepted.
Error: Invitation Expired (410 Gone)
The invitation existed but has passed its 14-day window and is no longer acceptable. This is distinct from the 404 above (which means "never existed / already consumed"). Ask the workspace Owner or Admin to send a fresh invitation.
Roles Reference
| Role | Description |
|---|---|
owner | Full access including billing and workspace deletion. One per workspace. |
admin | All CRM permissions plus user management. No billing access. |
developer | Flows, templates, segments, contacts, logs, and dev tools. |
marketing | Flows, templates, segments, and analytics. |
operations | Contacts (read-only), email logs, and analytics. |
viewer | Analytics read-only. |
Plan Limits
| Plan | Max Members |
|---|---|
| Free | 1 |
| Starter | 3 |
| Growth | 10 |
| Enterprise | Unlimited |
When the member limit is reached, invite requests return 403 with plan_limit_reached.