Skip to content

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.

FieldTypeDescription
idstringUnique identifier for the team.
namestringDisplay name of the team.
slugstringURL-safe identifier derived from the name. Unique per workspace.
descriptionstring | nullFree-text description shown in the SkipUp app.
modestringOne of pool, stack, or manual.
email_addressstring | nullScheduling email address for the team. null for manual-mode teams or when the workspace has not yet provisioned an email handle.
member_countintegerNumber of members on the team.
stack_always_applybooleanStack-mode only. When true, the team is included on every request regardless of whether the inbound email matches the team address.
include_all_membersbooleanStack-mode only. When true, every active workspace member participates in stack scheduling for this team.
introduce_memberbooleanPool-mode only. When true, the AI composes a brief introduction of the assigned member to the participant.
introduction_guidancestring | nullPool-mode only. Free-text guidance the AI uses when composing the introduction.
activebooleantrue when the team is in use, false after deactivation.
deactivated_atstring | nullISO 8601 timestamp of when the team was deactivated.
created_atstringISO 8601 timestamp of creation.
updated_atstringISO 8601 timestamp of the last update.
membersarray(Show / create / update endpoints) List of team membership records.
next_assigneeobject | 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.
ModeDescription
poolRound-robin assignment. Each request goes to the next available member.
stackCollective scheduling. The whole team coordinates with the participant.
manualNo automatic routing. Members are referenced for context, not assignment.
FieldTypeDescription
idstringUnique identifier for the team membership.
team_idstringID of the team this membership belongs to.
rolestringmember or manager. Managers can edit team settings.
workspace_membership_idstringID of the underlying workspace member.
emailstringEmail of the workspace member.
namestring | nullFull name of the workspace member, if known.
paused_atstring | nullISO 8601 timestamp of when the member was paused (round-robin only). null when active.
last_assigned_atstring | nullISO 8601 timestamp of when the member was last assigned a round-robin meeting. null if never assigned or just unpaused.
created_atstringISO 8601 timestamp of when the member was added to the team.
GET /api/v1/teams

Returns a paginated list of teams in your workspace, sorted by creation date (newest first).

Scope required: teams.read

ParameterTypeDescription
activestringPass true to return only active teams.
limitintegerNumber of results per page. Default 25, max 100.
cursorstringCursor for fetching the next page. Use next_cursor from a previous response.
Terminal window
curl "https://api.skipup.ai/api/v1/teams?active=true" \
-H "Authorization: Bearer $SKIPUP_API_KEY"
{
"data": [
{
"id": "tm_01HQ...",
"name": "Sales",
"slug": "sales",
"description": "Outbound sales team",
"mode": "pool",
"email_address": "[email protected]",
"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 /api/v1/teams/:id

Retrieves a single team, including its full member roster.

Scope required: teams.read

Terminal window
curl "https://api.skipup.ai/api/v1/teams/tm_01HQ..." \
-H "Authorization: Bearer $SKIPUP_API_KEY"
{
"data": {
"id": "tm_01HQ...",
"name": "Sales",
"slug": "sales",
"mode": "pool",
"email_address": "[email protected]",
"member_count": 2,
"active": true,
"members": [
{
"id": "tmem_01HQ...",
"team_id": "tm_01HQ...",
"role": "manager",
"workspace_membership_id": "mem_01HQ...",
"email": "[email protected]",
"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...",
"email": "[email protected]",
"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...",
"email": "[email protected]",
"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"
}
}
POST /api/v1/teams

Scope required: teams.write

ParameterTypeRequiredDescription
namestringYesDisplay name.
descriptionstringNoFree-text description.
modestringNopool, stack, or manual. Defaults to pool.
member_idsstring[]NoWorkspace membership IDs to add as initial team members.
stack_always_applybooleanNoStack mode only.
include_all_membersbooleanNoStack mode only.
Terminal window
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..."]
}'

Returns 201 Created with the new team object (including the members array).

PATCH /api/v1/teams/:id

Scope required: teams.write

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.

Terminal window
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 }'

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",
"email_address": "[email protected]",
"member_count": 4,
"introduce_member": true,
"active": true,
"members": [
{
"id": "tmem_01HQ...",
"role": "manager",
"workspace_membership_id": "mem_01HQ...",
"email": "[email protected]",
"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...",
"email": "[email protected]",
"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"
}
}
POST /api/v1/teams/:id/deactivate

Marks 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

Terminal window
curl -X POST "https://api.skipup.ai/api/v1/teams/tm_01HQ.../deactivate" \
-H "Authorization: Bearer $SKIPUP_API_KEY"
POST /api/v1/teams/:team_id/members

Scope required: teams.write

ParameterTypeRequiredDescription
workspace_membership_idstringYesID of the workspace member to add.
rolestringNomember (default) or manager.
Terminal window
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" }'
PATCH /api/v1/teams/:team_id/members/:id

Scope required: teams.write

ParameterTypeRequiredDescription
rolestringYesmember or manager.
Terminal window
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" }'
{
"data": {
"id": "tmem_01HQ...",
"team_id": "tm_01HQ...",
"role": "manager",
"workspace_membership_id": "mem_01HQ...",
"email": "[email protected]",
"name": "Bob Chen",
"paused_at": null,
"last_assigned_at": null,
"created_at": "2026-02-02T11:00:00Z"
}
}
DELETE /api/v1/teams/:team_id/members/:id

Scope required: teams.write

Returns 204 No Content on success.

Terminal window
curl -X DELETE "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members/tmem_01HQ..." \
-H "Authorization: Bearer $SKIPUP_API_KEY"

204 No Content (empty body).

POST /api/v1/teams/:team_id/members/:id/pause

Marks a round-robin team member as unavailable. Sets paused_at. Returns 422 if the member is already paused.

Scope required: teams.write

Terminal window
curl -X POST "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members/tmem_01HQ.../pause" \
-H "Authorization: Bearer $SKIPUP_API_KEY"
POST /api/v1/teams/:team_id/members/:id/unpause

Marks 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

Terminal window
curl -X POST "https://api.skipup.ai/api/v1/teams/tm_01HQ.../members/tmem_01HQ.../unpause" \
-H "Authorization: Bearer $SKIPUP_API_KEY"