Sync stock and prices in bulk

Push quantity and price changes for up to 100 SKUs per call, and read per-item outcomes.

For recurring syncs from an ERP or warehouse, POST /inventory/batch is the endpoint to build on: it addresses variants by SKU, so you don't need to store Nembol ids at all.

curl -X POST https://api.nembol.com/rest/v1/inventory/batch \
  -H "Authorization: Bearer $NEMBOL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: stock-sync-2026-07-30T22:00" \
  -d '{"items": [
    {"sku": "VDJ-M-001", "quantity": 12},
    {"sku": "VDJ-L-001", "quantity": 0, "price": "44.90"}
  ]}'

The local write is immediate; channel propagation is asynchronous. The response is an operation — per-item results land in results[], and items that can't be matched come back in rejected_items with a reason (sku_not_found, sku_ambiguous) without failing the rest.

Full catalog upserts

To create-or-update whole products (content included), use POST /products/batch — same per-SKU matching, up to 100 items, per-item outcomes, status: "partial" when only some fail. Unmatched SKUs are created (title required), matched ones are updated.

Gotchas

  • One Idempotency-Key per batch run. Retrying a timed-out batch with the same key replays the stored outcome instead of double-applying it.
  • Batch updates don't take images. A matched item with images[] fails (per-item) — update images with PATCH /products/{id} instead.
  • quantity: 0 is a real value — it sold-outs the variant everywhere.
  • Watch operation.completed instead of polling if you sync frequently.
  • Prices are strings ("44.90"), always in the store's base currency.
  • A channel can show "out of stock" with stock on hand: sellers can set a per-channel stock buffer (inventory on GET /channel_accounts) — below the threshold the channel lists the product as unavailable on purpose.

Last updated on July 30, 2026

Need help?

The API is in private beta — email us and a human replies, usually within one business day.

On this page