Confirm the OTP for the in-flight closure
Verifies the OTP code and moves the closure to OTP_CONFIRMED. Requires an authenticated, active user. The custodian bank then reviews the request and moves the account to CLOSED only when it approves. Returns 409 with code ACCOUNT_HAS_NON_ZERO_BALANCE when money arrived on the account after the closure started. Returns 404 when no closure is in progress.
Authorization
oauth2 Create a client with POST /v1/oauth/clients, then exchange its credentials for an access token. AUTHORIZATION_CODE clients act on behalf of a signed-in user and always use PKCE; CLIENT_CREDENTIALS clients act as themselves. A client may only be granted scopes its creator already holds — read the grantable list from GET /v1/oauth/clients/scopes.
In: header
Request Body
application/json
Request body for confirming the OTP on a current-account closure.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/user/accounts/current/closure/confirm" \ -H "Content-Type: application/json" \ -d '{ "otp_code": "1234" }'{ "id": "550e8400-e29b-41d4-a716-446655440000", "status": "AWAITING_OTP", "initiated_by": "USER", "reasons": [ "NO_LONGER_USING" ], "created_at": "2026-09-01T10:15:30Z", "otp_confirmed_at": "2026-01-15T09:31:00Z", "completed_at": "2026-01-15T09:33:00Z", "rejection_reason": "Account has a pending dispute", "resource_id": "string"}{ "code": "BAD_REQUEST", "description": "Bad Request"}{ "code": "UNAUTHORISED", "description": "Unauthorised"}{ "code": "FORBIDDEN", "description": "Forbidden"}{ "code": "RATE_LIMIT_EXCEEDED", "description": "Too Many Requests"}{ "code": "INTERNAL_ERROR", "description": "Internal Server Error"}Start closing the caller's current account POST
Requires an authenticated, active user. For an `ACTIVE` account, the service registers the closure with the custodian bank and sends an OTP by SMS. The account becomes `CLOSED` after the caller confirms the OTP and the custodian bank approves. The service closes a `PENDING` account at once when the custodian bank holds no onboarding for it. A failed onboarding needs an operator reset first. Returns 409 when the balance is not zero, a closure is in progress, or the status prevents a closure.
Resend the OTP for the in-flight closure POST
Sends a new OTP for the closure that is still `AWAITING_OTP`. Requires an authenticated, active user. When the OTP session expired at the custodian bank, this call registers a new closure with the same reasons. It then sends the new closure's OTP. Call `GET /v1/user/accounts/current/closure` afterward to read the current closure id. Returns 404 when no closure is in progress.