Keep stock in sync
This guide keeps a store's stock in step with another system, such as a warehouse, an ERP or a second shop's point of sale.
Nepzio counts stock as the store sells, online and in the shop. Decide which system holds the true count:
- The other system holds it: push counts into Nepzio with
POST /v1/inventory/set. - Nepzio holds it: read Nepzio's counts with
GET /v1/inventoryand theinventory.updatedwebhook.
Pushing counts into Nepzio
Needs a key with write_inventory. Name each variant by its SKU (or variant_id).
To make the count exactly what the other system says (after a stock count, say):
curl https://api.nepzio.com/v1/inventory/set \
-H "Authorization: Bearer $NEPZIO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3c9f..." \
-d '{"sku": "PSH-RED", "stock": 42, "reason": "Warehouse count"}'
To add or take away (stock received, items damaged):
curl https://api.nepzio.com/v1/inventory/adjust \
-H "Authorization: Bearer $NEPZIO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8a21..." \
-d '{"sku": "PSH-RED", "delta": 10, "reason": "Received from supplier"}'
- No lost sales: both work out the change at the moment it is saved, under a lock, so a sale made at the same moment isn't lost.
- Never below zero: a change that would take stock below zero is refused with
insufficient_stock. - On the record: each change appears in the store's stock history with your reason, credited to your key.
- Safe to retry: send an Idempotency-Key with each change.
Reading Nepzio's counts
Needs read_inventory. Each variant has one stock level:
{
"object": "inventory_level",
"variant_id": "...",
"product_id": "...",
"sku": "PSH-RED",
"tracked": true,
"stock": 42,
"reserved": 3,
"available": 39,
"updated_at": "2026-11-10T08:15:00Z"
}
stock: units on hand.reserved: units held by orders not yet shipped.available: what can be sold now (stock less reserved). It isnullfor a variant whose quantity isn't tracked, meaning there is no limit.
Fetch only some variants with ?sku=PSH-RED,PSH-BLUE (up to 100), or what changed with ?updated_at_min=.... Listen for inventory.updated to hear about changes as they happen. Several changes within a few seconds arrive as one event.