Skip to content

Teams API reference

All write and admin endpoints require:

Authorization: Bearer {token}

Some workspace reads also accept a logged-in browser session.

GET /v1/account/tier

See Teams overview for tier feature flags. Production upgrades use the billing API below — not POST /v1/account/upgrade (legacy/dev).

MethodEndpointWhoNotes
GET/v1/billing/plansPublicList Pro/Teams plans.
GET/v1/billing/subscription?workspace_id=Member+Current subscription for a workspace.
POST/v1/billing/subscribeOwner/adminStart 15-day trial (workspace_id, plan_id, seats).
POST/v1/billing/rebill-activateOwner/adminPersist Rebill subscription after embedded checkout (session).
POST/v1/billing/rebill-save-cardOwner/adminPersist Rebill card after save-card flow (session).
POST/v1/billing/cardOwner/adminLegacy card token (subscription_id, token).
PATCH/v1/billing/subscription/seatsOwner/adminChange seats (next cycle).
PATCH/v1/billing/subscription/planOwner/adminChange plan — upgrades apply immediately, downgrades at next renewal.
DELETE/v1/billing/subscriptionOwner/adminCancel (subscription_id in body).
GET/v1/billing/invoices?workspace_id=Member+Payment history.

See Billing & subscriptions.

MethodEndpointNotes
GET/v1/workspacesList workspaces the token’s user belongs to.
POST/v1/workspacesCreate a workspace.
GET/v1/workspaces/{id}Get workspace, including a seats object (used/limit/remaining). Member+.
PATCH/v1/workspaces/{id}Update name, slug, settings. Admin+.
POST/v1/workspaces/{id}/logoUpload workspace logo (image). Admin+.
DELETE/v1/workspaces/{id}/logoRemove workspace logo. Admin+.
DELETE/v1/workspaces/{id}Delete workspace. Owner only.
GET/v1/workspaces/by-slug/{slug}Look up by slug.
MethodEndpointNotes
GET/v1/workspaces/{id}/membersList members.
POST/v1/workspaces/{id}/membersAdd member; policy-gated.
DELETE/v1/workspaces/{id}/members/{userId}Remove member.
POST/v1/workspaces/{id}/members/inviteBulk invite by email. Admin+.
GET/v1/workspaces/{id}/members/metricsActivity metrics. Admin+.
GET/v1/workspaces/{id}/invitesPending email invites. Admin+.
DELETE/v1/workspaces/{id}/invites/{inviteId}Revoke pending invite. Admin+.
GET/v1/workspaces/{id}/peoplePeople picker list.
POST/v1/workspaces/{id}/transfer-ownershipTransfer to another member. Owner only.
POST/v1/workspaces/{id}/members/{userId}/tokensCreate API token for member. Admin+.
DELETE/v1/workspaces/{id}/members/{userId}/tokensRevoke tokens for member. Admin+.

Non-human, workspace-scoped credentials (prefix sot_) for a customer’s AI agent, a backend service, or CI/CD. Each token authenticates as a service principal — a headless first-class member that owns the artifacts it publishes and is confined to its one workspace. Action scopes: artifacts:read, artifacts:publish, data:read, data:write.

MethodEndpointNotes
POST/v1/workspaces/{id}/agent-tokensMint. Body { name, scopes[], expires_at? }. Returns sot_… once. Admin+.
GET/v1/workspaces/{id}/agent-tokensList (metadata only). Admin+.
DELETE/v1/workspaces/{id}/agent-tokens/{tokenId}Soft-revoke. Admin+.

A token without a scope gets 403 INSUFFICIENT_SCOPE; a revoked/expired token gets 401.

GET /v1/workspaces/{id}/access-policy
PUT /v1/workspaces/{id}/access-policy

Body: { "allowed_domains": ["example.com"], "allowed_emails": ["x@y.com"] }. PUT requires admin or owner. See Workspaces.

GET /v1/workspaces/{id}/subdomain
POST /v1/workspaces/{id}/subdomain ← { "enabled": true }
DELETE /v1/workspaces/{id}/subdomain

Requires Teams plan + admin or owner. See Subdomains.

GET /v1/workspaces/{id}/branding
PUT /v1/workspaces/{id}/branding
POST /v1/workspaces/{id}/logo
DELETE /v1/workspaces/{id}/logo
GET /v1/workspaces/{id}/context
PUT /v1/workspaces/{id}/context ← { "entry": "index.md" }
GET /v1/workspaces/{id}/context/{name}
PUT /v1/workspaces/{id}/context/{name}
DELETE /v1/workspaces/{id}/context/{name}

Writes require admin or owner. See Workspaces.

GET /v1/workspaces/{id}/folders
POST /v1/workspaces/{id}/folders
GET /v1/workspaces/{id}/folders/{folderId}
PATCH /v1/workspaces/{id}/folders/{folderId}
DELETE /v1/workspaces/{id}/folders/{folderId}
GET /v1/workspaces/{id}/folders/by-path/{path}
POST /v1/workspaces/{id}/artifacts/{artifactId}/move

See Folders.

Per-scope asset library — one hidden bucket per workspace (shared) and one personal bucket. Any workspace member may use the workspace routes; personal routes use /v1/assets without a workspace prefix.

MethodEndpointNotes
GET/v1/workspaces/{id}/assetsList deliverables + loose files (deliverables[], loose[], bucketId, usedBytes). Member+.
POST/v1/workspaces/{id}/assets/uploadRequest upload → { uploadUrl, tokenId }; PUT bytes to uploadUrl. Member+.
POST/v1/workspaces/{id}/assets/deliverables{ blobId, name? } → new deliverable (v1). Member+.
POST/v1/workspaces/{id}/assets/deliverables/{id}/version{ blobId } → add version. Member+.
PATCH/v1/workspaces/{id}/assets/deliverables/{id}{ visibility?, folderId? }private | workspace. Member+.
GET/v1/workspaces/{id}/assets/deliverables/{id}/versionsVersion history. Member+.
DELETE/v1/workspaces/{id}/assets/deliverables/{id}Delete deliverable + all versions. Member+.
POST/v1/workspaces/{id}/assets/collections{ name?, deliverableIds[] } → bundle. Member+.
POST/v1/workspaces/{id}/assets/collections/{id}/share{ expiresAt?, gate?, password?, domains? }{ url } (/d/<token>). Member+.
POST/v1/workspaces/{id}/assets/collections/{id}/send{ to, expiresAt?, gate?, password?, domains? } → email link. Member+.
GET/v1/workspaces/{id}/assets/linksList sent delivery links (gate, expiry, viewCount, revoked). Member+.
POST/v1/workspaces/{id}/assets/links/{linkId}/revokeRevoke link (page + bytes 404). Member+.

gate: none (default), password + password, or domain + domains[]. Protected deliveries stream bytes through /d/<token>/file/<blobId> after the gate clears. First open emails the link creator (asset_delivery_opened).

Limits: 500 MB/file · 10 GB/bucket · 10 000 files. See Files & deliverables.

Embed a workspace file in any artifact by its dlv_ id. Enforces per-file visibility (private files 403 for unauthorized viewers).

MethodEndpointNotes
GET/v1/files/{deliverableId}/contentLatest version bytes. Session or token; owner, member (workspace files), or sharee grant.

SDK: sdk.files.getUrl('dlv_…').

Teams/Enterprise feature. Share folders and artifacts with client orgs outside your team — grouped portal, branded pages, scoped API tokens, read receipts, and private client notes. All routes require workspace admin plus the entitlement (403 EXTERNAL_SHARING_NOT_ENTITLED otherwise). See External sharing.

MethodEndpointNotes
GET/v1/workspaces/{id}/shareesList client orgs (member_count).
POST/v1/workspaces/{id}/sharees{ "name": "Acme", "type": "client" }.
GET/v1/workspaces/{id}/sharees/{sid}One client.
PATCH/v1/workspaces/{id}/sharees/{sid}{ name?, type?, properties?, branding? }branding is { logo, color } for the portal.
DELETE/v1/workspaces/{id}/sharees/{sid}Removes the client, its members, grants, and notes.
MethodEndpointNotes
GET/v1/workspaces/{id}/sharees/{sid}/membersList external members.
POST/v1/workspaces/{id}/sharees/{sid}/members{ "email": "ext@acme.com" } — invite; stamps an external membership edge (free, not billed).
DELETE/v1/workspaces/{id}/sharees/{sid}/members/{uid}Remove from this client only.
MethodEndpointNotes
GET/v1/workspaces/{id}/grantsFilter with ?subject_id= / ?resource_type= / ?resource_id=.
POST/v1/workspaces/{id}/grantsMint a grant — see body below.
DELETE/v1/workspaces/{id}/grants/{gid}Revoke (effective within ~60s of cache).

Share with one person (no client org):

MethodEndpointNotes
POST/v1/workspaces/{id}/share-person{ email, resource_type: "file"|"folder", resource_id, capability: "view"|"comment" } — admin + Teams entitlement; invites external user if needed. 409 if email is an internal member.

Grant body (admin grants API):

{
"subject_type": "sharee",
"subject_id": "shr_…",
"resource_type": "folder",
"resource_id": "fld_…",
"capability": "view"
}

resource_type: folder | artifact | file. subject_type: sharee (whole client org) or external_user (one person). capability: view | comment | create | edit. create is folder-only — lets the external author new artifacts fenced inside that folder (forced private).

External tokens resolve through grants — never workspace-blanket. Scopes limited to artifacts:read, data:read, data:write (never artifacts:publish).

MethodEndpointNotes
GET/v1/workspaces/{id}/sharees/{sid}/members/{uid}/tokensList (no secrets).
POST/v1/workspaces/{id}/sharees/{sid}/members/{uid}/tokens{ "scopes": ["data:read"] }{ token: "sot_…", shown_once: true }.
DELETE/v1/workspaces/{id}/sharees/{sid}/members/{uid}/tokens/{tid}Revoke.
MethodEndpointNotes
GET/v1/workspaces/{id}/sharees/{sid}/activityRecent views for one client.
GET/v1/workspaces/{id}/sharee-activityRecent views across all clients.

Workspace-private markdown about a client — never shared with them. Any member can read; admin (or the workspace assistant via set_client_notes) can write.

MethodEndpointNotes
GET/v1/workspaces/{id}/sharees/{sid}/contextList note files.
GET/v1/workspaces/{id}/sharees/{sid}/context/{name}Read one note (markdown).
PUT/v1/workspaces/{id}/sharees/{sid}/context/{name}Create/replace (admin). Raw markdown or { "content": "…" }.
DELETE/v1/workspaces/{id}/sharees/{sid}/context/{name}Delete (admin).
MethodEndpointWhoNotes
GET/v1/workspaces/{id}/connectionsMember+List. No secrets.
POST/v1/workspaces/{id}/connectionsAdmin+Create.
GET/v1/workspaces/{id}/connections/{connectionId}Admin+Detail.
DELETE/v1/workspaces/{id}/connections/{connectionId}Admin+Delete; cascades member creds.
GET/v1/workspaces/{id}/connections/{connectionId}/artifactsMember+Artifacts using this connector.
GET/v1/workspaces/{id}/connections/{connectionId}/my-credentialsMember+Per-user status.
PUT/v1/workspaces/{id}/connections/{connectionId}/my-credentialsMember+Save own token.
DELETE/v1/workspaces/{id}/connections/{connectionId}/my-credentialsMember+Remove own token.
GET/v1/workspaces/{id}/connections/{provider}/auth-urlAdmin+OAuth start URL.
GET/v1/workspaces/{id}/connections/slack/installAdmin+Slack install (302).
GET/v1/workspaces/{id}/connections/{connection}/slack/channelsMember+Slack channel list.
GET/v1/oauth/slack/callbackSlack OAuth callback.

See Connections.

Optional per-workspace data map. See Data Catalog.

MethodEndpointWhoNotes
GET/v1/workspaces/{id}/catalogMember+Search (q, kind, domain, status, tag) + facets.
GET/v1/workspaces/{id}/catalog/manifestMember+Adoption KPIs, orphans, dangling refs.
GET/v1/workspaces/{id}/catalog/entries/{entryId}Member+Entry + lineage neighbors.
GET/v1/workspaces/{id}/catalog/lineageMember+Full graph (nodes, edges).
POST/v1/workspaces/{id}/catalog/enableAdmin+{ "enabled": true | false }.
POST/v1/workspaces/{id}/catalog/seedAdmin+Idempotent connector seed.
PUT/v1/workspaces/{id}/catalog/filesMember+{ "path", "content" } — upsert markdown file.
DELETE/v1/workspaces/{id}/catalog/files?path=Member+Remove a file.

Opt-in learned library. Paid plan required for enable and backfill. See Workspace Knowledge.

MethodEndpointWhoNotes
GET/v1/workspaces/{id}/knowledgeMember+Settings + counts.
GET/v1/workspaces/{id}/knowledge/statusMember+Training progress (24h window).
GET/v1/workspaces/{id}/knowledge/treeMember+Note summaries by kind.
GET/v1/workspaces/{id}/knowledge/files/{path}Member+One note (full body).
PUT/v1/workspaces/{id}/knowledge/files/{path}Member+Upsert note markdown.
DELETE/v1/workspaces/{id}/knowledge/files/{path}?forget=1Admin+Delete; forget=1 stops re-learn.
POST/v1/workspaces/{id}/knowledge/enableAdmin+{ "enabled": true } — paid plan.
POST/v1/workspaces/{id}/knowledge/backfillAdmin+Queue up to 200 pages → { queued, kicked } — paid plan.
MethodEndpointDescription
GET/v1/workspaces/{id}/schedulesList schedules. Admin+.
GET/v1/workspaces/{id}/schedules/{jobId}/logsRecent logs. Admin+.
POST/v1/workspaces/{id}/schedules/{jobId}/runRun now. Admin+.
PATCH/v1/workspaces/{id}/schedules/{jobId}Enable/disable. Admin+.
DELETE/v1/workspaces/{id}/schedules/{jobId}Delete. Admin+.
GET/v1/workspaces/{id}/automationsList automations. Admin+.
GET/v1/workspaces/{id}/automations/{triggerId}/runsRun history. Admin+.
POST/v1/workspaces/{id}/automations/{triggerId}/runDispatch now. Admin+.
PATCH/v1/workspaces/{id}/automations/{triggerId}Enable/disable. Admin+.
DELETE/v1/workspaces/{id}/automations/{triggerId}Delete. Admin+.
GET/v1/workspaces/{id}/runsUnified run list (surface, status, limit). Admin+.
GET/v1/workspaces/{id}/runs/{surface}/{runId}Run Inspector detail (crew/job/alert). Admin+.
MethodEndpointWhoNotes
GET/v1/workspaces/{id}/admin/artifactsAdmin+Governance table (views, owner, visibility…).
POST/v1/workspaces/{id}/admin/artifacts/{artifactId}/pauseAdmin+{ "paused": true }.
POST/v1/workspaces/{id}/admin/artifacts/{artifactId}/visibilityAdmin+Change visibility.
POST/v1/workspaces/{id}/admin/artifacts/{artifactId}/transferAdmin+Reassign owner { "new_owner_id" }.
MethodEndpointWhoNotes
POST/v1/access-requestsPublicRequest access to a gated page.
GET/v1/access-requests/incomingOwner/adminPending requests for your workspaces.
POST/v1/access-requests/{id}Owner/admin{ "action": "approve" | "deny" }.
MethodEndpointWhoNotes
POST/v1/support/ticketsSigned-inCreate ticket { "subject", "body", "workspaceId"? }.
GET/v1/support/tickets?scope=mineSigned-inRequester’s own tickets (default).
GET/v1/support/tickets?scope=workspace&workspace={id}Admin+Workspace tickets; optional &status=.
GET/v1/support/tickets?scope=allSuper-adminAll platform tickets.
GET/v1/support/tickets/{id}Requester or staffTicket + full thread.
POST/v1/support/tickets/{id}/messageRequester or staffAppend { "body" } (customer reply re-opens).
POST/v1/support/tickets/{id}/replyStaffApprove & send { "body" } on origin channel.
POST/v1/support/tickets/{id}/statusStaff{ "status": "resolved" } etc.
POST/v1/support/tickets/{id}/assignStaff{ "assigneeUserId": "usr_…" } or null.
POST/v1/support/tickets/{id}/triageStaffRe-run AI triage draft.

See Get help and Admin → Support.

Endpoints stay under /v1/metric-alerts. Teams changes who can manage:

RoleCapability
Artifact owner/editor or workspace owner/adminFull alert management on the artifact.
Workspace member or artifact viewerSelf-subscribe to personal destinations only.

See Metric alerts.

One-click anomaly watches on artifact tables — bell-only, no destinations. See Metric alerts → Watches.

MethodEndpointWhoNotes
POST/v1/metric-watchViewer+ on artifact{ "artifact_id", "table", "kind", "column?", "threshold_pct?" }
GET/v1/metric-watch?artifact_id=Viewer+List watches on a page
DELETE/v1/metric-watch/{id}CreatorRemove a watch
GET /v1/workspaces/{id}/features

Returns enabled/disabled flags. readonly: true — only ShareOut super-admins can toggle workspace features.

GET /v1/workspaces/{id}/session-policy
PUT /v1/workspaces/{id}/session-policy ← { "session_max_days": 7 }

session_max_days is 130 or null (inherit the 30-day default). GET requires membership; PUT requires admin/owner and the Teams plan (402 TIER_REQUIRED otherwise). See Admin.

GET /v1/workspaces/{id}/publish-policy
PATCH /v1/workspaces/{id}/publish-policy ← { "policy": "require_approval", "approvals_required": 2 }
GET /v1/workspaces/{id}/publish-approvals?status=pending
POST /v1/artifacts/{id}/publish-approval ← { "visibility": "public", "approver_ids": ["usr_a"] }
POST /v1/artifacts/{id}/publish-approval/{requestId}/decision ← { "decision": "approve" }

PATCH requires admin/owner. See Publishing policy and Publishing artifacts.

MethodEndpointWhoNotes
POST/v1/auth/device/startPublicStart CLI login. Optional { "expected_email" }login_hint + mismatch warn.
POST/v1/auth/device/tokenPublicPoll with { "device_code" }. Pending / approved / expired. Token once.

Browser step: GET /auth/device?code=USER-CODE → Google OAuth. See Authentication → Device login.

Ranked, typo-tolerant search — the same engine behind the Home ⌘K palette and inline quick-jump. Finds pages (name, tags, description), plus folders, datasets, connectors, people, schedules, crew, and alerts when scoped to a workspace.

GET /v1/search?q={query}&groups={csv}&limit={n}&workspace={id}
Authorization: Bearer {token}
ParamDefaultNotes
q(required)Search text. Typo-tolerant. Empty returns recents.
groupsallComma subset of artifacts,folders,datasets,connectors,people,schedules,crew,alerts.
limit10Max per group (cap 25).
workspaceScope (personal tokens only; sot_ tokens are pinned to their workspace).

Auth: personal so_… token, workspace Agent sot_… token (artifacts:read), or session cookie. Non-artifact groups require a workspace scope.

Response groups (artifacts, folders, datasets, connectors, people, schedules, crew, alerts) each carry scored hits. Artifact hits include views, owner, thumb, and badge (e.g. Private).

Inside the workspace assistant chat, the same search is exposed as search_workspace — prefer it over search_artifacts for anything but an exact page name.

Single-turn Q&A over pages the caller can access — read-only, no tools.

POST /v1/ask
Authorization: Bearer {token}
Content-Type: application/json
{ "question": "What was Q3 revenue?", "workspace": "wsp_…" }

Response: { "answer": "…", "citations": [{ "artifact_id", "title", "url" }] }. Citations are pages the model referenced with [n] markers from the scoped candidate set. Also triggered from Home ⌘K when the query ends with ?.

One-click data portability — zip of source + json + tables.

MethodEndpointWhoNotes
GET/v1/artifacts/{id}/exportOwner or workspace adminSingle artifact zip
GET/v1/workspaces/{id}/exportWorkspace owner/adminAll artifacts (max 200)

See Your data is portable.

AI-generate a slides deck from a published HTML artifact.

POST /v1/artifacts/{id}/present
Authorization: Bearer {token}

Returns { "artifact_id", "url" }. Rate-limited per user. See Slides overview → Present this.

MethodEndpointWhoNotes
POST/v1/workspaces/{id}/unused/archiveWorkspace owner/adminArchive all flagged unused pages (batch 100)
POST/v1/artifacts/unused/archivePersonal account ownerSame for personal pages

See Publishing → Unused-page janitor.

MethodEndpointWhoNotes
GET/v1/skills/recommendedSigned-inOfficial Recommended by ShareOut strip (all plans).
GET/v1/workspaces/{id}/skillsMember+Browse catalog (sort, category, q). Teams plan.
GET/v1/workspaces/{id}/skills/categoriesMember+Category counts.
GET/v1/workspaces/{id}/skills/installedMember+Saved skills.
POST/DELETE/v1/artifacts/{id}/skill/voteMember+Upvote / remove vote.
POST/DELETE/v1/artifacts/{id}/skill/installMember+Save / unsave to My Skills.
PATCH/v1/artifacts/{id}/skill/adminAdmin+{ "featured" } or { "blocked" }.
GET/v1/artifacts/{id}/skillsViewer+List attached skills.
POST/v1/artifacts/{id}/skillsEditor+Attach skill (skill_artifact_id). Max 5.
POST/DELETE/v1/artifacts/{id}/skills/{skillId}Editor+Bump version / detach.

Publish skills with artifact_type: "skill" on POST /v1/publish. See Skill Marketplace.

GET /v1/workspaces/{id}/audit?limit=100

Admin/owner only. Returns the append-only governance trail (entries[] with ts, actor_email, action, target_type, target_id, detail). One-year retention. See Admin.

MethodEndpointWhoNotes
GET/v1/home/activity-feed?workspace=&window=&limit=Member+Needs You + Pulse (window: today, 7d, 30d). Returns needs, seen (dismissed/opened needs still in window), pulse, actionItems, requestedOpen.
POST/v1/home/dismiss-eventMember+Hide Needs You events for the signed-in user ({ "eventId" } or { "eventIds": [] }). Used by the notifications panel (dismiss, mark-all-read, or opening a card).
GET/v1/home/agent/brief?workspace=Member+Proactive daily AI brief (when ai.web_agent on).
POST/v1/home/agent/chatMember+Home-scoped assistant chat (SSE).
POST/v1/home/agent/confirmMember+Confirm pending assistant action.
GET/v1/home/agent/threadsMember+List named chat threads.
POST/v1/home/agent/threadsMember+Create thread.
POST/v1/home/agent/threads/{id}/renameMember+Rename thread.
DELETE/v1/home/agent/threads/{id}Member+Delete thread.
POST/v1/workspace/{id}/agent/chatMember+Workspace-scoped assistant chat (SSE).
GET/v1/home/event-visibility?workspace=Member+Per-kind audience map; canManage for admins.
PUT/v1/home/event-visibility?workspace=Admin+{ "kind", "audience" } — see Activity visibility.
GET/v1/home/onboarding?workspace=Member+Setup checklist status (track, tasks, pct, dismissed) or { track: null }.
POST/v1/home/onboarding/dismiss?workspace=Member+Hide the checklist for this user.
POST/v1/home/onboarding/skill-ack?workspace=Member+Acknowledge the “Get the skill” task.
POST/v1/home/onboarding/celebrate?workspace=Member+Record the one-shot 100% moment.
GET/v1/artifacts/{id}/presenceOwner/collaborator+Live concurrent viewer count (best-effort).

Send an artifact to email, Slack, or Telegram immediately from Home Inspector Deliver or the API — same destination registry as scheduled jobs.

MethodEndpointWhoNotes
GET/v1/artifacts/{id}/deliverCollaborator+Per-channel status (telegram.linked, slack.connected + connectUrl, email.available).
GET/v1/artifacts/{id}/deliver/slack-channelsCollaborator+Searchable channel list for the workspace Slack connection.
POST/v1/artifacts/{id}/deliverCollaborator+{ "action": "email" | "slack" | "telegram", "config": {…} } — same config shape as jobs. Viewers may only deliver to themselves on Slack/Telegram.

See Your workspace → Inspector, Slack delivery, and Your workspace (Home).