Statements

The three statements, section by section and - asked for - account by account, with the movement and the closing balance named for what they are, so a figure can be read without knowing which statement it came from.

The endpoints

MethodPathAnswers
GET/api/v1/organisations/{organisation}/statements/profit-loss The profit and loss
GET…/statements/balance-sheetThe balance sheet
GET…/statements/cash-flowThe cash flow

Each needs a bearer token, a credential issued for that company, and the statements.read scope.

The parameters

ParameterWhat it does
periodThe month, Jul-2026 or 2026-07. Absent, the company's reporting month is answered.
number_of_monthsHow many trailing months, 1 to 120. Default 1. A profit and loss or a balance sheet only.
currencyThe currency to present in. Default: the company's own. A currency the group holds no rate for is refused rather than answered untranslated.
detail1 answers the accounts behind a section instead of the sections. A profit and loss or a balance sheet only.
sectionWith detail=1: which section to open, as Sections answers it. Required with detail, and it has to be a section of the statement asked for.
scenarioActual (default), Budget or Forecast. A profit and loss or a balance sheet only. A month after the company's reporting month answers its plan for Forecast; a month at or before it answers no plan rows, because the actuals replace the plan there.
is_ytdCash flow only: 1 for fiscal year to date, absent for the month.

A parameter the statement does not take is refused with unknown_field rather than ignored, so a caller is never left believing a filter applied.

What a statement answers

GET /api/v1/organisations/149/statements/profit-loss?period=Sep-2026

{
  "data": [
    { "section": "DIRECT COSTS", "statement": "profit-loss", "period": "Sep-2026",
      "movement": 22593.0, "balance": 295735.0 },
    { "section": "REVENUE", "statement": "profit-loss", "period": "Sep-2026",
      "movement": 80423.0, "balance": 697728.0 }
  ],
  "page": 1, "per_page": 50, "total": 9, "has_more": false
}

A row is one section for one month. The sections are the account types of the statement, and a section with no movement in the month is not answered for it - a profit and loss only carries sections that moved, and a balance sheet only sections that stand at a balance. movement is the period's figure and balance the closing one, both on the account's own normal side.

A balance sheet answers the year's earnings as a section of its own, CY EARNINGS. The screen prints that figure inside equity, but it is not an equity account, so answering it separately is what makes the sections add up: assets on one side, liabilities, equity and the earnings on the other. The equity total the screen shows is the EQUITY section plus CY EARNINGS.

A statement answers the scenario it is asked for. scenario filters the rows the statement is built from, so Actual, Budget and Forecast answer different figures for the same month. The table behind the statement composes actual rows up to the company's reporting month, forecast rows after it and budget rows for any month, so a month after the reporting month answers its plan and a month at or before it carries none.

A plan month's position is the reporting month's actual close plus the plan. A plan states movements, not closing positions, so the balance sheet of a plan month is answered the way the report answers it: a section the plan leaves alone - equity, for one - carries the close it stood at in the reporting month, and CY EARNINGS answers that close plus the earnings the plan adds. A company whose figures are consolidated is answered the same way, so its translation reserve and the minority interests' share of profit and of the translation reserve come to the figures the screen shows.

What a detail answers

GET …/statements/profit-loss?period=Sep-2026&detail=1&section=REVENUE

{
  "data": [
    { "code": "SA-4000", "name": "Sales Revenue", "movement": [80423.0], "balance": [697728.0] }
  ],
  "page": 1, "per_page": 50, "total": 1, "has_more": false
}

movement and balance each hold one figure per month asked for, in the order the months were requested, oldest first: the movement is the month's figure and the balance is the position at its end, whichever statement it is. The account identity is code and name.

A detail row is one account across the months asked for. The equity section lists its own accounts only: the year's earnings are answered as the CY EARNINGS section, so they are not repeated as a row here. A detail read of CY EARNINGS answers that section's per-month movement and balance. A section of the other statement answers invalid_value, naming the sections the statement does have.

What a cash flow answers

GET …/statements/cash-flow?period=Sep-2026&is_ytd=1

{
  "period": "Sep-2026",
  "basis": "year_to_date",
  "lines": [ { "id": "net_cash_flow", "title": "Net Cash Flow", "value": 165023.0 } ]
}

basis is year_to_date or month, so a caller never has to remember which it asked for, and the year to date stops at the company's reporting month. The lines are the steps the cash flow prints, in order and all of them, each with its id - which is stable - its title as the screen shows it and its value. The steps are read from the cash flow's own report template, so what nets off, which change is inverted and what the closing bank is come to the figures the screen prints.