Reports API
The Reports API provides endpoints for generating various financial reports following Norwegian accounting standards. Reports can be generated in multiple formats including Excel, HTML, and PDF.
Content Negotiation
Report format is determined by the Accept header on the request, not a query parameter:
| Accept Header | Format | Description |
|---|---|---|
application/json |
JSON | Structured data response (default) |
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
Excel | Excel workbook download |
text/html |
HTML | HTML document download |
application/pdf |
PDF document download |
Available Reports
Balance Sheet Report
Generates a balance sheet report showing assets, liabilities, and equity at a specific date.
GET /api/v2/reports/balance-sheet
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | ID of the client account |
| report_date | date | No | Date in YYYY-MM-DD format (default: today) |
| dimensions | string | No | Comma-separated dimension tuples in type:id format |
| include_drafts | boolean | No | Include draft journal entries (default: false) |
JSON Response:
Balance sheet, income statement, and trial balance return a bare JSON array of row objects (no wrapping envelope):
[
{
"grouping": {
"level_1_code": "1000",
"level_1_name": "Assets",
"level_2_code": "1100",
"level_2_name": "Current Assets",
"level_3_code": "1110",
"level_3_name": "Cash and Bank"
},
"account_code": "1110",
"account_name": "Bank Account",
"balance": 50000.00
}
]
Income Statement Report
Generates an income statement (profit & loss) report for a specified period.
GET /api/v2/reports/income-statement
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | ID of the client account |
| date_from | date | No | Start date in YYYY-MM-DD format (default: Jan 1 of current year) |
| date_to | date | No | End date in YYYY-MM-DD format (default: today) |
| dimensions | string | No | Comma-separated dimension tuples in type:id format |
| include_drafts | boolean | No | Include draft journal entries (default: false) |
| free_text | string | No | Filter by free text search |
| group_by_dimension | string | No | Group results by dimension type. See Dimension Types |
JSON Response:
period_debit_movements is an object keyed by month number ("1" through "12"), so each row always carries all twelve months.
[
{
"grouping": {
"level_1_code": "3000",
"level_1_name": "Revenue",
"level_2_code": "3100",
"level_2_name": "Sales Revenue",
"level_3_code": "3110",
"level_3_name": "Product Sales"
},
"account_code": "3110",
"account_name": "Product Sales",
"period_debit_movements": {
"1": 10000.00,
"2": 12000.00,
"3": 15000.00,
"4": 0.00,
"5": 0.00,
"6": 0.00,
"7": 0.00,
"8": 0.00,
"9": 0.00,
"10": 0.00,
"11": 0.00,
"12": 0.00
}
}
]
Trial Balance Report
Generates a trial balance showing all account balances.
GET /api/v2/reports/trial-balance
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | ID of the client account |
| date_from | date | Yes | Start date in YYYY-MM-DD format |
| date_to | date | Yes | End date in YYYY-MM-DD format |
| account_codes | string | No | Comma-separated list of account codes to filter |
| dimensions | string | No | Comma-separated dimension tuples in type:id format |
| include_drafts | boolean | No | Include draft journal entries (default: false) |
| include_dimensions | boolean | No | Include dimension breakdown in results (default: true) |
| include_zero_movement | boolean | No | Include accounts with no movement in period (default: true) |
| free_text | string | No | Filter by free text search |
| group_by_dimension | string | No | Group results by dimension type. See Dimension Types |
JSON Response:
[
{
"grouping": {
"level_1_code": "1000",
"level_1_name": "Assets",
"level_2_code": "1100",
"level_2_name": "Current Assets",
"level_3_code": "1110",
"level_3_name": "Cash and Bank"
},
"account_id": 4321,
"account_code": "1110",
"account_name": "Bank Account",
"incoming_balance": 40000.00,
"debit": 15000.00,
"credit": 5000.00,
"outgoing_balance": 50000.00,
"relation_type": "bankacc",
"relation_id": 1,
"relation_name": "Main Bank Account"
}
]
General Ledger Report
Generates a detailed general ledger report showing all transactions.
GET /api/v2/reports/general-ledger
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | ID of the client account |
| date_from | date | No | Start date in YYYY-MM-DD format |
| date_to | date | No | End date in YYYY-MM-DD format |
| account_codes | string | No | Comma-separated list of account codes to filter |
| dimensions | string | No | Comma-separated dimension tuples in type:id format |
| include_drafts | boolean | No | Include draft journal entries (default: false) |
| include_reconciled | boolean | No | Include reconciled entries (default: true) |
| include_cancelled | boolean | No | Include cancelled journal entries (default: true) |
| tax_codes | string | No | Comma-separated list of tax codes to filter |
| free_text | string | No | Filter by free text search |
| page | integer | No | Page number (default: 1) |
| per_page | integer | No | Items per page (default: 100) |
JSON Response:
Unlike the balance sheet, income statement, and trial balance, the general ledger (and the accounts payable/receivable reports below) is paginated. The response is wrapped in a meta/data envelope. Each row in data mirrors a journal entry line; the most relevant fields are shown below.
{
"meta": {
"records": 248,
"per_page": 100,
"page": 1,
"pages": 3
},
"data": [
{
"id": 90211,
"line_id": 3,
"posting_date": "2025-03-14",
"account_id": 4321,
"account_code": "1110",
"description": "Payment received",
"debit": 15000.00,
"credit": 0.00,
"debit_amount": 15000.00,
"currency_code": "NOK",
"exchange_rate": 1.0,
"tax_code": null,
"tax_base_amount": null,
"tax_amount": null,
"reconciled_amount": 15000.00,
"sequence_number": 42,
"relation_type": "bankacc",
"relation_id": 1,
"dimensions": [],
"journal_entry": {
"id": 5567,
"sequence_number": 42,
"cancelled": false,
"is_draft": false,
"voucher_id": 771,
"description": "Bank payment",
"related_object": {
"id": 9001,
"document_number": "B-2025-014",
"document_date": "2025-03-14",
"due_date": null,
"payment_ref": null,
"document_type": "BANK_STATEMENT",
"business_partner": { "id": 88, "name": "Acme AS" }
},
"created_by": { "id": 7, "full_name": "Ola Nordmann" }
}
}
]
}
Accounts Payable Report
Generates an accounts payable report showing outstanding supplier balances (account 2400).
GET /api/v2/reports/accounts-payable
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | ID of the client account |
| business_partner_id | integer | No | Filter by specific business partner |
| date_from | date | No | Start date in YYYY-MM-DD format |
| date_to | date | No | End date in YYYY-MM-DD format |
| free_text | string | No | Filter by free text search |
| include_reconciled | boolean | No | Include reconciled entries (default: true) |
| include_drafts | boolean | No | Include draft journal entries (default: false) |
| include_cancelled | boolean | No | Include cancelled journal entries (default: true) |
| page | integer | No | Page number (default: 1) |
| per_page | integer | No | Items per page (default: 100) |
The JSON response uses the same paginated meta/data envelope and row shape as the General Ledger Report above.
Accounts Receivable Report
Generates an accounts receivable report showing outstanding customer balances (account 1500).
GET /api/v2/reports/accounts-receivable
Query Parameters:
Same parameters as Accounts Payable Report above.
Data Export (SAF-T Financial)
Generates a SAF-T Financial export following Norwegian tax authority requirements.
GET /api/v2/reports/data-export
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | ID of the client account |
| date_from | date | No | Start date in YYYY-MM-DD format |
| date_to | date | No | End date in YYYY-MM-DD format |
Content Negotiation:
| Accept Header | Response |
|---|---|
text/xml |
SAF-T XML file download |
application/zip |
Starts async export. Returns 202 Accepted with a message. The ZIP file is emailed when ready. |
Dimension Types
The group_by_dimension parameter accepts the following values:
| Value | Description |
|---|---|
businesspartner |
Group by customer or supplier |
bankacc |
Group by bank account |
project |
Group by project |
department |
Group by department |
asset |
Group by fixed asset |
tag |
Group by tag |
item |
Group by item |
These literal values are also what appear in the relation_type field of trial-balance and general-ledger response rows. An unrecognised value returns 400 Bad Request.
The dimensions parameter uses type:id format, where type is one of the values above and id is the entity ID. Multiple dimensions are comma-separated: dimensions=project:1,department:2.
Response Formats
Excel Format
Returns an Excel workbook with formatted headers, grouped data with subtotals, and number formatting following Norwegian standards.
HTML Format
Returns an HTML document with responsive table layout, formatted numbers and dates, and print-friendly styling.
PDF Format
Returns a PDF document with professional layout, page headers and footers, and print-optimized formatting.
Error Responses
{
"status": 400,
"error": "Bad Request",
"message": "string"
}
Common error codes:
400 Bad Request: Invalid parameters (e.g., invalidgroup_by_dimensionvalue, or a client account that could not be found on the data-export endpoint)403 Forbidden: Missingclient_account_idor no access to the requested client account