# Freeze and unfreeze MPT tokens

Control token transfers by freezing individual holders or the entire MPT issuance.

## How freezing works

Issuers can freeze tokens at two levels:

- **Individual freeze** — Freeze a specific holder's balance.
- **Global freeze** — Freeze all holders of the MPT.


When tokens are frozen, the holder cannot send or receive tokens until unfrozen.

Freezing requires `lsfMPTCanLock` to be set during issuance. If this flag is not set, the issuer cannot freeze tokens.

## Prerequisites

- You are the issuer of the MPT
- The MPT has `lsfMPTCanLock` enabled


## Freeze or unfreeze in the UI

To freeze a holder or all holders:

1. Go to **Accounts** and open the issuer account.
2. Click **Create order** and select **Ledger-specific operations**.
3. In **Ledger**, select the XRP Ledger network.
4. In **Operation**, select **Freeze one or all holders**.
5. In **Freeze scope**, select one of these options:
  - **Individual holder** — Then, in **Holder**, select the holder's account.
  - **All holders** — A warning confirms that all transfers for every holder stop until you unfreeze all holders.
6. Select the token:
  - **Listed asset** — Select the token from the list.
  - **Unlisted asset** — Enter the token's issuance ID.


7. Select a **Fee Strategy**, then click **Submit for approval** and [sign the operation with the app](/pt-br/products/custody/identity-and-access/authentication/ui-authentication#sign-ui-operations). The signing window shows the operation as **MPT Issuance Set** with the setting **Freeze**. For an individual freeze, it also shows the holder.



To unfreeze, follow the same steps and select **Unfreeze one or all holders** in **Operation**. Use the same scope that you froze with. A global freeze stays in place until you unfreeze **All holders**, even if you unfreeze individual holders.

The **Lock status** column on the account page shows the Ripple Custody lock status of the asset, not the ledger freeze. A holder that you freeze on the ledger still shows **Allowed**.

## Freeze a specific holder with the API

To freeze a specific holder's tokens, use `MPTokenIssuanceSet` with the `tfMPTLock` flag:

```json
{
  "payload": {
    "id": "{{intent_id}}",
    "accountId": "{{issuer_account_id}}",
    "parameters": {
      "type": "XRPL",
      "feeStrategy": {
        "priority": "Medium",
        "type": "Priority"
      },
      "operation": {
        "type": "MPTokenIssuanceSet",
        "tokenIdentifier": {
          "issuanceId": "000004C463C52827307480341125DA0577AFFC21D4B2D083",
          "type": "MPTokenIssuanceId"
        },
        "holder": {
          "address": "rHolderAddress...",
          "type": "Address"
        },
        "flags": ["tfMPTLock"]
      }
    },
    "customProperties": {},
    "type": "v0_CreateTransactionOrder"
  }
}
```

## Unfreeze a specific holder with the API

To unfreeze a holder, use the `tfMPTUnlock` flag:

```json
{
  "payload": {
    "id": "{{intent_id}}",
    "accountId": "{{issuer_account_id}}",
    "parameters": {
      "type": "XRPL",
      "feeStrategy": {
        "priority": "Medium",
        "type": "Priority"
      },
      "operation": {
        "type": "MPTokenIssuanceSet",
        "tokenIdentifier": {
          "issuanceId": "000004C463C52827307480341125DA0577AFFC21D4B2D083",
          "type": "MPTokenIssuanceId"
        },
        "holder": {
          "address": "rHolderAddress...",
          "type": "Address"
        },
        "flags": ["tfMPTUnlock"]
      }
    },
    "customProperties": {},
    "type": "v0_CreateTransactionOrder"
  }
}
```

## Global freeze with the API

To freeze all holders, omit the `holder` field:

```json
{
  "operation": {
    "type": "MPTokenIssuanceSet",
    "tokenIdentifier": {
      "issuanceId": "000004C463C52827307480341125DA0577AFFC21D4B2D083",
      "type": "MPTokenIssuanceId"
    },
    "flags": ["tfMPTLock"]
  }
}
```

## Parameters

| Field | Type | Required | Description |
|  --- | --- | --- | --- |
| `tokenIdentifier.issuanceId` | string | Yes | The 192-bit MPT issuance ID. |
| `tokenIdentifier.type` | string | Yes | Must be `MPTokenIssuanceId`. |
| `holder` | object | No | The holder to freeze. Omit for global freeze. |
| `holder.type` | string | Conditional | One of: `Account` (internal account UUID), `Address` (XRPL address), or `Endpoint` (endpoint UUID). Required when `holder` is provided. |
| `holder.address` | string | Conditional | The holder's XRPL address. Required when `holder.type` is `Address`. |
| `holder.accountId` | string | Conditional | Internal account UUID. Required when `holder.type` is `Account`. |
| `holder.endpointId` | string | Conditional | Endpoint UUID. Required when `holder.type` is `Endpoint`. |
| `flags` | array | Yes | `["tfMPTLock"]` to freeze, `["tfMPTUnlock"]` to unfreeze. |


## Response

A successful request returns the transaction order with status `Pending`. After confirmation, the holder's (or all holders') transfer capabilities are updated.

## Related topics

- [Multi-purpose tokens](/pt-br/products/custody/accounts-and-assets/tokenization/xrpl-mpts#supported-operations) — Overview of MPT operations.
- [Token flags](/pt-br/products/custody/accounts-and-assets/tokenization/xrpl-mpts#token-flags) — Flag descriptions.
- [Clawback](/pt-br/products/custody/accounts-and-assets/tokenization/xrpl-mpts/issuer/clawback) — Recover tokens from frozen holders.
- MPTokenIssuanceSet — XRPL transaction reference.