# Held fills

Source: https://docs.settlemint.com/docs/console/asset-lifecycle/venues/held-fills
Find the fills the platform could not settle, read why each was held, and retry it or propose a bust.

When a fill cannot settle after the platform's automatic retries, or fails the same way on every attempt, the platform holds that fill with its decoded refusal reason. Both legs of the held fill, the base tokens and the quote tokens, stay locked in the venue's [escrow](https://docs.settlemint.com/docs/console/asset-lifecycle/escrows), and the trade stays pending delivery until an operator decides. The **Held fills** tab of the venue, titled "Held settlement fills", lists the 100 most recently held fills, and the filters reach older ones. An operator reads why each fill was held, then retries it or proposes a bust.

![The Held settlement fills tab with the Instrument, Reason and age filters, and No held settlement fills while every fill has settled](https://docs.settlemint.com/docs/screenshots/console-venue-held-fills.light.en.webp)

[Screenshot] The "Held settlement fills" tab with the "Instrument", "Reason", "Minimum age (seconds)" and "Maximum age (seconds)" filters.

With nothing held, the tab reads "No held settlement fills" and "Fills that fail to settle wait here for an operator to retry or bust them." When fills are held, the table shows "Trade", "Instrument", "Parties", "Amounts", "Reason", "Attempts" and "Age".

## Before you start [#before-you-start]

- **The Venue operator role on the venue.** Reading and acting on held fills needs it. A venue admin grants it on the venue's [Permissions](https://docs.settlemint.com/docs/console/asset-lifecycle/venues/permissions) tab.
- **A reason and your wallet.** Each action needs an operator reason and your wallet verification.
- **A second operator for a bust.** A bust follows the venue's "Trading venues" row under "Approvals" on [General](https://docs.settlemint.com/docs/console/organisation-settings/general#approvals) like any other bust. While the row is on, a different venue operator approves it.

## Steps [#steps]

### Find the held fill [#find-the-held-fill]

Open "Asset lifecycle", then "Venues", select the venue, then "More" and **Held fills**. The list shows the trade, the instrument, both parties, the base and quote amounts, the reason, the attempts with the last attempt, and the age.

Filter by **Instrument**, "Reason", "Minimum age (seconds)" or "Maximum age (seconds)". The filters stay in the page address, so you can hand the same view to a colleague.

### Read why it was held [#read-why-it-was-held]

Select **Open details** on a row. The "Held fill details" sheet shows the buyer, seller, quantity, price, first and last attempt, the attempt count and the "Attempt history", with links to the trade and both orders. "Retry now" and "Bust" sit in this sheet.

A failed settlement attempt keeps the trade in **Pending delivery**, keeps both legs locked, and retries on its own after a growing delay. The platform holds a fill instead when:

- the failure repeats on every attempt
- the venue refuses the fill on chain, for example with `InvalidDeliveryRecipient` on an instrument with a holding period when the buyer, seller or a fee recipient is the zero address, the escrow or an address on the token's compliance bypass list
- the fill owes VAT on chain that cannot be paid
- the batch runs out of automatic retries

A failing batch of several fills is split in halves until the platform isolates the failing fill, and only that fill is held.

### Retry the fill [#retry-the-fill]

In the sheet, enter the "Operator reason (required)", select **Retry now** and confirm with your wallet verification. The platform queues the fill for settlement again and records your reason in the audit trail. The fill leaves the list as soon as the retry is queued. For a reason the platform marks non-retryable, the sheet warns that the retry needs an explicit override, which the audit trail records. The action stays off until you tick "Confirm override for this non-retryable reason", and the platform refuses the retry without it. A retry, with or without the override, needs no second operator.

### Bust the trade instead [#bust-the-trade-instead]

Select **Bust** to propose a trade bust for the held trade, with the same reason and wallet step. The proposal is refused while either order of the trade is still open. It follows the venue's "Trading venues" row like any other bust. An approved bust undoes the trade, refunds the escrow lock of each closed order, and removes the held fill. [Trade busts](https://docs.settlemint.com/docs/console/asset-lifecycle/venues/trade-busts) covers the approval.

## You should see [#you-should-see]

- Filter the held fills to the instrument you worked and check that a fill you retried has left the list.
- The fill leaves when the retry is queued, so check on [Settlement instructions](https://docs.settlemint.com/docs/console/asset-lifecycle/venues/settlement-instructions) that the trade moves from "Pending delivery" to **Delivered**.
- For a bust, open [Trade busts](https://docs.settlemint.com/docs/console/asset-lifecycle/venues/trade-busts) and check the proposal, then check that the trade reads "Undone" on [Settlement instructions](https://docs.settlemint.com/docs/console/asset-lifecycle/venues/settlement-instructions).

## Troubleshooting [#troubleshooting]

**Retry now is refused for a reason marked non-retryable**

A retry is not expected to change this reason, for example a refusal that repeats on every attempt. Confirm the
override to retry anyway, which the audit record keeps, or bust the trade.

**A bust from a held fill is refused**

An order from the trade is still open and must be cancelled on the
[Orders](https://docs.settlemint.com/docs/console/asset-lifecycle/venues/orders) tab, or another of the causes listed under [Trade
busts](https://docs.settlemint.com/docs/console/asset-lifecycle/venues/trade-busts#troubleshooting) applies.

## API routes [#api-routes]

| Task | Route |
| --- | --- |
| List the held fills | `GET /api/v2/addons/trading-venues/{venueAddress}/settlement/parked` |
| Retry one held fill | `POST /api/v2/addons/trading-venues/{venueAddress}/settlement/parked/{fillId}/retries` |

Integrations receive the `trading-venue.settlement-fill.parked` webhook when a fill is held, and `trading-venue.settlement-fill.aged` when it stays held past an age set for your deployment. The webhook and the route say parked where the Console says held. The request and response fields are in [the v2 API reference](https://docs.settlemint.com/docs/api-reference/v2).
