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.
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
| Method | Path | Permission | Purpose |
|---|---|---|---|
GET | /api/v1/capabilities | catalog:read + stock:write | Verify permissions required for POS stock sync. |
PATCH | /api/v1/products/{productId} | catalog:write | Archive or restore a product. |
POST | /api/v1/catalog/attributes | catalog:write | Add a configurable product field. |
PATCH | /api/v1/catalog/attributes/{attributeId} | catalog:write | Rename, archive, or restore a field. |
DELETE | /api/v1/catalog/attributes/{attributeId} | catalog:write | Archive a field while retaining saved values. |
PUT | /api/v1/products/{productId}/reorder-point | catalog:write | Set a product reorder threshold by location. |
POST | /api/v1/imports | catalog:write | Preview and apply a catalog and stock import. |
GET | /api/v1/counts | reports:read | List recent physical stock counts by location. |
POST | /api/v1/counts | stock:write | Start a physical stock count. |
PATCH | /api/v1/counts/{countId} | stock:write | Save counted quantities as a draft. |
PUT | /api/v1/counts/{countId} | stock:write | Apply a count with guarded stock adjustments. |
GET | /api/v1/products | catalog:read | Search and page through active products, units, balances, and reorder points. |
POST | /api/v1/products | catalog:write | Create a product and initialize its location balances. |
PUT | /api/v1/products/{productId} | catalog:write | Update product details and configured attributes. |
GET | /api/v1/products/{productId}/units | catalog:read | Read active alternate units and base-unit conversion factors. |
PUT | /api/v1/products/{productId}/units | catalog:write | Configure up to 20 alternate units for a product. |
GET | /api/v1/locations | catalog:read | List active stock locations. |
POST | /api/v1/locations | catalog:write | Create a location. |
PATCH | /api/v1/locations/{locationId} | catalog:write | Rename, restore, or deactivate an empty location. |
GET | /api/v1/catalog/attributes | catalog:read | Read configured business-specific fields. |
GET | /api/v1/stock-reservations/{reservationId} | stock:write | Reconcile reservation actions and confirm linked stock movements. |
POST | /api/v1/products/{productId}/movements | stock:write | Receive or reduce stock with an idempotency key. |
POST | /api/v1/imports | catalog:write | Preview or apply CSV imports; quantities can use configured alternate units. |
POST | /api/v1/transfers | stock:write | Transfer stock between locations atomically, with optional alternate-unit conversion. |
GET | /api/v1/alerts | reports:read | List current out-of-stock and reorder-point alerts. |
GET | /api/v1/reports/movements | reports:read | Read movement totals and recent activity for a location. |
GET | /api/v1/reports/aging | reports:read | List positive stock by time since its last recorded movement (up to 500 rows). |
GET | /api/v1/reports/valuation?locationId={locationId} | reports:read | Read 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.