Team Management
Invite colleagues to your workspace, decide what they can see before they join, and hand over their work when they leave.
Required Scopes
| Scope | Purpose |
|---|---|
team:read | List members, roles and pending invitations |
team:create | Create, edit, resend and revoke invitations |
team:update | Change a member's roles and settings; also needed to set non-default member_settings on an invitation |
team:delete | Remove members and preview what removing them affects |
team:admin | Grant system roles (Owner, Admin, ...) |
GET /api/v1/users lists the current members (paginated, page_size up to 100) with their roles and availability. GET /api/v1/roles lists the roles you can grant: the system roles and your workspace's custom roles.
Invite a Member
curl -X POST "https://api.sendseven.com/api/v1/invitations" \
-H "Authorization: Bearer s7_api_a1b2c3d4e5f6789012345678abcdef00" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"role_ids": ["role_support_agent", "role_campaigns"],
"member_settings": {
"inbox_access_mode": "restricted",
"inbox_ids": ["inbox_support_de"],
"contact_history_visibility": "accessible_only",
"tag_ids": ["tag_german"]
}
}'
The invitee receives an email and joins when they accept it. The invitation expires after 7 days. The response (201) is the invitation: id, email, status (pending), role_ids, member_settings, expires_at and so on.
| Field | Required | Description |
|---|---|---|
email | Yes | The address to invite |
role_ids | One of the role fields | 1 to 20 role IDs from GET /roles (system or custom roles). The first one is the primary role. Takes precedence over role_id and role |
role_id | A single role ID | |
role | Deprecated role name (admin, support_agent, marketing_agent, viewer, billing_admin, developer, owner). Prefer role_ids | |
member_settings | No | Access settings applied when the invitation is accepted, see below |
member_settings (all optional; anything left out uses the default)
| Field | Default | Description |
|---|---|---|
inbox_access_mode | all | all inboxes, or restricted to the custom inboxes in inbox_ids |
inbox_ids | Custom inboxes the member may see when restricted | |
contact_history_visibility | all | accessible_only: in a contact's conversation history the member sees only conversations from inboxes they can access. Members with restricted inbox access always get accessible_only; Owners and Admins always see everything |
tag_ids | Member tags (skills) for skill-based routing | |
ai_suggestions_enabled | true | false turns off AI drafting and suggestions in Conversations for this member |
account_billing_access | false | Access to the billing account's usage across workspaces. Only the billing account owner can grant it |
Rules
- You can only grant roles whose permissions your token has itself (
403otherwise). Granting a system role needsteam:admin; the billing role can only be granted by an Owner. - Non-default
member_settingsneedteam:updatein addition toteam:create. inbox_idsandtag_idsmust belong to your workspace (422), and role IDs must exist (404).400when the person already has a pending invitation or is already a member.- At most 30 invitations per hour (
429).
Manage Pending Invitations
| Method | Path | Scope | Description |
|---|---|---|---|
GET | /invitations | team:read | Pending and past invitations: {"invitations": [...], "total": n} |
PATCH | /invitations/{invitation_id} | team:create | Change role_ids (or role_id, not both) and member_settings of a pending or expired invitation. member_settings are merged: a field set to null goes back to its default, "member_settings": null resets all. No new email is sent and the link and expiry stay the same. 409 once accepted |
POST | /invitations/{invitation_id}/resend | team:create | Send the email again with a new link and a fresh 7-day expiry |
DELETE | /invitations/{invitation_id} | team:create | Revoke the invitation |
Changing settings with PATCH also needs team:update for each setting you change, like on create.
Legacy: add a member without invitation
POST /api/v1/users/invite (scope team:create, body {"email", "name", "role_id"}) adds the person to the workspace directly, without sending an email and without their confirmation. They can sign in with that email address right away. It exists for older integrations; use POST /invitations for new ones. Only Owners and Admins can call it, and 409 means the person is already a member.
Remove a Member
Before removing someone, check what depends on them:
curl "https://api.sendseven.com/api/v1/users/usr_7f3a9c/removal-impact" \
-H "Authorization: Bearer s7_api_a1b2c3d4e5f6789012345678abcdef00"
{
"user_id": "usr_7f3a9c",
"owned_contacts": 214,
"open_assigned_conversations": 9,
"substitute_for": [
{"absence_id": "abs_1", "user_id": "usr_2b8e41", "user_name": "Jonas", "starts_at": "2026-11-02T00:00:00Z", "ends_at": "2026-11-09T00:00:00Z"}
],
"flows": [{"id": "flow_9d2", "name": "VIP hand-over", "status": "published"}]
}
substitute_for lists colleagues whose out-of-office names this member as substitute; flows lists flows that reference the member (for example as a fixed assignee). Scope team:delete.
Then remove the member and say what happens to their work:
curl -X DELETE "https://api.sendseven.com/api/v1/users/usr_7f3a9c" \
-H "Authorization: Bearer s7_api_a1b2c3d4e5f6789012345678abcdef00" \
-H "Content-Type: application/json" \
-d '{
"contacts": {"mode": "round_robin_inbox", "target_id": "inbox_support_de"},
"conversations": {"mode": "same_as_contacts"}
}'
Returns 204. The body is optional; the hand-over runs in the background right after the removal.
| Field | Values | Default |
|---|---|---|
contacts.mode | unassign, user, round_robin_inbox, round_robin_tag, least_busy_inbox, least_busy_tag: what happens to the contacts the member owns | unassign |
contacts.target_id | The user, inbox or tag ID the mode needs | |
conversations.mode | keep (stay assigned to the removed member), unassign, or same_as_contacts (follow the contacts' new owners): what happens to their open assigned conversations | keep |
Rules: Only Owners and Admins can remove members, only an Owner can remove another Owner, you cannot remove yourself (400), and the last Owner cannot be removed (403). Out-of-office periods that named the member as substitute lose their substitute, and the colleagues concerned are notified.
API tokens and OAuth connections act as the member who created them. Once that member is removed or deactivated, their tokens return 401 immediately. Move integrations to another member's token before you remove someone.
Next Steps
- Availability and Out of Office -- work hours, absences and auto-assignment rules
- Custom Inboxes -- restrict what members see
- Skill-Based Routing -- route by member tags
- Manage Contacts -- contact owners