lodgeit labs

Hire Purchase available

Amortisation schedule for a hire purchase, chattel mortgage or equipment loan: nominal monthly period basis, in arrears or in advance, monthly frequency, with an optional balloon that replaces or adds to the instalment on its row. Internal balances are unrounded; output rounds to cents. The residual is reported against the stated rate and never forced to zero. Monthly frequency only; other frequencies are refused.

Endpoint

POST /v1/calculators/hp/schedule

URN urn:sbrm:calculator:hp:schedule. selection.kind: fact. Not period-scoped. Read the input schema from /openapi.json before calling.

Inputs

FieldRequiredAllowed values
amount_financedrequireddecimal string
annual_rate_pctrequireddecimal string
term_regular_instalmentsrequiredinteger ≥ 1
instalmentrequireddecimal string
timingrequiredin_arrears | in_advance
frequencyrequiredstring; v1 supports monthly only
begin_daterequiredISO date (YYYY-MM-DD)
contract_formrequiredhire_purchase | chattel_mortgage | equipment_loan
balloonoptionalobject, or null
balloon.amountrequired when balloon presentdecimal string
balloon.instalment_numberrequired when balloon presentinteger ≥ 1
balloon.moderequired when balloon presentreplace | add
fy_end_monthoptionalinteger 1–12, default 6

What the figures are

Worked example

A Scania prime mover on a chattel mortgage, in arrears, with a balloon that replaces the final instalment:

curl -s -X POST \
  "$BASE/v1/calculators/hp/schedule" \
  -H "Content-Type: application/json" \
  -d '{
    "amount_financed": "273269.35",
    "annual_rate_pct": "3.84",
    "term_regular_instalments": 59,
    "instalment": "4180.02",
    "timing": "in_arrears",
    "frequency": "monthly",
    "begin_date": "2021-08-30",
    "contract_form": "chattel_mortgage",
    "balloon": {
      "amount": "59180.02",
      "instalment_number": 60,
      "mode": "replace"
    },
    "fy_end_month": 6
  }'

From the live response:

totals.interest          "32531.96"
final_balance            "0.11"
rate_precision_residual  "0.11"

fy_position["2025-06-30"] = {
  "principal": "105904.81",
  "current_gross": "50160.24",
  "current_unexpired": "3246.78",
  "current_net": "46913.46",
  "non_current_gross": "59180.02",
  "non_current_unexpired": "188.77",
  "non_current_net": "58991.25"
}