---
title: "Start team deletion"
method: DELETE
path: "/teams/{key}"
tags: ["Teams"]
---

# Start team deletion

`DELETE /teams/{key}`

Soft-delete a team immediately and queue its asynchronous cleanup by ID or slug

## Path parameters

- `key` string, required — Team key - either a unique ID (tem_xxx format) or URL-friendly slug

## Response `200`

OK

- object — Accepted team deletion request and its operation state
  - `team` object, required
    - `id` string, required — Unique identifier for the team organization
    - `createdAt` string, date-time, required — Timestamp in ISO 8601 format when the team was created
    - `updatedAt` string, date-time, required — Timestamp in ISO 8601 format when the team was last updated
    - `name` string, required — Display name of the team organization. Must be between 3 and 30 characters
    - `slug` string, required — URL-friendly slug for the team organization. Must be unique within tenant and between 3 and 30 characters
    - `supportEmail` string, email — Support email address for customer inquiries. Used as reply-to address in order confirmation emails
    - `publicBaseUrl` string, uri — Optional public website base URL for team-owned event and order links. When present, it overrides the tenant public base URL.
    - `image` object — Team image with dimensions and alt text for branding across the platform
      - `src` string, uri, required
      - `alt` string, required
      - `width` number, required
      - `height` number, required
    - `metadata` object — Flexible key-value metadata storage for custom configuration. Similar to Stripe's metadata API. Maximum 50 keys, key names up to 40 characters, values up to 500 characters.
    - `approval` 'PENDING' | 'APPROVED' | 'REJECTED', required — Approval status of the team. PENDING: awaiting review, APPROVED: can create promoters/venues/events, REJECTED: cannot operate
    - `deletedAt` string, date-time — Timestamp in ISO 8601 format when the team was soft deleted. Only present for deleted teams.
    - `tenantId` string, required — Tenant ID for multi-tenant isolation
    - `isAdmin` boolean — Whether this team is the tenant admin team
    - `isDemo` boolean, required — Whether this team is protected seeded demo data
    - `gateway` object — Connected payment gateway for direct payouts. When connected, funds from ticket sales go directly to the team's account with platform fees deducted.
      - `provider` 'STRIPE' | 'AIRWALLEX', required — Payment gateway provider type
      - `connectedAt` string, date-time, required — Timestamp when the payment gateway was connected to this team
      - `connectedBy` string, required — User ID of the team member who connected the payment gateway
      - `accountId` string, required — Connected account ID. For Stripe: acct_xxxxx. For Airwallex: business account open ID.
      - `scope` 'TEAM' | 'EVENTS' — Stripe Connect routing scope. TEAM routes all team events through Stripe Connect. EVENTS routes only selected events.
      - `eventIds` string[] — Event IDs routed through Stripe Connect when scope is EVENTS.
      - `chargesEnabled` boolean — Whether the connected Stripe account can currently accept charges.
      - `payoutsEnabled` boolean — Whether the connected Stripe account can currently receive payouts.
      - `requirementsDue` string[] — Stripe Connect account requirements currently due before the account can remain fully enabled.
      - `disabledReason` string — Stripe disabled reason for the connected account, when Stripe reports one.
      - `syncedAt` string, date-time — Timestamp when gateway account status was last synced from the provider.
    - `member` object — Current user's membership details for this team. Present when user is a member.
      - `id` string, required — Current user's team member identifier for this team
      - `permissions` string[], required — Permissions the current user has for this team. Controls access to team resources.
      - `isOwner` boolean, required — Whether the current user is the owner of this team. Owners have full control.
    - `stripeConnectAvailability` object — Stripe Connect availability metadata for tenant payment settings UI.
      - `available` boolean, required — Whether Stripe Connect can be used for the selected team, event, and currency.
      - `reasons` string[], required — Machine-readable reasons Stripe Connect is unavailable. Empty when available is true.
      - `supportedCurrencies` string[], required — Currencies currently supported for Stripe Connect routing in this tenant flow.
  - `deletion` object, required — Asynchronous team deletion operation
    - `id` string, required — Unique identifier for the deletion operation
    - `teamId` string, required — Team being deleted
    - `status` 'QUEUED' | 'PROCESSING' | 'BLOCKED' | 'COMPLETED' | 'FAILED', required — Current state of an asynchronous team deletion operation
    - `createdAt` string, date-time, required — Timestamp when deletion was requested
    - `updatedAt` string, date-time, required — Timestamp when deletion progress last changed
    - `completedAt` string, date-time — Timestamp when deletion completed
    - `blocker` object — Structured business condition preventing team deletion
      - `reason` 'ADMIN_TEAM' | 'DEMO_TEAM' | 'EVENTS' | 'ORDERS' | 'EVENTS_AND_ORDERS' | 'BUSINESS_RECORDS' | 'SETUP_IN_USE', required — Stable business reason preventing team deletion
      - `hasEvents` boolean, required — Whether active events prevent deletion
      - `hasOrders` boolean, required — Whether orders prevent deletion
    - `error` string — Safe failure description when manual recovery is needed

## Other responses

- `400` — 400
- `401` — 401
- `403` — 403
- `404` — 404
- `409` — 409
- `412` — 412
- `422` — 422
- `429` — 429
- `500` — 500
- `501` — 501
- `503` — 503

---

[API](https://skmtc.net/session/apis/session-services-api.md) · [All operations](https://skmtc.net/session/apis/session-services-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/session/session-services-api/versions/a1bb6f6c8a2e/schema)
