---
title: "Get Financial Statements"
method: GET
path: "/companies/{company_id}/financial-statements"
tags: ["accounting-settings"]
---

# Get Financial Statements

`GET /companies/{company_id}/financial-statements`

## Request

- Base URL: `https://app.zeno-works.ch` (the document declares no server; this is the origin it was published from)
- URL: `https://app.zeno-works.ch/companies/{company_id}/financial-statements`
- Auth: none declared

Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).

Aggregates every posted GL journal line whose **posting date** falls in the fiscal
year's window, classifies each account against the chart of accounts, and reports
problems (unbalanced trial balance, unclassified accounts, year-not-opened, mixed
currency). **Read-only and distinct** from the uploaded balance-sheet snapshots
(``GET .../balance-sheets``): nothing here reads a snapshot. ``fiscal_year`` optional
→ the latest FY with journal data. ``month`` (``YYYY-MM``, inside the FY — **422**
otherwise) narrows the statement to one month: the balance sheet stays cumulative
(as of month end, YTD equity fold) while the P&L + cash flow cover that month's
flows. Explicit non-member ``company_id`` → 403.

**The cut** — a line is included because its ``posting_date`` falls inside the fiscal
year's own window, read off the ``gl_fiscal_year`` row; the response's
``fiscal_year_cut`` says so (``method="posting_date_window"``, dates = that window;
the aggregated window is ``period_start``..``period_end``, narrower when
month-scoped, ZET-166). The ``/gl/reports/*`` family cuts by the line's stamped
``fiscal_year_id`` FK instead. Both read the same window, so they agree on where the
year starts and ends; they can still differ on a line dated outside the year it is
stamped to.

## Path parameters

- `company_id` string, required

## Query parameters

- `fiscal_year` integer, nullable
- `month` string, nullable

## Headers

- `authorization` string, nullable

## Cookies

- `access_token` string, nullable

## Response `200`

Successful Response

- FinancialStatementsOut: Computed balance sheet + P&L + cash flow for a ``(company, fiscal_year)``. ``period_start``/``period_end`` are the reporting window: the FY bounds by default, one month of the FY when ``?month=YYYY-MM`` was passed. Month-scoped, the **balance sheet stays cumulative** (FY start → month end, an as-of position; its ``net_result_cents`` fold is the year-to-date result) while the **P&L and cash flow cover only that month's flows** (``profit_loss.net_result_cents`` is the period result).
  - `company_id` string, required
  - `fiscal_year` integer, required
  - `currency` string, required
  - `fiscal_year_start` string, required
  - `fiscal_year_end` string, required
  - `period_start` string, required
  - `period_end` string, required
  - `is_opened` boolean, required
  - `balanced` boolean, required
  - `residual_cents` integer, required
  - `available_fiscal_years` integer[], required
  - `balance_sheet` BalanceSheetSection, required: The computed balance sheet (journal-derived).
    - `assets` FinancialStatementLine[], required
      - `account_number` string, required
      - `account_name` string, nullable
      - `category` 'asset' | 'liability' | 'equity' | 'income' | 'expense' | 'tax' | 'other' | 'unknown', required: The account-type axis of a ledger account (Swiss-KMU chart of accounts). Distinct from — but derived from — ``LineRole`` (the journal-line semantic role). ``unknown`` is the conservative default when classification can't decide; ``other`` covers genuinely ambiguous / closing (9xxx) accounts.
      - `amount_cents` integer, required
      - `side` string, required
      - `is_contra` boolean
    - `liabilities` FinancialStatementLine[], required
      - `account_number` string, required
      - `account_name` string, nullable
      - `category` 'asset' | 'liability' | 'equity' | 'income' | 'expense' | 'tax' | 'other' | 'unknown', required: The account-type axis of a ledger account (Swiss-KMU chart of accounts). Distinct from — but derived from — ``LineRole`` (the journal-line semantic role). ``unknown`` is the conservative default when classification can't decide; ``other`` covers genuinely ambiguous / closing (9xxx) accounts.
      - `amount_cents` integer, required
      - `side` string, required
      - `is_contra` boolean
    - `equity` FinancialStatementLine[], required
      - `account_number` string, required
      - `account_name` string, nullable
      - `category` 'asset' | 'liability' | 'equity' | 'income' | 'expense' | 'tax' | 'other' | 'unknown', required: The account-type axis of a ledger account (Swiss-KMU chart of accounts). Distinct from — but derived from — ``LineRole`` (the journal-line semantic role). ``unknown`` is the conservative default when classification can't decide; ``other`` covers genuinely ambiguous / closing (9xxx) accounts.
      - `amount_cents` integer, required
      - `side` string, required
      - `is_contra` boolean
    - `unclassified` FinancialStatementLine[], required
      - `account_number` string, required
      - `account_name` string, nullable
      - `category` 'asset' | 'liability' | 'equity' | 'income' | 'expense' | 'tax' | 'other' | 'unknown', required: The account-type axis of a ledger account (Swiss-KMU chart of accounts). Distinct from — but derived from — ``LineRole`` (the journal-line semantic role). ``unknown`` is the conservative default when classification can't decide; ``other`` covers genuinely ambiguous / closing (9xxx) accounts.
      - `amount_cents` integer, required
      - `side` string, required
      - `is_contra` boolean
    - `total_assets_cents` integer, required
    - `total_liabilities_cents` integer, required
    - `total_equity_cents` integer, required
    - `total_unclassified_cents` integer, required
    - `net_result_cents` integer, required
    - `total_liabilities_equity_cents` integer, required
  - `profit_loss` ProfitLossSection, required: The computed P&L (income statement), journal-derived.
    - `income` FinancialStatementLine[], required
      - `account_number` string, required
      - `account_name` string, nullable
      - `category` 'asset' | 'liability' | 'equity' | 'income' | 'expense' | 'tax' | 'other' | 'unknown', required: The account-type axis of a ledger account (Swiss-KMU chart of accounts). Distinct from — but derived from — ``LineRole`` (the journal-line semantic role). ``unknown`` is the conservative default when classification can't decide; ``other`` covers genuinely ambiguous / closing (9xxx) accounts.
      - `amount_cents` integer, required
      - `side` string, required
      - `is_contra` boolean
    - `expense` FinancialStatementLine[], required
      - `account_number` string, required
      - `account_name` string, nullable
      - `category` 'asset' | 'liability' | 'equity' | 'income' | 'expense' | 'tax' | 'other' | 'unknown', required: The account-type axis of a ledger account (Swiss-KMU chart of accounts). Distinct from — but derived from — ``LineRole`` (the journal-line semantic role). ``unknown`` is the conservative default when classification can't decide; ``other`` covers genuinely ambiguous / closing (9xxx) accounts.
      - `amount_cents` integer, required
      - `side` string, required
      - `is_contra` boolean
    - `total_income_cents` integer, required
    - `total_expense_cents` integer, required
    - `net_result_cents` integer, required
  - `cash_flow` CashFlowSection, required: The computed cash-flow statement (indirect method), journal-derived. Indirect method: ``net result`` + non-cash working-capital movements reconcile to the net change in cash & cash-equivalents over the fiscal year. Each section total is the sum of its lines (Operating already includes the net-result line). ``reconciles`` is the double-entry sanity check: operating + investing + financing == the actual change in cash accounts (within ±1 cent).
    - `net_result_cents` integer, required
    - `operating` CashFlowLine[], required
      - `label` string, required
      - `amount_cents` integer, required
      - `account_number` string, nullable
      - `account_name` string, nullable
    - `investing` CashFlowLine[], required
      - `label` string, required
      - `amount_cents` integer, required
      - `account_number` string, nullable
      - `account_name` string, nullable
    - `financing` CashFlowLine[], required
      - `label` string, required
      - `amount_cents` integer, required
      - `account_number` string, nullable
      - `account_name` string, nullable
    - `total_operating_cents` integer, required
    - `total_investing_cents` integer, required
    - `total_financing_cents` integer, required
    - `net_change_in_cash_cents` integer, required
    - `opening_cash_cents` integer, required
    - `closing_cash_cents` integer, required
    - `reconciles` boolean, required
  - `problems` FinancialStatementProblem[], required
    - `severity` string, required
    - `code` string, required
    - `message` string, required
    - `account_number` string, nullable
  - `review` ReviewBlockOut: The uniform ``review`` block artifact endpoints embed (computed live).
    - `verdict` string, required
    - `summary` string, required
    - `plan` integer[]
    - `findings` ReviewFindingOut[]
      - `finding_identity` string, required
      - `code` string, required
      - `check_class` string, required
      - `severity` string, required
      - `title` string, required
      - `detail` string
      - `expected_cents` integer, nullable
      - `actual_cents` integer, nullable
      - `delta_cents` integer, nullable
      - `dimension` object
      - `settings_implicated` string[]
      - `evidence` object
      - `remediation` RemediationOut: Deterministic resolution instructions for one finding.
        - `what_it_means` string, required
        - `why_it_matters` string, required
        - `steps` string[], required
        - `deep_link` string, nullable
        - `who_can_fix` string, required
        - `fix_with_ai` boolean
      - `blocking` boolean
      - `subject_kind` string, nullable
      - `subject_id` string, nullable
      - `first_seen_at` string, nullable
      - `resolved_at` string, nullable
      - `ack_by` string, nullable
      - `ack_at` string, nullable
      - `ack_reason` string, nullable
      - `ack_treatment` string, nullable
      - `ack_treatments` ReviewAckTreatmentOut[]
        - `key` string, required
        - `label` string, required
      - `ai_assessment` object, nullable
    - `coverage` object
  - `gliederung` GliederungOut: The statements re-presented on the statutory structure axis (ZET-280). ``financial_statements`` reports a flat list of accounts per section — a trial balance grouped five ways. OR Art. 959a prescribes a *Mindestgliederung* for the balance sheet and Art. 959b Abs. 2 one for the Erfolgsrechnung; this block is that axis, built from the chart's control marks and Swiss-KMU number bands (``services.or_gliederung``). Three identities hold by construction and are pinned by ``tests/test_gliederung_identities.py``:: Σ aktiven == balance_sheet.total_assets_cents Σ passiven == balance_sheet.total_liabilities_equity_cents Σ sign × erfolg == profit_loss.net_result_cents (excluding ``ER_RESULT``) **Absent (``None``) for a month-scoped statement**: the cumulative balance sheet folds the year-to-date result while the P&L covers one month, so the two result figures differ — and a one-month statutory Mindestgliederung is not a thing. This is a **presentation lens, not the Jahresrechnung**. It carries no Anhang (OR 959c), no entity identity, no comparative and no signature block, and several placements rest on stated ``assumption``s rather than on asserted facts.
    - `version` string, required
    - `aktiven` GliederungPositionOut[], required
      - `key` string, required
      - `group` string, required
      - `side` string, required
      - `citation` string, required
      - `label_de` string, required
      - `label_en` string, required
      - `sign` integer, required
      - `synthetic` boolean
      - `amount_cents` integer, required
      - `lines` GliederungLineOut[], required
        - `account_number` string, required
        - `account_name` string, nullable
        - `amount_cents` integer, required
        - `is_contra` boolean
        - `basis` string, required
        - `assumption` string, nullable
    - `passiven` GliederungPositionOut[], required
      - `key` string, required
      - `group` string, required
      - `side` string, required
      - `citation` string, required
      - `label_de` string, required
      - `label_en` string, required
      - `sign` integer, required
      - `synthetic` boolean
      - `amount_cents` integer, required
      - `lines` GliederungLineOut[], required
        - `account_number` string, required
        - `account_name` string, nullable
        - `amount_cents` integer, required
        - `is_contra` boolean
        - `basis` string, required
        - `assumption` string, nullable
    - `erfolg` GliederungPositionOut[], required
      - `key` string, required
      - `group` string, required
      - `side` string, required
      - `citation` string, required
      - `label_de` string, required
      - `label_en` string, required
      - `sign` integer, required
      - `synthetic` boolean
      - `amount_cents` integer, required
      - `lines` GliederungLineOut[], required
        - `account_number` string, required
        - `account_name` string, nullable
        - `amount_cents` integer, required
        - `is_contra` boolean
        - `basis` string, required
        - `assumption` string, nullable
    - `total_aktiven_cents` integer, required
    - `total_passiven_cents` integer, required
    - `result_cents` integer, required
    - `unclassified` GliederungLineOut[], required
      - `account_number` string, required
      - `account_name` string, nullable
      - `amount_cents` integer, required
      - `is_contra` boolean
      - `basis` string, required
      - `assumption` string, nullable
    - `net_unclassified_cents` integer, required
    - `assumptions` string[], required
    - `has_unassigned` boolean, required
  - `fiscal_year_cut` FiscalYearCutOut: How a statement decided which journal lines belong to the fiscal year (ZET-166). Two statement families cut the year differently, and a response must say which cut produced it — for an ordinary calendar-year book the two agree, but they diverge for a short/long fiscal year, after a ``fiscal_year_start_month`` change, or for any line dated outside the year it is stamped to: - ``"fiscal_year_id"`` (``/gl/reports/trial-balance`` / ``profit-and-loss`` / ``balance-sheet``) — a line is included because its **stamped** ``fiscal_year_id`` FK points at this fiscal year. ``date_from``/``date_to`` are that year's *calendar bounds*, informational only: a line dated outside them is still included when it is stamped to the year. ``period_id`` non-``None`` means the figures are further narrowed to that one fiscal period of the year, whose own bounds are ``period_date_from``.. ``period_date_to``. On these routes the descriptor is ``None`` for a company that has posted nothing (no year resolved, no cut applied). - ``"posting_date_window"`` (``GET /companies/{id}/financial-statements``) — a line is included because its ``posting_date`` falls inside a window derived **at read time** from the company's ``fiscal_year_start_month`` setting; ``date_from``/``date_to`` are that derived window and the descriptor is always present (the window resolves with or without data). A month-scoped read (``?month=``) aggregates the narrower ``period_start``..``period_end`` echoed beside this object (the balance sheet staying cumulative from ``date_from``).
    - `method` 'fiscal_year_id' | 'posting_date_window', required
    - `date_from` string, date, nullable
    - `date_to` string, date, nullable
    - `period_id` string, nullable
    - `period_date_from` string, date, nullable
    - `period_date_to` string, date, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/zeno-works/apis/zeno-api.md) · [All operations](https://skmtc.dev/zeno-works/apis/zeno-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zeno-works/apis/zeno-api/revisions/1eb93dde146c?raw)
