Skip to main content

What happened

Funds were available when the transaction was created and reserved, but by the time settlement was attempted the source balance had dropped below the required amount. No funds were moved. The transaction is in a terminal failed state with failureCode: INSUFFICIENT_FUNDS_AT_SETTLE. This is distinct from the INSUFFICIENT_FUNDS error at submission time: that error fires immediately when there is not enough balance to reserve. This error fires later, at settlement, after the reservation was already accepted.
{
  "type": "INSUFFICIENT_FUNDS_AT_SETTLE",
  "title": "Insufficient funds at settlement",
  "status": 422,
  "detail": "Funds were available at reservation but not at settlement. No money was moved.",
  "resolution": "Top up the funding source and submit a new transaction.",
  "docs": "/errors#insufficient-funds-at-settle",
  "instance": "/v2/transactions/txn_abc123",
  "correlationId": "corr_xyz789",
  "timestamp": "2026-01-15T09:30:00.000Z"
}

Common causes

  • Concurrent withdrawals — multiple transactions consumed the available balance between reservation and settlement
  • Fee adjustment — the final settlement fee was higher than estimated, leaving the source short at the settlement boundary
  • Balance consumed by a competing operation — another API call or system event reduced the source balance before settlement ran

Recovery

1. Confirm the terminal state
curl -X GET https://api.conduit.financial/v2/transactions/txn_abc123 \
  -H "x-api-key: YOUR_API_KEY"
2. Check the current balance Retrieve the source to confirm its current available balance:
curl -X GET https://api.conduit.financial/v2/wallets/wlt_abc123 \
  -H "x-api-key: YOUR_API_KEY"
3. Top up the source and resubmit Once the source balance is replenished to at least the required amount plus fee, submit a new transaction:
curl -X POST https://api.conduit.financial/v2/payouts \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Idempotency-Key: idem_NEW_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "cus_abc123",
    "virtualAccountId": "vac_abc123",
    "assetAmount": {"code": "USD", "amount": "500.00"},
    "destination": {
      "recipient": {
        "rail": "us",
        "type": "INDIVIDUAL",
        "firstName": "Jane",
        "lastName": "Doe",
        "accountNumber": "...",
        "routingNumber": "...",
        "accountType": "CHECKING"
      }
    }
  }'

Prevention

  • Serialize high-value transactions — avoid submitting concurrent transactions from the same source unless you track the total reserved amount
  • Check balance before submitting — read the source’s available balance and compare it against the intended amount plus an estimated fee buffer before submitting
  • Handle transaction.failed with this code — branch on failureCode === 'INSUFFICIENT_FUNDS_AT_SETTLE' to surface a “please top up your balance and try again” message
The transaction.failed event fires when settlement fails:
{
  "type": "transaction.failed",
  "data": {
    "transactionId": "txn_abc123",
    "failureCode": "INSUFFICIENT_FUNDS_AT_SETTLE"
  }
}