Skip to main content

The Lever Ledger

Read the ledger of recoverable money: levers with their cited rows, direct and signal totals, the roles that were read, and how a build or a 503 is handled.

GET /v1/money-found/levers returns the ledger: the levers with their rows, the totals and the roles that were read. Builds run on a worker and are stored. A stored ledger is answered at once and refreshed in the background when it is stale. When none is stored, the call waits for the build and answers 503 while it is still running; retry in a few minutes. Decisions recorded on rows apply on every read.

The headline is direct_entitlement_total: the open owed entitlement on direct levers whose headline is not false. The other totals are reported next to it and never mixed in: estimated_total and potential_total for open exposure of those tiers on headline direct levers, signal_exposure_total for signal levers, further_direct_total for direct levers configured out of the headline, upside_total for upside levers, and resolved_total for entitlement on rows a person resolved or dismissed. Contract price rows the screen flagged or a review held count in held_for_review_total, and rows a review found to rest on a misread contract in not_finding_total. Both stay out of every other total.

GET/v1/money-found/levers

Ledger fields

enginestringstandard, or legacy for a workspace without a Money Found configuration.
currencystringISO 4217 code of every amount.
as_ofstring | nullThe configured date that horizons and lapse clocks count from; null means the current date.
generated_atdatetimeWhen the ledger was built.
direct_entitlement_totalnumberOpen owed entitlement on direct levers with headline not false.
estimated_total / potential_totalnumberOpen exposure of those tiers on headline direct levers.
signal_exposure_totalnumberExposure across signal levers; never part of the headline.
held_for_review_total / held_for_review_rowsnumber / integerContract price rows held out of every total.
not_finding_total / not_finding_rowsnumber / integerContract price rows a review found to rest on a misread contract; excluded.
levers[]arrayThe levers; see below.
roles[]arrayThe roles that were read: role, kind (pipeline, reference_table, master_records or contracts_app), id, name, rows.
skipped[]arrayLevers that could not run: id, name and reason.

levers[] fields

id / category / namestringThe lever.
kindstringdirect, signal, per_load or per_occurrence.
basis / basis_evidence[]string / arrayWhat the lever checks, with its evidence pointers.
entitlement / exposure / checkednumberSums over the lever's rows and the number of items checked.
headlinebooleanFalse when a direct lever is configured out of the headline total.
familystring | nullupside levers never count toward the headline.
rows[]arrayThe findings; see below.

levers[].rows[] fields

keystringThe row key; the key path parameter of the row review route.
explanationstringOne plain-language sentence.
party / agreementstring | nullWho the row concerns and under which agreement.
entitlement / exposurenumberThe amounts of the row.
tierstringowed, estimated, potential or assumed. owed counts as entitlement; the others stay exposure until confirmed.
evidence[]arraydocument_id and field for a document cell, or reference_data_id for a table row, with a label.
state / state_sincestring | nullDecision recorded on the row; absent when open.
lapses_on / lapse_basisstring | nullThe ISO date the claim window closes, and what it rests on.
plausibilityobject | nullScreen flags, status and re-review of a contract price row; see the re-review sections.

cURL: Read the ledger

curl "https://api.talonic.com/v1/money-found/levers" \
  -H "Authorization: Bearer $TALONIC_API_KEY"

Response: Ledger (abridged)

{
  "engine": "standard",
  "currency": "USD",
  "generated_at": "2026-10-21T07:40:02.000Z",
  "direct_entitlement_total": 48210.5,
  "signal_exposure_total": 12400,
  "held_for_review_total": 3100,
  "held_for_review_rows": 2,
  "levers": [
    {
      "id": "contract_price_underbilled",
      "name": "Underbilled against contract price",
      "kind": "direct",
      "entitlement": 48210.5,
      "exposure": 0,
      "rows": [
        {
          "key": "r_3f9a1c",
          "explanation": "Invoice 20411 bills 0.082 per kWh against a contract price of 0.091.",
          "tier": "owed",
          "entitlement": 1204.5,
          "exposure": 0,
          "evidence": [{ "document_id": "7c1e2b94-3a5d-4f08-9b6a-52d8c0e1a4f3", "field": "unit_price", "label": "Invoice 20411" }]
        }
      ]
    }
  ],
  "roles": [{ "role": "invoices", "kind": "pipeline", "id": "9d8c...", "name": "Customer invoices", "rows": 412 }],
  "skipped": []
}
A 503 from this route means the ledger is still building and no earlier build is stored. It is retryable and not a failure of the request. The same applies to GET /v1/money-found/evidence-requests and POST /v1/money-found/reviews/run, which read the ledger too.

Frequently asked questions

Why does the call return 503?+
No ledger is stored yet and the build on the worker is still running. The call waits for the build for a while and then answers 503. Retry in a few minutes. Once a ledger is stored, later reads answer at once and refresh it in the background when it is stale.
Which total is the headline number?+
direct_entitlement_total: the open owed entitlement on direct levers with headline not false. Estimated and potential exposure, signal exposure, upside and held-for-review amounts are separate fields and are never part of it.
How do I trace a row to its source?+
Each row carries evidence pointers. A document pointer has document_id and field; a table pointer has reference_data_id. Every pointer has a label, so a row never points to nothing.