# SettlementBatchStatus

A model the API reference uses in a request or a response. The operation pages link every field typed as this model here.

Status of a settlement batch through its lifecycle.

## Values

| Value | Description |
| --- | --- |
| `Pending` | Batch created, awaiting processor submission. |
| `Completed` | Batch successfully settled with the processor. |
| `Failed` | Batch settlement failed. |
| `PartiallyCompleted` | Some transactions settled, others rejected by the processor. |
| `NothingToSettle` | No transactions were eligible to settle for this (merchant, processor) group. A successful no-op outcome, distinct from Failed (a genuine fault) and from Completed (a real settle). Recorded so a settlement run leaves a history row for every targeted (merchant, processor) even when zero transactions are loaded. The short explanation is carried in SettlementBatch.ErrorMessage as the per-batch outcome detail. |
| `OperatorActionRequired` | The batch could not be settled automatically and is parked for operator action. Distinct from Failed: a Failed closed batch is re-attempted on the next run (transient fault), whereas an OperatorActionRequired batch is deliberately excluded from automatic retry because blindly re-submitting it would just re-fail. Two causes park a batch here: a non-transient duplicate-batch-number processor rejection (the same processor BatchNumber will keep colliding until an operator bumps it), and exhaustion of SettlementConsts.MaxSettlementRetries transient retries. The batch's transactions are moved to SettlementStatus.SettlementOnHold so they stop auto-retrying; the reason is carried in SettlementBatch.ErrorMessage. The operator UI (follow-up story) lists these and can retry with a bumped processor BatchNumber. |
| `TerminalContention` | The batch was not submitted because a concurrent settlement run already held the terminal lock for the same (Fiserv MerchID, TermID) pair (UMF Appendix M 42.1: only one batch at a time per terminal). Distinct from Failed: nothing went wrong, this run simply deferred to the run that already owned the terminal. The next scheduled run retries normally. |

## See also

- [All documentation](https://devportal.demo.winkpg.io/llms.txt): the machine-readable index of every public page on this site.
