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 withfailureCode: 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.
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 statePrevention
- 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.failedwith this code — branch onfailureCode === 'INSUFFICIENT_FUNDS_AT_SETTLE'to surface a “please top up your balance and try again” message
Related webhooks
Thetransaction.failed event fires when settlement fails:
Related endpoints
- GET /v2/transactions/:id — read transaction state
- GET /v2/wallets/:id — read current wallet balance
- POST /v2/payouts — submit a new payout