Overview
The closure flow has eight steps, grouped into three phases:
Throughout this guide,
{organization_id} and {ledger_id} identify the Midaz Organization and Ledger that own the accounts. This guide abbreviates the paths to /v1/.../accounts/{accountId} for readability.Prerequisites
Before you start, make sure you have:
- The
holderIdof the customer to offboard. - The list of
accountIdvalues linked to that Holder across the Ledger (retrieve them from the Holder’s Alias Accounts). - Confirmation from your compliance team that you can end the customer relationship (no legal holds, open disputes, or pending regulatory requirements).
- Appropriate API credentials with permission to modify holders, balances, and accounts.
Via API
Run the full closure flow programmatically. Each step lists the endpoint, an example payload, and the compliance rationale.
Step 1 — Freeze the Holder
Mark the Holder as inactive to record the closure across your systems. Update the Holder and set thestatus field on its person profile to an inactive value.
Marking the Holder inactive is a record change, not a deletion. The Holder record stays fully readable for audit. This status does not block new credits on its own — Step 2 blocks inflows at the balance level. For a legal person, set
legalPerson.status instead.Step 2 — Block credits on the accounts
For each account linked to the Holder, prevent new funds from entering. First, list the Balances of the account. Then update each balance to disable receiving. Retrieve the account balances:balanceId returned, block incoming funds:
Step 3 — Settle pending activity
Before you can zero a balance, the account must have no in-flight movements.- Check for transactions in processing. Confirm the account has no pending or uncommitted transactions. Commit or cancel them as appropriate using Commit a pending transaction or Cancel a pending transaction.
- Cancel active schedules. Cancel any recurring or scheduled transactions tied to the account. This stops new entries after closure begins.
Step 4 — Zero the balance
Return any remaining funds to the customer (the account holder) and confirm every balance reaches zero.- Record a return transaction that moves the remaining
availableamount from each customer account to the holder’s designated destination (for example, an external settlement account). Use Create a transaction. - Confirm
available = 0on every balance of every account in the Ledger before you proceed. You can check this with Retrieve balances by account.
Step 5 — Close the Ledger Accounts in Midaz
After you zero the balances and clear pending activity, delete each Ledger Account.204 No Content. Repeat for every account linked to the Holder. See Delete an account for the full contract.
Deleting a Ledger Account is a logical removal. The account and its historical operations remain available for audit and reporting, subject to your retention policy.
Step 6 — Register the closing date on the alias
Record the official closure date on the Holder’s Alias Account so the CRM and any regulatory exports reflect when the relationship ended.The
closingDate field lives in the bankingDetails object of the Alias Account and uses YYYY-MM-DD format. See Alias Accounts for the full field reference. BACEN account-lifecycle reporting needs an accurate closing date.Step 7 — Archive the alias accounts in CRM
Archive each Alias Account in CRM. Use a soft delete. It removes the record from active use but keeps it for the regulatory retention period.Step 8 — Archive the Holder in CRM
After you archive all of its alias accounts, archive the Holder itself with a soft delete.Via Console
Run the same eight-step closure flow from the Midaz Console. The Console covers most of the flow point-and-click, but two steps — blocking credits (Step 2) and cancelling scheduled transactions (Step 3) — still require the API. Each step below notes the equivalent API step on this page.
Step 1 — Freeze the Holder
Mark the Holder as inactive to record the closure. This is a record change and does not block new credits on its own.1
From the Holders page, find the Holder to close.
2
Click the three dots () in the Actions column, and select Edit.
3
In the Holder form, set the Status to Inactive.
4
Click Save.
Marking the Holder inactive is a record change, not a deletion. The record stays fully readable for audit. It does not block new credits on its own — Step 2 blocks inflows at the balance level. See Editing a Holder.
Step 2 — Block credits on the accounts
For each account linked to the Holder, use the API to setallowReceiving to false on every balanceId. This blocks new inflows while outflows remain available for the return transaction in Step 4.
Step 3 — Settle pending activity
Confirm there are no in-flight movements before you zero any balance.1
From the Transactions page, filter by the accounts linked to the Holder. Confirm the account has no pending or uncommitted transactions, and commit or cancel any that are in flight.
2
Cancel any recurring or scheduled transactions tied to the account. This stops new entries after closure begins.
Step 4 — Zero the balance
Return any remaining funds to the customer and confirm every balance reaches zero.1
From the Transactions page, click New Transaction. Create a return transaction that moves the remaining
available amount from each customer account to the holder’s designated destination, for example an external settlement account. See Creating a Transaction.2
Open each account and confirm the available balance is 0 before you continue.
Step 5 — Close the Ledger Accounts in Midaz
After you zero the balances and clear pending activity, delete each Ledger Account.1
From the Accounts page, find the Account linked to the Holder, click the three dots () in the Actions column, and select Delete.
2
A confirmation dialog will appear. Click Confirm to finalize the deletion.
3
Repeat for every account linked to the Holder.
Deleting a Ledger Account is a logical removal. The account and its historical operations remain available for audit and reporting, subject to your retention policy. See Deleting an Account.
Step 6 — Register the closing date on the alias
Record the official closure date on the Holder’s Alias Account so the CRM and regulatory exports reflect when the relationship ended.1
From the Alias Accounts page, find the alias account to update, click the three dots () in the Actions column, and select Edit.
2
In the Alias Account form, set the Closing Date (in
bankingDetails) to the official closure date using YYYY-MM-DD format.3
Click Save.
BACEN account-lifecycle reporting needs an accurate closing date. See Editing an Alias Account.
Step 7 — Archive the alias accounts in CRM
Archive each Alias Account with a soft delete. It removes the record from active use but keeps it for the regulatory retention period.1
From the Alias Accounts page, find the alias account to archive, click the three dots () in the Actions column, and select Delete.
2
A confirmation dialog will appear. Click Confirm to finalize.
Step 8 — Archive the Holder in CRM
After you archive all of its alias accounts, archive the Holder itself with a soft delete.1
From the Holders page, find the Holder to archive, click the three dots () in the Actions column, and select Delete.
2
A confirmation dialog will appear. Click Confirm to finalize.
BACEN compliance notes
- Order is mandatory. Freeze first (Steps 1–2), then settle and zero (Steps 3–4). This order stops funds from entering an account that is mid-closure.
- Return funds before closing. Return any residual balance to the customer and confirm it at zero before you delete an account. Midaz blocks closing an account that holds funds, and that closure would also break compliance.
- Archive, don’t erase. A soft delete (no
hard_delete) keeps Holders and alias accounts available for the regulatory retention period. Permanent deletion would remove evidence that BACEN audits need. - Record the closing date. The
closingDateon the alias gives regulators an authoritative timestamp for when the relationship ended. - Preserve the audit trail. Midaz removes Ledger Accounts and operations logically. They remain queryable for reconciliation and reporting.

