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 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., invalid group_by_dimension value, or a client account that could not be found on the data-export endpoint)
  • 403 Forbidden: Missing client_account_id or no access to the requested client account