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
| Method | Path | Answers |
|---|---|---|
| GET | /api/v1/organisations/{organisation}/statements/profit-loss |
The profit and loss |
| GET | …/statements/balance-sheet | The balance sheet |
| GET | …/statements/cash-flow | The cash flow |
Each needs a bearer token, a credential issued for that company, and the statements.read
scope.
The parameters
| Parameter | What it does |
|---|---|
period | The month, Jul-2026 or 2026-07. Absent, the
company's reporting month is answered. |
number_of_months | How many trailing months, 1 to 120. Default
1. A profit and loss or a balance sheet only. |
currency | The currency to present in. Default: the company's own. A currency the group holds no rate for is refused rather than answered untranslated. |
detail | 1 answers the accounts behind a section instead of the
sections. A profit and loss or a balance sheet only. |
section | With 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. |
scenario | Actual (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_ytd | Cash 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§ion=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.