> ## Documentation Index
> Fetch the complete documentation index at: https://docs.capcells.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Read the payment options

> What to collect on a date, per loan: what has fallen due, what is late, the next instalment, the payoff, and what an unnamed amount would do.

The collection question, answered per Loan for the date you name: what has fallen due, what among it is late, the next instalment, the payoff, and what an amount naming none of them would do. A figure the Platform could not produce is **absent rather than zero** — a quoted zero says the Loan owes nothing, which is a different fact from being unable to say — with the reason in `anomalies`. `late` is the one exception: its absence means the Loan is not late.

<Warning>
  **Is this Client late? Read `late`, not `overdue`.** `overdue` holds the instalment falling due on the date you name, so it is non-zero on every due date of every Loan. `late` is present only where a Period stands past its tolerance end unpaid.
</Warning>

The figures are **not additive**. `late` is part of `overdue`; on an instalment's due date `overdue` already holds that instalment; `payoff` is a complete answer of its own.

**This read records nothing.** It is the read to make on every visit to a screen. The payoff figure it answers is for the screen; the figure you relay to a borrower as the one to pay, [record](/api-reference/loans/record-payoff-quote) — it answers the same number, and the record, and the rule that it binds nothing, are on [the Loan's payoff quotes](/api-reference/loans/payoff-quotes).

**It carries a validator.** The answer has an `ETag`; send it back in `If-None-Match` and, where nothing was recorded about the Client since and the date is the same, the answer is `304` with no body — decided from one statement, with no derivation run. Any receipt, reversal, act, retraction or issuance for the Client, or a release of the Platform, changes the tag. [The book version](/api-reference/clients/book-version) answers whether anything moved without asking for anything else.

## Path parameters

<ParamField path="tenant_id" type="string" required>
  The Tenancy asking.
</ParamField>

<ParamField path="client_id" type="string" required>
  The Client whose Loans the answer walks.
</ParamField>

## Query parameters

<ParamField query="on" type="string" required>
  The civil date the figures stand for. Required and never defaulted; absent is `422` — there is no today the Platform can supply.
</ParamField>

## Response

<ResponseField name="loans" type="array" required>
  One entry per Loan the Client holds.

  <Expandable title="loan">
    <ResponseField name="overdue" type="object">
      Everything the Periods that have fallen due on the date still owe, its charges apart. A Period has fallen due when its due date is on or before the date — so the instalment falling due that day is in it, and so is a Period still inside its tolerance. The waterfall settles this first, whatever else the payment intends; paying it brings the Loan current. It does not say the Client is late.

      Stated on every Loan the Platform could describe — a zero where nothing has fallen due — and absent only where no figure could be produced, with the reason in `anomalies`. On a Loan whose debt stands fixed — accelerated, or written off — it is everything the Loan owes and equals `payoff`.
    </ResponseField>

    <ResponseField name="late" type="object">
      What among `overdue` is late: the Periods past their tolerance end on the date and not yet settled — exactly the Periods [the delinquency read](/api-reference/loans/delinquency) reports still overdue.

      | Field | What it is |
      | - | - |
      | `owed` | What the late Periods still owe, charges apart, penalty and late fee among them. Part of `overdue`, never beside it. |
      | `worst_days_past_due` | The largest day count among them. |
      | `periods` | How many Periods are late. |

      **Present exactly where the Loan is late, absent otherwise.** On a Loan whose balance has been called, `owed` is everything the Loan owes. Absent on a date a [suspension](/api-reference/loans/suspension) stands over: a Loan whose clock is stopped is not late that day, and what it owes stays in `overdue`.
    </ResponseField>

    <ResponseField name="suspension" type="object">
      The suspension in force on the date — `event_id`, `reference`, `from`, `to`, and `ended_on` where it was ended early. Absent where the clock was running. It is what explains a matured debt with no `late`.
    </ResponseField>

    <ResponseField name="waivers" type="array">
      The charges [waivers](/api-reference/loans/waiver) by the date released — `reference`, `on`, `period`, `charge`, `amount`. Every figure here already nets them: a waived charge reads settled by its waiver. Absent where none stands.
    </ResponseField>

    <ResponseField name="instalment" type="object">
      The next instalment: its Period, `owed` with charges apart, `actionable_from`, `requires_overdue_settled` — matured Periods are walked oldest first — and `settled_by`. Absent where every Period has matured, and on a Loan whose debt stands fixed: there is no instalment left to pay into.

      | `settled_by` | When | What to collect |
      | - | - | - |
      | `overdue` | The instalment's own due date | The `overdue` figure. It already holds the instalment and everything older; adding `owed` to it collects the instalment twice. |
      | `instalment` | Any day before it | `owed`, once everything older is settled. |
    </ResponseField>

    <ResponseField name="payoff" type="object">
      What discharges the Loan on the date: `owed` with charges apart, `actionable_on`, `requires_payoff_intent` — always true, a payoff is stated, never inferred — and `requires_designation`, true where the Client holds another Loan open in the same currency.
    </ResponseField>

    <ResponseField name="any_other_amount" type="object" required>
      The Configuration's `early_money_treatment` as the stable name beside a borrower-facing sentence — what silent money past everything matured does.
    </ResponseField>

    <ResponseField name="anomalies" type="array" required>
      Why an absent figure is absent, among everything else the derivation had to say.
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash Read theme={null}
  curl "https://api.capcells.com/v1/tenants/$TENANT_ID/clients/c-0001/payment-options?on=2026-04-13" \
    -H "Authorization: $(capcells_sign "$CAPCELLS_API_KEY" GET "/v1/tenants/$TENANT_ID/clients/c-0001/payment-options?on=2026-04-13")"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "client_id": "c-0001",
    "on": "2026-04-13",
    "loans": [
      {
        "loan_id": "7771aef0-9e65-4a0a-a902-aab4e970d33f",
        "reference": "loan-0001",
        "overdue": { "total": { "minor_units": 0, "currency": "MXN" }, "charges": [] },
        "instalment": {
          "index": 2,
          "scheduled_on": "2026-05-02",
          "due_on": "2026-05-04",
          "owed": { "total": { "minor_units": 90066, "currency": "MXN" }, "charges": [ … ] },
          "actionable_from": "2026-05-04",
          "requires_overdue_settled": false,
          "settled_by": "instalment"
        },
        "payoff": {
          "owed": {
            "total": { "minor_units": 787367, "currency": "MXN" },
            "charges": [
              { "charge": "fee", "amount": { "minor_units": 22917, "currency": "MXN" }, "tax": { "minor_units": 3667, "currency": "MXN" }, "total": { "minor_units": 26584, "currency": "MXN" } },
              { "charge": "interest", "amount": { "minor_units": 10409, "currency": "MXN" }, "tax": { "minor_units": 1665, "currency": "MXN" }, "total": { "minor_units": 12074, "currency": "MXN" } },
              { "charge": "principal", "amount": { "minor_units": 748709, "currency": "MXN" }, "tax": { "minor_units": 0, "currency": "MXN" }, "total": { "minor_units": 748709, "currency": "MXN" } }
            ]
          },
          "actionable_on": "2026-04-13",
          "requires_payoff_intent": true,
          "requires_designation": false
        },
        "any_other_amount": {
          "treatment": "reduces_principal",
          "description": "everything overdue is settled first; what remains is applied exclusively to outstanding principal under the statutory rule on early payment, which keeps the term and lowers the payments that follow"
        },
        "anomalies": []
      }
    ]
  }
  ```

  ```json 200 On the due date theme={null}
  {
    "client_id": "c-0001",
    "on": "2026-05-04",
    "loans": [
      {
        "loan_id": "7771aef0-9e65-4a0a-a902-aab4e970d33f",
        "reference": "loan-0001",
        "overdue": { "total": { "minor_units": 90066, "currency": "MXN" }, "charges": [ … ] },
        "instalment": {
          "index": 2,
          "scheduled_on": "2026-05-02",
          "due_on": "2026-05-04",
          "owed": { "total": { "minor_units": 90066, "currency": "MXN" }, "charges": [ … ] },
          "actionable_from": "2026-05-04",
          "requires_overdue_settled": false,
          "settled_by": "overdue"
        },
        "payoff": { … },
        "any_other_amount": { … },
        "anomalies": []
      }
    ]
  }
  ```

  ```json 422 No date theme={null}
  {
    "error": "loan: the question falls outside the loan: what a payment would do is quoted as of a date, and none was given -- there is no today the platform can supply",
    "code": "outside_loan"
  }
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.