# Holds for reserves and fees

Learn how Stripe holds additional funds for reserves and fees on stablecoin-backed card authorizations.

Stablecoin-backed card programs move funds out of the cardholder’s wallet upon authorization, before the transaction settles. The amount requested at authorization doesn’t always match the final amount captured, because some transactions can settle for a higher amount than the originally authorized amount. Issuing merchants can also configure fees to be charged on the cardholder. This results in reserves and fees being withdrawn from the cardholder’s wallet.

## Where to see hold details

Hold details are present on each authorization request for stablecoin-backed cards. The [Authorization](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1) object contains the details about requests:

- [pending_request.hold_amount](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-pending_request-hold_amount) and [pending_request.hold_amount_details](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-pending_request-hold_amount_details), on the [issuing_authorization.request](https://docs.stripe.com/api/events/types.md?api-version=2026-08-26.preview&rds=1#event_types-issuing_authorization.request) webhook.
- [request_history.hold_amount](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-request_history-hold_amount) and [request_history.hold_amount_details](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-request_history-hold_amount_details), on the authorization object and on the [issuing_authorization.created](https://docs.stripe.com/api/events/types.md?api-version=2026-08-26.preview&rds=1#event_types-issuing_authorization.created) and [issuing_authorization.updated](https://docs.stripe.com/api/events/types.md?api-version=2026-08-26.preview&rds=1#event_types-issuing_authorization.updated) events.

Both `hold_amount` and `hold_amount_details` require using any preview API version. `hold_amount` is the total amount held from the wallet, equivalent to `network &plus; reserve &plus; estimated_fee`, and `hold_amount_details` breaks it into its parts:

| Field | Description |
| --- | --- |
| [network](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-pending_request-hold_amount_details-network) | The authorization amount as the network sent it. This is what the business asked to authorize. |
| [reserve](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-pending_request-hold_amount_details-reserve) | Extra funds held above the network amount for merchant categories that commonly capture more than they authorize. `null` when no reserve applies. |
| [estimated_fee](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-pending_request-hold_amount_details-estimated_fee) | The total of the cardholder fees estimated for this request. `null` when no fees apply. |
| [estimated_fee_details](https://docs.stripe.com/api/issuing/authorizations/object.md?api-version=2026-08-26.preview&rds=1#issuing_authorization_object-pending_request-hold_amount_details-estimated_fee_details) | A per-fee breakdown of `estimated_fee`. `null` when no fees apply. |

Here’s a snippet of the `issuing_authorization.request` webhook for a 100 USD domestic restaurant purchase on a program that charges a 0.50 USD + 2% domestic transaction fee, which holds a 20% reserve on top of the network and fee amounts:

```json
{
  "amount": 10000,
  "currency": "usd",
  "pending_request": {
    "amount": 10000,
    "currency": "usd",
    "hold_amount": {"value": 12290, "currency": "usd"},
    "hold_amount_details": {
      "network": {"value": 10000, "currency": "usd"},
      "reserve": {"value": 2000, "currency": "usd"},
      "estimated_fee": {"value": 290, "currency": "usd"},
      "estimated_fee_details": [
        {
          "amount": {"value": 290, "currency": "usd"},
          "type": "application_fee",
          "charged_by": {
            "type": "application",
            "application": {"feature_name": "Issuing cardholder domestic transaction fee"}
          }
        }
      ]
    }
  }
}
```

## Reserves

A reserve is held when the category code (MCC) for the business belongs to a category that routinely captures more than it authorizes, such as adding a tip or extending a rental.

| Merchant category | Reserve |
| --- | --- |
| Eating places, restaurants, and drinking places | 20% of the authorization amount, for US cardholders only |
| Taxis and limousines | 20% of the authorization amount |
| Car and truck rentals | 20% of the authorization amount |
| Automated fuel dispensers | Tops the hold up to the amount the network requires for a fuel status check. See [Automated fuel dispensers](https://docs.stripe.com/issuing/bridge-stablecoin-cards/hold-details.md#automated-fuel-dispensers). |

For a 100 USD restaurant purchase that’s incremented by 20 USD and then partially reversed by 40 USD:

| Request | `network` | `reserve` | `hold_amount` |
| --- | --- | --- | --- |
| Initial authorization | 100.00 USD | 20.00 USD | 120.00 USD |
| Incremental authorization | 20.00 USD | 4.00 USD | 24.00 USD |
| Partial reversal | -40.00 USD | -8.00 USD | -48.00 USD |
| **Totals** | **80.00 USD** | **16.00 USD** | **96.00 USD** |

### Automated fuel dispensers

[Automated fuel dispensers](https://docs.stripe.com/issuing/purchases/authorizations.md#fuel-dispenser-authorizations) (MCC 5542) work differently, because some acquiring merchants authorize a token amount at the pump and only report the real amount after fueling.

Stripe might hold a reserve for fuel to model this. For example, here’s a 1.00 USD status check with a 100.00 USD hold, completing at 45.00 USD:

| Authorization request | `network` | `reserve` | `hold_amount` |
| --- | --- | --- | --- |
| Status check | 1.00 USD | 99.00 USD | 100.00 USD |
| Completion advice | 44.00 USD | -99.00 USD | -55.00 USD |
| **Total held** | **45.00 USD** | **0.00 USD** | **45.00 USD** |

## Cardholder fees

You can configure cardholder fees at the program level and we hold them at authorization time alongside the network amount and any potential reserves. To configure cardholder fees for your program, contact [Stripe support](https://support.stripe.com/).

Three fee rules can apply, depending on the program’s configuration:

| Type | Condition | Options |
| --- | --- | --- |
| Domestic transaction fee | The card country and the acquiring merchant country match | Fixed or percentage fees |
| International transaction fee | The card country and the acquiring merchant country differ | Fixed or percentage fees |
| FX fee | The cardholder’s billing currency and the acquiring merchant’s currency differ | Percentage fees |

More than one rule can apply to a single authorization. For example, an international purchase priced in another currency might be charged both the international transaction fee and the FX fee, and `estimated_fee_details` lists each one separately while `estimated_fee` carries the total.

For partial reversals, the percentage on the reversed amount is returned but the fixed portion is kept. Reversing 40 USD of a 100 USD hold under a 0.50 USD + 2% rule releases 0.80 USD, which leaves 1.70 USD held, which is the same as a 60 USD hold would have cost outright. For full reversals, the fixed portion is refunded too, making the fees across the history net to zero.

The following is the fee lifecycle for a 100 USD domestic purchase under a 0.50 USD + 2% rule with no reserve:

| Authorization request | `network` | `estimated_fee` | `hold_amount` |
| --- | --- | --- | --- |
| Initial authorization | 100.00 USD | 2.50 USD (0.50 USD + 2% of 100 USD) | 102.50 USD |
| Incremental authorization | 20.00 USD | 0.40 USD (2% of 20 USD) | 20.40 USD |
| Partial reversal | -40.00 USD | -0.80 USD (2% of -40 USD) | -40.80 USD |
| **Total held** | **80.00 USD** | **2.10 USD (0.50 USD + 2% of 80 USD)** | **82.10 USD** |

### Reconciling fees

When the transaction settles, Stripe records the final fee as a [FeeEntry](https://docs.stripe.com/api/v2/core/fee-entries.md?api-version=2026-08-26.preview&rds=1), calculated from the captured amount. Fee entries are immutable and append-only, so they’re what you reconcile your program’s fee revenue against.

| Property | Authorization estimated fee details | Fee entries |
| --- | --- | --- |
| When Stripe creates it | On every authorization request, including increments and reversals | Once, when the transaction settles |
| Amount basis | The amount the network requested | The amount the transaction captured |
| Granularity | One entry per applied fee rule, per request | One fee entry per applied fee rule, per settled transaction |
| Stability | An estimate that later requests supersede | Final |

To retrieve the fees for a transaction, list fee entries filtered by `incurred_by`, using the ID of the [Issuing Transaction](https://docs.stripe.com/api/issuing/transactions.md?api-version=2026-08-26.preview&rds=1). Stripe bills these fees to the account that holds the cardholder, so set `Stripe-Context` to that account:

```shell
curl -G https://api.stripe.com/v2/core/fee_entries \
  -H "Authorization: Bearer {{SECRET_KEY}}" \
  -H "Stripe-Version: 2026-08-26.preview" \
  -H "Stripe-Context: {{CONNECTED_ACCOUNT_ID}}" \
  -d "incurred_by={{ISSUING_TRANSACTION_IPI_ID}}"
```
