Table of Contents

Inventory

/api/integration/inventory — domain: Inventory

PUT /

Purpose. Push stock positions per SKU: what is on hand at each location, what is on its way, and which reservations the upstream system now considers settled.

Domain. Inventory, which owns stock levels and the reservations held against them during checkout.

Request

IntegrationEnvelope<InventoryEnvelopeDto>.

{
  "source": "BC",
  "timestamp": "2026-08-19T04:00:00Z",
  "data": [
    {
      "sku": "SHIRT-BLK-M",
      "stockOnHand": [
        {
          "locationCode": "SYD",
          "quantity": 260
        },
        {
          "locationCode": "MEL",
          "quantity": 152
        }
      ],
      "incomingStock": [
        {
          "locationCode": "SYD",
          "externalReference": "PO-77321",
          "expectedDate": "2026-09-14",
          "quantity": 500
        }
      ],
      "reservationIdentifiers": [
        "ORD-0000123"
      ]
    }
  ]
}
Field Type Required Description
sku string Yes The natural key. Must match a SKU sent to Catalogue
stockOnHand[] array Current physical stock, one entry per location
incomingStock[] array Expected deliveries, one entry per delivery
reservationIdentifiers[] array of string Reservations the upstream system has now absorbed — see below

stockOnHand[]

Field Type Required Description
locationCode string Yes Warehouse or location identifier
quantity int Yes Units available at that location. Whole units only

incomingStock[]

Field Type Required Description
locationCode string Yes Where the delivery is expected
externalReference string Yes The upstream reference for the delivery, typically a purchase order. Part of the key
expectedDate date Yes When it is expected to arrive. Date only, no time
quantity int Yes Units expected. Whole units only

Both child collections are snapshots. Send the complete set for the SKU. A location present in Commerce but absent from the payload is removed — including a location dropping to zero, which should be sent as an explicit zero or omitted deliberately, not left to chance.

incomingStock is keyed on locationCode plus externalReference, so two expected deliveries into the same warehouse are distinct rows.

What reservationIdentifiers is for

While a customer is checking out, Commerce reserves stock so two buyers cannot take the last unit. Once the upstream system has the order and its own stock reflects it, the reservation is redundant — listing its identifier here releases it.

Omitting the field leaves existing reservations untouched, which is the safe default.

Response

One entry per SKU, keyed by sku.

{
  "data": [
    { "key": "SHIRT-BLK-M", "outcome": "Upserted" }
  ]
}