Products & Product Bundles
This section covers the Products API for managing your product and service catalog, and the Product Bundles API for grouping products into pre-configured packages.
Products
Products represent items or services that can be added as line items to invoices. Managing them via API lets you keep your catalog in sync with external systems.
Product Endpoints
All product endpoints require
apiKeyAuth.
| Endpoint | Method | Description |
|---|---|---|
GET /products | GET | Paginated list of all products. Supports filtering and sorting. |
GET /product/{id} | GET | Get a single product by its ID. |
POST /product | POST | Create a new product. |
PATCH /product/{id} | PATCH | Update an existing product (partial update). |
DELETE /product/{id} | DELETE | Delete a product. Returns { "succeed": true }. |
GET /product/valid-code | GET | Check whether a product code is unique. Returns { "succeed": true/false }. |
Query Parameters for GET /products
| Parameter | Type | Description |
|---|---|---|
page | number | Page number (1-based). |
perPage | number | Results per page. |
sort | string | Field to sort by: code, name, unit, tax, price, cost, inventoryCount, createdAt, description, buyerAssignedID. |
order | string | Sort direction: asc or desc. |
keyword | string | Search term matched against name, code, and description. |
code | string | Filter by exact product code. |
Product Fields
| Field | Type | Required | Description |
|---|---|---|---|
name | string | ✓ | Product name (no emoji). |
unit | string | ✓ | Unit of measure (e.g., H87 for piece, HUR for hour). |
tax | number | ✓ | VAT rate in percent (e.g., 19, 7, 0). |
code | string | Internal product code or SKU. | |
description | string | Product description (no emoji). | |
price | number | Selling price (net). | |
cost | number | Purchase cost. | |
inventoryCount | number | Current stock count. | |
time | number | Estimated time in hours. | |
estimate | number | Estimated value. | |
buyerAssignedID | string | Buyer-side product identifier (BT-156 in EN 16931). | |
globalID | object | Global product identifier: { "id": "...", "schemeId": "..." }. schemeId must be an ISO/IEC 6523 code. | |
additionalReferencedDocument | object | Additional referenced document. |
Example: Create a product
curl -X POST \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"name": "Web Development Services",
"unit": "HUR",
"tax": 19,
"price": 120.00,
"code": "WEB-DEV-001",
"description": "Hourly rate for web development"
}' \
https://api.faktoora.com/api/v1/product
Response (200 OK) — the created product object including its id.
Example: List products with filtering
curl -G -H "X-API-KEY: your-api-token" \
--data-urlencode "keyword=development" \
--data-urlencode "page=1" \
--data-urlencode "perPage=20" \
--data-urlencode "sort=name" \
--data-urlencode "order=asc" \
https://api.faktoora.com/api/v1/products
Example: Validate a product code
curl -G -H "X-API-KEY: your-api-token" \
--data-urlencode "value=WEB-DEV-001" \
https://api.faktoora.com/api/v1/product/valid-code
Response (200 OK)
{ "succeed": false }
succeed: false means the code is already in use. succeed: true means the code is available.
Example: Update a product
curl -X PATCH \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"price": 130.00
}' \
https://api.faktoora.com/api/v1/product/prod_abc123
Example: Delete a product
curl -X DELETE \
-H "X-API-KEY: your-api-token" \
https://api.faktoora.com/api/v1/product/prod_abc123
Response (200 OK)
{ "succeed": true }
Product Bundles
Product bundles group multiple products into a single package that can be added to invoices in one step. This feature is subscription-gated — it requires the PRODUCT_BUNDLE feature to be enabled on your account.
Feature requirement: All product bundle endpoints return
403 Forbiddenif thePRODUCT_BUNDLEfeature is not enabled on your subscription.
Product Bundle Endpoints
All product bundle endpoints require
apiKeyAuth.
| Endpoint | Method | Description |
|---|---|---|
GET /productbundles | GET | Paginated list of all product bundles. |
GET /productbundle/{id} | GET | Get a single product bundle by its ID. |
POST /productbundle | POST | Create a new product bundle. |
PATCH /productbundle/{id} | PATCH | Update an existing product bundle (partial update). |
DELETE /productbundle/{id} | DELETE | Delete a product bundle. Returns { "succeed": true }. |
Example: List product bundles
curl -G -H "X-API-KEY: your-api-token" \
--data-urlencode "page=1" \
--data-urlencode "perPage=20" \
https://api.faktoora.com/api/v1/productbundles
Example: Delete a product bundle
curl -X DELETE \
-H "X-API-KEY: your-api-token" \
https://api.faktoora.com/api/v1/productbundle/bundle_xyz789
Response (200 OK)
{ "succeed": true }