Items
Items represent products and services that can be used as line items in invoices and other commercial documents. The items API allows you to manage a catalog of reusable items, group them into collections (templates, carts, orders), and look up standard measurement units.
Item Endpoints
List Items
GET /api/v2/items
Retrieves a paginated list of items.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | Filter items by client account |
| item_type | string | No | Filter by type: ITEM or SERVICE |
| is_active | boolean | No | Filter by active status (default: true). Pass null to include all |
| free_text | string | No | Full-text search across item number and description |
| order_by | string | No | Sort order (e.g., description, -created_at) |
| 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: sales_unit, stock_unit, tax_code) |
Response
{
"data": [
{
"id": 1,
"client_account_id": 7,
"item_no": "PROD-001",
"name": "Web Development Service",
"item_type": "SERVICE",
"sales_unit_id": 5,
"stock_unit_id": null,
"tax_code_id": 3,
"price": "1500.000000",
"metadata": null,
"is_active": true
}
],
"meta": {
"page": 1,
"pages": 1,
"per_page": 50,
"records": 1
}
}
Get Item
GET /api/v2/items/{id}
Retrieves a specific item by ID.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| with | string | No | Include related resources (supported: sales_unit, stock_unit, tax_code) |
Response
{
"id": 1,
"client_account_id": 7,
"item_no": "PROD-001",
"name": "Web Development Service",
"item_type": "SERVICE",
"sales_unit_id": 5,
"stock_unit_id": null,
"tax_code_id": 3,
"price": "1500.000000",
"metadata": null,
"is_active": true
}
Create Item
POST /api/v2/items
Creates a new item.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | The client account ID |
| item_no | string | Yes | Unique item number/code (max 100 characters) |
| name | string | No | Description of the item (max 250 characters) |
| item_type | string | No | Item type: ITEM (physical product) or SERVICE |
| sales_unit_id | integer | Yes | Unit of measure for sales (see Units) |
| stock_unit_id | integer | No | Unit of measure for inventory tracking |
| tax_code_id | integer | Yes | Tax/VAT code to apply |
| price | decimal | No | Default unit price |
| metadata | object | No | Arbitrary JSON metadata |
Example Request
{
"client_account_id": 7,
"item_no": "PROD-001",
"name": "Web Development Service",
"item_type": "SERVICE",
"sales_unit_id": 5,
"tax_code_id": 3,
"price": "1500"
}
Response
Returns the created item with status 201 Created.
Update Item
PUT /api/v2/items/{id}
Updates an existing item. The client_account_id cannot be changed after creation.
Request Body
Same fields as Create Item, except client_account_id is immutable.
Response
Returns the updated item with status 200 OK.
Deactivate Item
DELETE /api/v2/items/{id}
Deactivates an item by setting its is_active status to false. The item record is preserved for historical purposes.
Response
Returns the deactivated item with is_active: false and status 200 OK.
Item Collection Endpoints
Item collections group items into reusable sets such as invoice templates, shopping carts, or orders.
List Item Collections
GET /api/v2/item-collections
Retrieves a paginated list of item collections.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | Filter by client account |
| collection_type | string | No | Filter by type: TEMPLATE, CART, or ORDER (comma-separated for multiple) |
| name | string | No | Filter by collection name |
| page | integer | No | Page number (default: 1) |
| per_page | integer | No | Items per page (default: 100, max: 100) |
Response
{
"data": [
{
"id": 10,
"client_account_id": 7,
"name": "Monthly Retainer",
"collection_type": "TEMPLATE"
}
],
"meta": {
"page": 1,
"pages": 1,
"per_page": 100,
"records": 1
}
}
Get Item Collection
GET /api/v2/item-collections/{id}
Retrieves a specific item collection by ID. Entries are included by default.
Response
{
"id": 10,
"client_account_id": 7,
"name": "Monthly Retainer",
"collection_type": "TEMPLATE",
"entries": [
{
"id": 100,
"item_collection_id": 10,
"item_id": 1,
"description": "Web Development Service",
"quantity": "10.000000",
"price": "1500.000000",
"currency_code": "NOK",
"unit_id": 5,
"tax_code_id": 3,
"business_partner_id": null,
"project_id": null,
"recurring_start_date": null,
"recurring_end_date": null,
"recurring_terms": null,
"recurring_interval": null,
"refund_policy": null,
"trial_end_date": null,
"created_at": "2024-03-15T10:00:00Z",
"created_by_id": 7,
"updated_at": null,
"updated_by_id": null
}
]
}
Create Item Collection
POST /api/v2/item-collections
Creates a new item collection.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| client_account_id | integer | Yes | The client account ID |
| name | string | No | Name for the collection (max 150 characters) |
| collection_type | string | Yes | Type: TEMPLATE, CART, or ORDER |
Example Request
{
"client_account_id": 7,
"name": "Monthly Retainer",
"collection_type": "TEMPLATE"
}
Response
Returns the created collection with status 201 Created.
List Collection Entries
GET /api/v2/item-collections/{id}/entries
Retrieves entries within a collection with optional filtering.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| item_id | string | No | Filter by item IDs (comma-separated) |
| project_id | string | No | Filter by project IDs (comma-separated) |
| include_used | boolean | No | Include entries already used in documents |
| order_by | string | No | Sort order |
| page | integer | No | Page number (default: 1) |
| per_page | integer | No | Items per page (default: 100, max: 100) |
Add Collection Entry
POST /api/v2/item-collections/{id}/entries
Adds a line item to a collection.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
| item_id | integer | No | Reference to an item from the catalog |
| description | string | No | Line description (max 1000 characters) |
| quantity | decimal | Yes | Quantity |
| price | decimal | Yes | Unit price |
| currency_code | string | No | ISO 4217 currency code (e.g., NOK) |
| unit_id | integer | Yes | Unit of measure |
| tax_code_id | integer | Yes | Tax code |
| business_partner_id | integer | No | Associated customer/supplier |
| project_id | integer | No | Associated project |
| recurring_start_date | date | No | Start date for recurring invoicing |
| recurring_end_date | date | No | End date for recurring invoicing |
| recurring_terms | string | No | IN_ADVANCE or IN_ARREARS |
| recurring_interval | integer | No | Interval: MONTHLY, QUARTERLY, HALF_YEARLY, YEARLY |
| refund_policy | string | No | NO_REFUND, PRORATED, or FULL_REFUND |
| trial_end_date | date | No | End of trial period |
Response
Returns the created entry with status 201 Created.
Update Collection Entry
PUT /api/v2/item-collections/{id}/entries/{entry_id}
Updates an existing entry. The item_collection_id cannot be changed.
Response
Returns the updated entry with status 202 Accepted.
Delete Collection Entry
DELETE /api/v2/item-collections/{id}/entries/{entry_id}
Permanently deletes an entry from the collection.
Response
Returns the deleted entry with status 200 OK.
Note: The backend currently returns
201 Createdfor this endpoint, which is a known quirk. This documentation uses200 OKas the semantically correct status for a DELETE operation.
Unit Endpoints
Units represent standard measurement units (e.g., hours, pieces, kilograms) following the UN/ECE Recommendation 20/21 codes.
List Units
GET /api/v2/units
Retrieves all available units of measure.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| order_by | string | No | Sort order |
| page | integer | No | Page number (default: 1) |
| per_page | integer | No | Items per page (default: 100) |
Response
{
"data": [
{
"id": 1,
"symbol": "stk",
"un_ece_rec_20_code": "C62",
"un_ece_rec_21_code": null,
"description": "One (piece)"
},
{
"id": 5,
"symbol": "timer",
"un_ece_rec_20_code": "HUR",
"un_ece_rec_21_code": null,
"description": "Hours"
}
],
"meta": {
"page": 1,
"pages": 1,
"per_page": 100,
"records": 2
}
}
Get Unit
GET /api/v2/units/{id}
Retrieves a specific unit by ID.
Response
{
"id": 5,
"symbol": "timer",
"un_ece_rec_20_code": "HUR",
"un_ece_rec_21_code": null,
"description": "Hours"
}
Item Types
| Value | Description |
|---|---|
| ITEM | Physical product or good |
| SERVICE | Service or labor |
Collection Types
| Value | Description |
|---|---|
| TEMPLATE | Reusable line item template for recurring invoices |
| CART | Shopping cart or draft selection |
| ORDER | Confirmed order |
Error Responses
| Status Code | Description |
|---|---|
| 400 | Invalid request (missing required fields, cannot change client_account_id) |
| 403 | Forbidden (no access to client account) |
| 404 | Item or collection not found |
Business Rules
- Items are scoped to a specific client account
- Users must have access to the client account to manage its items
- The
client_account_idcannot be changed after item creation - Deleting an item deactivates it rather than removing it, preserving historical data
- Item collections use cascade deletion: removing a collection also removes all its entries
- Units are system-wide and read-only
Common Use Cases
- Product catalog - Maintain a list of products and services with default pricing
- Invoice templates - Create reusable collections of line items for recurring invoices
- Recurring billing - Set up collection entries with recurring schedules and terms
- Multi-currency pricing - Specify currency codes on collection entries for international invoicing