Items (products & services)
Invoa API catalogue items: list and search the products and services you sell, and create items with a price in sen, tax type and LHDN code.
Catalogue items — shown as Products & Services in the app — are the products and services you sell, with a default price, tax type and LHDN classification code. Reference an item on a document line with itemId. The line still carries its own description, price and tax type, so changing an item later does not change existing documents.
| Method | Path | Scope |
|---|---|---|
GET | /items | documents:read |
POST | /items | documents:draft |
The item object
json
{
"id": "1e300000-0000-4000-8000-000000000003",
"tenantId": "7e0a0000-0000-4000-8000-000000000001",
"sku": "TOUR-LGK-3D",
"name": "Langkawi corporate retreat, 3 days 2 nights",
"description": "Per person, twin sharing, includes transfers",
"unit": "pax",
"unitPrice": 125000,
"taxType": "SST_SERVICE",
"classificationCode": "022",
"isActive": true,
"createdAt": "2026-10-01T03:00:00.000Z",
"updatedAt": "2026-10-01T03:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
id | string | Item ID (UUID). |
sku | string or null | Your code. Unique within the company when set. |
name | string | Item name. |
description | string or null | Longer description. |
unit | string | Unit label, for example unit, hour, month, pax. |
unitPrice | integer | Default price in sen. 125000 is RM 1,250.00. |
taxType | string | See Tax types. |
classificationCode | string | LHDN e-invoice classification code (3 digits). 022 is "Others". |
isActive | boolean | Inactive items are hidden from lists by default. |
Tax types
| Value | Meaning |
|---|---|
SST_SERVICE | Service tax, 8% (standard rate). |
SST_SERVICE_6 | Service tax, 6% (reduced rate: F&B, telecommunications, parking, logistics, construction, rental and leasing, some private healthcare and education). |
SST_SALES_5 | Sales tax, 5%. |
SST_SALES_10 | Sales tax, 10%. |
EXEMPT | Tax exempt. |
NOT_APPLICABLE | Not SST-registered. |
List items
http
GET /api/v1/itemsReturns active items sorted by name.
| Query parameter | Type | Description |
|---|---|---|
search | string | Matches name, SKU or description. |
includeInactive | boolean | true to include inactive items. |
limit, offset | integer | Default limit 100, maximum 200. See Pagination. |
bash
curl "https://app.invoa.io/api/v1/items?search=langkawi" \
-H "Authorization: Bearer $INVOA_API_KEY"json
{
"data": [
{
"id": "1e300000-0000-4000-8000-000000000003",
"sku": "TOUR-LGK-3D",
"name": "Langkawi corporate retreat, 3 days 2 nights",
"unit": "pax",
"unitPrice": 125000,
"taxType": "SST_SERVICE",
"classificationCode": "022",
"isActive": true
}
],
"pagination": { "total": 1, "limit": 100, "offset": 0, "has_more": false }
}Create an item
http
POST /api/v1/items| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 1 to 200 characters. |
unitPrice | integer | Yes | Price in sen, 0 or more. |
sku | string | No | Up to 60 characters. Must not match another item's SKU in the company. |
description | string | No | Up to 2,000 characters. |
unit | string | No | Up to 20 characters. Default unit. |
taxType | string | No | Default NOT_APPLICABLE. |
classificationCode | string | No | A valid LHDN classification code. Default 022. |
isActive | boolean | No | Default true. |
bash
curl https://app.invoa.io/api/v1/items \
-H "Authorization: Bearer $INVOA_API_KEY" \
-H "content-type: application/json" \
-d '{
"sku": "TOUR-LGK-3D",
"name": "Langkawi corporate retreat, 3 days 2 nights",
"unit": "pax",
"unitPrice": 125000,
"taxType": "SST_SERVICE"
}'Returns 201 Created with { "data": <item object> }.
Errors:
400 validationfor a missing name, a non-integer price or an unknown classification code.409 conflictif another item in the company already has thissku.detailshas theskuand the existing item'sitemId.
There are no endpoints to update or delete items. Manage existing items in the app.
Related
Something unclear or out of date? Tell us at hello@invoa.io and we'll fix the page.