# List inventory levels

Operation ID: `inventoryLevels`

Group: Inventory › Inventory Levels

[Open in the interactive reference](https://docs.api.lensing.ai/lensing/v1/endpoints/inventoryLevels)

`GET /inventory/inventory-levels`

Read-only: Reads and returns; changes nothing.

Lists inventory levels. Each inventory level is the stock of one item at one location, with the id, code, and name of both.

To read the stock of one item at one location, filter on itemId and locationId together. They identify at most one inventory level.

## 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`. |

## Query surface

- `id` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `itemId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `itemCode` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `locationId` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `locationCode` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between, like
- `lastModifiedDate` — filter by eq, ne, gt, gte, lt, lte, in, notIn, between
- Orderable: id, itemCode, locationCode, onHandQuantity, availableQuantity, onHandValue, lastTransactionTimestamp, lastModifiedDate
- Selectable: id, itemId, itemCode, itemName, locationId, locationCode, locationName, onHandQuantity, availableQuantity, allocatedQuantity, reservedQuantity, inTransitQuantity, damagedQuantity, qualityHoldQuantity, averageCost, onHandValue, currency, lastTransactionTimestamp, lastModifiedDate
- `page[size]` — Page size
- `page[cursor]` — Opaque continuation cursor

## Response

`200` Success

Under `data`, an array of inventoryLevelsRow:

| Field | Type | Required | Filter | Sort | Description |
| --- | --- | --- | --- | --- | --- |
| `id` | string | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | yes | The unique identifier for the inventory level. Example: `"0b6d4c93-71ea-4f28-9c05-83a1e7f6204d"`. |
| `itemId` | string | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | no | The unique identifier for the item this level is for. See id on GET inventory/items/:id. Example: `"5f21c8b0-9d34-4a76-8e12-04b93c7de5a8"`. |
| `itemCode` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | yes | The item's short code. Example: `"WIDGET-01"`. |
| `itemName` | string \| null | no | no | no | The item's name. Example: `"Standard widget"`. |
| `locationId` | string | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | no | The unique identifier for the location this level is at. See id on GET inventory/warehouses/:id. Example: `"e1d84c07-5b39-4a26-9f70-2c8b613ad495"`. |
| `locationCode` | string \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`), Pattern (`like`) | yes | The location's short code. Example: `"WH-01"`. |
| `locationName` | string \| null | no | no | no | The location's name. Example: `"Rotterdam Distribution Centre"`. |
| `onHandQuantity` | decimal \| null | no | no | yes | The total physical quantity on hand at this location, in the item's stocking unit of measure. Example: `"1200.00"`. |
| `availableQuantity` | decimal \| null | no | no | yes | The quantity free to allocate: onHandQuantity minus allocatedQuantity and reservedQuantity. Example: `"1150.00"`. |
| `allocatedQuantity` | decimal \| null | no | no | no | The quantity allocated to outbound demand. Example: `"50.00"`. |
| `reservedQuantity` | decimal \| null | no | no | no | The quantity reserved. |
| `inTransitQuantity` | decimal \| null | no | no | no | The quantity in transit to this location. |
| `damagedQuantity` | decimal \| null | no | no | no | The quantity flagged as damaged. |
| `qualityHoldQuantity` | decimal \| null | no | no | no | The quantity on quality hold. |
| `averageCost` | decimal \| null | no | no | no | The moving-average unit cost, in the currency given by currency. Example: `"3.75"`. |
| `onHandValue` | decimal \| null | no | no | yes | The value of the stock on hand, in the currency given by currency. Example: `"4500.00"`. |
| `currency` | string \| null | no | no | no | The currency of averageCost and onHandValue. Format ISO 4217, for example 'EUR'. Absent when the level has no valuation yet. Example: `"EUR"`. |
| `lastTransactionTimestamp` | date-time \| null | no | no | yes | 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. Example: `"2026-08-03T11:15:00"`. |
| `lastModifiedDate` | date-time \| null | no | Exact (`eq`, `ne`), Range (`gt`, `gte`, `lt`, `lte`, `between`), Any of (`in`, `notIn`) | yes | The date and time the inventory-level record last changed, in UTC. Format YYYY-MM-DDTHH:mm:ss.sssZ. Example: `"2026-08-03T11:15:00.000Z"`. |

```json
{
  "data": [
    {
      "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",
      "reservedQuantity": "19.99",
      "inTransitQuantity": "19.99",
      "damagedQuantity": "19.99",
      "qualityHoldQuantity": "19.99",
      "averageCost": "3.75",
      "onHandValue": "4500.00",
      "currency": "EUR",
      "lastTransactionTimestamp": "2026-08-03T11:15:00",
      "lastModifiedDate": "2026-08-03T11:15:00.000Z"
    }
  ],
  "pagination": {
    "hasMore": true,
    "nextCursor": "<nextCursor>"
  }
}
```

## Statuses

- `400` — Invalid request or business failure
- `401` — The request carries no valid access token.
- `403` — Not authorized
- `404` — Not found
- `429` — Too many requests from this client address. The response has no body and no `Retry-After` header.
- `500` — Internal server error
