# INSUFFICIENT_FUNDS

# INSUFFICIENT_FUNDS

The issuer declined the payment because the account does not cover the transaction amount. The card credentials are valid — this is a decision about the balance at this moment, not about the card.

## Summary

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

:::note[This is a reason code, not a top-level error code]
`INSUFFICIENT_FUNDS` 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/place`** — payment authorization was declined by the issuer for lack of available funds or credit.

## Recommended Action

Surface the reason and let the customer choose a different payment method. This decline is safe to state plainly — unlike [`CARD_LOST_OR_STOLEN`](/errors/CARD_LOST_OR_STOLEN), there is no reason to withhold it, and telling the customer why is what lets them fix it.

An issuer *may* approve the same card later, so this is not a permanent decline. But retrying inside a checkout session is very unlikely to change the answer, and repeated authorization attempts against the same card can trip issuer fraud controls. Treat "ask for another payment method" as the action and leave any retry to the customer's next attempt.

## Example

```json
{
  "isValid": false,
  "errors": [
    {
      "code": "INSUFFICIENT_FUNDS",
      "message": "Your card was declined for insufficient funds. Please try a different payment method.",
      "pointer": null
    }
  ]
}
```
