> ## 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 a loan's payoff quotes

> Read every payoff figure recorded for one Loan, and the versions that computed each.

A **payoff quote** is a figure the Platform served when you asked it to record what discharges a Loan, recorded with the date it answers for, the moment it was served, and the versions of the three things that computed it. This call answers one Loan's quotes, oldest first.

The record binds nothing. No derivation reads it, no settlement cites it, and the next question about the same Loan and the same date is derived again from the recorded facts. Where a recorded quote and today's figure disagree, the record is evidence of what was said and today's figure is what is owed.

<Warning>
  A quote is not an offer and this listing is not a price list. A Receipt is settled against the figure the Platform derives on the day it arrives, never against a figure recorded here. A quote you relayed to a borrower two weeks ago may no longer discharge the Loan.
</Warning>

## Where a record comes from

You ask for one. When you relay a payoff to a borrower as the figure to pay, [record it](/api-reference/loans/record-payoff-quote): the Platform derives the figure exactly as the payment-options read does, records it, and answers it with the record's `id` — which the Receipt paying it may name in `quote_id`.

The [payment options](/api-reference/clients/payment-options) and [the book](/api-reference/clients/book) record nothing. They answer the same figure for a screen, and a screen is drawn far more often than a figure is relayed.

A figure the Platform cannot record is not answered: if the write fails, the recording is refused and you receive no figure. A figure that reached you and a figure on the record are the same figure, to the minor unit. The Loan on [Quickstart](/getting-started/quickstart) is quoted `787367` (MXN 7,873.67) for `2026-04-13`, and the record below is what recording that figure left behind.

| Case | Recorded |
| - | - |
| A recording of the Loan's payoff on a date | One record |
| A book read with `include=payoff`, or a payment-options read | Nothing |
| A recording where the Platform could not produce the payoff figure | Nothing — refused `409` `undeterminable`, the reason the payment options show in `anomalies[]` |
| The same Loan and the same date recorded twice | Two records — asking again is asking again, and the second answer may differ |
| A payment-options read, `GET` or `HEAD` | Nothing |

## Path parameters

<ParamField path="tenant_id" type="string" required>
  The Tenancy the Loan belongs to. Another Tenancy's path answers `403`.
</ParamField>

<ParamField path="loan_id" type="string" required>
  The Loan the quotes are about, as the issuance answered it.
</ParamField>

## Query parameters

<ParamField query="limit" type="integer" default="50">
  How many records to serve, between 1 and 200. A value outside that range is `400`, never clamped.
</ParamField>

<ParamField query="cursor" type="string">
  Where to resume, returned verbatim from the previous page. A cursor issued for another listing or another Tenancy is refused.
</ParamField>

## Response

<ResponseField name="loan_id" type="string" required>
  The Loan the page is about.
</ResponseField>

<ResponseField name="payoff_quotes" type="array" required>
  The records, oldest first by `served_at`. An empty array is a Loan nobody has asked about.

  <Expandable title="quote">
    <ResponseField name="id" type="string" required>
      The record's identifier.
    </ResponseField>

    <ResponseField name="quoted_for" type="string" required>
      The date the figure answers for, ISO `YYYY-MM-DD`. It is the `on` you named, which may be a date that has not arrived.
    </ResponseField>

    <ResponseField name="served_at" type="string" required>
      RFC 3339 in UTC: the moment the answer left the Platform. It is a different fact from `quoted_for`.
    </ResponseField>

    <ResponseField name="owed" type="object" required>
      What discharging the Loan on `quoted_for` would have taken, as `minor_units` and `currency`. The total alone: the charges it was made of are a derivation, and the payment-options read still answers them.
    </ResponseField>

    <ResponseField name="computed_by" type="object" required>
      The three versions that produced the figure.

      <Expandable title="computed_by">
        <ResponseField name="engine" type="string" required>
          The build that served it, as its commit.
        </ResponseField>

        <ResponseField name="calendar" type="string" required>
          The version of the non-working-day tables that build carries.
        </ResponseField>

        <ResponseField name="country" type="string" required>
          The version of the country registry that build carries.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="note" type="string" required>
  One sentence repeating that a recorded quote is evidence and not authority. It is the same sentence on every page of every Loan.
</ResponseField>

<ResponseField name="cursor" type="string">
  Where the next page resumes. It is absent exactly when this page is the end of the listing.
</ResponseField>

## What the three versions name

A derived figure is a function of the recorded facts and of the machinery that read them, and the machinery moves when the Platform is released. The three versions say which part moved.

| Version | What it names | What moves it |
| - | - | - |
| `engine` | The build that computed the figure | Any release of the Platform |
| `calendar` | The non-working-day tables that build carries | A release that adds, removes or edits a day |
| `country` | The country registry that build carries | A release that edits an entry |

Two records of one Loan and one date read together answer the question a dispute asks:

| The two records | What moved |
| - | - |
| Different figures, identical versions | The facts. A Receipt, a rollover or a retraction landed between the two questions |
| Different figures, one version differing | The machinery, and the version that differs names which part |
| Identical figures, different versions | Nothing that reaches this figure. A release moved something the payoff does not read |

## Refusals

This route takes no body and reads two query parameters.

| Status | When |
| - | - |
| `400` | The URL carries a parameter this route does not read — it reads `limit` and `cursor` and nothing else — or a `limit` outside 1 to 200 |
| `403` | The key authenticates for another Tenancy |
| `404` | No such Loan, or it belongs to another Tenancy |

Those two are one `404`, which is what keeps them indistinguishable from outside. A read-scoped key is enough.

<RequestExample>
  ```bash Read theme={null}
  curl "https://api.capcells.com/v1/tenants/capyplazo/loans/7771aef0-9e65-4a0a-a902-aab4e970d33f/payoff-quotes" \
    -H "Authorization: $(capcells_sign "$CAPCELLS_API_KEY" GET /v1/tenants/capyplazo/loans/7771aef0-9e65-4a0a-a902-aab4e970d33f/payoff-quotes)"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "loan_id": "7771aef0-9e65-4a0a-a902-aab4e970d33f",
    "payoff_quotes": [
      {
        "id": "b41e0a52-1f7c-4a1d-9d0e-0c2f6b8a4e31",
        "quoted_for": "2026-04-13",
        "served_at": "2026-04-13T16:41:07.902244Z",
        "owed": { "minor_units": 787367, "currency": "MXN" },
        "computed_by": {
          "engine": "c45dd7bb8f3901498b2e6fe8da185ff1ee950331",
          "calendar": "94364e4c694519022ac6db0274d1cb07aea422708768b81f8f75507ea1c4373f",
          "country": "36a0213c9989d83f931a5dbb010d474b05e0da9c1a6adc6d3df9735741af97f6"
        }
      }
    ],
    "note": "a recorded quote is evidence of what was said, never authority over what is owed: what discharges the loan today is the payment-options read's answer"
  }
  ```

  ```json 404 No such loan theme={null}
  {
    "error": "loan: loan not found",
    "code": "not_found"
  }
  ```

  ```json 400 A parameter the route does not read theme={null}
  {
    "error": "reading the request: this route does not read the parameter \"on\"",
    "code": "invalid_query"
  }
  ```
</ResponseExample>


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