---
title: "Delete the account"
method: DELETE
path: "/account"
tags: ["account"]
---

# Delete the account

`DELETE /account`

## Request

- Base URL: `https://api.sparkvault.com/v1`
- URL: `https://api.sparkvault.com/v1/account`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/sparkvault/apis/sparkvault-api/docs/account/delete.ts> (a function with typed inputs; its response is checked against the schema)

The account owner deletes the account, permanently: every vault, ingot, folder, Spark, key and member's access goes, and SparkVault cannot recover any of it. Only the owner may, from their own session (an API key or an impersonated session is refused), confirming with the organization name exactly as it stands. Every Stripe subscription billing the account is cancelled at once, before the deletion starts, and nothing is refunded for the rest of the period. A subscription bought through the App Store or Google Play cannot be cancelled by SparkVault: the deletion goes on, and `store_subscriptions` names each one, which keeps billing until it is cancelled in the store. From the answer on, no member, session or key of the account authenticates (401 with `details.reason` ACCOUNT_UNAVAILABLE) for anything but this request, which the owner may repeat while the deletion runs: it is acknowledged (202) and cancels nothing again. While any request in the account's help desk is under legal hold the deletion does not start: nothing is cancelled, and every hold must be cleared first. The rest of the deletion finishes in the background, and the account is then gone (404).

## Request body

- object
  - `confirmation` string, required: The organization name, exactly as it stands (case-sensitive).

## Response `202`

The deletion has started.

- object
  - `data` AccountDeletionStarted, required
    - `message` string, required
    - `account_id` string, required
    - `started_at` integer, required: Unix seconds: when the deletion started.
    - `stripe_subscriptions_cancelled` string[], required: The Stripe subscriptions this request ended, at once and with nothing refunded. Empty when the deletion was already in progress.
    - `store_subscriptions` StoreSubscription[], required: The store subscriptions that keep billing until their buyer cancels them in the store.
      - `kind` 'base' | 'addon', required: base: the license; addon: a capacity add-on.
      - `channel` 'appstore' | 'play', required
      - `id` string, nullable, required: The store's id for it (App Store original transaction id, Google Play purchase token), when known.
  - `meta` ResponseMeta: Envelope metadata present on every successful response.
    - `api_version` string
    - `request_id` string
    - `response_ms` integer
    - `timestamp` integer: Unix seconds.
    - `pools` object: Storage and bandwidth capacity snapshot for the account.
    - `billing` object
      - `past_due` boolean
    - `quota` object: This minute of the account request budget. Present on authenticated success responses that passed the throttle; absent otherwise.
      - `limit` integer
      - `used` integer
      - `remaining` integer
      - `resets_at` integer: Unix seconds.

## Other responses

- `400`: VALIDATION_ERROR — the confirmation is missing, or is not the organization name exactly as it stands.
- `401`: AUTHENTICATION_ERROR — missing or invalid credentials, or a suspended account (`details.reason` ACCOUNT_UNAVAILABLE).
- `403`: FORBIDDEN — the caller is not the account owner, the credential is an API key or an impersonated session, or the account is the SparkVault platform account.
- `404`: NOT_FOUND — the account does not exist: its deletion has finished.
- `409`: SEAT_CHANGE_IN_PROGRESS — another billing update for this account is in progress. Try again in a moment. LEGAL_HOLD_ACTIVE — a request in the account's help desk is under legal hold; clear every hold, then delete the account.
- `429`: RATE_LIMIT_EXCEEDED — the account exceeded 5000 requests this minute. `Retry-After` carries the seconds to wait, and `details` carries limit/resets_at, plus `used` whenever the request was counted. A request refused because the limiter itself was unavailable reports no `used`.
- `500`: INTERNAL_ERROR — a Stripe subscription could not be cancelled, or the deletion could not start. Retry the request: a retry resumes a deletion that has started.

## Changes

- **2026-10-28** `a9a10e328ba5`: 28 info
  - the response property `error/details` became required for the status `400`
  - the response property `error/details` became required for the status `401`
  - the response property `error/details` became required for the status `403`
  - the response property `error/details` became required for the status `404`
  - …24 more
- **2026-10-28** `56d7c265a77a`: 7 breaking
  - the response property `error/details` became nullable for the status `400`
  - the response property `error/details` became nullable for the status `401`
  - the response property `error/details` became nullable for the status `403`
  - the response property `error/details` became nullable for the status `404`
  - …3 more
- **2026-10-16** `4609037ab07c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/sparkvault/apis/sparkvault-api/changes/account/delete.md)

---

[API](https://skmtc.dev/sparkvault/apis/sparkvault-api.md) - [All operations](https://skmtc.dev/sparkvault/apis/sparkvault-api/llms.txt) - [OpenAPI document](https://skmtc.dev/sparkvault/apis/sparkvault-api/revisions/97cfadccd0c0?raw)
