Delete My Account

DELETE /v1/user

Permanently closes your entire profile: your login and every account you own, together with each owned account's endpoints, certificates and traffic history. This is the same action exposed in the dashboard under User Settings → Danger zone ("Delete my account").

You are signed out immediately and cannot sign in again. This is not the same as deleting a single account: to delete just the account you are currently working in while keeping your login and your other accounts, use /account instead.

Accounts where you are only a member (not the owner) are not deleted — you are simply removed from them. Only accounts you own are closed along with your profile.

Interactive session only. This irreversible action is refused for API keys and for OAuth/MCP (Iris) tokens — they receive 403 with code: "interactive_session_required". It can only be called from a signed-in dashboard session and requires a step-up re-authentication (your password, plus a 2FA code when MFA is enabled). In practice you trigger it from User Settings → Danger zone in the dashboard.

Permission required

An interactive session (your own signed-in dashboard user). The call always operates on your own profile — you cannot delete another user with this endpoint — and no account permission is needed. Non-interactive credentials (API key, OAuth/MCP) are rejected before any check.

Step-up (request body)

Send a JSON body re-confirming your identity. mfa_code is required only when you have MFA enabled.

password string required
Your current password. Missing → 401 reauth_required; wrong → 401 invalid_password.
mfa_code string
A current TOTP or backup code. Required when MFA is enabled: omitted → 401 mfa_required; invalid → 401 invalid_mfa.

Before you can delete

The request is blocked with 409 Conflict if any account you own has any of these. Resolve them on every owned account first, then retry:

Active subscription
Cancel the plan's subscription on that account. See /account/billing.
Other active members
Transfer ownership to another member (see /account/transfer-owner) or remove every other member (see /account/members) so you are the sole member.
Positive credit balance
The account must not hold a remaining credit balance — withdraw or refund it first.
Unpaid invoices
Settle any outstanding invoices on that account before closing your profile.

Response (200 OK)

success boolean
true when your profile and all owned accounts were deleted. Any credentials or sessions you held are now invalid.

Errors

401 Unauthorized
Missing or invalid auth, or a failed step-up. The code field distinguishes them: reauth_required, invalid_password, mfa_required, invalid_mfa.
403 Forbidden
The credential is a non-interactive API key or OAuth/MCP token — code: "interactive_session_required". Deletion is dashboard-only.
409 Conflict
An account you own has an active subscription, other active members, a positive credit balance, or unpaid invoices. The response body lists each blocking account and why (see below).

409 response shape

On a conflict the body carries a human-readable error plus an accounts array. Each entry identifies an owned account you must resolve first, with its id, name, and a human-readable reason:

Request — interactive session + step-up
# API keys / OAuth tokens are rejected (403). Called from a signed-in # dashboard session (session cookie), with a password + MFA step-up body. curl -X DELETE "https://api.ngris.com/v1/user" \ -H "Cookie: auth_token=<dashboard_session>" \ -H "X-CSRF-Token: <csrf>" \ -H "Content-Type: application/json" \ -d '{"password": "<your_password>", "mfa_code": "<123456, if MFA enabled>"}'
Note
# Closing your profile is a dashboard-only action. There is no API-key / # SDK path: an API key or OAuth/MCP token returns # 403 {"error": "...", "code": "interactive_session_required"} # Trigger it from the dashboard: User Settings -> Danger zone.
Response — 200 OK
{ "success": true }
Response — 409 Conflict
{ "error": "You own an account with an active subscription or other members. Cancel the subscription and transfer/remove members first, then try again.", "accounts": [ { "id": 42, "name": "Acme Engineering", "reason": "account has a live subscription — cancel it first" }, { "id": 58, "name": "Side Project", "reason": "account has other active members — transfer ownership or remove them first" } ] }
On this page
Delete My Account