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 buildingsutleieverdi— 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, andutleieverdiare 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
- Assets are associated with a specific client account
- Users must have access to the client account to manage its assets
- The client_account_id cannot be changed after asset creation
- Each asset is automatically assigned a unique sequence number
- Creation and update timestamps and user IDs are automatically tracked
- Only real-estate asset classes (
BUILDINGS_AND_STRUCTURES,AGRICULTURAL_BUILDINGS,COMMERCIAL_BUILDINGS,LAND,INVESTMENT_PROPERTY) can be linked to Skatteetaten properties - 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
- Property valuation results are fetched live from Skatteetaten and are never stored
Common Use Cases
- Creating an inventory of company assets
- Tracking office equipment and furniture
- Managing vehicle fleet assets
- Recording property and real estate holdings
- Linking real-estate assets to Skatteetaten for wealth tax reporting
- Computing property valuations for annual tax returns
Best Practices
- Use clear and descriptive names for assets
- Maintain consistent naming conventions
- Regularly review and update asset information
- Use the sequence_number for internal reference
- After attaching a property, review and refine auto-populated fields (building type, area, etc.) via PATCH before computing valuations