Cowdidocs
API ReferenceCurrent account closure

Confirm the OTP for the in-flight closure

POST
/v1/user/accounts/current/closure/confirm

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.

AuthorizationBearer <token>

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"}