Create product
POST
/partners/productsCreates a new product or service.
Use `categoryAccountUuid` and `purchaseCategoryAccountUuid` for chart-of-accounts references and `taxUuids` for taxes.
HMAC signature + Bearer access token
Try this requestRequest body
namestringrequiredProduct or service name.
codestringOptional SKU or item code.
descriptionstringLonger description.
unitPricenumberDefault sell price.
purchasePricenumberDefault purchase/cost price.
currencystringISO 4217 currency. Defaults to workspace currency.
statusenumProduct status.
One of: active, inactive
pricingMethodenumPricing basis.
One of: hour, item
hiddenbooleanHide from default product pickers.
stockAdjustmentintegerInitial stock quantity when enabling inventory.
timeEntryTaskbooleanExpose as a time-entry task.
categoryAccountUuiduuidIncome category account UUID from chart of accounts.
purchaseCategoryAccountUuiduuidPurchase/expense category account UUID.
taxUuidsarrayArray of tax UUIDs to attach.
notesstringInternal notes.
Responses
201Product created successfully.400Validation failed or unknown account/tax UUID.401Missing or invalid HMAC signature, expired timestamp, or invalid Bearer token. Troubleshoot403The credential does not have access to this workspace or resource. Troubleshoot429Rate limit exceeded (100 requests per minute per clientId). Retry after the Retry-After header. TroubleshootPOST
https://api.getcount.com/partners/productsRequest
import crypto from 'node:crypto';
const BASE_URL = 'https://api.getcount.com';
const CLIENT_ID = process.env.COUNT_CLIENT_ID;
const CLIENT_SECRET = process.env.COUNT_CLIENT_SECRET;
const ACCESS_TOKEN = process.env.COUNT_ACCESS_TOKEN;
const method = 'POST';
const signingPath = '/products';
const timestamp = Math.floor(Date.now() / 1000).toString();
const body = {
"name": "Consulting — hourly",
"code": "SVC-001",
"description": "Consulting services",
"unitPrice": 150,
"currency": "USD",
"pricingMethod": "hour",
"categoryAccountUuid": "c8d9e0f1-a2b3-4567-cdef-789012345678",
"status": "active"
};
const bodyString = JSON.stringify(body);
const bodyHash = crypto.createHash('sha256').update(bodyString).digest('hex');
const baseString = `${method}:${signingPath}:${timestamp}:${bodyHash}`;
const signature = crypto.createHmac('sha256', CLIENT_SECRET).update(baseString).digest('hex');
const response = await fetch(`${BASE_URL}/partners/products`, {
method,
headers: {
'x-client-id': CLIENT_ID,
'x-timestamp': timestamp,
'x-signature': signature,
'Content-Type': 'application/json',
Authorization: `Bearer ${ACCESS_TOKEN}`,
},
body: bodyString,
});
console.log(await response.json());Response · 201
{
"status": "success",
"message": "Success on creating product",
"data": {
"productService": {
"id": "aa11bb22-cc33-dd44-ee55-ff6677889900",
"name": "Consulting — hourly",
"code": "SVC-001",
"description": "Consulting services",
"unitPrice": 150,
"purchasePrice": null,
"total": 150,
"tax": 0,
"currency": "USD",
"status": "active",
"pricingMethod": "hour",
"hidden": false,
"stockQuantity": null,
"timeEntryTask": false,
"categoryAccount": {
"id": "c8d9e0f1-a2b3-4567-cdef-789012345678",
"name": "Professional Services Income",
"type": "Income"
},
"purchaseCategoryAccount": null,
"taxes": [],
"createdAt": "2026-01-15T10:30:00.000Z",
"updatedAt": "2026-01-28T14:22:30.000Z"
}
}
}