Assets

Assets represent items of value owned by a company, such as equipment, vehicles, or property. The assets API allows you to manage and track these assets within Snapbooks.

Endpoints

List Assets

GET /api/v2/assets

Retrieves a paginated list of assets.

Query Parameters

Parameter Type Required Description
client_account_id integer No Filter assets by client account
is_active boolean No Filter by active status (default: true). Pass null to include all
page integer No Page number (default: 1)
per_page integer No Items per page (default: 50, max: 100)
with string No Include related resources (supported: client_account, created_by, statistics, property)

Response

{
  "data": [
    {
      "id": 123,
      "name": "Office Equipment",
      "client_account_id": 456,
      "sequence_number": 1,
      "is_active": true,
      "asset_class": "OFFICE_EQUIPMENT",
      "acquisition_date": "2024-01-15",
      "retirement_date": null,
      "auto_depreciate": true,
      "autonomy_level": null,
      "external_source": null,
      "external_id": null,
      "created_at": "2024-03-15T10:00:00Z",
      "updated_at": "2024-03-15T10:00:00Z",
      "created_by_id": 789,
      "updated_by_id": 789,
      "client_account": {  // Only included when with=client_account
        "id": 456,
        "unique_name": "company-abc",
        "display_name": "Company ABC"
      },
      "created_by": {  // Only included when with=created_by
        "id": 789,
        "first_name": "John",
        "last_name": "Doe",
        "created_at": "2023-01-01T00:00:00Z",
        "profile_image_url": null,
        "last_login": "2024-03-15T14:30:00Z"
      }
    }
  ],
  "meta": {
    "page": 1,
    "pages": 1,
    "per_page": 50,
    "records": 1
  }
}

Get Asset

GET /api/v2/assets/{id}

Retrieves a specific asset by ID.

Query Parameters

Parameter Type Required Description
with string No Include related resources (supported: client_account, created_by, statistics, property)

Response

{
  "id": 123,
  "name": "Office Equipment",
  "client_account_id": 456,
  "sequence_number": 1,
  "is_active": true,
  "asset_class": "OFFICE_EQUIPMENT",
  "acquisition_date": "2024-01-15",
  "retirement_date": null,
  "auto_depreciate": true,
  "autonomy_level": null,
  "external_source": null,
  "external_id": null,
  "created_at": "2024-03-15T10:00:00Z",
  "updated_at": "2024-03-15T10:00:00Z",
  "created_by_id": 789,
  "updated_by_id": 789
}

Create Asset

POST /api/v2/assets

Creates a new asset.

Request Body

Field Type Required Description
name string Yes The name of the asset
client_account_id integer Yes The ID of the client account
asset_class string No The asset class code (e.g. OFFICE_EQUIPMENT, MOTOR_VEHICLES). See Asset Classes
acquisition_date date No The date the asset was acquired
retirement_date date No The date the asset was retired
auto_depreciate boolean No Whether the asset should be auto-depreciated (default: true)
autonomy_level string No The autonomy level for automated processing

Example Request

{
  "name": "Office Equipment",
  "client_account_id": 456,
  "asset_class": "OFFICE_EQUIPMENT",
  "acquisition_date": "2024-01-15"
}

Response

{
  "id": 123,
  "name": "Office Equipment",
  "client_account_id": 456,
  "sequence_number": 1,
  "is_active": true,
  "asset_class": "OFFICE_EQUIPMENT",
  "acquisition_date": "2024-01-15",
  "retirement_date": null,
  "auto_depreciate": true,
  "autonomy_level": null,
  "external_source": null,
  "external_id": null,
  "created_at": "2024-03-15T10:00:00Z",
  "updated_at": "2024-03-15T10:00:00Z",
  "created_by_id": 789,
  "updated_by_id": 789
}

Update Asset

POST|PUT /api/v2/assets/{id}

Updates an existing asset. Both POST and PUT methods are accepted.

Request Body

Field Type Required Description
name string No The new name for the asset
asset_class string No The asset class code (e.g. OFFICE_EQUIPMENT, MOTOR_VEHICLES). See Asset Classes
acquisition_date date No The date the asset was acquired
retirement_date date No The date the asset was retired
is_active boolean No Whether the asset is active
auto_depreciate boolean No Whether the asset should be auto-depreciated
autonomy_level string No The autonomy level for automated processing

Example Request

{
  "name": "Updated Equipment Name",
  "asset_class": "FURNITURE_AND_FIXTURES"
}

Response

{
  "id": 123,
  "name": "Updated Equipment Name",
  "client_account_id": 456,
  "sequence_number": 1,
  "is_active": true,
  "asset_class": "FURNITURE_AND_FIXTURES",
  "acquisition_date": "2024-01-15",
  "retirement_date": null,
  "auto_depreciate": true,
  "autonomy_level": null,
  "external_source": null,
  "external_id": null,
  "created_at": "2024-03-15T10:00:00Z",
  "updated_at": "2024-03-15T15:30:00Z",
  "created_by_id": 789,
  "updated_by_id": 789
}

Deactivate Asset

DELETE /api/v2/assets/{id}

Deactivates an asset by setting its is_active status to false. The asset record is preserved for historical purposes.

Response

{
  "id": 123,
  "name": "Office Equipment",
  "client_account_id": 456,
  "sequence_number": 1,
  "is_active": false,
  "asset_class": "OFFICE_EQUIPMENT",
  "acquisition_date": "2024-01-15",
  "retirement_date": null,
  "auto_depreciate": true,
  "autonomy_level": null,
  "external_source": null,
  "external_id": null,
  "created_at": "2024-03-15T10:00:00Z",
  "updated_at": "2024-03-15T16:00:00Z",
  "created_by_id": 789,
  "updated_by_id": 789
}

Deactivation Validation

When attempting to deactivate an asset, the system performs validation to ensure data integrity:

  • Balance Checking: The system checks if any accounting accounts with mandatory asset dimensions have non-zero balances for this specific asset.
  • Validation Failure: If any accounts have non-zero balances, the deactivation is denied with a 400 Bad Request error.
  • Error Details: The error message includes specific account codes and their balances to help identify which transactions need to be resolved.
Example Error Response
{
    "error": "Cannot deactivate asset: account 1200: 15000.00, account 1210: -2500.00",
    "status": 400
}

This validation ensures that assets cannot be deactivated while they still have outstanding balances, maintaining the integrity of your accounting records.

Asset Attributes

Attribute Type Description
id integer The unique ID of the asset (read-only)
created_at datetime When the asset was created (read-only)
created_by_id integer The ID of the user who created the asset (read-only)
updated_at datetime When the asset was last updated (read-only)
updated_by_id integer The ID of the user who last updated the asset (read-only)
client_account_id integer The ID of the client account
sequence_number integer Unique sequence number within the client account (read-only)
name string The name of the asset
is_active boolean Whether the asset is active
asset_class string The asset class code (e.g. OFFICE_EQUIPMENT). See Available Asset Classes
acquisition_date date The date the asset was acquired
retirement_date date The date the asset was retired
auto_depreciate boolean Whether the asset should be auto-depreciated (default: true)
autonomy_level string The autonomy level for automated processing
external_source string Source registry for linked property (e.g. skatteetaten) (read-only)
external_id string External property identifier (read-only)

Relationships

Relationship Type Description
client_account ClientAccount The client account this asset belongs to
created_by User The user who created the asset
statistics object GL account balance summary for the asset. See Statistics Object
property object Real-estate property detail linked from Skatteetaten. See Asset Properties

Statistics Object

The statistics relation (included via ?with=statistics) returns the sum of journal entry line balances (debit minus credit) grouped by GL account code, for all journal entries where this asset is used as a dimension. Only accounts with non-zero balances are included.

{
  "statistics": {
    "balances": [
      {
        "account_code": "1280",
        "balance": 45000.0
      },
      {
        "account_code": "6015",
        "balance": 15000.0
      }
    ]
  }
}
Field Type Description
balances array List of GL account balances for this asset
balances[].account_code string The GL account code
balances[].balance number Net balance (sum of debit minus credit)

Asset Classes

Asset classes define categories of fixed assets based on IFRS standards (IAS 16, IAS 38, IAS 40). Each class specifies a depreciation method and includes Norwegian-specific tax rules (saldogruppe, depreciation rates, and default GL accounts per skatteloven chapter 14).

List Asset Classes

GET /api/v2/asset-classes

Returns all available asset classes with their depreciation configuration and Norwegian tax rules.

Response

[
  {
    "code": "OFFICE_EQUIPMENT",
    "name": "Office equipment",
    "description": "Computers, printers, phones, and other office equipment",
    "depreciation_method": "saldo",
    "ifrs_standard": "IAS 16",
    "no": {
      "saldogruppe": "a",
      "depreciation_rate": "0.30",
      "default_asset_account": "1280",
      "default_accumulated_account": "1299",
      "default_expense_account": "6015"
    }
  },
  {
    "code": "MOTOR_VEHICLES",
    "name": "Motor vehicles",
    "description": "Cars and other passenger vehicles",
    "depreciation_method": "saldo",
    "ifrs_standard": "IAS 16",
    "no": {
      "saldogruppe": "d",
      "depreciation_rate": "0.20",
      "default_asset_account": "1230",
      "default_accumulated_account": "1299",
      "default_expense_account": "6010"
    }
  },
  {
    "code": "SOFTWARE",
    "name": "Software",
    "description": "Purchased or internally developed software",
    "depreciation_method": "linear",
    "ifrs_standard": "IAS 38",
    "no": {
      "saldogruppe": null,
      "depreciation_rate": "0.33",
      "default_asset_account": "1060",
      "default_accumulated_account": "1299",
      "default_expense_account": "6029"
    }
  }
]

The response above shows a subset. The full response includes all 18 asset classes.

Asset Class Attributes

Attribute Type Description
code string Unique asset class code (e.g. OFFICE_EQUIPMENT, MOTOR_VEHICLES)
name string Localized display name
description string Localized description of what the class covers
depreciation_method string Method used: saldo (declining balance), linear, or none
ifrs_standard string Applicable IFRS standard (IAS 16, IAS 38, or IAS 40)
no.saldogruppe string or null Norwegian tax saldogruppe (a-j), or null for linear/non-depreciable assets
no.depreciation_rate string Maximum annual depreciation rate (e.g. "0.30" = 30%)
no.default_asset_account string Default GL account code for the asset balance
no.default_accumulated_account string or null Default GL account for accumulated depreciation
no.default_expense_account string or null Default GL account for depreciation expense

Available Asset Classes

Code Name Method IFRS Saldogruppe Rate
OFFICE_EQUIPMENT Office equipment saldo IAS 16 a 30%
GOODWILL Goodwill saldo IAS 38 b 20%
COMMERCIAL_VEHICLES Commercial vehicles saldo IAS 16 c 24%
MACHINERY_AND_PLANT Machinery and plant saldo IAS 16 d 20%
MOTOR_VEHICLES Motor vehicles saldo IAS 16 d 20%
FURNITURE_AND_FIXTURES Furniture and fixtures saldo IAS 16 d 20%
SHIPS_AND_VESSELS Ships and vessels saldo IAS 16 e 14%
AIRCRAFT Aircraft saldo IAS 16 f 12%
POWER_DISTRIBUTION Power distribution saldo IAS 16 g 5%
BUILDINGS_AND_STRUCTURES Buildings and structures saldo IAS 16 h 4%
AGRICULTURAL_BUILDINGS Agricultural buildings saldo IAS 16 h 6%
COMMERCIAL_BUILDINGS Commercial buildings saldo IAS 16 i 2%
BUILDING_INSTALLATIONS Building installations saldo IAS 16 j 10%
LAND Land none IAS 16 0%
PATENTS_AND_LICENSES Patents and licenses linear IAS 38 10%
SOFTWARE Software linear IAS 38 33%
RESEARCH_AND_DEVELOPMENT Research and development linear IAS 38 20%
INVESTMENT_PROPERTY Investment property saldo IAS 40 h 4%

Asset Properties (Real Estate)

Assets with real-estate asset classes can be linked to the Norwegian property registry (Skatteetaten) to pull cadastral data, address information, and compute wealth-tax valuations. The property detail is a one-to-one relation stored alongside the asset.

Only assets with the following asset classes support property linking: BUILDINGS_AND_STRUCTURES, AGRICULTURAL_BUILDINGS, COMMERCIAL_BUILDINGS, LAND, INVESTMENT_PROPERTY.

Attach Property

POST /api/v2/assets/{id}/property

Links an asset to an external property via Skatteetaten. The endpoint fetches the property record from Skatteetaten and populates cadastral identity, address, and inferred building details on the asset.

Request Body

Field Type Required Description
external_id string Yes The Skatteetaten property identifier
external_source string No Source registry. Only skatteetaten is supported (default: skatteetaten)
tax_year integer Yes The tax year (inntektsår) to look up the property for

Example Request

{
  "external_id": "3817404-31/139/0/0",
  "external_source": "skatteetaten",
  "tax_year": 2025
}

Response

Returns the asset with the property relation included. Status 201 Created.

{
  "id": 123,
  "name": "Kontorbygning Sentrum",
  "client_account_id": 456,
  "sequence_number": 1,
  "is_active": true,
  "asset_class": "COMMERCIAL_BUILDINGS",
  "acquisition_date": "2020-06-01",
  "retirement_date": null,
  "external_source": "skatteetaten",
  "external_id": "3817404-31/139/0/0",
  "created_at": "2024-03-15T10:00:00Z",
  "updated_at": "2026-04-20T12:00:00Z",
  "created_by_id": 789,
  "updated_by_id": 789,
  "property": {
    "id": 1,
    "asset_id": 123,
    "municipality_code": "4601",
    "municipality_name": "Bergen",
    "land_number": "31",
    "title_number": "139",
    "lease_number": null,
    "section_number": null,
    "cooperative_org_number": null,
    "share_number": null,
    "country_code": "NO",
    "street_address": "Strandgaten 18",
    "postal_code": "5013",
    "postal_area": "Bergen",
    "additional_addresses": null,
    "cadastral_number": "4601-31/139/0/0",
    "established_date": "2005-08-15",
    "is_historical": false,
    "building_type": "COMMERCIAL_BUILDING",
    "construction_year": 1985,
    "ownership_type": "SELF_OWNED",
    "rental_status": "NOT_RENTED",
    "usable_area_m2": 420,
    "bra_internal_m2": null,
    "bra_external_m2": null,
    "bra_enclosed_balcony_m2": null,
    "gross_area_m2": null,
    "primary_area_m2": null,
    "secondary_area_m2": null,
    "ownership_share": null,
    "documented_market_value": null,
    "created_at": "2026-04-20T12:00:00Z",
    "created_by_id": 789,
    "updated_at": "2026-04-20T12:00:00Z",
    "updated_by_id": 789
  }
}

Error Responses

Status Description
400 Missing external_id or tax_year, unsupported external_source, asset class does not support real-estate linking, client account has no organization number, or Skatteetaten reports the property as unknown (ukjentEiendomINorge)
403 No access to the asset’s client account
404 Asset not found

Update Property Details

PATCH /api/v2/assets/{id}/property

Updates user-editable fields on the property. Cadastral identity, address, and registry metadata fields are read-only (populated from Skatteetaten) and are silently ignored if included in the request.

Request Body

All fields are optional. Only the fields included in the request body are updated.

Field Type Description
building_type string Building type. See Building Types
construction_year integer Year the building was constructed
ownership_type string Ownership type. See Ownership Types
rental_status string Rental status. See Rental Status Values
usable_area_m2 integer Usable area in square meters
bra_internal_m2 integer Internal gross area (BRA-i, NS 3940)
bra_external_m2 integer External gross area (BRA-e, NS 3940)
bra_enclosed_balcony_m2 integer Enclosed balcony area (BRA-b, NS 3940)
gross_area_m2 integer Total gross area
primary_area_m2 integer Primary area (P-ROM)
secondary_area_m2 integer Secondary area (S-ROM)
ownership_share decimal Ownership share (e.g. 0.500 for 50%)
documented_market_value decimal Documented market value for tax purposes

Example Request

{
  "building_type": "COMMERCIAL_BUILDING",
  "usable_area_m2": 450,
  "documented_market_value": "8500000.00"
}

Response

Returns the asset with the updated property relation. Status 200 OK.

Error Responses

Status Description
400 Missing request body, or asset has no linked property
403 No access to the asset’s client account
404 Asset not found

Detach Property

DELETE /api/v2/assets/{id}/property

Unlinks the property from the asset. Clears the external_source and external_id on the asset and deletes the property detail row via cascade.

Response

Returns the asset with property set to null. Status 200 OK.

{
  "id": 123,
  "name": "Kontorbygning Sentrum",
  "client_account_id": 456,
  "external_source": null,
  "external_id": null,
  "property": null
}

Error Responses

Status Description
400 Asset has no linked property to detach
403 No access to the asset’s client account
404 Asset not found

Get Property Valuation

GET /api/v2/assets/{id}/property/valuation

Fetches a live property valuation from Skatteetaten for wealth tax purposes. The result is computed on-the-fly and is never persisted. The endpoint dispatches to the appropriate Skatteetaten valuation service based on the property’s building type and rental status.

Query Parameters

Parameter Type Required Description
tax_year integer Yes The tax year to compute the valuation for
building_type string No Override the stored building type for this calculation
documented_market_value string No Override the stored documented market value
usable_area_m2 string No Override the stored usable area
construction_year string No Override the stored construction year

Response

The response always includes tax_year, external_id, and formuesgrunnlag (the wealth tax basis from Skatteetaten). Depending on the property type, one additional valuation field is included:

  • markedsverdi_bolig — for dwellings (detached houses, apartments, cabins, etc.)
  • markedsverdi_flerbolig — for multi-unit buildings
  • utleieverdi — for non-rented commercial properties
{
  "tax_year": 2025,
  "external_id": "3817404-31/139/0/0",
  "formuesgrunnlag": { },
  "markedsverdi_bolig": { }
}

The contents of formuesgrunnlag, markedsverdi_bolig, markedsverdi_flerbolig, and utleieverdi are passthrough responses from the Skatteetaten API and follow their schema.

Error Responses

Status Description
400 Missing tax_year, asset is not linked to Skatteetaten, asset has no property row, or client account has no organization number
403 No access to the asset’s client account
404 Asset not found

Asset Property Attributes

Attribute Type Description
id integer Unique property ID (read-only)
asset_id integer The parent asset ID (read-only)
created_at datetime When the property was created (read-only)
created_by_id integer User who created the property (read-only)
updated_at datetime When the property was last updated (read-only)
updated_by_id integer User who last updated the property (read-only)
municipality_code string Norwegian municipality code (read-only, from registry)
municipality_name string Municipality name (read-only, from registry)
land_number string Cadastral land number / gårdsnummer (read-only, from registry)
title_number string Cadastral title number / bruksnummer (read-only, from registry)
lease_number string Lease number / festenummer (read-only, from registry)
section_number string Section number / seksjonsnummer (read-only, from registry)
cooperative_org_number string Housing cooperative organization number (read-only, from registry)
share_number string Share or unit number in housing cooperative (read-only, from registry)
country_code string ISO country code, always NO (read-only)
street_address string Street address (read-only, from registry)
postal_code string Postal code (read-only, from registry)
postal_area string Postal area name (read-only, from registry)
additional_addresses array Additional addresses if the property has more than one (read-only, from registry)
cadastral_number string Formatted cadastral number, e.g. 4601-31/139/0/0 (read-only, computed)
established_date date When the property was registered in the registry (read-only)
is_historical boolean Whether the registry considers this property historical (read-only)
building_type string Building type classification. See Building Types
construction_year integer Year of construction
ownership_type string Ownership type. See Ownership Types
rental_status string Rental status. See Rental Status Values
usable_area_m2 integer Usable area in m²
bra_internal_m2 integer Internal gross area (BRA-i) in m²
bra_external_m2 integer External gross area (BRA-e) in m²
bra_enclosed_balcony_m2 integer Enclosed balcony area (BRA-b) in m²
gross_area_m2 integer Total gross area in m²
primary_area_m2 integer Primary area (P-ROM) in m²
secondary_area_m2 integer Secondary area (S-ROM) in m²
ownership_share decimal Ownership share (e.g. 0.500 = 50%)
documented_market_value decimal Documented market value for tax assessment

Building Types

Value Description
DETACHED_HOUSE Single-family detached house (enebolig)
DETACHED_HOUSE_WITH_UNIT Detached house with secondary unit
SEMI_DETACHED_HOUSE Semi-detached or duplex (tomannsbolig)
ROW_HOUSE Row house / townhouse (rekkehus)
LINKED_HOUSE Linked house (kjedehus)
APARTMENT Apartment (leilighet)
STUDIO Studio apartment
MULTI_UNIT_BUILDING Multi-unit residential building (flerboligbygning)
CABIN Cabin / holiday home (hytte/fritidsbolig)
HOLIDAY_APARTMENT Holiday apartment
COMMERCIAL_BUILDING Commercial building (næringseiendom)
AGRICULTURAL_BUILDING Agricultural building (driftsbygning)
OUTBUILDING Outbuilding (uthus)
OTHER Other property type

Ownership Types

Value Description
SELF_OWNED Self-owned property (selveier)
LEASED_SITE Property on leased land (festet tomt)
HOUSING_COOPERATIVE Housing cooperative unit (borettslag)
SHARE_HOUSING Share-based housing (aksjeleilighet)

Rental Status Values

Value Description
NOT_RENTED Not rented out
PARTIALLY_RENTED Partially rented
FULLY_RENTED Fully rented

Error Responses

Status Code Description
400 Invalid request (e.g., missing required fields)
403 Forbidden (no access to client account)
404 Asset not found

Business Rules

  1. Assets are associated with a specific client account
  2. Users must have access to the client account to manage its assets
  3. The client_account_id cannot be changed after asset creation
  4. Each asset is automatically assigned a unique sequence number
  5. Creation and update timestamps and user IDs are automatically tracked
  6. Only real-estate asset classes (BUILDINGS_AND_STRUCTURES, AGRICULTURAL_BUILDINGS, COMMERCIAL_BUILDINGS, LAND, INVESTMENT_PROPERTY) can be linked to Skatteetaten properties
  7. When a property is attached from Skatteetaten, inferred values (building type, ownership type, etc.) are only written into empty fields — user-set values are preserved across re-syncs
  8. Property valuation results are fetched live from Skatteetaten and are never stored

Common Use Cases

  1. Creating an inventory of company assets
  2. Tracking office equipment and furniture
  3. Managing vehicle fleet assets
  4. Recording property and real estate holdings
  5. Linking real-estate assets to Skatteetaten for wealth tax reporting
  6. Computing property valuations for annual tax returns

Best Practices

  1. Use clear and descriptive names for assets
  2. Maintain consistent naming conventions
  3. Regularly review and update asset information
  4. Use the sequence_number for internal reference
  5. After attaching a property, review and refine auto-populated fields (building type, area, etc.) via PATCH before computing valuations