COUNTCOUNT
Sign Up
Products & ServicesCreate product

Create product

POST/partners/products

Creates 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 request

Request body

namestringrequired

Product or service name.

codestring

Optional SKU or item code.

descriptionstring

Longer description.

unitPricenumber

Default sell price.

purchasePricenumber

Default purchase/cost price.

currencystring

ISO 4217 currency. Defaults to workspace currency.

statusenum

Product status.

One of: active, inactive

pricingMethodenum

Pricing basis.

One of: hour, item

hiddenboolean

Hide from default product pickers.

stockAdjustmentinteger

Initial stock quantity when enabling inventory.

timeEntryTaskboolean

Expose as a time-entry task.

categoryAccountUuiduuid

Income category account UUID from chart of accounts.

purchaseCategoryAccountUuiduuid

Purchase/expense category account UUID.

taxUuidsarray

Array of tax UUIDs to attach.

notesstring

Internal notes.

Responses

201Product created successfully.
400Validation failed or unknown account/tax UUID.
401Missing or invalid HMAC signature, expired timestamp, or invalid Bearer token. Troubleshoot
403The credential does not have access to this workspace or resource. Troubleshoot
429Rate limit exceeded (100 requests per minute per clientId). Retry after the Retry-After header. Troubleshoot
POSThttps://api.getcount.com/partners/products
Request
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"
    }
  }
}