lodgeit labs

Depreciation available

Single-asset carrying amounts under AASB 116. Prime cost or diminishing value, valued at a date or across an arbitrary range — including ranges that have nothing to do with a financial year.

The range endpoint exists because that is the thing nobody offers. If you bought an asset on 1 April 2022 and need the depreciation charge for August 2023 alone, that is one call, not a schedule you post-process.

This is an accounting figure, not a tax figure. It is a carrying amount computed from the cost, useful life, method and dates you supply. It does not represent a deduction under ITAA 1997 Division 40, and the tax figure will not equal it. Every response says so.

Endpoints

POST /v1/calculators/depreciation/at/urn:sbrm:period:depreciation:unscoped
POST /v1/calculators/depreciation/range/urn:sbrm:period:depreciation:unscoped

The period segment reads :unscoped because this calculator is not period-scoped — all date semantics live in at_date, or in from_date and to_date. The segment is required for path uniformity across the constellation and does not affect the calculation. Fiscal-year URNs are not accepted here and will return 404.

The asset

basis required
Only "accounting". Tax basis is reachable at the engine but not exposed at the front door; it will land as its own registry entry.
asset.cost required
Acquisition cost.
asset.acquisition_date required
ISO date.
asset.accounting_useful_life_years required
Useful life in years. Yours to determine — we do not assess whether it is appropriate.
asset.accounting_method required
"prime_cost" or "diminishing_value".
asset.dv_rate_factor optional
Multiplier for diminishing value, not a rate. 2.0 means 200% — a 5-year life at 2.0 gives a 40% annual rate.
asset.pool_type
Refused. Pooled assets are out of scope and return 400 with refusal_class: "pool_asset_out_of_t6_scope".

Day-count conventions

day_count is required on /range/ and optional on /at/, where it defaults to actual/actual. Whichever applies is echoed in the response.

ValueBehaviour
actual/actualAnniversary-year denominators. Each year charges exactly cost ÷ life, and the asset lands on zero at life-end. This is the AASB 116-faithful choice.
actual/365365 days always, including leap years. Honest to its own label; a leap-containing year charges slightly more than cost ÷ life.
monthlyEqual monthly instalments, rounded per month and summed.

Value at a date

curl -s -X POST \
  "$BASE/v1/calculators/depreciation/at/urn:sbrm:period:depreciation:unscoped" \
  -H "Content-Type: application/json" \
  -d '{
    "basis": "accounting",
    "asset": {
      "cost": 10000,
      "acquisition_date": "2023-07-01",
      "accounting_useful_life_years": 5,
      "accounting_method": "prime_cost"
    },
    "at_date": "2025-06-30"
  }'
{
  "wdv_at": "6000.00",
  "period_dep_at": "2000.00",
  "day_count": "actual/actual",
  "schedule_summary": {
    "opening_balance": "10000.00",
    "closing_balance_at": "6000.00",
    "total_depreciation_to_date": "4000.00",
    "total_cost_additions": "0.00",
    "fiscal_years_covered": [2024, 2025]
  }
}

Diminishing value

Same asset, "accounting_method": "diminishing_value" with "dv_rate_factor": 2.0, at 30 June 2024 — 40% of $10,000 in year one:

"wdv_at": "6000.00",  "period_dep_at": "4000.00"

Charge over a range

August 2023 alone, on an asset acquired 1 July 2023. Both endpoints of the range are inclusive — 1 to 31 August is 31 days.

curl -s -X POST \
  "$BASE/v1/calculators/depreciation/range/urn:sbrm:period:depreciation:unscoped" \
  -H "Content-Type: application/json" \
  -d '{
    "basis": "accounting",
    "asset": {
      "cost": 10000,
      "acquisition_date": "2023-07-01",
      "accounting_useful_life_years": 5,
      "accounting_method": "prime_cost"
    },
    "from_date": "2023-08-01",
    "to_date": "2023-08-31",
    "day_count": "actual/actual"
  }'
{
  "from_date": "2023-08-01",
  "to_date": "2023-08-31",
  "day_count": "actual/actual",
  "days_in_range": 31,
  "range_dep": "169.40",
  "opening_wdv": "9830.60",
  "closing_wdv": "9661.20",
  "truncated": false
}

The ledger identity

closing_wdv = opening_wdv − range_dep, exactly, to the cent. The balances are computed and the movement is derived from them, so consecutive ranges telescope: twelve monthly calls sum to the annual charge, with no rounding drift to reconcile.

Boundaries

from_date relative to acquisitionopening_wdvtruncated
before0.00true
equalcostfalse
afterthe fold's value at that datefalse
Known limitation — ranges that span the acquisition date do not reconcile. When from_date falls before acquisition_date, the asset's cost enters during the window and the response carries no column for it. The three published figures then fail the identity above:
from 2023-05-01 to 2023-08-31, acquired 2023-07-01
  opening_wdv  0.00
  range_dep    338.80
  closing_wdv  9661.20      ← 0.00 − 338.80 ≠ 9661.20
The correct form is closing_wdv = opening_wdv + cost_additions − range_dep, and cost_additions is not yet emitted. The engine change is queued. Until it ships, treat a range spanning the acquisition as informational: range_dep and closing_wdv are correct; the roll-forward is not closable from the response alone. Ranges that start on or after the acquisition date are unaffected.

Refusals

// pool_type supplied
400  {"detail": {
       "refusal_class": "pool_asset_out_of_t6_scope",
       "refusal_payload": {"pool_type": "general", "asset_acquisition_date": "2023-07-01"}
     }}

// accounting_useful_life_years omitted
422  {"detail": [{"type": "value_error",
       "msg": "Value error, basis='accounting' requires asset.accounting_useful_life_years"}]}

// basis other than "accounting"
422  {"detail": [{"type": "literal_error", "loc": ["body", "basis"],
       "msg": "Input should be 'accounting'"}]}

Notes for integrators