StabisoDocs

API reference

Reports

Trial balance, profit and loss, balance sheet, general ledger, aging, VAT report.

Operation Summary Scope Idempotency-Key
GET /v1/entities/{entity}/overview Entity Overview read
GET /v1/entities/{entity}/reports/aging Aging of receivables or payables read
GET /v1/entities/{entity}/reports/balance-sheet Balance Sheet read
GET /v1/entities/{entity}/reports/cash-flow Cash Flow read
GET /v1/entities/{entity}/reports/general-ledger General Ledger read
GET /v1/entities/{entity}/reports/period-profit-and-loss Period Profit And Loss read
GET /v1/entities/{entity}/reports/period-trial-balance Period Trial Balance read
GET /v1/entities/{entity}/reports/profit-and-loss Profit And Loss read
GET /v1/entities/{entity}/reports/trial-balance Trial Balance read
GET /v1/entities/{entity}/reports/vat VAT report from the ledger read

GET /v1/entities/{entity}/overview

Entity Overview

Role Center cues and KPIs of one entity: pending approvals, draft entries, unmatched bank lines, overdue receivables and payables per currency, cash, revenue and net income for the month up to as_of, and the eight most recently posted entries. Amounts are in the entity's functional currency unless stated per currency.

Required scope read (admin implies every scope)
Operation id entity_overview_v1_entities__entity__overview_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query as_of string (date) or null The day the cues are computed for, ISO 8601; default: today.

Example request

curl "$ERP_URL/v1/entities/CH01/overview" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK Overview
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "entity_name": "string",
  "currency": "string",
  "as_of": "2026-09-21",
  "period": "string",
  "period_status": "string",
  "pending_approvals": 1,
  "pending_for_me": 1,
  "draft_entries": 1,
  "unmatched_bank_lines": 1,
  "unappropriated_years": 1,
  "recurring_due": 0,
  "recurring_journals_due": 0,
  "periods_in_close": 0,
  "vat_returns_due_soon": 0,
  "vat_returns_overdue": 0,
  "overdue_receivables": {
    "count": 1,
    "totals_by_currency": {}
  },
  "overdue_payables": {
    "count": 1,
    "totals_by_currency": {}
  },
  "cash": "string",
  "revenue_mtd": "string",
  "net_income_mtd": "string",
  "recent_entries": [
    {
      "id": "string",
      "number": "string",
      "entry_date": "2026-09-21",
      "description": "string",
      "source": "string",
      "amount": "string"
    }
  ]
}

GET /v1/entities/{entity}/reports/aging

Aging of receivables or payables

Open posted documents of one side with their open amount, days overdue and aging bucket (current, 1-30, 31-60, 61-90, 90+ days past due), oldest due date first, and the totals per currency and bucket. Credit notes count negative; settled documents are left out. Amounts are in the document's currency; open_functional and totals_functional give the same in the entity's functional currency: the carrying amount the ledger holds (the booked total less what the posted payments and credit notes relieved; a payment waiting for approval reserves the open amount but relieves nothing yet), the figures of the analytics aging trend for that day. A document that pending payments reserve in full is listed too (reserved, open zero), so those totals are complete. reconciliation sets them against the ledger's control account as of as_of: the balance, the revaluation postings that sit on it, and what is unexplained (zero when the books are in order).

Required scope read (admin implies every scope)
Operation id aging_v1_entities__entity__reports_aging_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query side "payables" | "receivables" yes receivables: sales invoices and credit notes; payables: purchase bills and vendor credit notes.
query as_of string (date) yes Day the report is as of (ISO 8601, e.g. 2026-09-30): overdue days are counted to it, only documents dated on or before it are listed, and a payment or credit note dated after it has not settled anything yet.

Example request

curl "$ERP_URL/v1/entities/CH01/reports/aging?side=value&as_of=2026-09-30" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK Aging
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "side": "payables",
  "as_of": "2026-09-21",
  "items": [
    {
      "document_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "number": "string",
      "kind": "string",
      "party": "string",
      "party_code": "",
      "party_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "document_date": "2026-09-21",
      "due_date": "2026-09-21",
      "currency": "string",
      "total": "string",
      "open": "string",
      "open_functional": "0.00",
      "reserved": false,
      "days_overdue": 1,
      "bucket": "string",
      "external_number": "string",
      "cash_discount_date": "2026-09-21",
      "cash_discount": "0.00",
      "payment_blocked": false
    }
  ],
  "totals_by_currency": {},
  "functional_currency": "",
  "totals_functional": {},
  "reconciliation": {
    "control_account": "string",
    "group_control_account": "string",
    "control_balance": "string",
    "totals_functional": "string",
    "difference": "string",
    "unrealised_fx": "string",
    "pending_settlements": "string",
    "unexplained": "string"
  }
}

GET /v1/entities/{entity}/reports/balance-sheet

Balance Sheet

Assets, liabilities and equity as of a date, grouped by report line, in the entity's functional currency. Profit not yet closed to retained earnings is added to equity and shown separately as unclosed_earnings, so assets equal liabilities plus equity (balanced). compare or compare_as_of adds a comparative date.

Required scope read (admin implies every scope)
Operation id balance_sheet_v1_entities__entity__reports_balance_sheet_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query as_of string (date) yes The report date, ISO 8601: everything posted on or before it.
query currency string or null Show the report in another currency than the entity's own, e.g. EUR: income and expenses at each month's average ECB rate, assets and liabilities at the rate of the report date, equity at the rates of the days it was booked, the translation difference as its own equity line (IAS 21.39 to 21.41). translation names every rate used. A rate that is not published yet answers 409 fx_rate_missing.
query compare "prior_year_end" or null prior_year_end: add the balance sheet on the last day of the previous fiscal year (the day before the fiscal year of as_of starts) and the change, per account, per section and in total (comparative). Works with currency too. There is no budget comparison: budgets plan revenue and expenses only.
query compare_as_of string (date) or null Compare with the balance sheet at this date instead (ISO 8601); it wins over compare.

Example request

curl "$ERP_URL/v1/entities/CH01/reports/balance-sheet?as_of=2026-09-30" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK BalanceSheet
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "currency": "string",
  "as_of": "2026-09-21",
  "assets": "string",
  "liabilities": "string",
  "equity": "string",
  "unclosed_earnings": "string",
  "balanced": true,
  "sections": [
    {
      "report_line": "string",
      "amount": "string",
      "accounts": [
        null
      ],
      "comparative": null,
      "budget": null
    }
  ],
  "translation": {
    "functional_currency": "string",
    "currency": "string",
    "source": "string",
    "dataset_version": "string",
    "closing_rate": null,
    "average_rates": [
      null
    ],
    "historical_rates": [
      null
    ],
    "difference": "string",
    "reconciled": true
  },
  "comparative": {
    "as_of": "2026-09-21",
    "assets": {
      "amount": null,
      "change": null,
      "change_pct": null
    },
    "liabilities": {
      "amount": null,
      "change": null,
      "change_pct": null
    },
    "equity": {
      "amount": null,
      "change": null,
      "change_pct": null
    },
    "unclosed_earnings": {
      "amount": null,
      "change": null,
      "change_pct": null
    }
  },
  "notes": [
    {
      "words": "string",
      "code": "string",
      "details": {},
      "text": "string"
    }
  ]
}

GET /v1/entities/{entity}/reports/cash-flow

Cash Flow

Cash flow statement by the indirect method, in the entity's functional currency: the profit of the posted entries dated from start to end, the amounts in it that are not cash (depreciation, gains and losses on disposals, unrealised exchange differences on cash), the change of each balance sheet account in operating, investing or financing activities, and the effect of exchange rate changes on cash. Cash is the accounts on the balance sheet's cash line: opening_cash plus net_change is closing_cash (balanced). Which line an account is on follows the rules of its chart (under the German chart, DRS 21: interest received in investing, interest paid in financing). Year-end closing entries are left out, and balances taken over from an earlier system count as the position at the start. Fixed assets bought or sold on credit count in investing when paid (IAS 7.43), the unpaid part as a note; interest and income taxes paid are notes too (IAS 7.31-35). Each line lists its accounts, to follow them into the general ledger. 422 end_before_start when end is before start.

Required scope read (admin implies every scope)
Operation id cash_flow_v1_entities__entity__reports_cash_flow_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query start string (date) yes First day of the range, ISO 8601.
query end string (date) yes Last day of the range, ISO 8601, included.

Example request

curl "$ERP_URL/v1/entities/CH01/reports/cash-flow?start=2026-01-01&end=2026-09-30" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK CashFlowStatement
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "currency": "string",
  "start": "2026-09-21",
  "end": "2026-09-21",
  "opening_cash": "string",
  "sections": [
    {
      "section": "financing",
      "total": "string",
      "lines": [
        null
      ]
    }
  ],
  "net_change": "string",
  "closing_cash": "string",
  "balanced": true,
  "notes": [
    {
      "words": "string",
      "code": "string",
      "details": {},
      "text": "string"
    }
  ]
}

GET /v1/entities/{entity}/reports/general-ledger

General Ledger

The posted lines of one account dated from start to end, by entry date and posting order, with the running balance in the account's normal direction (debit for assets and expenses, credit for the others). opening_balance is everything posted before start. A line of a year-end closing entry has closing true. An unknown account answers 404.

Required scope read (admin implies every scope)
Operation id general_ledger_v1_entities__entity__reports_general_ledger_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query account string yes Account code (or id) in the entity, e.g. 6500.
query start string (date) yes First day of the range, ISO 8601.
query end string (date) yes Last day of the range, ISO 8601, included.
query include_close boolean Show the lines of year-end closing entries (marked closing); false leaves them out of the lines and the balances, so the account reads as it did before the close. (default true)

Example request

curl "$ERP_URL/v1/entities/CH01/reports/general-ledger?account=6500&start=2026-09-01&end=2026-09-30" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK GeneralLedger
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "account": "string",
  "name": "string",
  "start": "2026-09-21",
  "end": "2026-09-21",
  "opening_balance": "string",
  "closing_balance": "string",
  "lines": [
    {
      "entry_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "number": "string",
      "entry_date": "2026-09-21",
      "description": "string",
      "line_description": "string",
      "currency": "string",
      "amount": "string",
      "debit": "string",
      "credit": "string",
      "balance": "string",
      "closing": false
    }
  ]
}

GET /v1/entities/{entity}/reports/period-profit-and-loss

Period Profit And Loss

Income statement for a fiscal period and for the year to date through it, with the same figures of the previous year as comparatives. notes says when there is no comparative period or when it has a different number of days. Entries are selected by the period they were posted in. Unknown year or period answers 404.

Required scope read (admin implies every scope)
Operation id period_profit_and_loss_v1_entities__entity__reports_period_profit_and_loss_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query fiscal_year integer yes The fiscal year, e.g. 2026.
query period integer yes Period number within the year, from 1; adjustment periods follow the regular ones.
query comparatives boolean true (default): add the same period of the previous fiscal year and its year to date; false: leave them out. (default true)
query currency string or null Show the report in another currency than the entity's own, e.g. EUR: income and expenses at each month's average ECB rate, assets and liabilities at the rate of the report date, equity at the rates of the days it was booked, the translation difference as its own equity line (IAS 21.39 to 21.41). translation names every rate used. A rate that is not published yet answers 409 fx_rate_missing.

Example request

curl "$ERP_URL/v1/entities/CH01/reports/period-profit-and-loss?fiscal_year=2026&period=9" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK PeriodProfitAndLoss
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "currency": "string",
  "period": {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "fiscal_year": 1,
    "number": 1,
    "kind": "string",
    "start": "2026-09-21",
    "end": "2026-09-21",
    "status": "string"
  },
  "current": {
    "entity": "string",
    "currency": "string",
    "start": "2026-09-21",
    "end": "2026-09-21",
    "revenue": "string",
    "expenses": "string",
    "net_income": "string",
    "sections": [
      {
        "report_line": null,
        "amount": null,
        "accounts": null,
        "comparative": null,
        "budget": null
      }
    ],
    "translation": {
      "functional_currency": null,
      "currency": null,
      "source": null,
      "dataset_version": null,
      "closing_rate": null,
      "average_rates": null,
      "historical_rates": null,
      "difference": null,
      "reconciled": null
    },
    "comparative": {
      "start": null,
      "end": null,
      "revenue": null,
      "expenses": null,
      "net_income": null
    },
    "budget": {
      "versions": null,
      "periods": null,
      "revenue": null,
      "expenses": null,
      "net_income": null
    },
    "notes": [
      {
        "words": null,
        "code": null,
        "details": null,
        "text": null
      }
    ]
  },
  "year_to_date": {
    "entity": "string",
    "currency": "string",
    "start": "2026-09-21",
    "end": "2026-09-21",
    "revenue": "string",
    "expenses": "string",
    "net_income": "string",
    "sections": [
      {
        "report_line": null,
        "amount": null,
        "accounts": null,
        "comparative": null,
        "budget": null
      }
    ],
    "translation": {
      "functional_currency": null,
      "currency": null,
      "source": null,
      "dataset_version": null,
      "closing_rate": null,
      "average_rates": null,
      "historical_rates": null,
      "difference": null,
      "reconciled": null
    },
    "comparative": {
      "start": null,
      "end": null,
      "revenue": null,
      "expenses": null,
      "net_income": null
    },
    "budget": {
      "versions": null,
      "periods": null,
      "revenue": null,
      "expenses": null,
      "net_income": null
    },
    "notes": [
      {
        "words": null,
        "code": null,
        "details": null,
        "text": null
      }
    ]
  },
  "prior_period": {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "fiscal_year": 1,
    "number": 1,
    "kind": "string",
    "start": "2026-09-21",
    "end": "2026-09-21",
    "status": "string"
  },
  "prior_current": {
    "entity": "string",
    "currency": "string",
    "start": "2026-09-21",
    "end": "2026-09-21",
    "revenue": "string",
    "expenses": "string",
    "net_income": "string",
    "sections": [
      null
    ],
    "translation": null,
    "comparative": null,
    "budget": null,
    "notes": [
      null
    ]
  },
  "prior_year_to_date": {
    "entity": "string",
    "currency": "string",
    "start": "2026-09-21",
    "end": "2026-09-21",
    "revenue": "string",
    "expenses": "string",
    "net_income": "string",
    "sections": [
      null
    ],
    "translation": null,
    "comparative": null,
    "budget": null,
    "notes": [
      null
    ]
  },
  "notes": [
    {
      "words": "string",
      "code": "string",
      "details": {},
      "text": "string"
    }
  ],
  "translation": {
    "functional_currency": "string",
    "currency": "string",
    "source": "string",
    "dataset_version": "string",
    "closing_rate": null,
    "average_rates": [
      null
    ],
    "historical_rates": [
      null
    ],
    "difference": "string",
    "reconciled": true
  }
}

GET /v1/entities/{entity}/reports/period-trial-balance

Period Trial Balance

Trial balance after every posting through a fiscal period, on any calendar. On the last day of the year the last regular period is before adjustments, an adjustment period after them. Entries are selected by the period they were posted in, not by date. Unknown year or period answers 404.

Required scope read (admin implies every scope)
Operation id period_trial_balance_v1_entities__entity__reports_period_trial_balance_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query fiscal_year integer yes The fiscal year, e.g. 2026 (GET /v1/entities/{entity}/fiscal-years).
query period integer yes Period number within the year, from 1; adjustment periods follow the regular ones (period 13 on a monthly calendar with one adjustment period).

Example request

curl "$ERP_URL/v1/entities/CH01/reports/period-trial-balance?fiscal_year=2026&period=9" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK PeriodTrialBalance
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "currency": "string",
  "as_of": "2026-09-21",
  "accounts": [
    {
      "account_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "code": "string",
      "name": "string",
      "type": "string",
      "report_line": "string",
      "debit": "string",
      "credit": "string",
      "balance": "string",
      "comparative": null,
      "budget": null
    }
  ],
  "total_debit": "string",
  "total_credit": "string",
  "balanced": true,
  "period": {
    "id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "fiscal_year": 1,
    "number": 1,
    "kind": "string",
    "start": "2026-09-21",
    "end": "2026-09-21",
    "status": "string"
  }
}

GET /v1/entities/{entity}/reports/profit-and-loss

Profit And Loss

Revenue, expenses and net income of the posted entries dated from start to end, grouped into sections by report line, in the entity's functional currency. Unlike the period report it selects by entry date, not by fiscal period. compare and budget add comparative figures; notes holds their caveats.

Required scope read (admin implies every scope)
Operation id profit_and_loss_v1_entities__entity__reports_profit_and_loss_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query start string (date) yes First day of the range, ISO 8601.
query end string (date) yes Last day of the range, ISO 8601, included.
query currency string or null Show the report in another currency than the entity's own, e.g. EUR: income and expenses at each month's average ECB rate, assets and liabilities at the rate of the report date, equity at the rates of the days it was booked, the translation difference as its own equity line (IAS 21.39 to 21.41). translation names every rate used. A rate that is not published yet answers 409 fx_rate_missing.
query compare "prior_year" or null prior_year: add the same range one year earlier (a month end stays a month end, so 29 February compares with 28 February) and the change, per account, per section and in total (comparative). Works with currency too.
query budget boolean true: add the approved budget and the variance, per account, per section and in total (budget): per fiscal year, the approved version of its budget (of several, the one approved last), for the fiscal periods wholly in the range. Without an approved budget budget is null and notes says why; with currency it is left out (a budget is planned in the functional currency). (default false)

Example request

curl "$ERP_URL/v1/entities/CH01/reports/profit-and-loss?start=2026-09-01&end=2026-09-30" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK ProfitAndLoss
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "currency": "string",
  "start": "2026-09-21",
  "end": "2026-09-21",
  "revenue": "string",
  "expenses": "string",
  "net_income": "string",
  "sections": [
    {
      "report_line": "string",
      "amount": "string",
      "accounts": [
        null
      ],
      "comparative": null,
      "budget": null
    }
  ],
  "translation": {
    "functional_currency": "string",
    "currency": "string",
    "source": "string",
    "dataset_version": "string",
    "closing_rate": null,
    "average_rates": [
      null
    ],
    "historical_rates": [
      null
    ],
    "difference": "string",
    "reconciled": true
  },
  "comparative": {
    "start": "2026-09-21",
    "end": "2026-09-21",
    "revenue": {
      "amount": null,
      "change": null,
      "change_pct": null
    },
    "expenses": {
      "amount": null,
      "change": null,
      "change_pct": null
    },
    "net_income": {
      "amount": null,
      "change": null,
      "change_pct": null
    }
  },
  "budget": {
    "versions": [
      null
    ],
    "periods": [
      "string"
    ],
    "revenue": {
      "amount": null,
      "change": null,
      "change_pct": null
    },
    "expenses": {
      "amount": null,
      "change": null,
      "change_pct": null
    },
    "net_income": {
      "amount": null,
      "change": null,
      "change_pct": null
    }
  },
  "notes": [
    {
      "words": "string",
      "code": "string",
      "details": {},
      "text": "string"
    }
  ]
}

GET /v1/entities/{entity}/reports/trial-balance

Trial Balance

The trial balance as of a date: for every account with postings, the debit and credit totals of all posted entries dated on or before as_of and the balance, in the entity's functional currency. balanced is true when total debits equal total credits, which it is unless the books are corrupt. closing=exclude leaves out the closing entries of a year-end close (the pre-closing view).

Required scope read (admin implies every scope)
Operation id trial_balance_v1_entities__entity__reports_trial_balance_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query as_of string (date) yes The report date, ISO 8601: everything posted on or before it.
query closing "exclude" | "include" include (default): the year-end closing entries count, so after a close the profit and loss accounts are at zero and the result is in equity. exclude: the view before the close of the fiscal year of as_of, with that year's profit and loss on its accounts; earlier years stay closed. (default "include")

Example request

curl "$ERP_URL/v1/entities/CH01/reports/trial-balance?as_of=2026-09-30" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK TrialBalance
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "currency": "string",
  "as_of": "2026-09-21",
  "accounts": [
    {
      "account_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
      "code": "string",
      "name": "string",
      "type": "string",
      "report_line": "string",
      "debit": "string",
      "credit": "string",
      "balance": "string",
      "comparative": null,
      "budget": null
    }
  ],
  "total_debit": "string",
  "total_credit": "string",
  "balanced": true
}

GET /v1/entities/{entity}/reports/vat

VAT report from the ledger

VAT of the posted entries between start and end, grouped by direction, jurisdiction, treatment and rate from the tax data stored on the journal lines, in the entity's functional currency. It is reconciled with the movements on the VAT accounts: unexplained_difference shows VAT booked by manual journals. Settlements of VAT returns are left out. This is a working report; the filed figures are in /v1/vat-returns.

Required scope read (admin implies every scope)
Operation id vat_report_v1_entities__entity__reports_vat_get

Parameters

In Name Type Required Description
path entity string yes Entity code, e.g. CH01 (GET /v1/entities).
query start string (date) yes First day of the period, inclusive (ISO 8601).
query end string (date) yes Last day of the period, inclusive (ISO 8601).

Example request

curl "$ERP_URL/v1/entities/CH01/reports/vat?start=2026-09-01&end=2026-09-30" \
  -H "Authorization: Bearer $ERP_KEY"

Responses

Status Meaning Body
200 OK VatReport
401 Missing or invalid API key (unauthorized). ErrorEnvelope
403 The caller lacks the required scope (missing_right, with scope), the key belongs to no person where a person is needed (forbidden), or the approval policy denies the action (policy_denied, with action and rule_id). ErrorEnvelope
404 The resource does not exist, or belongs to another organization (not_found). ErrorEnvelope
422 Validation failed: the error envelope (validation_failed). For a malformed body or parameter its message is in sentences ("Line 2: the quantity must be above zero") and fields lists each error with pydantic's loc, type and msg beside its sentence (message) and its parts, to word it in another language: items (name and number from 1: line 2), field (its name as sent) and the rule it breaks with its limit, count and choices (none for a validator's own sentence); FastAPI's own detail list stays beside the envelope. HTTPValidationError

Example response (shape)

{
  "entity": "string",
  "currency": "string",
  "start": "2026-09-21",
  "end": "2026-09-21",
  "rows": [
    {
      "direction": "string",
      "jurisdiction": "string",
      "treatment": "string",
      "rate": "string",
      "self_assessed": true,
      "base": "string",
      "output_tax": "string",
      "input_tax": "string"
    }
  ],
  "output_tax": "string",
  "input_tax": "string",
  "net_payable": "string",
  "ledger_output_tax": "string",
  "ledger_input_tax": "string",
  "other_period_output_tax": "0.00",
  "other_period_input_tax": "0.00",
  "unexplained_difference": "string",
  "reconciling_items": [
    {
      "code": "string",
      "label": "string",
      "amount": "string"
    }
  ]
}

Schemas

Aging

Field Type Required Description
entity string yes Code of the entity.
side "payables" | "receivables" yes receivables or payables.
as_of string (date) yes The day the report is as of.
items array of AgingItem yes Open documents, oldest due date first.
totals_by_currency map of map of string yes Per currency, the open amount per bucket and total.
functional_currency string The entity's functional currency, for totals_functional. (default "")
totals_functional map of string The open amount per bucket and total in the entity's functional currency: the sum of the items' open_functional, the carrying amounts the ledger holds. These are the figures the analytics aging trend shows for the same day.
reconciliation AgingReconciliation or null The aging against the ledger's control account as of as_of, so the difference is named: revaluation postings that sit on the control account.

AgingItem

Field Type Required Description
document_id string (uuid) yes Id of the document.
number string or null yes Document number.
kind string yes Document kind.
party string yes Name of the customer or vendor.
party_code string Code of the customer or vendor. (default "")
party_id string (uuid) or null Id of the customer or vendor.
document_date string (date) yes Document date.
due_date string (date) yes Due date.
currency string yes ISO 4217 currency of the amounts.
total string yes Gross total, negative for a credit note.
open string yes Open amount, negative for a credit note.
open_functional string The carrying amount the ledger holds for the document in the entity's functional currency: its booked total less the carrying amounts of the posted payments and credit notes (each as booked), so it ties to the FX revaluation. A pending allocation reserves open but relieves nothing yet. Negative for a credit note. (default "0.00")
reserved boolean True when payments waiting for approval reserve the whole open amount: open is zero (nothing is left to pay), but the ledger still carries the document, so it is listed with its open_functional and its bucket. (default false)
days_overdue integer yes Days past the due date at as_of; 0 when not yet due.
bucket string yes current, 1-30, 31-60, 61-90 or 90+ days overdue.
external_number string or null The vendor's invoice number (bills).
cash_discount_date string (date) or null Last day the cash discount may be taken.
cash_discount string May still be taken on as_of. (default "0.00")
payment_blocked boolean A bill blocked for payment until a second person approves its variance against its purchase order. (default false)

AgingReconciliation

Field Type Required Description
control_account string yes Code of the receivables or payables control account.
group_control_account string or null Code of the group account (ic_ar_control or ic_ap_control) the documents of the entity's group entities post to, when it has one: the aging lists those documents with the others, so the balance it ties to is that of both accounts together.
control_balance string yes The control account's balance in the ledger as of as_of, in the functional currency, in its normal direction (what is owed to us, or by us).
totals_functional string yes The aging's total in the functional currency (totals_functional.total).
difference string yes control_balance less totals_functional.
unrealised_fx string yes Entries of source fx (period-end revaluations) on the control account up to as_of that no reversal has cancelled yet: they sit on the control account but on no document.
pending_settlements string yes A memo: the functional amount of payments and applications waiting for approval on the listed items (an application on both of its items). They reserve the open amount in the document currency but are not booked, so they are in neither control_balance nor totals_functional and explain no part of the difference.
unexplained string yes difference less unrealised_fx: zero when the aging ties to the ledger; anything else is a posting on the control account that no document carries.

BudgetComparative

Field Type Required Description
versions array of BudgetVersionRef yes The budget versions compared with: per fiscal year in the range, the approved version of a budget of that year (of several budgets, the one approved last).
periods array of string yes The fiscal periods whose budget counts, <year>-<number>, e.g. 2026-09: the regular periods wholly in the range (a budget is planned per period).
revenue Comparative yes Total revenue against the budget.
expenses Comparative yes Total expenses against the budget.
net_income Comparative yes Net income against the budget.

BudgetVersionRef

Field Type Required Description
plan_id string (uuid) yes Id (uuid) of the budget (GET /v1/plans/{plan_id}).
version_id string (uuid) yes Id (uuid) of the approved version.
name string yes Name of the budget.
fiscal_year integer yes The fiscal year the budget is for.
number integer yes The version number.

CashFlowStatement

Field Type Required Description
entity string yes Code of the entity.
currency string yes The entity's functional currency; all amounts are in it.
start string (date) yes First day of the range (ISO 8601).
end string (date) yes Last day of the range (ISO 8601).
opening_cash string yes Cash and cash equivalents (the accounts on the balance sheet's cash line) at the start, opening balances taken over in the range included.
sections array of CashFlowSection yes Operating, investing and financing activities, then the effect of exchange rate changes when there is one.
net_change string yes The sum of the sections.
closing_cash string yes Cash and cash equivalents at the end, per the books.
balanced boolean yes True when the opening cash plus the net change is the closing cash.
notes array of Reason yes What to know when reading it (vocabulary cashFlow.note).

GeneralLedger

Field Type Required Description
entity string yes Code of the entity.
account string yes Account code.
name string yes Account name.
start string (date) yes First day of the range (ISO 8601).
end string (date) yes Last day of the range (ISO 8601).
opening_balance string yes Balance before start, functional currency, in the account's normal direction.
closing_balance string yes Balance after the last line of the range.
lines array of LedgerLine yes The posted lines of the account in the range.

LedgerLine

Field Type Required Description
entry_id string (uuid) yes Id (uuid) of the journal entry.
number string or null yes The entry number.
entry_date string (date) yes The posting date (ISO 8601).
description string yes Description of the entry.
line_description string or null yes Description of this line; null if none.
currency string yes Currency of the line.
amount string yes Debit minus credit in the line's currency (negative on a credit).
debit string yes The debit in the entity's functional currency.
credit string yes The credit in the entity's functional currency.
balance string yes Running balance after this line, in the functional currency and the account's normal direction.
closing boolean True for a line of a year-end closing entry (source close), which brings the profit and loss accounts to zero; the report shows it marked. (default false)

Overdue

Field Type Required Description
count integer yes Number of overdue open documents.
totals_by_currency map of string yes Overdue open amount per document currency (ISO 4217 code to decimal string).

Overview

Field Type Required Description
entity string yes Code of the entity.
entity_name string yes Name of the entity.
currency string yes The entity's functional currency; the amounts below are in it.
as_of string (date) yes The day the figures are computed for (ISO 8601).
period string or null yes Label of the regular period containing as_of, e.g. 2026-09; null when none.
period_status string or null yes open or closed; null when no period contains as_of.
pending_approvals integer yes Approval requests of the entity waiting for a decision.
pending_for_me integer yes Of pending_approvals, those the four-eyes principle leaves the caller free to decide: not requested, created, prepared or submitted by the caller (whichever key or session); 0 for a key the system issued. The approve scope and the approval policy are not asked. The length of GET /v1/approvals?entity={entity}&for_me=true.
draft_entries integer yes Journal entries of the entity still in draft.
unmatched_bank_lines integer yes Bank statement lines not yet matched or posted.
unappropriated_years integer Closed fiscal years whose general meeting is overdue while part of the result is still unappropriated (a Swiss entity, six months after the year end): the count the cue shows, and the length of GET /v1/entities/{entity}/fiscal-years?unappropriated=true. (default 0)
recurring_due integer Active recurring invoices with a due date on or before as_of: the count the cue shows, and the length of GET /v1/recurring-invoices?entity={entity}&due_through={as_of}. A run (POST /v1/recurring-invoices/run) makes their invoices. (default 0)
recurring_journals_due integer Active recurring journals with a due date on or before as_of: the count the cue shows, and the length of GET /v1/recurring-journals?entity={entity}&due_through={as_of}. A run (POST /v1/recurring-journals/run) posts their entries. (default 0)
periods_in_close integer Regular periods that ended before as_of and are still open, from the one of the entity's first posted entry on (a period of a fiscal year whose close is posted counts as closed): the cue "periods in close", each with its close status at GET /v1/periods/{period_id}/close-status. A new company's months before its first entry are not counted. (default 0)
vat_returns_due_soon integer VAT returns of this and last year not yet final and due to be filed and paid within 14 days of as_of (due_status due_soon in GET /v1/entities/{entity}/vat-periods); 0 for an entity without a VAT number. (default 0)
vat_returns_overdue integer VAT returns of this and last year past their due date and not final (due_status overdue), from the start of the entity's books. (default 0)
overdue_receivables Overdue yes Open customer invoices past their due date.
overdue_payables Overdue yes Open vendor bills past their due date.
cash string yes Balance of the cash and bank accounts at as_of.
revenue_mtd string yes Revenue from the first of the month of as_of through as_of.
net_income_mtd string yes Net income from the first of the month of as_of through as_of.
recent_entries array of RecentEntry yes The eight most recently posted entries, newest first.

PeriodProfitAndLoss

Field Type Required Description
entity string yes Code of the entity.
currency string yes The currency all amounts are in: the entity's functional currency, or the one asked for with currency.
period PeriodRef yes The period reported.
current ProfitAndLoss yes The period's own postings.
year_to_date ProfitAndLoss yes From the start of the fiscal year through the period.
prior_period PeriodRef or null yes The same period number of the previous fiscal year; null if none.
prior_current ProfitAndLoss or null yes The comparative period's own postings; null without comparative.
prior_year_to_date ProfitAndLoss or null yes The comparative year to date; null without comparative.
notes array of Reason yes Caveats (reportNote codes), e.g. that no comparative period exists or that the periods differ in length.
translation ReportTranslation or null Shown in another currency than the entity's own: how it was translated and the rates used; null in the entity's own currency.

PeriodTrialBalance

Field Type Required Description
entity string yes Code of the entity.
currency string yes The entity's functional currency; all amounts are in it.
as_of string (date) yes The last day of the period (ISO 8601).
accounts array of AccountBalance yes One row per account with postings through the period, ordered by code.
total_debit string yes Sum of the debit column.
total_credit string yes Sum of the credit column.
balanced boolean yes True when total debit equals total credit.
period PeriodRef yes The period the trial balance is through.

ProfitAndLoss

Field Type Required Description
entity string yes Code of the entity.
currency string yes The currency all amounts are in: the entity's functional currency, or the one asked for with currency.
start string (date) yes First day of the range (ISO 8601).
end string (date) yes Last day of the range (ISO 8601).
revenue string yes Total revenue of the range.
expenses string yes Total expenses of the range.
net_income string yes Revenue minus expenses; negative is a loss.
sections array of Section yes The accounts grouped by report line, in report-line order.
translation ReportTranslation or null Shown in another currency than the entity's own: how it was translated and the rates used; null in the entity's own currency.
comparative ProfitAndLossComparative or null With compare=prior_year: the totals of the same range one year earlier and the changes; each account and section carries its own comparative.
budget BudgetComparative or null With budget=true: the totals of the approved budget for the range and the variances; each account and section carries its own budget. Null when no approved budget covers the range (notes says why).
notes array of Reason Caveats of the comparatives (reportNote codes), e.g. that there is no approved budget for the year or that a period is only partly in the range.

ProfitAndLossComparative

Field Type Required Description
start string (date) yes First day of the comparative range: start one year earlier (ISO 8601).
end string (date) yes Last day of the comparative range: end one year earlier, a month end staying a month end (29 February to 28 February and back) (ISO 8601).
revenue Comparative yes Total revenue against the comparative range.
expenses Comparative yes Total expenses against the comparative range.
net_income Comparative yes Net income against the comparative range.

RecentEntry

Field Type Required Description
id string yes Id (uuid) of the entry, as text.
number string or null yes The entry number.
entry_date string (date) yes The posting date (ISO 8601).
description string yes What the entry is for.
source string yes manual or the subledger that created it.
amount string yes Total debits in the functional currency.

TrialBalance

Field Type Required Description
entity string yes Code of the entity.
currency string yes The entity's functional currency; all amounts are in it.
as_of string (date) yes The report date (ISO 8601).
accounts array of AccountBalance yes One row per account with postings, ordered by code.
total_debit string yes Sum of the debit column.
total_credit string yes Sum of the credit column.
balanced boolean yes True when total debit equals total credit.

VatReport

Field Type Required Description
entity string yes Code of the entity.
currency string yes The entity's functional currency; all amounts are in it.
start string (date) yes First day of the period.
end string (date) yes Last day of the period.
rows array of VatRow yes The tagged postings grouped by direction, jurisdiction, treatment and rate.
output_tax string yes Total output VAT of the rows.
input_tax string yes Total input VAT of the rows.
net_payable string yes Output VAT less input VAT.
ledger_output_tax string yes Movement on the output and reverse-charge VAT accounts.
ledger_input_tax string yes Movement on the input VAT accounts.
other_period_output_tax string Output VAT in ledger_output_tax whose tax point is in another period (the date of supply or, under the cash basis, the payment moved it), less output VAT of this period's tax points booked in another period: explained, not part of unexplained_difference. (default "0.00")
other_period_input_tax string The same for input VAT (ledger_input_tax). (default "0.00")
unexplained_difference string yes VAT-account movements not produced by tagged subledger postings (e.g. manual journals); 0 when the report reconciles.
reconciling_items array of ReconcilingItem What is in the ledger's revenue and expenses but in no VAT turnover of this report: lines outside the scope of VAT. Empty when there are none.

VatRow

Field Type Required Description
direction string yes sales or purchases.
jurisdiction string or null yes Taxing jurisdiction, e.g. CH or DE.
treatment string or null yes Tax treatment, e.g. reverse_charge or intra_community_supply.
rate string or null yes VAT rate in percent, as a string.
self_assessed boolean yes true for VAT the entity accounts for itself.
base string yes Tax base (net amount) in the functional currency.
output_tax string yes Output VAT owed, in the functional currency.
input_tax string yes Input VAT deductible, in the functional currency.
Stabiso, the Enterprise System of Record · generated from the code and its guides · release 6f03a5e846b3