ClearITCountAPI key settings →
← Back to integrations

DEVELOPER REFERENCE · V1

Connect inventory to the systems your business uses.

The Inventory API gives a connected POS, ecommerce store, accounting tool, or custom application a scoped way to work with one business’s catalog and stock. Inventory remains the system of record.

Developer previewAPI keys are limited to 120 requests per fixed minute by default (configurable); throttled requests return 429 with Retry-After. Targeted tenant and role integration checks pass locally; the full permission matrix, external edge protection, and support policy remain launch work. Avoid production use.

Authentication

A business owner creates and revokes API keys at Integrations. Keys are business-scoped, stored as SHA-256 hashes, expire after a selected period, and are shown in full only once. Keep the token in a server-side secret store and send it over HTTPS:

Authorization: Bearer inv_live_<one-time-token>

Never put keys in a URL, browser bundle, or source control. A key is disabled when it expires, is revoked, or its creating membership becomes inactive. Invalid keys return 401; a missing permission returns 403.

Permissions

catalog:readRead products, on-hand balances, active locations, and configured fields.
reports:readRead stock alerts, movement activity, stock aging, reports, and aggregate inventory valuation.
catalog:writeCreate or edit products, locations, fields, and reorder thresholds.
stock:writeRecord receipts, reductions, and location transfers.

Grant only the permissions the connection needs. catalog:read does not expose unit costs; reports:read permits aggregate inventory valuation by location.

Endpoints

MethodPathPermissionPurpose
GET/api/v1/capabilitiescatalog:read + stock:writeVerify permissions required for POS stock sync.
PATCH/api/v1/products/{productId}catalog:writeArchive or restore a product.
POST/api/v1/catalog/attributescatalog:writeAdd a configurable product field.
PATCH/api/v1/catalog/attributes/{attributeId}catalog:writeRename, archive, or restore a field.
DELETE/api/v1/catalog/attributes/{attributeId}catalog:writeArchive a field while retaining saved values.
PUT/api/v1/products/{productId}/reorder-pointcatalog:writeSet a product reorder threshold by location.
POST/api/v1/importscatalog:writePreview and apply a catalog and stock import.
GET/api/v1/countsreports:readList recent physical stock counts by location.
POST/api/v1/countsstock:writeStart a physical stock count.
PATCH/api/v1/counts/{countId}stock:writeSave counted quantities as a draft.
PUT/api/v1/counts/{countId}stock:writeApply a count with guarded stock adjustments.
GET/api/v1/productscatalog:readSearch and page through active products, units, balances, and reorder points.
POST/api/v1/productscatalog:writeCreate a product and initialize its location balances.
PUT/api/v1/products/{productId}catalog:writeUpdate product details and configured attributes.
GET/api/v1/products/{productId}/unitscatalog:readRead active alternate units and base-unit conversion factors.
PUT/api/v1/products/{productId}/unitscatalog:writeConfigure up to 20 alternate units for a product.
GET/api/v1/locationscatalog:readList active stock locations.
POST/api/v1/locationscatalog:writeCreate a location.
PATCH/api/v1/locations/{locationId}catalog:writeRename, restore, or deactivate an empty location.
GET/api/v1/catalog/attributescatalog:readRead configured business-specific fields.
GET/api/v1/stock-reservations/{reservationId}stock:writeReconcile reservation actions and confirm linked stock movements.
POST/api/v1/products/{productId}/movementsstock:writeReceive or reduce stock with an idempotency key.
POST/api/v1/importscatalog:writePreview or apply CSV imports; quantities can use configured alternate units.
POST/api/v1/transfersstock:writeTransfer stock between locations atomically, with optional alternate-unit conversion.
GET/api/v1/alertsreports:readList current out-of-stock and reorder-point alerts.
GET/api/v1/reports/movementsreports:readRead movement totals and recent activity for a location.
GET/api/v1/reports/agingreports:readList positive stock by time since its last recorded movement (up to 500 rows).
GET/api/v1/reports/valuation?locationId={locationId}reports:readRead aggregate on-hand cost valuation and missing-cost counts for a location.

Pagination and stock units

GET /api/v1/products returns pages of up to 200 active products. Continue with meta.nextCursor while meta.hasMore is true; the first response also includes meta.totalCount. Search uses the q parameter across product name, SKU, and barcode.

Each balance includes its location and unit of measure. Keep different units separate; do not total boxes, kilograms, meters, or other unlike units together.

Start with a configurable catalog item

Define business-specific fields once, then attach their values to products. The same catalog supports goods, parts, materials, and supplies; category names and units are data configured for each business.

For example, add a text field for a shelf location:

curl --request POST "$INVENTORY_API_URL/api/v1/catalog/attributes" \
  --header "Authorization: Bearer $INVENTORY_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{"label":"Shelf","dataType":"TEXT"}'

Then create an item with its own SKU, unit, reorder point, and configured field value:

curl --request POST "$INVENTORY_API_URL/api/v1/products" \
  --header "Authorization: Bearer $INVENTORY_API_KEY" \
  --header "Content-Type: application/json" \
  --data '{"name":"Steel fastener","sku":"HW-028","categoryName":"Hardware","unitOfMeasure":"box","reorderPoint":5,"customAttributes":{"shelf":"A-12"}}'

The product starts with a zero balance at each active location. Record its opening quantity with a stock receipt and an idempotency key, or use the CSV import preview for an existing catalog.

Reliable stock changes

Stock movement requests require a positive decimal quantity, location, compatible reason, and UUID idempotencyKey. Retry uncertain requests with the same key and exact same request body. Reusing a key for a different change or reducing stock below zero returns 409.

Product alternate units convert into the product base unit. Configure them at /api/v1/products/{productId}/units, then pass the selected unitId when recording a stock movement. Balances stay in the base unit, and each movement stores the entered quantity, unit, and conversion factor used. Existing requests without a unitId continue to use the base unit.

Location transfers also accept an optional alternate unit and record paired base-unit movements atomically. API changes use the same tenant checks and audit history as workspace activity.

Inventory valuation

GET /api/v1/reports/valuation?locationId=<id> requires reports:read and returns the estimated value of positive on-hand stock, the configured business currency, and counts of valued and missing-cost items. It does not expose per-product unit costs. Workspace sessions must belong to an owner, admin, or manager to read valuation.

Location time zones

Locations include an IANA time zone, such as America/Chicago. Create requests may provide one; the API defaults to UTC when omitted. Authorized users can update it later. Movement-report daily totals follow that location time zone.

Response format

Successful responses use { "success": true, "data": ... }. Errors use { "success": false, "error": "..." }. Organization scope comes from the session or API key; clients cannot choose another business by sending an organization ID.

Movement reports accept locationId, days from 1 to 365, and an optional cursor. Each page contains up to 50 movement details; pass meta.nextCursor unchanged to load older activity. The full-period count, unit totals, and location-timezone daily chart totals are included with every page.

Compatibility and limits

API keys are limited to 120 requests per fixed minute by default. Configure `INVENTORY_API_REQUESTS_PER_MINUTE` to set a positive limit up to 100000; throttled responses return `429` and `Retry-After`. No availability guarantee is published. Targeted tenant-isolation and selected role/session checks pass locally. A full permission matrix, support and deprecation policy, and external edge protection remain before production integrations.

For the current request schemas and additional operations, see the repository’s docs/API.md.