Search inventory levels

Operation ID: searchInventoryLevels

Group: Inventory › Inventory Levels

Open in the interactive reference

POST /inventory/inventory-levels/search

Read-only: A read that takes its filters in the body. Changes nothing, and ignores Idempotency-Key.

Searches inventory levels. The fields are the same as on GET inventory/inventory-levels/:id and the collection GET inventory/inventory-levels.

Parameters

Name In Type Required Description
Api-Version header string · v1 yes The API version this request targets, named by its public identifier. Required on every request; omitting it, or naming a version this company does not have, is answered with 400. This document describes version v1.

Request body

Required, application/json: searchInventoryLevelsInput.

Field Type Required Description
filters object yes The filters to apply. A level must match every filter you send. Omit to return all inventory levels. Example: {"itemId":"5f21c8b0-9d34-4a76-8e12-04b93c7de5a8"}.
filters.itemId string no Limits results to levels for the item with this identifier. An identifier that matches no item returns an empty page. See id on GET inventory/items/:id.
filters.locationId string no Limits results to levels at the location with this identifier. Combine with itemId to identify at most one level. An identifier that matches no location returns an empty page. See id on GET inventory/warehouses/:id.
filters.modifiedSince date-time no Limits results to levels with lastModifiedDate at or after this time, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ.
page object no Pagination controls. Omit for the first page. Example: {"size":50}.
page.cursor string no The cursor from the previous response's pagination.nextCursor. Omit on the first request.
page.size number no The maximum number of inventory levels to return. Defaults to 50. A value above 200 is treated as 200, not rejected.
{
  "filters": {
    "itemId": "5f21c8b0-9d34-4a76-8e12-04b93c7de5a8"
  },
  "page": {
    "size": 50
  }
}

Response

200 Success

Under data (searchInventoryLevelsOutput):

Field Type Required Description
items array<object> yes The inventory levels that match, ordered by id. An empty array when nothing matches. Example: [{"id":"0b6d4c93-71ea-4f28-9c05-83a1e7f6204d","itemId":"5f21c8b0-9d34-4a76-8e12-04b93c7de5a8","itemCode":"WIDGET-01","itemName":"Standard widget","locationId":"e1d84c07-5b39-4a26-9f70-2c8b613ad495","locationCode":"WH-01","locationName":"Rotterdam Distribution Centre","onHandQuantity":"1200.00","availableQuantity":"1150.00","allocatedQuantity":"50.00","averageCost":"3.75","onHandValue":"4500.00","currency":"EUR","lastTransactionTimestamp":"2026-08-03T11:15:00","lastModifiedDate":"2026-08-03T11:15:00.000Z"}].
items[].id string yes The unique identifier for the inventory level.
items[].itemId string yes The unique identifier for the item this level is for. See id on GET inventory/items/:id.
items[].itemCode string no The item's short code.
items[].itemName string no The item's name.
items[].locationId string yes The unique identifier for the location this level is at. See id on GET inventory/warehouses/:id.
items[].locationCode string no The location's short code.
items[].locationName string no The location's name.
items[].onHandQuantity decimal no The total physical quantity on hand at this location, in the item's stocking unit of measure.
items[].availableQuantity decimal yes The quantity free to allocate: onHandQuantity minus allocatedQuantity and reservedQuantity.
items[].allocatedQuantity decimal no The quantity allocated to outbound demand.
items[].reservedQuantity decimal no The quantity reserved.
items[].inTransitQuantity decimal no The quantity in transit to this location.
items[].damagedQuantity decimal no The quantity flagged as damaged.
items[].qualityHoldQuantity decimal no The quantity on quality hold.
items[].averageCost decimal no The moving-average unit cost, in the currency given by currency.
items[].onHandValue decimal no The value of the stock on hand, in the currency given by currency.
items[].currency string no The currency of averageCost and onHandValue. Format ISO 4217, for example 'EUR'. Absent when the level has no valuation yet.
items[].lastTransactionTimestamp date-time no The date and time a stock movement last touched this level. Format YYYY-MM-DDTHH:mm:ss. Unlike lastModifiedDate, it changes only when stock moves.
items[].lastModifiedDate date-time no The date and time the inventory-level record last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ.
pagination object yes The pagination cursor for this page. Example: {"hasMore":false}.
pagination.nextCursor string no The cursor for the next page. Pass it as page.cursor. Absent on the last page.
pagination.hasMore boolean yes True when more matches remain beyond this page.
{
  "data": {
    "items": [
      {
        "id": "0b6d4c93-71ea-4f28-9c05-83a1e7f6204d",
        "itemId": "5f21c8b0-9d34-4a76-8e12-04b93c7de5a8",
        "itemCode": "WIDGET-01",
        "itemName": "Standard widget",
        "locationId": "e1d84c07-5b39-4a26-9f70-2c8b613ad495",
        "locationCode": "WH-01",
        "locationName": "Rotterdam Distribution Centre",
        "onHandQuantity": "1200.00",
        "availableQuantity": "1150.00",
        "allocatedQuantity": "50.00",
        "averageCost": "3.75",
        "onHandValue": "4500.00",
        "currency": "EUR",
        "lastTransactionTimestamp": "2026-08-03T11:15:00",
        "lastModifiedDate": "2026-08-03T11:15:00.000Z"
      }
    ],
    "pagination": {
      "hasMore": false
    }
  },
  "diagnostics": [
    {
      "code": "<code>",
      "message": "<message>",
      "severity": "error",
      "path": [
        "<path>"
      ],
      "details": "<details>"
    }
  ]
}

Statuses