# ITEM_UNAVAILABLE

# ITEM_UNAVAILABLE

A line item, modifier group, or modifier referenced by the order is no longer present in the live catalog. Catalogs change — items get 86'd, modifier groups are reorganized — and the user's cart can drift out of sync.

## Summary

| Field | Value |
|---|---|
| Appears as | `errors[].code` |
| Response | HTTP `200` — `Order` with `isValid: false` and a populated `errors[]` |
| Retry unchanged | No |

:::note[This is a reason code, not a top-level error code]
`ITEM_UNAVAILABLE` is an `errors[].code` value on the order. It is **not** a top-level
`ProblemDetail.errorCode`, so it carries no HTTP status, `errorCategory`, or `retryable` field of its
own. See [Unified OrderError shape](/distribution-partners/marketfront-api/guides/order-lifecycle#unified-ordererror-shape).
:::

## When This Fires

- **`POST /v1/marketfront/orders/validate`** — at least one `lineItem.itemId`, `modifierGroup.modifierGroupId`, or `modifier.modifierId` does not exist in the catalog set the order was validated against.
- **`POST /v1/marketfront/orders/place`** — same condition surfaces at placement time (typically only if validation was skipped).

When the cart is checked against the catalog, `errors[]` contains one entry per offending line item with a `pointer` locating the exact element. When the reason comes back from the commerce partner instead, `pointer` is `null` — the partner tells us the order failed, not which element caused it.

`message` names the item when we can resolve its name from the catalog you validated against, and falls back to a generic sentence when we cannot. It never carries an identifier — use `pointer` to locate the element programmatically, and `message` only for display.

## Recommended Action

Re-fetch the catalog and reconcile the cart with the user:

1. `GET /v1/marketfront/stores/{storeId}` — read the store's current `catalogSetId`, then
   `GET /v1/marketfront/catalog-sets/{catalogSetId}` to pull it. Catalog sets are immutable, so
   re-fetching the id you already hold returns the same stale menu — you must re-read the store to
   pick up the new one.
2. Walk the `errors[]` array and surface each unavailable item to the user with a "remove" or "substitute" affordance.
3. Have the user resolve each, then resubmit.

A blind retry will continue to fail.

## Example

```json
{
  "isValid": false,
  "errors": [
    {
      "code": "ITEM_UNAVAILABLE",
      "message": "'Pepperoni' is no longer available on 'Build Your Own Pizza'. Please edit that item and try again.",
      "pointer": "/cart/lineItems/0"
    }
  ]
}
```
