Teams
Create, update, and manage routing teams via the SkipUp API.
Teams group workspace members for shared scheduling. SkipUp uses a team’s mode to decide who handles each incoming request: pool teams (round robin), stack teams (collective), or manual teams (no automatic assignment). Each non-manual team also gets its own scheduling email address.
The team object
Section titled “The team object”| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for the team. |
name | string | Display name of the team. |
slug | string | URL-safe identifier derived from the name. Unique per workspace. |
description | string | null | Free-text description shown in the SkipUp app. |
mode | string | One of pool, stack, or manual. |
email_address | string | null | Scheduling email address for the team. null for manual-mode teams or when the workspace has not yet provisioned an email handle. |
member_count | integer | Number of members on the team. |
stack_always_apply | boolean | Stack-mode only. When true, the team is included on every request regardless of whether the inbound email matches the team address. |
include_all_members | boolean | Stack-mode only. When true, every active workspace member participates in stack scheduling for this team. |
introduce_member | boolean | Pool-mode only. When true, the AI composes a brief introduction of the assigned member to the participant. |
introduction_guidance | string | null | Pool-mode only. Free-text guidance the AI uses when composing the introduction. |
active | boolean | true when the team is in use, false after deactivation. |
deactivated_at | string | null | ISO 8601 timestamp of when the team was deactivated. |
created_at | string | ISO 8601 timestamp of creation. |
updated_at | string | ISO 8601 timestamp of the last update. |
members | array | (Show / create / update endpoints) List of team membership records. |
next_assignee | object | null | (Show endpoint, pool mode only) The team membership next in line to receive a round-robin assignment. null for stack/manual teams or when no eligible member exists. |
| Mode | Description |
|---|---|
pool | Round-robin assignment. Each request goes to the next available member. |
stack | Collective scheduling. The whole team coordinates with the participant. |
manual | No automatic routing. Members are referenced for context, not assignment. |
The team membership object
Section titled “The team membership object”| Field | Type | Description |
|---|---|---|
id | string | Unique identifier for the team membership. |
team_id | string | ID of the team this membership belongs to. |
role | string | member or manager. Managers can edit team settings. |
workspace_membership_id | string | ID of the underlying workspace member. |
email | string | Email of the workspace member. |
name | string | null | Full name of the workspace member, if known. |
paused_at | string | null | ISO 8601 timestamp of when the member was paused (round-robin only). null when active. |
last_assigned_at | string | null | ISO 8601 timestamp of when the member was last assigned a round-robin meeting. null if never assigned or just unpaused. |
created_at | string | ISO 8601 timestamp of when the member was added to the team. |
List teams
Section titled “List teams”GET /api/v1/teamsReturns a paginated list of teams in your workspace, sorted by creation date (newest first).
Scope required: teams.read
Query parameters
Section titled “Query parameters”| Parameter | Type | Description |
|---|---|---|
active | string | Pass true to return only active teams. |
limit | integer | Number of results per page. Default 25, max 100. |
cursor | string | Cursor for fetching the next page. Use next_cursor from a previous response. |
Request
Section titled “Request”curl "https://api.skipup.ai/api/v1/teams?active=true" \ -H "Authorization: Bearer $SKIPUP_API_KEY"Response
Section titled “Response”{ "data": [ { "id": "tm_01HQ...", "name": "Sales", "slug": "sales", "description": "Outbound sales team", "mode": "pool", "member_count": 4, "stack_always_apply": false, "include_all_members": false, "introduce_member": true, "introduction_guidance": "Keep the introduction friendly and concise.", "active": true, "deactivated_at": null, "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-04-20T14:30:00Z" } ], "meta": { "limit": 25, "has_more": false }}Get a team
Section titled “Get a team”GET /api/v1/teams/:idRetrieves a single team, including its full member roster.
Scope required: teams.read
Request
Section titled “Request”curl "https://api.skipup.ai/api/v1/teams/tm_01HQ..." \ -H "Authorization: Bearer $SKIPUP_API_KEY"Response
Section titled “Response”{ "data": { "id": "tm_01HQ...", "name": "Sales", "slug": "sales", "mode": "pool", "member_count": 2, "active": true, "members": [ { "id": "tmem_01HQ...", "team_id": "tm_01HQ...", "role": "manager", "workspace_membership_id": "mem_01HQ...", "name": "Alice Lin", "paused_at": null, "last_assigned_at": "2026-04-20T09:15:00Z", "created_at": "2026-01-15T10:00:00Z" }, { "id": "tmem_01HQ...", "team_id": "tm_01HQ...", "role": "member", "workspace_membership_id": "mem_01HQ...", "name": "Bob Chen", "paused_at": "2026-04-21T08:00:00Z", "last_assigned_at": "2026-04-19T16:00:00Z", "created_at": "2026-02-02T11:00:00Z" } ], "next_assignee": { "id": "tmem_01HQ...", "team_id": "tm_01HQ...", "role": "manager", "workspace_membership_id": "mem_01HQ...", "name": "Alice Lin", "paused_at": null, "last_assigned_at": "2026-04-20T09:15:00Z", "created_at": "2026-01-15T10:00:00Z" }, "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-04-20T14:30:00Z" }}Create a team
Section titled “Create a team”POST /api/v1/teamsScope required: teams.write
Body parameters
Section titled “Body parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name. |
description | string | No | Free-text description. |
mode | string | No | pool, stack, or manual. Defaults to pool. |
member_ids | string[] | No | Workspace membership IDs to add as initial team members. |
stack_always_apply | boolean | No | Stack mode only. |
include_all_members | boolean | No | Stack mode only. |
Request
Section titled “Request”curl -X POST "https://api.skipup.ai/api/v1/teams" \ -H "Authorization: Bearer $SKIPUP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Customer Success", "description": "Inbound CS team", "mode": "pool", "member_ids": ["mem_01HQ...", "mem_01HR..."] }'Response
Section titled “Response”Returns 201 Created with the new team object (including the members array).
Update a team
Section titled “Update a team”PATCH /api/v1/teams/:idScope required: teams.write
Body parameters
Section titled “Body parameters”Any of name, description, mode, stack_always_apply, include_all_members, introduce_member, introduction_guidance. Switching from manual to pool or stack provisions a scheduling email automatically.
stack_always_apply and include_all_members only apply in stack mode; introduce_member and introduction_guidance only apply in pool (round-robin) mode. Setting them in the wrong mode is silently ignored.
Request
Section titled “Request”curl -X PATCH "https://api.skipup.ai/api/v1/teams/tm_01HQ..." \ -H "Authorization: Bearer $SKIPUP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Sales East", "introduce_member": true }'Response
Section titled “Response”Returns the updated team with members and next_assignee populated, same shape as Get a team.
{ "data": { "id": "tm_01HQ...", "name": "Sales East", "slug": "sales-east", "mode": "pool", "member_count": 4, "introduce_member": true, "active": true, "members": [ { "id": "tmem_01HQ...", "role": "manager", "workspace_membership_id": "mem_01HQ...", "name": "Alice Lin", "paused_at": null, "last_assigned_at": null, "created_at": "2026-01-15T10:00:00Z" } ], "next_assignee": { "id": "tmem_01HQ...", "team_id": "tm_01HQ...", "role": "manager", "workspace_membership_id": "mem_01HQ...", "name": "Alice Lin", "paused_at": null, "last_assigned_at": null, "created_at": "2026-01-15T10:00:00Z" }, "created_at": "2026-01-15T10:00:00Z", "updated_at": "2026-04-29T16:00:00Z" }}Deactivate a team
Section titled “Deactivate a team”POST /api/v1/teams/:id/deactivateMarks the team inactive. Active meeting requests already routed to the team continue; new inbound mail is not routed to the team after deactivation.
Scope required: teams.write
Request
Section titled “Request”curl -X POST "https://api.skipup.ai/api/v1/teams/tm_01HQ.../deactivate" \ -H "Authorization: Bearer $SKIPUP_API_KEY"Add a team member
Section titled “Add a team member”POST /api/v1/teams/:team_id/membersScope required: teams.write
Body parameters
Section titled “Body parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
workspace_membership_id | string | Yes | ID of the workspace member to add. |
role | string | No | member (default) or manager. |
Request
Section titled “Request”curl -X POST "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members" \ -H "Authorization: Bearer $SKIPUP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "workspace_membership_id": "mem_01HR...", "role": "member" }'Update a team member’s role
Section titled “Update a team member’s role”PATCH /api/v1/teams/:team_id/members/:idScope required: teams.write
Body parameters
Section titled “Body parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
role | string | Yes | member or manager. |
Request
Section titled “Request”curl -X PATCH "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members/tmem_01HQ..." \ -H "Authorization: Bearer $SKIPUP_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "role": "manager" }'Response
Section titled “Response”{ "data": { "id": "tmem_01HQ...", "team_id": "tm_01HQ...", "role": "manager", "workspace_membership_id": "mem_01HQ...", "name": "Bob Chen", "paused_at": null, "last_assigned_at": null, "created_at": "2026-02-02T11:00:00Z" }}Remove a team member
Section titled “Remove a team member”DELETE /api/v1/teams/:team_id/members/:idScope required: teams.write
Returns 204 No Content on success.
Request
Section titled “Request”curl -X DELETE "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members/tmem_01HQ..." \ -H "Authorization: Bearer $SKIPUP_API_KEY"Response
Section titled “Response”204 No Content (empty body).
Pause a team member
Section titled “Pause a team member”POST /api/v1/teams/:team_id/members/:id/pauseMarks a round-robin team member as unavailable. Sets paused_at. Returns 422 if the member is already paused.
Scope required: teams.write
Request
Section titled “Request”curl -X POST "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members/tmem_01HQ.../pause" \ -H "Authorization: Bearer $SKIPUP_API_KEY"Unpause a team member
Section titled “Unpause a team member”POST /api/v1/teams/:team_id/members/:id/unpauseMarks a paused round-robin team member as available again. Clears paused_at and resets last_assigned_at so the member moves to the front of the queue. Returns 422 if the member is not paused.
Scope required: teams.write
Request
Section titled “Request”curl -X POST "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members/tmem_01HQ.../unpause" \ -H "Authorization: Bearer $SKIPUP_API_KEY"